blob: 326372db43dd05cd7b711f1d2553afdce38d92cf [file] [log] [blame]
/*
* 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_