Index: remoting/host/video_scheduler.cc |
diff --git a/remoting/host/video_scheduler.cc b/remoting/host/video_scheduler.cc |
index e2a3f945533aec44f68f2d58c1860f07494e90a5..77ee4f46f65f88477417c0b7a2e4f968392c6b39 100644 |
--- a/remoting/host/video_scheduler.cc |
+++ b/remoting/host/video_scheduler.cc |
@@ -19,16 +19,20 @@ |
#include "remoting/proto/video.pb.h" |
#include "remoting/protocol/cursor_shape_stub.h" |
#include "remoting/protocol/message_decoder.h" |
-#include "remoting/protocol/video_stub.h" |
+#include "remoting/protocol/video_sender.h" |
#include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" |
#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
#include "third_party/webrtc/modules/desktop_capture/mouse_cursor.h" |
namespace remoting { |
-// Maximum number of frames that can be processed simultaneously. |
+// Maximum number of frames that can be processed simultaneously. In case the |
+// video channel has Ack messages enabled the VideoSender acknowledges frames |
+// only after the corresponding Ack message is received. The values are chosen |
+// experimentally to maximize frame rate, while keeping round-trip latency low. |
// TODO(hclam): Move this value to CaptureScheduler. |
-static const int kMaxPendingFrames = 2; |
+static const int kMaxPendingFrames = 4; |
Wez
2015/01/21 01:35:38
kMaxPendingFrames controls the number of screen-ca
Sergey Ulanov
2015/01/29 01:33:27
Fixed it now. CaptureScheduler now separately chec
|
+static const int kMaxPendingFramesWithoutAcks = 2; |
// Interval between empty keep-alive frames. These frames are sent only when the |
// stream is paused or inactive for some other reason (e.g. when blocked on |
@@ -51,7 +55,7 @@ VideoScheduler::VideoScheduler( |
scoped_ptr<webrtc::MouseCursorMonitor> mouse_cursor_monitor, |
scoped_ptr<VideoEncoder> encoder, |
protocol::CursorShapeStub* cursor_stub, |
- protocol::VideoStub* video_stub) |
+ protocol::VideoSender* video_sender) |
: capture_task_runner_(capture_task_runner), |
encode_task_runner_(encode_task_runner), |
network_task_runner_(network_task_runner), |
@@ -59,7 +63,7 @@ VideoScheduler::VideoScheduler( |
mouse_cursor_monitor_(mouse_cursor_monitor.Pass()), |
encoder_(encoder.Pass()), |
cursor_stub_(cursor_stub), |
- video_stub_(video_stub), |
+ video_sender_(video_sender), |
pending_frames_(0), |
capture_pending_(false), |
did_skip_frame_(false), |
@@ -70,7 +74,7 @@ VideoScheduler::VideoScheduler( |
DCHECK(mouse_cursor_monitor_); |
DCHECK(encoder_); |
DCHECK(cursor_stub_); |
- DCHECK(video_stub_); |
+ DCHECK(video_sender_); |
} |
// Public methods -------------------------------------------------------------- |
@@ -156,7 +160,7 @@ void VideoScheduler::Stop() { |
// Clear stubs to prevent further updates reaching the client. |
cursor_stub_ = nullptr; |
- video_stub_ = nullptr; |
+ video_sender_ = nullptr; |
keep_alive_timer_.reset(); |
@@ -274,10 +278,14 @@ void VideoScheduler::CaptureNextFrame() { |
if (!capturer_ || is_paused_) |
return; |
+ int max_pending_frames = video_sender_->SupportsAcks() |
+ ? kMaxPendingFrames |
+ : kMaxPendingFramesWithoutAcks; |
+ |
// Make sure we have at most two outstanding recordings. We can simply return |
// if we can't make a capture now, the next capture will be started by the |
// end of an encode operation. |
- if (pending_frames_ >= kMaxPendingFrames || capture_pending_) { |
+ if (pending_frames_ >= max_pending_frames || capture_pending_) { |
did_skip_frame_ = true; |
return; |
} |
@@ -286,7 +294,7 @@ void VideoScheduler::CaptureNextFrame() { |
// At this point we are going to perform one capture so save the current time. |
pending_frames_++; |
- DCHECK_LE(pending_frames_, kMaxPendingFrames); |
+ DCHECK_LE(pending_frames_, max_pending_frames); |
// Before doing a capture schedule for the next one. |
ScheduleNextCapture(); |
@@ -318,17 +326,17 @@ void VideoScheduler::FrameCaptureCompleted() { |
void VideoScheduler::SendVideoPacket(scoped_ptr<VideoPacket> packet) { |
DCHECK(network_task_runner_->BelongsToCurrentThread()); |
- if (!video_stub_) |
+ if (!video_sender_) |
return; |
- video_stub_->ProcessVideoPacket( |
+ video_sender_->ProcessVideoPacket( |
packet.Pass(), base::Bind(&VideoScheduler::OnVideoPacketSent, this)); |
} |
void VideoScheduler::OnVideoPacketSent() { |
DCHECK(network_task_runner_->BelongsToCurrentThread()); |
- if (!video_stub_) |
+ if (!video_sender_) |
return; |
keep_alive_timer_->Reset(); |
@@ -340,10 +348,10 @@ void VideoScheduler::OnVideoPacketSent() { |
void VideoScheduler::SendKeepAlivePacket() { |
DCHECK(network_task_runner_->BelongsToCurrentThread()); |
- if (!video_stub_) |
+ if (!video_sender_) |
return; |
- video_stub_->ProcessVideoPacket( |
+ video_sender_->ProcessVideoPacket( |
make_scoped_ptr(new VideoPacket()), |
base::Bind(&VideoScheduler::OnKeepAlivePacketSent, this)); |
} |