mirror of
https://github.com/k4yt3x/video2x.git
synced 2024-12-27 14:39:09 +00:00
feat(libvideo2x): add optimization for scene detection
Signed-off-by: k4yt3x <i@k4yt3x.com>
This commit is contained in:
parent
0e00aca401
commit
ca5044f09c
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user