|  | /* | 
|  | *  Copyright 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 RTC_BASE_EXPERIMENTS_BALANCED_DEGRADATION_SETTINGS_H_ | 
|  | #define RTC_BASE_EXPERIMENTS_BALANCED_DEGRADATION_SETTINGS_H_ | 
|  |  | 
|  | #include <optional> | 
|  | #include <vector> | 
|  |  | 
|  | #include "api/field_trials_view.h" | 
|  | #include "api/video_codecs/video_encoder.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | class BalancedDegradationSettings { | 
|  | public: | 
|  | static constexpr int kNoFpsDiff = -100; | 
|  |  | 
|  | BalancedDegradationSettings(const FieldTrialsView& field_trials); | 
|  | ~BalancedDegradationSettings(); | 
|  |  | 
|  | struct CodecTypeSpecific { | 
|  | CodecTypeSpecific() {} | 
|  | CodecTypeSpecific(int qp_low, int qp_high, int fps, int kbps, int kbps_res) | 
|  | : qp_low(qp_low), | 
|  | qp_high(qp_high), | 
|  | fps(fps), | 
|  | kbps(kbps), | 
|  | kbps_res(kbps_res) {} | 
|  |  | 
|  | bool operator==(const CodecTypeSpecific& o) const { | 
|  | return qp_low == o.qp_low && qp_high == o.qp_high && fps == o.fps && | 
|  | kbps == o.kbps && kbps_res == o.kbps_res; | 
|  | } | 
|  |  | 
|  | std::optional<int> GetQpLow() const; | 
|  | std::optional<int> GetQpHigh() const; | 
|  | std::optional<int> GetFps() const; | 
|  | std::optional<int> GetKbps() const; | 
|  | std::optional<int> GetKbpsRes() const; | 
|  |  | 
|  | // Optional settings. | 
|  | int qp_low = 0; | 
|  | int qp_high = 0; | 
|  | int fps = 0;       // If unset, defaults to `fps` in Config. | 
|  | int kbps = 0;      // If unset, defaults to `kbps` in Config. | 
|  | int kbps_res = 0;  // If unset, defaults to `kbps_res` in Config. | 
|  | }; | 
|  |  | 
|  | struct Config { | 
|  | Config(); | 
|  | Config(int pixels, | 
|  | int fps, | 
|  | int kbps, | 
|  | int kbps_res, | 
|  | int fps_diff, | 
|  | CodecTypeSpecific vp8, | 
|  | CodecTypeSpecific vp9, | 
|  | CodecTypeSpecific h264, | 
|  | CodecTypeSpecific av1, | 
|  | CodecTypeSpecific generic); | 
|  |  | 
|  | bool operator==(const Config& o) const { | 
|  | return pixels == o.pixels && fps == o.fps && kbps == o.kbps && | 
|  | kbps_res == o.kbps_res && fps_diff == o.fps_diff && vp8 == o.vp8 && | 
|  | vp9 == o.vp9 && h264 == o.h264 && av1 == o.av1 && | 
|  | generic == o.generic; | 
|  | } | 
|  |  | 
|  | // Example: | 
|  | // WebRTC-Video-BalancedDegradationSettings/pixels:100|200|300,fps:5|15|25/ | 
|  | // pixels <= 100 -> min framerate: 5 fps | 
|  | // pixels <= 200 -> min framerate: 15 fps | 
|  | // pixels <= 300 -> min framerate: 25 fps | 
|  | // | 
|  | // WebRTC-Video-BalancedDegradationSettings/pixels:100|200|300, | 
|  | // fps:5|15|25,       // Min framerate. | 
|  | // kbps:0|60|70,      // Min bitrate needed to adapt up. | 
|  | // kbps_res:0|65|75/  // Min bitrate needed to adapt up in resolution. | 
|  | // | 
|  | // pixels: fps:  kbps:     kbps_res: | 
|  | // 300     30    -         - | 
|  | // 300     25    70 kbps   75 kbps | 
|  | // 200     25    70 kbps   - | 
|  | // 200     15    60 kbps   65 kbps | 
|  | // 100     15    60 kbps   - | 
|  | // 100      5 | 
|  | //               optional  optional | 
|  |  | 
|  | int pixels = 0;  // Video frame size. | 
|  | // If the frame size is less than or equal to `pixels`: | 
|  | int fps = 0;       // Min framerate to be used. | 
|  | int kbps = 0;      // Min bitrate needed to adapt up (resolution/fps). | 
|  | int kbps_res = 0;  // Min bitrate needed to adapt up in resolution. | 
|  | int fps_diff = kNoFpsDiff;  // Min fps reduction needed (input fps - `fps`) | 
|  | // w/o triggering a new subsequent downgrade | 
|  | // check. | 
|  | CodecTypeSpecific vp8; | 
|  | CodecTypeSpecific vp9; | 
|  | CodecTypeSpecific h264; | 
|  | CodecTypeSpecific av1; | 
|  | CodecTypeSpecific generic; | 
|  | }; | 
|  |  | 
|  | // Returns configurations from field trial on success (default on failure). | 
|  | std::vector<Config> GetConfigs() const; | 
|  |  | 
|  | // Gets the min/max framerate from `configs_` based on `pixels`. | 
|  | int MinFps(VideoCodecType type, int pixels) const; | 
|  | int MaxFps(VideoCodecType type, int pixels) const; | 
|  |  | 
|  | // Checks if quality can be increased based on `pixels` and `bitrate_bps`. | 
|  | bool CanAdaptUp(VideoCodecType type, int pixels, uint32_t bitrate_bps) const; | 
|  | bool CanAdaptUpResolution(VideoCodecType type, | 
|  | int pixels, | 
|  | uint32_t bitrate_bps) const; | 
|  |  | 
|  | // Gets the min framerate diff from `configs_` based on `pixels`. | 
|  | std::optional<int> MinFpsDiff(int pixels) const; | 
|  |  | 
|  | // Gets QpThresholds for the codec `type` based on `pixels`. | 
|  | std::optional<VideoEncoder::QpThresholds> GetQpThresholds(VideoCodecType type, | 
|  | int pixels) const; | 
|  |  | 
|  | private: | 
|  | std::optional<Config> GetMinFpsConfig(int pixels) const; | 
|  | std::optional<Config> GetMaxFpsConfig(int pixels) const; | 
|  | Config GetConfig(int pixels) const; | 
|  |  | 
|  | std::vector<Config> configs_; | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // RTC_BASE_EXPERIMENTS_BALANCED_DEGRADATION_SETTINGS_H_ |