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( |