| /* | 
 |  *  Copyright (c) 2024 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 VIDEO_QUALITY_CONVERGENCE_MONITOR_H_ | 
 | #define VIDEO_QUALITY_CONVERGENCE_MONITOR_H_ | 
 |  | 
 | #include <deque> | 
 | #include <memory> | 
 |  | 
 | #include "api/field_trials_view.h" | 
 | #include "api/video/video_codec_type.h" | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | class QualityConvergenceMonitor { | 
 |  public: | 
 |   struct Parameters { | 
 |     // Static QP threshold. No history or even refresh-frame requirements to | 
 |     // determine that target quality is reached if the QP value is at or below | 
 |     // this threshold. | 
 |     int static_qp_threshold = 0; | 
 |  | 
 |     // Determines if the dynamic threshold should be used for refresh frames. | 
 |     bool dynamic_detection_enabled = false; | 
 |  | 
 |     // Window lengths of QP values to use when determining if refresh frames | 
 |     // have reached the target quality. The combined window length is | 
 |     // `past_window_length` + `recent_window_length`. The recent part of the | 
 |     // window contains the most recent samples. Once the recent buffer reaches | 
 |     // this length, new samples will pop the oldest samples in recent and move | 
 |     // them to the past buffer. The average of `QP_past` must be equal to or | 
 |     // less than the average of `QP_recent` to determine that target quality is | 
 |     // reached. See the implementation in `AddSample()`. | 
 |     size_t recent_window_length = 0; | 
 |     size_t past_window_length = 0; | 
 |  | 
 |     // During dynamic detection, the average of `QP_past` must be less than or | 
 |     // equal to this threshold to determine that target quality is reached. | 
 |     int dynamic_qp_threshold = 0; | 
 |   }; | 
 |  | 
 |   explicit QualityConvergenceMonitor(const Parameters& params); | 
 |  | 
 |   static std::unique_ptr<QualityConvergenceMonitor> Create( | 
 |       int static_qp_threshold, | 
 |       VideoCodecType codec, | 
 |       const FieldTrialsView& trials); | 
 |  | 
 |   // Add the supplied `qp` value to the detection window. | 
 |   // `is_refresh_frame` must only be `true` if the corresponding | 
 |   // video frame is a refresh frame that is used to improve the visual quality. | 
 |   void AddSample(int qp, bool is_refresh_frame); | 
 |  | 
 |   // Returns `true` if the algorithm has determined that the supplied QP values | 
 |   // have converged and reached the target quality. | 
 |   bool AtTargetQuality() const; | 
 |  | 
 |   // Used in tests to verify that default values and field trials are set | 
 |   // correctly. | 
 |   Parameters GetParametersForTesting() const { return params_; } | 
 |  | 
 |  private: | 
 |   const Parameters params_; | 
 |   bool at_target_quality_ = false; | 
 |  | 
 |   // Contains a window of QP values. New values are added at the back while old | 
 |   // values are popped from the front to maintain the configured window length. | 
 |   std::deque<int> qp_window_; | 
 | }; | 
 |  | 
 | }  // namespace webrtc | 
 |  | 
 | #endif  // VIDEO_QUALITY_CONVERGENCE_MONITOR_H_ |