diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/libwebrtc/video/video_stream_buffer_controller.h | |
parent | Initial commit. (diff) | |
download | firefox-esr-upstream.tar.xz firefox-esr-upstream.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/video/video_stream_buffer_controller.h')
-rw-r--r-- | third_party/libwebrtc/video/video_stream_buffer_controller.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/third_party/libwebrtc/video/video_stream_buffer_controller.h b/third_party/libwebrtc/video/video_stream_buffer_controller.h new file mode 100644 index 0000000000..7638c91471 --- /dev/null +++ b/third_party/libwebrtc/video/video_stream_buffer_controller.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2022 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef VIDEO_VIDEO_STREAM_BUFFER_CONTROLLER_H_ +#define VIDEO_VIDEO_STREAM_BUFFER_CONTROLLER_H_ + +#include <memory> + +#include "api/field_trials_view.h" +#include "api/task_queue/task_queue_base.h" +#include "api/video/encoded_frame.h" +#include "api/video/frame_buffer.h" +#include "modules/video_coding/include/video_coding_defines.h" +#include "modules/video_coding/timing/inter_frame_delay.h" +#include "modules/video_coding/timing/jitter_estimator.h" +#include "modules/video_coding/timing/timing.h" +#include "rtc_base/experiments/rtt_mult_experiment.h" +#include "system_wrappers/include/clock.h" +#include "video/decode_synchronizer.h" +#include "video/video_receive_stream_timeout_tracker.h" + +namespace webrtc { + +class FrameSchedulingReceiver { + public: + virtual ~FrameSchedulingReceiver() = default; + + virtual void OnEncodedFrame(std::unique_ptr<EncodedFrame> frame) = 0; + virtual void OnDecodableFrameTimeout(TimeDelta wait_time) = 0; +}; + +class VideoStreamBufferController { + public: + VideoStreamBufferController( + Clock* clock, + TaskQueueBase* worker_queue, + VCMTiming* timing, + VCMReceiveStatisticsCallback* stats_proxy, + FrameSchedulingReceiver* receiver, + TimeDelta max_wait_for_keyframe, + TimeDelta max_wait_for_frame, + std::unique_ptr<FrameDecodeScheduler> frame_decode_scheduler, + const FieldTrialsView& field_trials); + virtual ~VideoStreamBufferController() = default; + + void Stop(); + void SetProtectionMode(VCMVideoProtection protection_mode); + void Clear(); + absl::optional<int64_t> InsertFrame(std::unique_ptr<EncodedFrame> frame); + void UpdateRtt(int64_t max_rtt_ms); + void SetMaxWaits(TimeDelta max_wait_for_keyframe, + TimeDelta max_wait_for_frame); + void StartNextDecode(bool keyframe_required); + int Size(); + + private: + void OnFrameReady( + absl::InlinedVector<std::unique_ptr<EncodedFrame>, 4> frames, + Timestamp render_time); + void OnTimeout(TimeDelta delay); + void FrameReadyForDecode(uint32_t rtp_timestamp, Timestamp render_time); + void UpdateDroppedFrames() RTC_RUN_ON(&worker_sequence_checker_); + void UpdateDiscardedPackets() RTC_RUN_ON(&worker_sequence_checker_); + void UpdateJitterDelay(); + void UpdateTimingFrameInfo(); + bool IsTooManyFramesQueued() const RTC_RUN_ON(&worker_sequence_checker_); + void ForceKeyFrameReleaseImmediately() RTC_RUN_ON(&worker_sequence_checker_); + void MaybeScheduleFrameForRelease() RTC_RUN_ON(&worker_sequence_checker_); + + RTC_NO_UNIQUE_ADDRESS SequenceChecker worker_sequence_checker_; + const FieldTrialsView& field_trials_; + const absl::optional<RttMultExperiment::Settings> rtt_mult_settings_ = + RttMultExperiment::GetRttMultValue(); + Clock* const clock_; + VCMReceiveStatisticsCallback* const stats_proxy_; + FrameSchedulingReceiver* const receiver_; + VCMTiming* const timing_; + const std::unique_ptr<FrameDecodeScheduler> frame_decode_scheduler_ + RTC_GUARDED_BY(&worker_sequence_checker_); + + JitterEstimator jitter_estimator_ RTC_GUARDED_BY(&worker_sequence_checker_); + InterFrameDelay inter_frame_delay_ RTC_GUARDED_BY(&worker_sequence_checker_); + bool keyframe_required_ RTC_GUARDED_BY(&worker_sequence_checker_) = false; + std::unique_ptr<FrameBuffer> buffer_ + RTC_GUARDED_BY(&worker_sequence_checker_); + FrameDecodeTiming decode_timing_ RTC_GUARDED_BY(&worker_sequence_checker_); + VideoReceiveStreamTimeoutTracker timeout_tracker_ + RTC_GUARDED_BY(&worker_sequence_checker_); + int frames_dropped_before_last_new_frame_ + RTC_GUARDED_BY(&worker_sequence_checker_) = 0; + int packets_discarded_before_last_new_frame_ + RTC_GUARDED_BY(&worker_sequence_checker_) = 0; + VCMVideoProtection protection_mode_ + RTC_GUARDED_BY(&worker_sequence_checker_) = kProtectionNack; + + // This flag guards frames from queuing in front of the decoder. Without this + // guard, encoded frames will not wait for the decoder to finish decoding a + // frame and just queue up, meaning frames will not be dropped or + // fast-forwarded when the decoder is slow or hangs. + bool decoder_ready_for_new_frame_ RTC_GUARDED_BY(&worker_sequence_checker_) = + false; + + // Maximum number of frames in the decode queue to allow pacing. If the + // queue grows beyond the max limit, pacing will be disabled and frames will + // be pushed to the decoder as soon as possible. This only has an effect + // when the low-latency rendering path is active, which is indicated by + // the frame's render time == 0. + FieldTrialParameter<unsigned> zero_playout_delay_max_decode_queue_size_; + + ScopedTaskSafety worker_safety_; +}; + +} // namespace webrtc + +#endif // VIDEO_VIDEO_STREAM_BUFFER_CONTROLLER_H_ |