| /* | 
 |  *  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_ |