// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_BASE_VIDEO_BITRATE_ALLOCATION_H_ #define MEDIA_BASE_VIDEO_BITRATE_ALLOCATION_H_ #include #include #include #include "media/base/bitrate.h" #include "media/base/media_export.h" namespace media { // Class that describes how video bitrate, in bps, is allocated across temporal // and spatial layers. Note that bitrates are NOT cumulative. Depending on if // layers are dependent or not, it is up to the user to aggregate. class MEDIA_EXPORT VideoBitrateAllocation { public: static constexpr size_t kMaxSpatialLayers = 5; static constexpr size_t kMaxTemporalLayers = 4; explicit VideoBitrateAllocation( Bitrate::Mode mode = Bitrate::Mode::kConstant); ~VideoBitrateAllocation() = default; // Returns true iff. the bitrate was set (sum within uint32_t max value). If // a variable bitrate is used and the previous peak bitrate was below the new // sum of bitrates across layers, this will automatically set the new peak to // equal the new sum. If you have a signed or 64-bit value you want to use as // input, you must explicitly convert to uint32_t before calling. This is // intended to prevent implicit and unsafe type conversion. bool SetBitrate(size_t spatial_index, size_t temporal_index, uint32_t bitrate_bps); // Deleted variants: you must SAFELY convert to uint32_t before calling. // See base/numerics/safe_conversions.h for functions to safely convert // between types. bool SetBitrate(size_t spatial_index, size_t temporal_index, int32_t bitrate_bps) = delete; bool SetBitrate(size_t spatial_index, size_t temporal_index, int64_t bitrate_bps) = delete; bool SetBitrate(size_t spatial_index, size_t temporal_index, uint64_t bitrate_bps) = delete; // True iff. this bitrate allocation can have its peak set to |peak_bps| (the // peak must be greater than the sum of the layers' bitrates, and the bitrate // mode must be variable bitrate). bool SetPeakBps(uint32_t peak_bps); // Returns the bitrate for specified spatial/temporal index, or 0 if not set. uint32_t GetBitrateBps(size_t spatial_index, size_t temporal_index) const; // Sum of all bitrates. uint32_t GetSumBps() const; // Non-layered bitrate allocation. If there are layers, this bitrate's target // bps equals the sum of the layers' bitrates. const Bitrate GetSumBitrate() const; // Returns the encoding rate control mode of this allocation. Bitrate::Mode GetMode() const; std::string ToString() const; bool operator==(const VideoBitrateAllocation& other) const; inline bool operator!=(const VideoBitrateAllocation& other) const { return !(*this == other); } private: // A bitrate representing a cached sum of the elements of |bitrates_|, for // performance. Bitrate sum_bitrate_; uint32_t bitrates_[kMaxSpatialLayers][kMaxTemporalLayers] = {}; }; } // namespace media #endif // MEDIA_BASE_VIDEO_BITRATE_ALLOCATION_H_