| Index: remoting/host/video_scheduler.cc
|
| diff --git a/remoting/host/video_scheduler.cc b/remoting/host/video_scheduler.cc
|
| index 883166b39ce5c4b1c8ad7c18775d2c302262a50a..5c95c7a9387a9040c489ae4fa0a2951f531d052f 100644
|
| --- a/remoting/host/video_scheduler.cc
|
| +++ b/remoting/host/video_scheduler.cc
|
| @@ -249,11 +249,8 @@ void VideoScheduler::SendVideoPacket(scoped_ptr<VideoPacket> packet) {
|
| if (!video_stub_)
|
| return;
|
|
|
| - base::Closure callback;
|
| - if ((packet->flags() & VideoPacket::LAST_PARTITION) != 0)
|
| - callback = base::Bind(&VideoScheduler::VideoFrameSentCallback, this);
|
| -
|
| - video_stub_->ProcessVideoPacket(packet.Pass(), callback);
|
| + video_stub_->ProcessVideoPacket(
|
| + packet.Pass(), base::Bind(&VideoScheduler::VideoFrameSentCallback, this));
|
| }
|
|
|
| void VideoScheduler::VideoFrameSentCallback() {
|
| @@ -286,7 +283,6 @@ void VideoScheduler::EncodeFrame(
|
| // If there is nothing to encode then send an empty keep-alive packet.
|
| if (!frame || frame->updated_region().is_empty()) {
|
| scoped_ptr<VideoPacket> packet(new VideoPacket());
|
| - packet->set_flags(VideoPacket::LAST_PARTITION);
|
| packet->set_client_sequence_number(sequence_number);
|
| network_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&VideoScheduler::SendVideoPacket, this,
|
| @@ -295,25 +291,16 @@ 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);
|
|
|
| - bool last = (packet->flags() & VideoPacket::LAST_PACKET) != 0;
|
| - if (last) {
|
| - scheduler_.RecordEncodeTime(
|
| - base::TimeDelta::FromMilliseconds(packet->encode_time_ms()));
|
| - }
|
| + // 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();
|
|
|
| + scheduler_.RecordEncodeTime(
|
| + base::TimeDelta::FromMilliseconds(packet->encode_time_ms()));
|
| network_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&VideoScheduler::SendVideoPacket, this,
|
| base::Passed(&packet)));
|
|
|