Index: remoting/host/video_scheduler.cc |
diff --git a/remoting/host/video_scheduler.cc b/remoting/host/video_scheduler.cc |
index 883166b39ce5c4b1c8ad7c18775d2c302262a50a..3b2973314d7a4c613649a2a8c8fda91f8837b034 100644 |
--- a/remoting/host/video_scheduler.cc |
+++ b/remoting/host/video_scheduler.cc |
@@ -295,19 +295,14 @@ void VideoScheduler::EncodeFrame( |
return; |
} |
- encoder_->Encode( |
- frame.get(), base::Bind(&VideoScheduler::EncodedDataAvailableCallback, |
- this, sequence_number)); |
- capture_task_runner_->DeleteSoon(FROM_HERE, frame.release()); |
-} |
- |
-void VideoScheduler::EncodedDataAvailableCallback( |
- int64 sequence_number, |
- scoped_ptr<VideoPacket> packet) { |
- DCHECK(encode_task_runner_->BelongsToCurrentThread()); |
- |
+ scoped_ptr<VideoPacket> packet = encoder_->Encode(*frame); |
packet->set_client_sequence_number(sequence_number); |
+ // Destroy the frame before sending |packet| because SendVideoPacket() may |
+ // trigger another frame to be captured, and the screen capturer expects the |
+ // old frame to be freed by then. |
+ frame.reset(); |
+ |
bool last = (packet->flags() & VideoPacket::LAST_PACKET) != 0; |
if (last) { |
scheduler_.RecordEncodeTime( |