xref: /aosp_15_r20/external/webrtc/video/video_stream_buffer_controller.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef VIDEO_VIDEO_STREAM_BUFFER_CONTROLLER_H_
12*d9f75844SAndroid Build Coastguard Worker #define VIDEO_VIDEO_STREAM_BUFFER_CONTROLLER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "api/field_trials_view.h"
17*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_base.h"
18*d9f75844SAndroid Build Coastguard Worker #include "api/video/encoded_frame.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/video/frame_buffer.h"
20*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/include/video_coding_defines.h"
21*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/timing/inter_frame_delay.h"
22*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/timing/jitter_estimator.h"
23*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/timing/timing.h"
24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/experiments/rtt_mult_experiment.h"
25*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h"
26*d9f75844SAndroid Build Coastguard Worker #include "video/decode_synchronizer.h"
27*d9f75844SAndroid Build Coastguard Worker #include "video/video_receive_stream_timeout_tracker.h"
28*d9f75844SAndroid Build Coastguard Worker 
29*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker class FrameSchedulingReceiver {
32*d9f75844SAndroid Build Coastguard Worker  public:
33*d9f75844SAndroid Build Coastguard Worker   virtual ~FrameSchedulingReceiver() = default;
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker   virtual void OnEncodedFrame(std::unique_ptr<EncodedFrame> frame) = 0;
36*d9f75844SAndroid Build Coastguard Worker   virtual void OnDecodableFrameTimeout(TimeDelta wait_time) = 0;
37*d9f75844SAndroid Build Coastguard Worker };
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker class VideoStreamBufferController {
40*d9f75844SAndroid Build Coastguard Worker  public:
41*d9f75844SAndroid Build Coastguard Worker   VideoStreamBufferController(
42*d9f75844SAndroid Build Coastguard Worker       Clock* clock,
43*d9f75844SAndroid Build Coastguard Worker       TaskQueueBase* worker_queue,
44*d9f75844SAndroid Build Coastguard Worker       VCMTiming* timing,
45*d9f75844SAndroid Build Coastguard Worker       VCMReceiveStatisticsCallback* stats_proxy,
46*d9f75844SAndroid Build Coastguard Worker       FrameSchedulingReceiver* receiver,
47*d9f75844SAndroid Build Coastguard Worker       TimeDelta max_wait_for_keyframe,
48*d9f75844SAndroid Build Coastguard Worker       TimeDelta max_wait_for_frame,
49*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<FrameDecodeScheduler> frame_decode_scheduler,
50*d9f75844SAndroid Build Coastguard Worker       const FieldTrialsView& field_trials);
51*d9f75844SAndroid Build Coastguard Worker   virtual ~VideoStreamBufferController() = default;
52*d9f75844SAndroid Build Coastguard Worker 
53*d9f75844SAndroid Build Coastguard Worker   void Stop();
54*d9f75844SAndroid Build Coastguard Worker   void SetProtectionMode(VCMVideoProtection protection_mode);
55*d9f75844SAndroid Build Coastguard Worker   void Clear();
56*d9f75844SAndroid Build Coastguard Worker   absl::optional<int64_t> InsertFrame(std::unique_ptr<EncodedFrame> frame);
57*d9f75844SAndroid Build Coastguard Worker   void UpdateRtt(int64_t max_rtt_ms);
58*d9f75844SAndroid Build Coastguard Worker   void SetMaxWaits(TimeDelta max_wait_for_keyframe,
59*d9f75844SAndroid Build Coastguard Worker                    TimeDelta max_wait_for_frame);
60*d9f75844SAndroid Build Coastguard Worker   void StartNextDecode(bool keyframe_required);
61*d9f75844SAndroid Build Coastguard Worker   int Size();
62*d9f75844SAndroid Build Coastguard Worker 
63*d9f75844SAndroid Build Coastguard Worker  private:
64*d9f75844SAndroid Build Coastguard Worker   void OnFrameReady(
65*d9f75844SAndroid Build Coastguard Worker       absl::InlinedVector<std::unique_ptr<EncodedFrame>, 4> frames,
66*d9f75844SAndroid Build Coastguard Worker       Timestamp render_time);
67*d9f75844SAndroid Build Coastguard Worker   void OnTimeout(TimeDelta delay);
68*d9f75844SAndroid Build Coastguard Worker   void FrameReadyForDecode(uint32_t rtp_timestamp, Timestamp render_time);
69*d9f75844SAndroid Build Coastguard Worker   void UpdateDroppedFrames() RTC_RUN_ON(&worker_sequence_checker_);
70*d9f75844SAndroid Build Coastguard Worker   void UpdateJitterDelay();
71*d9f75844SAndroid Build Coastguard Worker   void UpdateTimingFrameInfo();
72*d9f75844SAndroid Build Coastguard Worker   bool IsTooManyFramesQueued() const RTC_RUN_ON(&worker_sequence_checker_);
73*d9f75844SAndroid Build Coastguard Worker   void ForceKeyFrameReleaseImmediately() RTC_RUN_ON(&worker_sequence_checker_);
74*d9f75844SAndroid Build Coastguard Worker   void MaybeScheduleFrameForRelease() RTC_RUN_ON(&worker_sequence_checker_);
75*d9f75844SAndroid Build Coastguard Worker 
76*d9f75844SAndroid Build Coastguard Worker   RTC_NO_UNIQUE_ADDRESS SequenceChecker worker_sequence_checker_;
77*d9f75844SAndroid Build Coastguard Worker   const FieldTrialsView& field_trials_;
78*d9f75844SAndroid Build Coastguard Worker   const absl::optional<RttMultExperiment::Settings> rtt_mult_settings_ =
79*d9f75844SAndroid Build Coastguard Worker       RttMultExperiment::GetRttMultValue();
80*d9f75844SAndroid Build Coastguard Worker   Clock* const clock_;
81*d9f75844SAndroid Build Coastguard Worker   VCMReceiveStatisticsCallback* const stats_proxy_;
82*d9f75844SAndroid Build Coastguard Worker   FrameSchedulingReceiver* const receiver_;
83*d9f75844SAndroid Build Coastguard Worker   VCMTiming* const timing_;
84*d9f75844SAndroid Build Coastguard Worker   const std::unique_ptr<FrameDecodeScheduler> frame_decode_scheduler_
85*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&worker_sequence_checker_);
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker   JitterEstimator jitter_estimator_ RTC_GUARDED_BY(&worker_sequence_checker_);
88*d9f75844SAndroid Build Coastguard Worker   InterFrameDelay inter_frame_delay_ RTC_GUARDED_BY(&worker_sequence_checker_);
89*d9f75844SAndroid Build Coastguard Worker   bool keyframe_required_ RTC_GUARDED_BY(&worker_sequence_checker_) = false;
90*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<FrameBuffer> buffer_
91*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&worker_sequence_checker_);
92*d9f75844SAndroid Build Coastguard Worker   FrameDecodeTiming decode_timing_ RTC_GUARDED_BY(&worker_sequence_checker_);
93*d9f75844SAndroid Build Coastguard Worker   VideoReceiveStreamTimeoutTracker timeout_tracker_
94*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&worker_sequence_checker_);
95*d9f75844SAndroid Build Coastguard Worker   int frames_dropped_before_last_new_frame_
96*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&worker_sequence_checker_) = 0;
97*d9f75844SAndroid Build Coastguard Worker   VCMVideoProtection protection_mode_
98*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&worker_sequence_checker_) = kProtectionNack;
99*d9f75844SAndroid Build Coastguard Worker 
100*d9f75844SAndroid Build Coastguard Worker   // This flag guards frames from queuing in front of the decoder. Without this
101*d9f75844SAndroid Build Coastguard Worker   // guard, encoded frames will not wait for the decoder to finish decoding a
102*d9f75844SAndroid Build Coastguard Worker   // frame and just queue up, meaning frames will not be dropped or
103*d9f75844SAndroid Build Coastguard Worker   // fast-forwarded when the decoder is slow or hangs.
104*d9f75844SAndroid Build Coastguard Worker   bool decoder_ready_for_new_frame_ RTC_GUARDED_BY(&worker_sequence_checker_) =
105*d9f75844SAndroid Build Coastguard Worker       false;
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker   // Maximum number of frames in the decode queue to allow pacing. If the
108*d9f75844SAndroid Build Coastguard Worker   // queue grows beyond the max limit, pacing will be disabled and frames will
109*d9f75844SAndroid Build Coastguard Worker   // be pushed to the decoder as soon as possible. This only has an effect
110*d9f75844SAndroid Build Coastguard Worker   // when the low-latency rendering path is active, which is indicated by
111*d9f75844SAndroid Build Coastguard Worker   // the frame's render time == 0.
112*d9f75844SAndroid Build Coastguard Worker   FieldTrialParameter<unsigned> zero_playout_delay_max_decode_queue_size_;
113*d9f75844SAndroid Build Coastguard Worker 
114*d9f75844SAndroid Build Coastguard Worker   ScopedTaskSafety worker_safety_;
115*d9f75844SAndroid Build Coastguard Worker };
116*d9f75844SAndroid Build Coastguard Worker 
117*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
118*d9f75844SAndroid Build Coastguard Worker 
119*d9f75844SAndroid Build Coastguard Worker #endif  // VIDEO_VIDEO_STREAM_BUFFER_CONTROLLER_H_
120