| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/host/screen_recorder.h" | 5 #include "remoting/host/screen_recorder.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 MessageLoop* network_loop, | 40 MessageLoop* network_loop, |
| 41 Capturer* capturer, | 41 Capturer* capturer, |
| 42 Encoder* encoder) | 42 Encoder* encoder) |
| 43 : capture_loop_(capture_loop), | 43 : capture_loop_(capture_loop), |
| 44 encode_loop_(encode_loop), | 44 encode_loop_(encode_loop), |
| 45 network_loop_(network_loop), | 45 network_loop_(network_loop), |
| 46 capturer_(capturer), | 46 capturer_(capturer), |
| 47 encoder_(encoder), | 47 encoder_(encoder), |
| 48 is_recording_(false), | 48 is_recording_(false), |
| 49 network_stopped_(false), | 49 network_stopped_(false), |
| 50 encoder_stopped_(false), |
| 50 recordings_(0), | 51 recordings_(0), |
| 51 frame_skipped_(false), | 52 frame_skipped_(false), |
| 52 max_rate_(kDefaultCaptureRate), | 53 max_rate_(kDefaultCaptureRate), |
| 53 sequence_number_(0) { | 54 sequence_number_(0) { |
| 54 DCHECK(capture_loop_); | 55 DCHECK(capture_loop_); |
| 55 DCHECK(encode_loop_); | 56 DCHECK(encode_loop_); |
| 56 DCHECK(network_loop_); | 57 DCHECK(network_loop_); |
| 57 } | 58 } |
| 58 | 59 |
| 59 ScreenRecorder::~ScreenRecorder() { | 60 ScreenRecorder::~ScreenRecorder() { |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 encode_start_time_ = base::Time::Now(); | 381 encode_start_time_ = base::Time::Now(); |
| 381 encoder()->Encode( | 382 encoder()->Encode( |
| 382 capture_data, false, | 383 capture_data, false, |
| 383 NewCallback(this, &ScreenRecorder::EncodedDataAvailableCallback)); | 384 NewCallback(this, &ScreenRecorder::EncodedDataAvailableCallback)); |
| 384 TraceContext::tracer()->PrintString("Encode Done"); | 385 TraceContext::tracer()->PrintString("Encode Done"); |
| 385 } | 386 } |
| 386 | 387 |
| 387 void ScreenRecorder::DoStopOnEncodeThread(Task* done_task) { | 388 void ScreenRecorder::DoStopOnEncodeThread(Task* done_task) { |
| 388 DCHECK_EQ(encode_loop_, MessageLoop::current()); | 389 DCHECK_EQ(encode_loop_, MessageLoop::current()); |
| 389 | 390 |
| 391 encoder_stopped_ = true; |
| 392 |
| 390 // When this method is being executed there are no more tasks on encode thread | 393 // When this method is being executed there are no more tasks on encode thread |
| 391 // for this object. We can then post a task to capture thread to finish the | 394 // for this object. We can then post a task to capture thread to finish the |
| 392 // stop sequence. | 395 // stop sequence. |
| 393 if (done_task) | 396 if (done_task) |
| 394 capture_loop_->PostTask(FROM_HERE, done_task); | 397 capture_loop_->PostTask(FROM_HERE, done_task); |
| 395 } | 398 } |
| 396 | 399 |
| 397 void ScreenRecorder::EncodedDataAvailableCallback(VideoPacket* packet) { | 400 void ScreenRecorder::EncodedDataAvailableCallback(VideoPacket* packet) { |
| 398 DCHECK_EQ(encode_loop_, MessageLoop::current()); | 401 DCHECK_EQ(encode_loop_, MessageLoop::current()); |
| 399 | 402 |
| 403 if (encoder_stopped_) |
| 404 return; |
| 405 |
| 400 bool last = (packet->flags() & VideoPacket::LAST_PACKET) != 0; | 406 bool last = (packet->flags() & VideoPacket::LAST_PACKET) != 0; |
| 401 if (last) { | 407 if (last) { |
| 402 int encode_time = static_cast<int>( | 408 int encode_time = static_cast<int>( |
| 403 (base::Time::Now() - encode_start_time_).InMilliseconds()); | 409 (base::Time::Now() - encode_start_time_).InMilliseconds()); |
| 404 packet->set_encode_time_ms(encode_time); | 410 packet->set_encode_time_ms(encode_time); |
| 405 } | 411 } |
| 406 | 412 |
| 407 network_loop_->PostTask( | 413 network_loop_->PostTask( |
| 408 FROM_HERE, | 414 FROM_HERE, |
| 409 NewTracedMethod(this, &ScreenRecorder::DoSendVideoPacket, packet)); | 415 NewTracedMethod(this, &ScreenRecorder::DoSendVideoPacket, packet)); |
| 410 } | 416 } |
| 411 | 417 |
| 412 } // namespace remoting | 418 } // namespace remoting |
| OLD | NEW |