xref: /aosp_15_r20/external/webrtc/video/encoder_bitrate_adjuster.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2019 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_ENCODER_BITRATE_ADJUSTER_H_
12*d9f75844SAndroid Build Coastguard Worker #define VIDEO_ENCODER_BITRATE_ADJUSTER_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/video/encoded_image.h"
17*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_bitrate_allocation.h"
18*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/video_encoder.h"
19*d9f75844SAndroid Build Coastguard Worker #include "video/encoder_overshoot_detector.h"
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker class EncoderBitrateAdjuster {
24*d9f75844SAndroid Build Coastguard Worker  public:
25*d9f75844SAndroid Build Coastguard Worker   // Size of sliding window used to track overshoot rate.
26*d9f75844SAndroid Build Coastguard Worker   static constexpr int64_t kWindowSizeMs = 3000;
27*d9f75844SAndroid Build Coastguard Worker   // Minimum number of frames since last layout change required to trust the
28*d9f75844SAndroid Build Coastguard Worker   // overshoot statistics. Otherwise falls back to default utilization.
29*d9f75844SAndroid Build Coastguard Worker   // By layout change, we mean any spatial/temporal layer being either enabled
30*d9f75844SAndroid Build Coastguard Worker   // or disabled.
31*d9f75844SAndroid Build Coastguard Worker   static constexpr size_t kMinFramesSinceLayoutChange = 30;
32*d9f75844SAndroid Build Coastguard Worker   // Default utilization, before reliable metrics are available, is set to 20%
33*d9f75844SAndroid Build Coastguard Worker   // overshoot. This is conservative so that badly misbehaving encoders don't
34*d9f75844SAndroid Build Coastguard Worker   // build too much queue at the very start.
35*d9f75844SAndroid Build Coastguard Worker   static constexpr double kDefaultUtilizationFactor = 1.2;
36*d9f75844SAndroid Build Coastguard Worker 
37*d9f75844SAndroid Build Coastguard Worker   explicit EncoderBitrateAdjuster(const VideoCodec& codec_settings);
38*d9f75844SAndroid Build Coastguard Worker   ~EncoderBitrateAdjuster();
39*d9f75844SAndroid Build Coastguard Worker 
40*d9f75844SAndroid Build Coastguard Worker   // Adjusts the given rate allocation to make it paceable within the target
41*d9f75844SAndroid Build Coastguard Worker   // rates.
42*d9f75844SAndroid Build Coastguard Worker   VideoBitrateAllocation AdjustRateAllocation(
43*d9f75844SAndroid Build Coastguard Worker       const VideoEncoder::RateControlParameters& rates);
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker   // Updated overuse detectors with data about the encoder, specifically about
46*d9f75844SAndroid Build Coastguard Worker   // the temporal layer frame rate allocation.
47*d9f75844SAndroid Build Coastguard Worker   void OnEncoderInfo(const VideoEncoder::EncoderInfo& encoder_info);
48*d9f75844SAndroid Build Coastguard Worker 
49*d9f75844SAndroid Build Coastguard Worker   // Updates the overuse detectors according to the encoded image size.
50*d9f75844SAndroid Build Coastguard Worker   void OnEncodedFrame(DataSize size, int spatial_index, int temporal_index);
51*d9f75844SAndroid Build Coastguard Worker 
52*d9f75844SAndroid Build Coastguard Worker   void Reset();
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker  private:
55*d9f75844SAndroid Build Coastguard Worker   const bool utilize_bandwidth_headroom_;
56*d9f75844SAndroid Build Coastguard Worker 
57*d9f75844SAndroid Build Coastguard Worker   VideoEncoder::RateControlParameters current_rate_control_parameters_;
58*d9f75844SAndroid Build Coastguard Worker   // FPS allocation of temporal layers, per spatial layer. Represented as a Q8
59*d9f75844SAndroid Build Coastguard Worker   // fraction; 0 = 0%, 255 = 100%. See VideoEncoder::EncoderInfo.fps_allocation.
60*d9f75844SAndroid Build Coastguard Worker   absl::InlinedVector<uint8_t, kMaxTemporalStreams>
61*d9f75844SAndroid Build Coastguard Worker       current_fps_allocation_[kMaxSpatialLayers];
62*d9f75844SAndroid Build Coastguard Worker 
63*d9f75844SAndroid Build Coastguard Worker   // Frames since layout was changed, mean that any spatial or temporal layer
64*d9f75844SAndroid Build Coastguard Worker   // was either disabled or enabled.
65*d9f75844SAndroid Build Coastguard Worker   size_t frames_since_layout_change_;
66*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<EncoderOvershootDetector>
67*d9f75844SAndroid Build Coastguard Worker       overshoot_detectors_[kMaxSpatialLayers][kMaxTemporalStreams];
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker   // Minimum bitrates allowed, per spatial layer.
70*d9f75844SAndroid Build Coastguard Worker   uint32_t min_bitrates_bps_[kMaxSpatialLayers];
71*d9f75844SAndroid Build Coastguard Worker };
72*d9f75844SAndroid Build Coastguard Worker 
73*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker #endif  // VIDEO_ENCODER_BITRATE_ADJUSTER_H_
76