blob: acd28bbfc2be2b77bb5d10315237e6c48590736a [file]
/*
* Copyright (c) 2025 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 API_VIDEO_CORRUPTION_DETECTION_CORRUPTION_DETECTION_SETTINGS_GENERATOR_H_
#define API_VIDEO_CORRUPTION_DETECTION_CORRUPTION_DETECTION_SETTINGS_GENERATOR_H_
#include <optional>
#include <variant>
#include "api/video/corruption_detection/corruption_detection_filter_settings.h"
namespace webrtc {
class CorruptionDetectionSettingsGenerator {
public:
// A struct with the parameters for a ration function used to determine the
// standard deviation as function of the qp. It has the form f(qp) =
// (-numerator_factor * qp) / (denumerator_term + qp) + offset.
struct RationalFunctionParameters {
double numerator_factor = 0.0;
double denumerator_term = 0.0;
double offset = 0.0;
};
// A struct with the parameters for an exponential function used to determine
// the standard deviation as a function of the qp. It has the form f(qp) =
// scale * std::exp(exponent_factor * qp - exponent_offset).
struct ExponentialFunctionParameters {
double scale = 0.0;
double exponent_factor = 0.0;
double exponent_offset = 0.0;
};
// Allowed error thresholds for luma (Y) and chroma (UV) channels.
struct ErrorThresholds {
int luma = 0;
int chroma = 0;
};
// Settings relating to transient events like key-frames.
struct TransientParameters {
// The max qp for the codec in use (e.g. 255 for AV1).
int max_qp = 0;
// Temporary increase to error thresholds on keyframes.
int keyframe_threshold_offset = 0;
// Temporary increase to std dev on keyframes.
double keyframe_stddev_offset = 0.0;
// Fade-out time (in frames) for temporary keyframe offsets.
int keyframe_offset_duration_frames = 0;
// How many QP points count as a "large change", or 0 to disable.
// A large change will trigger the same compensation as a keyframe.
int large_qp_change_threshold = 0;
// Don't use a filter kernel smaller than this.
double std_dev_lower_bound = 0.0;
};
CorruptionDetectionSettingsGenerator(
const RationalFunctionParameters& function_params,
const ErrorThresholds& default_error_thresholds,
const TransientParameters& transient_params);
CorruptionDetectionSettingsGenerator(
const ExponentialFunctionParameters& function_params,
const ErrorThresholds& default_error_thresholds,
const TransientParameters& transient_params);
CorruptionDetectionFilterSettings OnFrame(bool is_keyframe, int qp);
private:
double CalculateStdDev(int qp) const;
const std::variant<RationalFunctionParameters, ExponentialFunctionParameters>
function_params_;
const ErrorThresholds error_thresholds_;
const TransientParameters transient_params_;
int frames_since_keyframe_;
std::optional<int> previous_qp_;
};
} // namespace webrtc
#endif // API_VIDEO_CORRUPTION_DETECTION_CORRUPTION_DETECTION_SETTINGS_GENERATOR_H_