Index: remoting/protocol/webrtc_frame_scheduler_simple.cc |
diff --git a/remoting/protocol/webrtc_frame_scheduler_simple.cc b/remoting/protocol/webrtc_frame_scheduler_simple.cc |
index 31494ae07840837f3c3d9399bdfdeb4694442a50..336276d6609e20169c69af3b4aa86f95ad614a83 100644 |
--- a/remoting/protocol/webrtc_frame_scheduler_simple.cc |
+++ b/remoting/protocol/webrtc_frame_scheduler_simple.cc |
@@ -6,6 +6,7 @@ |
#include <algorithm> |
+#include "remoting/protocol/webrtc_dummy_video_encoder.h" |
#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
namespace remoting { |
@@ -56,15 +57,41 @@ int64_t GetRegionArea(const webrtc::DesktopRegion& region) { |
WebrtcFrameSchedulerSimple::WebrtcFrameSchedulerSimple() |
: pacing_bucket_(LeakyBucket::kUnlimitedDepth, 0), |
frame_processing_delay_us_(kStatsWindow), |
- updated_region_area_(kStatsWindow) {} |
+ updated_region_area_(kStatsWindow), |
+ weak_factory_(this) {} |
WebrtcFrameSchedulerSimple::~WebrtcFrameSchedulerSimple() {} |
-void WebrtcFrameSchedulerSimple::Start(const base::Closure& capture_callback) { |
+void WebrtcFrameSchedulerSimple::OnKeyFrameRequested() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ key_frame_request_ = true; |
+ if (!capture_timer_.IsRunning()) |
+ ScheduleNextFrame(base::TimeTicks::Now()); |
+} |
+ |
+void WebrtcFrameSchedulerSimple::OnChannelParameters(int packet_loss, |
+ base::TimeDelta rtt) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+} |
+ |
+void WebrtcFrameSchedulerSimple::OnTargetBitrateChanged(int bitrate_kbps) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ base::TimeTicks now = base::TimeTicks::Now(); |
+ pacing_bucket_.UpdateRate(bitrate_kbps * 1000 / 8, now); |
+ ScheduleNextFrame(now); |
+} |
+ |
+void WebrtcFrameSchedulerSimple::Start( |
+ WebrtcDummyVideoEncoderFactory* video_encoder_factory, |
+ const base::Closure& capture_callback) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
capture_callback_ = capture_callback; |
- ScheduleNextFrame(base::TimeTicks::Now()); |
+ video_encoder_factory->SetVideoChannelStateObserver( |
+ weak_factory_.GetWeakPtr()); |
} |
void WebrtcFrameSchedulerSimple::Pause(bool pause) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
paused_ = pause; |
if (paused_) { |
capture_timer_.Stop(); |
@@ -73,19 +100,11 @@ void WebrtcFrameSchedulerSimple::Pause(bool pause) { |
} |
} |
-void WebrtcFrameSchedulerSimple::SetKeyFrameRequest() { |
- key_frame_request_ = true; |
-} |
- |
-void WebrtcFrameSchedulerSimple::SetTargetBitrate(int bitrate_kbps) { |
- base::TimeTicks now = base::TimeTicks::Now(); |
- pacing_bucket_.UpdateRate(bitrate_kbps * 1000 / 8, now); |
- ScheduleNextFrame(now); |
-} |
- |
bool WebrtcFrameSchedulerSimple::GetEncoderFrameParams( |
const webrtc::DesktopFrame& frame, |
WebrtcVideoEncoder::FrameParams* params_out) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
base::TimeTicks now = base::TimeTicks::Now(); |
if (frame.updated_region().is_empty() && !top_off_is_active_ && |
@@ -137,6 +156,8 @@ bool WebrtcFrameSchedulerSimple::GetEncoderFrameParams( |
void WebrtcFrameSchedulerSimple::OnFrameEncoded( |
const WebrtcVideoEncoder::EncodedFrame& encoded_frame, |
const webrtc::EncodedImageCallback::Result& send_result) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
base::TimeTicks now = base::TimeTicks::Now(); |
pacing_bucket_.RefillOrSpill(encoded_frame.data.size(), now); |
@@ -154,6 +175,8 @@ void WebrtcFrameSchedulerSimple::OnFrameEncoded( |
} |
void WebrtcFrameSchedulerSimple::ScheduleNextFrame(base::TimeTicks now) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
// Don't capture frames when paused or target bitrate is 0 or there is |
// no capture callback set. |
if (paused_ || pacing_bucket_.rate() == 0 || capture_callback_.is_null()) |
@@ -181,6 +204,8 @@ void WebrtcFrameSchedulerSimple::ScheduleNextFrame(base::TimeTicks now) { |
} |
void WebrtcFrameSchedulerSimple::CaptureNextFrame() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
last_capture_started_time_ = base::TimeTicks::Now(); |
capture_callback_.Run(); |
} |