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 |