| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_ | 5 #ifndef REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_ |
| 6 #define REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_ | 6 #define REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_ |
| 7 | 7 |
| 8 #include "remoting/protocol/webrtc_frame_scheduler.h" | 8 #include "remoting/protocol/webrtc_frame_scheduler.h" |
| 9 | 9 |
| 10 #include "base/threading/thread_checker.h" |
| 10 #include "base/timer/timer.h" | 11 #include "base/timer/timer.h" |
| 11 #include "remoting/base/leaky_bucket.h" | 12 #include "remoting/base/leaky_bucket.h" |
| 12 #include "remoting/base/running_samples.h" | 13 #include "remoting/base/running_samples.h" |
| 14 #include "remoting/protocol/video_channel_state_observer.h" |
| 13 | 15 |
| 14 namespace remoting { | 16 namespace remoting { |
| 15 namespace protocol { | 17 namespace protocol { |
| 16 | 18 |
| 17 // WebrtcFrameSchedulerSimple is a simple implementation of | 19 // WebrtcFrameSchedulerSimple is a simple implementation of |
| 18 // WebrtcFrameScheduler that always keeps only one frame in the pipeline. | 20 // WebrtcFrameScheduler that always keeps only one frame in the pipeline. |
| 19 // It schedules each frame after the previous one is expected to finish sending. | 21 // It schedules each frame after the previous one is expected to finish sending. |
| 20 class WebrtcFrameSchedulerSimple : public WebrtcFrameScheduler { | 22 class WebrtcFrameSchedulerSimple : public VideoChannelStateObserver, |
| 23 public WebrtcFrameScheduler { |
| 21 public: | 24 public: |
| 22 WebrtcFrameSchedulerSimple(); | 25 WebrtcFrameSchedulerSimple(); |
| 23 ~WebrtcFrameSchedulerSimple() override; | 26 ~WebrtcFrameSchedulerSimple() override; |
| 24 | 27 |
| 28 // VideoChannelStateObserver implementation. |
| 29 void OnKeyFrameRequested() override; |
| 30 void OnChannelParameters(int packet_loss, base::TimeDelta rtt) override; |
| 31 void OnTargetBitrateChanged(int bitrate_kbps) override; |
| 32 |
| 25 // WebrtcFrameScheduler implementation. | 33 // WebrtcFrameScheduler implementation. |
| 26 void Start(const base::Closure& capture_callback) override; | 34 void Start(WebrtcDummyVideoEncoderFactory* video_encoder_factory, |
| 35 const base::Closure& capture_callback) override; |
| 27 void Pause(bool pause) override; | 36 void Pause(bool pause) override; |
| 28 void SetKeyFrameRequest() override; | |
| 29 void SetTargetBitrate(int bitrate_kbps) override; | |
| 30 bool GetEncoderFrameParams( | 37 bool GetEncoderFrameParams( |
| 31 const webrtc::DesktopFrame& frame, | 38 const webrtc::DesktopFrame& frame, |
| 32 WebrtcVideoEncoder::FrameParams* params_out) override; | 39 WebrtcVideoEncoder::FrameParams* params_out) override; |
| 33 void OnFrameEncoded( | 40 void OnFrameEncoded( |
| 34 const WebrtcVideoEncoder::EncodedFrame& encoded_frame, | 41 const WebrtcVideoEncoder::EncodedFrame& encoded_frame, |
| 35 const webrtc::EncodedImageCallback::Result& send_result) override; | 42 const webrtc::EncodedImageCallback::Result& send_result) override; |
| 36 | 43 |
| 37 private: | 44 private: |
| 38 void ScheduleNextFrame(base::TimeTicks now); | 45 void ScheduleNextFrame(base::TimeTicks now); |
| 39 void CaptureNextFrame(); | 46 void CaptureNextFrame(); |
| 40 | 47 |
| 41 base::Closure capture_callback_; | 48 base::Closure capture_callback_; |
| 42 bool paused_ = false; | 49 bool paused_ = false; |
| 43 bool key_frame_request_ = false; | 50 bool key_frame_request_ = false; |
| 44 | 51 |
| 45 base::TimeTicks last_capture_started_time_; | 52 base::TimeTicks last_capture_started_time_; |
| 46 | 53 |
| 47 LeakyBucket pacing_bucket_; | 54 LeakyBucket pacing_bucket_; |
| 48 | 55 |
| 49 // Set to true when encoding unchanged frames for top-off. | 56 // Set to true when encoding unchanged frames for top-off. |
| 50 bool top_off_is_active_ = false; | 57 bool top_off_is_active_ = false; |
| 51 | 58 |
| 52 // Accumulator for capture and encoder delay history. | 59 // Accumulator for capture and encoder delay history. |
| 53 RunningSamples frame_processing_delay_us_; | 60 RunningSamples frame_processing_delay_us_; |
| 54 | 61 |
| 55 // Accumulator for updated region area in the previously encoded frames. | 62 // Accumulator for updated region area in the previously encoded frames. |
| 56 RunningSamples updated_region_area_; | 63 RunningSamples updated_region_area_; |
| 57 | 64 |
| 58 base::OneShotTimer capture_timer_; | 65 base::OneShotTimer capture_timer_; |
| 66 |
| 67 base::ThreadChecker thread_checker_; |
| 68 base::WeakPtrFactory<WebrtcFrameSchedulerSimple> weak_factory_; |
| 59 }; | 69 }; |
| 60 | 70 |
| 61 } // namespace protocol | 71 } // namespace protocol |
| 62 } // namespace remoting | 72 } // namespace remoting |
| 63 | 73 |
| 64 #endif // REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_ | 74 #endif // REMOTING_PROTOCOL_WEBRTC_FRAME_SCHEDULER_SIMPLE_H_ |
| OLD | NEW |