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 |