/* * Copyright (c) 2018 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 MODULES_VIDEO_CODING_SVC_SVC_RATE_ALLOCATOR_H_ #define MODULES_VIDEO_CODING_SVC_SVC_RATE_ALLOCATOR_H_ #include #include #include "absl/container/inlined_vector.h" #include "api/field_trials_view.h" #include "api/units/data_rate.h" #include "api/video/video_bitrate_allocation.h" #include "api/video/video_bitrate_allocator.h" #include "api/video/video_codec_constants.h" #include "api/video_codecs/video_codec.h" #include "rtc_base/experiments/stable_target_rate_experiment.h" namespace webrtc { class SvcRateAllocator : public VideoBitrateAllocator { public: [[deprecated]] explicit SvcRateAllocator(const VideoCodec& codec); SvcRateAllocator(const VideoCodec& codec, const FieldTrialsView& field_trials); VideoBitrateAllocation Allocate( VideoBitrateAllocationParameters parameters) override; static DataRate GetMaxBitrate(const VideoCodec& codec); static DataRate GetPaddingBitrate(const VideoCodec& codec); static absl::InlinedVector GetLayerStartBitrates( const VideoCodec& codec); private: struct NumLayers { size_t spatial = 1; size_t temporal = 1; }; static NumLayers GetNumLayers(const VideoCodec& codec); std::vector DistributeAllocationToSpatialLayersNormalVideo( DataRate total_bitrate, size_t first_active_layer, size_t num_spatial_layers) const; std::vector DistributeAllocationToSpatialLayersScreenSharing( DataRate total_bitrate, size_t first_active_layer, size_t num_spatial_layers) const; // Returns the number of layers that are active and have enough bitrate to // actually be enabled. size_t FindNumEnabledLayers(DataRate target_rate) const; const VideoCodec codec_; const NumLayers num_layers_; const StableTargetRateExperiment experiment_settings_; const absl::InlinedVector cumulative_layer_start_bitrates_; size_t last_active_layer_count_; }; } // namespace webrtc #endif // MODULES_VIDEO_CODING_SVC_SVC_RATE_ALLOCATOR_H_