1 /* 2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_VIDEO_VIDEO_BITRATE_ALLOCATION_H_ 12 #define API_VIDEO_VIDEO_BITRATE_ALLOCATION_H_ 13 14 #include <stddef.h> 15 #include <stdint.h> 16 17 #include <limits> 18 #include <string> 19 #include <vector> 20 21 #include "absl/types/optional.h" 22 #include "api/video/video_codec_constants.h" 23 #include "rtc_base/system/rtc_export.h" 24 25 namespace webrtc { 26 27 // Class that describes how video bitrate, in bps, is allocated across temporal 28 // and spatial layers. Not that bitrates are NOT cumulative. Depending on if 29 // layers are dependent or not, it is up to the user to aggregate. 30 // For each index, the bitrate can also both set and unset. This is used with a 31 // set bps = 0 to signal an explicit "turn off" signal. 32 class RTC_EXPORT VideoBitrateAllocation { 33 public: 34 static constexpr uint32_t kMaxBitrateBps = 35 std::numeric_limits<uint32_t>::max(); 36 VideoBitrateAllocation(); 37 38 bool SetBitrate(size_t spatial_index, 39 size_t temporal_index, 40 uint32_t bitrate_bps); 41 42 bool HasBitrate(size_t spatial_index, size_t temporal_index) const; 43 44 uint32_t GetBitrate(size_t spatial_index, size_t temporal_index) const; 45 46 // Whether the specific spatial layers has the bitrate set in any of its 47 // temporal layers. 48 bool IsSpatialLayerUsed(size_t spatial_index) const; 49 50 // Get the sum of all the temporal layer for a specific spatial layer. 51 uint32_t GetSpatialLayerSum(size_t spatial_index) const; 52 53 // Sum of bitrates of temporal layers, from layer 0 to `temporal_index` 54 // inclusive, of specified spatial layer `spatial_index`. Bitrates of lower 55 // spatial layers are not included. 56 uint32_t GetTemporalLayerSum(size_t spatial_index, 57 size_t temporal_index) const; 58 59 // Returns a vector of the temporal layer bitrates for the specific spatial 60 // layer. Length of the returned vector is cropped to the highest temporal 61 // layer with a defined bitrate. 62 std::vector<uint32_t> GetTemporalLayerAllocation(size_t spatial_index) const; 63 64 // Returns one VideoBitrateAllocation for each spatial layer. This is used to 65 // configure simulcast streams. Note that the length of the returned vector is 66 // always kMaxSpatialLayers, the optional is unset for unused layers. 67 std::vector<absl::optional<VideoBitrateAllocation>> GetSimulcastAllocations() 68 const; 69 get_sum_bps()70 uint32_t get_sum_bps() const { return sum_; } // Sum of all bitrates. get_sum_kbps()71 uint32_t get_sum_kbps() const { 72 // Round down to not exceed the allocated bitrate. 73 return sum_ / 1000; 74 } 75 76 bool operator==(const VideoBitrateAllocation& other) const; 77 inline bool operator!=(const VideoBitrateAllocation& other) const { 78 return !(*this == other); 79 } 80 81 std::string ToString() const; 82 83 // Indicates if the allocation has some layers/streams disabled due to 84 // low available bandwidth. set_bw_limited(bool limited)85 void set_bw_limited(bool limited) { is_bw_limited_ = limited; } is_bw_limited()86 bool is_bw_limited() const { return is_bw_limited_; } 87 88 private: 89 uint32_t sum_; 90 absl::optional<uint32_t> bitrates_[kMaxSpatialLayers][kMaxTemporalStreams]; 91 bool is_bw_limited_; 92 }; 93 94 } // namespace webrtc 95 96 #endif // API_VIDEO_VIDEO_BITRATE_ALLOCATION_H_ 97