| Index: remoting/host/video_scheduler.cc
|
| diff --git a/remoting/host/video_scheduler.cc b/remoting/host/video_scheduler.cc
|
| index e374c129cdf26fd32ac6f7804016a9f61db61d8e..c88dd80ae4ab88ec20306e29ab4dffe86e67aa72 100644
|
| --- a/remoting/host/video_scheduler.cc
|
| +++ b/remoting/host/video_scheduler.cc
|
| @@ -80,7 +80,8 @@ void VideoScheduler::Start() {
|
| this, &VideoScheduler::SendKeepAlivePacket));
|
|
|
| capture_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&VideoScheduler::StartOnCaptureThread, this));
|
| + FROM_HERE, base::Bind(&VideoScheduler::StartOnCaptureThread, this,
|
| + video_stub_->SupportsAcks()));
|
| }
|
|
|
| void VideoScheduler::Stop() {
|
| @@ -203,7 +204,7 @@ void VideoScheduler::OnMouseCursorPosition(
|
| NOTREACHED();
|
| }
|
|
|
| -void VideoScheduler::StartOnCaptureThread() {
|
| +void VideoScheduler::StartOnCaptureThread(bool acks_supported) {
|
| DCHECK(capture_task_runner_->BelongsToCurrentThread());
|
| DCHECK(!capture_scheduler_);
|
|
|
| @@ -211,7 +212,7 @@ void VideoScheduler::StartOnCaptureThread() {
|
| capturer_->Start(this);
|
|
|
| capture_scheduler_.reset(new CaptureScheduler(
|
| - base::Bind(&VideoScheduler::CaptureNextFrame, this)));
|
| + base::Bind(&VideoScheduler::CaptureNextFrame, this), acks_supported));
|
| capture_scheduler_->Start();
|
| }
|
|
|
| @@ -249,6 +250,13 @@ void VideoScheduler::ProcessFrameSentOnCaptureThread() {
|
| capture_scheduler_->OnFrameSent();
|
| }
|
|
|
| +void VideoScheduler::ProcessFrameAckOnCaptureThread() {
|
| + DCHECK(capture_task_runner_->BelongsToCurrentThread());
|
| +
|
| + if (capture_scheduler_)
|
| + capture_scheduler_->OnFrameAck();
|
| +}
|
| +
|
| // Network thread --------------------------------------------------------------
|
|
|
| void VideoScheduler::SendVideoPacket(scoped_ptr<VideoPacket> packet) {
|
| @@ -258,20 +266,32 @@ void VideoScheduler::SendVideoPacket(scoped_ptr<VideoPacket> packet) {
|
| return;
|
|
|
| video_stub_->ProcessVideoPacket(
|
| - packet.Pass(), base::Bind(&VideoScheduler::OnVideoPacketSent, this));
|
| + packet.Pass(), base::Bind(&VideoScheduler::OnVideoPacketProgress, this));
|
| }
|
|
|
| -void VideoScheduler::OnVideoPacketSent() {
|
| +void VideoScheduler::OnVideoPacketProgress(
|
| + protocol::VideoStub::PacketProgress progress) {
|
| DCHECK(network_task_runner_->BelongsToCurrentThread());
|
|
|
| if (!video_stub_)
|
| return;
|
|
|
| - keep_alive_timer_->Reset();
|
| -
|
| - capture_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&VideoScheduler::ProcessFrameSentOnCaptureThread, this));
|
| + switch (progress) {
|
| + case protocol::VideoStub::PacketProgress::SENT:
|
| + keep_alive_timer_->Reset();
|
| + capture_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&VideoScheduler::ProcessFrameSentOnCaptureThread, this));
|
| + break;
|
| +
|
| + case protocol::VideoStub::PacketProgress::DONE:
|
| + if (video_stub_->SupportsAcks()) {
|
| + capture_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&VideoScheduler::ProcessFrameAckOnCaptureThread, this));
|
| + }
|
| + break;
|
| + }
|
| }
|
|
|
| void VideoScheduler::SendKeepAlivePacket() {
|
| @@ -282,14 +302,17 @@ void VideoScheduler::SendKeepAlivePacket() {
|
|
|
| video_stub_->ProcessVideoPacket(
|
| make_scoped_ptr(new VideoPacket()),
|
| - base::Bind(&VideoScheduler::OnKeepAlivePacketSent, this));
|
| + base::Bind(&VideoScheduler::OnKeepAlivePacketProgress, this));
|
| }
|
|
|
| -void VideoScheduler::OnKeepAlivePacketSent() {
|
| +void VideoScheduler::OnKeepAlivePacketProgress(
|
| + protocol::VideoStub::PacketProgress progress) {
|
| DCHECK(network_task_runner_->BelongsToCurrentThread());
|
|
|
| - if (keep_alive_timer_)
|
| + if (progress == protocol::VideoStub::PacketProgress::SENT &&
|
| + keep_alive_timer_) {
|
| keep_alive_timer_->Reset();
|
| + }
|
| }
|
|
|
| void VideoScheduler::SendCursorShape(
|
|
|