|  | /* | 
|  | *  Copyright (c) 2019 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_ENCODER_BITRATE_ADJUSTER_H_ | 
|  | #define VIDEO_ENCODER_BITRATE_ADJUSTER_H_ | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "api/field_trials_view.h" | 
|  | #include "api/units/time_delta.h" | 
|  | #include "api/video/encoded_image.h" | 
|  | #include "api/video/video_bitrate_allocation.h" | 
|  | #include "api/video_codecs/video_encoder.h" | 
|  | #include "system_wrappers/include/clock.h" | 
|  | #include "video/encoder_overshoot_detector.h" | 
|  | #include "video/rate_utilization_tracker.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | class EncoderBitrateAdjuster { | 
|  | public: | 
|  | // Size of sliding window used to track overshoot rate. | 
|  | static constexpr TimeDelta kWindowSize = TimeDelta::Seconds(3); | 
|  | // Minimum number of frames since last layout change required to trust the | 
|  | // overshoot statistics. Otherwise falls back to default utilization. | 
|  | // By layout change, we mean any simulcast/spatial/temporal layer being either | 
|  | // enabled or disabled. | 
|  | static constexpr size_t kMinFramesSinceLayoutChange = 30; | 
|  | // Default utilization, before reliable metrics are available, is set to 20% | 
|  | // overshoot. This is conservative so that badly misbehaving encoders don't | 
|  | // build too much queue at the very start. | 
|  | static constexpr double kDefaultUtilizationFactor = 1.2; | 
|  |  | 
|  | EncoderBitrateAdjuster(const VideoCodec& codec_settings, | 
|  | const FieldTrialsView& field_trials, | 
|  | Clock& clock); | 
|  | ~EncoderBitrateAdjuster(); | 
|  |  | 
|  | // Adjusts the given rate allocation to make it paceable within the target | 
|  | // rates. | 
|  | VideoBitrateAllocation AdjustRateAllocation( | 
|  | const VideoEncoder::RateControlParameters& rates); | 
|  |  | 
|  | // Updated overuse detectors with data about the encoder, specifically about | 
|  | // the temporal layer frame rate allocation. | 
|  | void OnEncoderInfo(const VideoEncoder::EncoderInfo& encoder_info); | 
|  |  | 
|  | // Updates the overuse detectors according to the encoded image size. | 
|  | // `stream_index` is the spatial or simulcast index. | 
|  | // TODO(https://crbug.com/webrtc/14891): If we want to support a mix of | 
|  | // simulcast and SVC we'll also need to consider the case where we have both | 
|  | // simulcast and spatial indices. | 
|  | void OnEncodedFrame(DataSize size, int stream_index, int temporal_index); | 
|  |  | 
|  | void Reset(); | 
|  |  | 
|  | private: | 
|  | const bool utilize_bandwidth_headroom_; | 
|  | const bool use_newfangled_headroom_adjustment_; | 
|  |  | 
|  | VideoEncoder::RateControlParameters current_rate_control_parameters_; | 
|  | // FPS allocation of temporal layers, per simulcast/spatial layer. Represented | 
|  | // as a Q8 fraction; 0 = 0%, 255 = 100%. See | 
|  | // VideoEncoder::EncoderInfo.fps_allocation. | 
|  | absl::InlinedVector<uint8_t, kMaxTemporalStreams> | 
|  | current_fps_allocation_[kMaxSpatialLayers]; | 
|  |  | 
|  | // Frames since layout was changed, mean that any simulcast, spatial or | 
|  | // temporal layer was either disabled or enabled. | 
|  | size_t frames_since_layout_change_; | 
|  | std::unique_ptr<EncoderOvershootDetector> | 
|  | overshoot_detectors_[kMaxSpatialLayers][kMaxTemporalStreams]; | 
|  |  | 
|  | // Per spatial layer track of average media utilization. | 
|  | std::unique_ptr<RateUtilizationTracker> | 
|  | media_rate_trackers_[kMaxSpatialLayers]; | 
|  |  | 
|  | // Minimum bitrates allowed, per spatial layer. | 
|  | uint32_t min_bitrates_bps_[kMaxSpatialLayers]; | 
|  |  | 
|  | // Codec type used for encoding. | 
|  | VideoCodecType codec_; | 
|  |  | 
|  | // Codec mode: { kRealtimeVideo, kScreensharing }. | 
|  | VideoCodecMode codec_mode_; | 
|  |  | 
|  | Clock& clock_; | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // VIDEO_ENCODER_BITRATE_ADJUSTER_H_ |