80 lines
3 KiB
C++
80 lines
3 KiB
C++
/*
|
|
* 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_
|