feat(libvideo2x): add optimization for scene detection
Some checks failed
Build / ubuntu (push) Has been cancelled
Build / windows (push) Has been cancelled
Build / container (push) Has been cancelled

Signed-off-by: k4yt3x <i@k4yt3x.com>
This commit is contained in:
k4yt3x 2024-12-12 00:00:00 +00:00
parent 0e00aca401
commit ca5044f09c
No known key found for this signature in database
4 changed files with 8 additions and 9 deletions

View File

@ -19,7 +19,6 @@ struct EncoderConfig {
bool copy_streams = true; bool copy_streams = true;
// Basic video options // Basic video options
int frm_rate_mul = 0;
AVPixelFormat pix_fmt = AV_PIX_FMT_NONE; AVPixelFormat pix_fmt = AV_PIX_FMT_NONE;
// Rate control and compression // Rate control and compression
@ -59,6 +58,7 @@ class Encoder {
EncoderConfig &enc_cfg, EncoderConfig &enc_cfg,
int width, int width,
int height, int height,
int frm_rate_mul,
int in_vstream_idx int in_vstream_idx
); );

View File

@ -35,6 +35,7 @@ int Encoder::init(
EncoderConfig &enc_cfg, EncoderConfig &enc_cfg,
int width, int width,
int height, int height,
int frm_rate_mul,
int in_vstream_idx int in_vstream_idx
) { ) {
int ret; int ret;
@ -123,9 +124,9 @@ int Encoder::init(
spdlog::debug("Auto-selected pixel format: {}", av_get_pix_fmt_name(enc_ctx_->pix_fmt)); spdlog::debug("Auto-selected pixel format: {}", av_get_pix_fmt_name(enc_ctx_->pix_fmt));
} }
if (enc_cfg.frm_rate_mul > 0) { if (frm_rate_mul > 0) {
AVRational in_frame_rate = get_video_frame_rate(ifmt_ctx, in_vstream_idx); AVRational in_frame_rate = get_video_frame_rate(ifmt_ctx, in_vstream_idx);
enc_ctx_->framerate = {in_frame_rate.num * enc_cfg.frm_rate_mul, in_frame_rate.den}; enc_ctx_->framerate = {in_frame_rate.num * frm_rate_mul, in_frame_rate.den};
enc_ctx_->time_base = av_inv_q(enc_ctx_->framerate); enc_ctx_->time_base = av_inv_q(enc_ctx_->framerate);
} else { } else {
// Set the output video's time base // Set the output video's time base

View File

@ -93,9 +93,6 @@ int VideoProcessor::process(
return handle_error(-1, "Failed to determine the output dimensions"); return handle_error(-1, "Failed to determine the output dimensions");
} }
// Update encoder frame rate multiplier
enc_cfg_.frm_rate_mul = proc_cfg_.frm_rate_mul;
// Initialize the encoder // Initialize the encoder
Encoder encoder; Encoder encoder;
ret = encoder.init( ret = encoder.init(
@ -106,6 +103,7 @@ int VideoProcessor::process(
enc_cfg_, enc_cfg_,
output_width, output_width,
output_height, output_height,
proc_cfg_.frm_rate_mul,
in_vstream_idx in_vstream_idx
); );
if (ret < 0) { if (ret < 0) {
@ -389,7 +387,7 @@ int VideoProcessor::process_interpolation(
// Check if a scene change is detected // Check if a scene change is detected
bool skip_frame = false; bool skip_frame = false;
if (prev_frame.get() != nullptr) { if (proc_cfg_.scn_det_thresh < 100.0 && prev_frame.get() != nullptr) {
float frame_diff = get_frame_diff(prev_frame.get(), frame); float frame_diff = get_frame_diff(prev_frame.get(), frame);
if (frame_diff > proc_cfg_.scn_det_thresh) { if (frame_diff > proc_cfg_.scn_det_thresh) {
spdlog::debug( spdlog::debug(

View File

@ -137,9 +137,9 @@ int parse_args(
("frame-rate-mul,m", po::value<int>(&proc_cfg.frm_rate_mul) ("frame-rate-mul,m", po::value<int>(&proc_cfg.frm_rate_mul)
->notifier([](int v) { validate_min(v, "frame-rate-mul", 2); }), ->notifier([](int v) { validate_min(v, "frame-rate-mul", 2); }),
"Frame rate multiplier") "Frame rate multiplier")
("scene-thresh,t", po::value<float>(&proc_cfg.scn_det_thresh)->default_value(20.0f) ("scene-thresh,t", po::value<float>(&proc_cfg.scn_det_thresh)->default_value(100.0f)
->notifier([](float v) { validate_range<float>(v, "scene-thresh", 0.0, 100.0); }), ->notifier([](float v) { validate_range<float>(v, "scene-thresh", 0.0, 100.0); }),
"Scene detection threshold") "Scene detection threshold (20 means 20% diff between frames is a scene change)")
; ;
po::options_description libplacebo_opts("libplacebo options"); po::options_description libplacebo_opts("libplacebo options");