diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a1cdf3..52a94a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- Real-ESRGAN models `realesr-general-x4v3` and `realesr-general-wdn-x4v3` (#1319). + ## [6.4.0] - 2025-01-24 ### Added - Multi-versioning to critical functions to enhance performance in generic architecture builds. -- RIFE models v4.25 and v4.26 (#1304). +- RIFE models `v4.25` and `v4.26` (#1304). - Support for processing videos without PTS information (#1278). - The feature to copy input streams' metadata to the output streams (#1282). - (Video2X Qt6) German translation (#1279). diff --git a/include/libvideo2x/filter_realesrgan.h b/include/libvideo2x/filter_realesrgan.h index df298fc..7fbaf82 100644 --- a/include/libvideo2x/filter_realesrgan.h +++ b/include/libvideo2x/filter_realesrgan.h @@ -18,6 +18,7 @@ class FilterRealesrgan : public Filter { int gpuid = 0, bool tta_mode = false, int scaling_factor = 4, + int noise_level = 0, const fsutils::StringType model_name = STR("realesr-animevideov3") ); @@ -47,6 +48,7 @@ class FilterRealesrgan : public Filter { int gpuid_; bool tta_mode_; int scaling_factor_; + int noise_level_; const fsutils::StringType model_name_; AVRational in_time_base_; AVRational out_time_base_; diff --git a/models/realesrgan/realesr-generalv3-wdn-x4.bin b/models/realesrgan/realesr-generalv3-wdn-x4.bin new file mode 100644 index 0000000..3ac4550 Binary files /dev/null and b/models/realesrgan/realesr-generalv3-wdn-x4.bin differ diff --git a/models/realesrgan/realesr-generalv3-wdn-x4.param b/models/realesrgan/realesr-generalv3-wdn-x4.param new file mode 100644 index 0000000..302664a --- /dev/null +++ b/models/realesrgan/realesr-generalv3-wdn-x4.param @@ -0,0 +1,75 @@ +7767517 +73 74 +Input data 0 1 data +Split splitncnn_input0 1 2 data data_splitncnn_0 data_splitncnn_1 +Convolution /Conv 1 1 data_splitncnn_1 /Conv_output_0 0=64 1=3 4=1 5=1 6=1728 +PReLU /PRelu 1 1 /Conv_output_0 /PRelu_output_0 0=64 +Convolution /Conv_1 1 1 /PRelu_output_0 /Conv_1_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_1 1 1 /Conv_1_output_0 /PRelu_1_output_0 0=64 +Convolution /Conv_2 1 1 /PRelu_1_output_0 /Conv_2_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_2 1 1 /Conv_2_output_0 /PRelu_2_output_0 0=64 +Convolution /Conv_3 1 1 /PRelu_2_output_0 /Conv_3_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_3 1 1 /Conv_3_output_0 /PRelu_3_output_0 0=64 +Convolution /Conv_4 1 1 /PRelu_3_output_0 /Conv_4_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_4 1 1 /Conv_4_output_0 /PRelu_4_output_0 0=64 +Convolution /Conv_5 1 1 /PRelu_4_output_0 /Conv_5_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_5 1 1 /Conv_5_output_0 /PRelu_5_output_0 0=64 +Convolution /Conv_6 1 1 /PRelu_5_output_0 /Conv_6_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_6 1 1 /Conv_6_output_0 /PRelu_6_output_0 0=64 +Convolution /Conv_7 1 1 /PRelu_6_output_0 /Conv_7_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_7 1 1 /Conv_7_output_0 /PRelu_7_output_0 0=64 +Convolution /Conv_8 1 1 /PRelu_7_output_0 /Conv_8_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_8 1 1 /Conv_8_output_0 /PRelu_8_output_0 0=64 +Convolution /Conv_9 1 1 /PRelu_8_output_0 /Conv_9_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_9 1 1 /Conv_9_output_0 /PRelu_9_output_0 0=64 +Convolution /Conv_10 1 1 /PRelu_9_output_0 /Conv_10_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_10 1 1 /Conv_10_output_0 /PRelu_10_output_0 0=64 +Convolution /Conv_11 1 1 /PRelu_10_output_0 /Conv_11_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_11 1 1 /Conv_11_output_0 /PRelu_11_output_0 0=64 +Convolution /Conv_12 1 1 /PRelu_11_output_0 /Conv_12_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_12 1 1 /Conv_12_output_0 /PRelu_12_output_0 0=64 +Convolution /Conv_13 1 1 /PRelu_12_output_0 /Conv_13_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_13 1 1 /Conv_13_output_0 /PRelu_13_output_0 0=64 +Convolution /Conv_14 1 1 /PRelu_13_output_0 /Conv_14_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_14 1 1 /Conv_14_output_0 /PRelu_14_output_0 0=64 +Convolution /Conv_15 1 1 /PRelu_14_output_0 /Conv_15_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_15 1 1 /Conv_15_output_0 /PRelu_15_output_0 0=64 +Convolution /Conv_16 1 1 /PRelu_15_output_0 /Conv_16_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_16 1 1 /Conv_16_output_0 /PRelu_16_output_0 0=64 +Convolution /Conv_17 1 1 /PRelu_16_output_0 /Conv_17_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_17 1 1 /Conv_17_output_0 /PRelu_17_output_0 0=64 +Convolution /Conv_18 1 1 /PRelu_17_output_0 /Conv_18_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_18 1 1 /Conv_18_output_0 /PRelu_18_output_0 0=64 +Convolution /Conv_19 1 1 /PRelu_18_output_0 /Conv_19_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_19 1 1 /Conv_19_output_0 /PRelu_19_output_0 0=64 +Convolution /Conv_20 1 1 /PRelu_19_output_0 /Conv_20_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_20 1 1 /Conv_20_output_0 /PRelu_20_output_0 0=64 +Convolution /Conv_21 1 1 /PRelu_20_output_0 /Conv_21_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_21 1 1 /Conv_21_output_0 /PRelu_21_output_0 0=64 +Convolution /Conv_22 1 1 /PRelu_21_output_0 /Conv_22_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_22 1 1 /Conv_22_output_0 /PRelu_22_output_0 0=64 +Convolution /Conv_23 1 1 /PRelu_22_output_0 /Conv_23_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_23 1 1 /Conv_23_output_0 /PRelu_23_output_0 0=64 +Convolution /Conv_24 1 1 /PRelu_23_output_0 /Conv_24_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_24 1 1 /Conv_24_output_0 /PRelu_24_output_0 0=64 +Convolution /Conv_25 1 1 /PRelu_24_output_0 /Conv_25_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_25 1 1 /Conv_25_output_0 /PRelu_25_output_0 0=64 +Convolution /Conv_26 1 1 /PRelu_25_output_0 /Conv_26_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_26 1 1 /Conv_26_output_0 /PRelu_26_output_0 0=64 +Convolution /Conv_27 1 1 /PRelu_26_output_0 /Conv_27_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_27 1 1 /Conv_27_output_0 /PRelu_27_output_0 0=64 +Convolution /Conv_28 1 1 /PRelu_27_output_0 /Conv_28_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_28 1 1 /Conv_28_output_0 /PRelu_28_output_0 0=64 +Convolution /Conv_29 1 1 /PRelu_28_output_0 /Conv_29_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_29 1 1 /Conv_29_output_0 /PRelu_29_output_0 0=64 +Convolution /Conv_30 1 1 /PRelu_29_output_0 /Conv_30_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_30 1 1 /Conv_30_output_0 /PRelu_30_output_0 0=64 +Convolution /Conv_31 1 1 /PRelu_30_output_0 /Conv_31_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_31 1 1 /Conv_31_output_0 /PRelu_31_output_0 0=64 +Convolution /Conv_32 1 1 /PRelu_31_output_0 /Conv_32_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_32 1 1 /Conv_32_output_0 /PRelu_32_output_0 0=64 +Convolution /Conv_33 1 1 /PRelu_32_output_0 /Conv_33_output_0 0=48 1=3 4=1 5=1 6=27648 +PixelShuffle /DepthToSpace 1 1 /Conv_33_output_0 /DepthToSpace_output_0 0=4 +Interp /Resize 1 1 data_splitncnn_0 /Resize_output_0 0=1 1=4.000000e+00 2=4.000000e+00 +BinaryOp /Add 2 1 /DepthToSpace_output_0 /Resize_output_0 /Add_output_0 +Clip /Clip 1 1 /Add_output_0 output 0=0.000000e+00 1=1.000000e+00 diff --git a/models/realesrgan/realesr-generalv3-x4.bin b/models/realesrgan/realesr-generalv3-x4.bin new file mode 100644 index 0000000..2fcd980 Binary files /dev/null and b/models/realesrgan/realesr-generalv3-x4.bin differ diff --git a/models/realesrgan/realesr-generalv3-x4.param b/models/realesrgan/realesr-generalv3-x4.param new file mode 100644 index 0000000..302664a --- /dev/null +++ b/models/realesrgan/realesr-generalv3-x4.param @@ -0,0 +1,75 @@ +7767517 +73 74 +Input data 0 1 data +Split splitncnn_input0 1 2 data data_splitncnn_0 data_splitncnn_1 +Convolution /Conv 1 1 data_splitncnn_1 /Conv_output_0 0=64 1=3 4=1 5=1 6=1728 +PReLU /PRelu 1 1 /Conv_output_0 /PRelu_output_0 0=64 +Convolution /Conv_1 1 1 /PRelu_output_0 /Conv_1_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_1 1 1 /Conv_1_output_0 /PRelu_1_output_0 0=64 +Convolution /Conv_2 1 1 /PRelu_1_output_0 /Conv_2_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_2 1 1 /Conv_2_output_0 /PRelu_2_output_0 0=64 +Convolution /Conv_3 1 1 /PRelu_2_output_0 /Conv_3_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_3 1 1 /Conv_3_output_0 /PRelu_3_output_0 0=64 +Convolution /Conv_4 1 1 /PRelu_3_output_0 /Conv_4_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_4 1 1 /Conv_4_output_0 /PRelu_4_output_0 0=64 +Convolution /Conv_5 1 1 /PRelu_4_output_0 /Conv_5_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_5 1 1 /Conv_5_output_0 /PRelu_5_output_0 0=64 +Convolution /Conv_6 1 1 /PRelu_5_output_0 /Conv_6_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_6 1 1 /Conv_6_output_0 /PRelu_6_output_0 0=64 +Convolution /Conv_7 1 1 /PRelu_6_output_0 /Conv_7_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_7 1 1 /Conv_7_output_0 /PRelu_7_output_0 0=64 +Convolution /Conv_8 1 1 /PRelu_7_output_0 /Conv_8_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_8 1 1 /Conv_8_output_0 /PRelu_8_output_0 0=64 +Convolution /Conv_9 1 1 /PRelu_8_output_0 /Conv_9_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_9 1 1 /Conv_9_output_0 /PRelu_9_output_0 0=64 +Convolution /Conv_10 1 1 /PRelu_9_output_0 /Conv_10_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_10 1 1 /Conv_10_output_0 /PRelu_10_output_0 0=64 +Convolution /Conv_11 1 1 /PRelu_10_output_0 /Conv_11_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_11 1 1 /Conv_11_output_0 /PRelu_11_output_0 0=64 +Convolution /Conv_12 1 1 /PRelu_11_output_0 /Conv_12_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_12 1 1 /Conv_12_output_0 /PRelu_12_output_0 0=64 +Convolution /Conv_13 1 1 /PRelu_12_output_0 /Conv_13_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_13 1 1 /Conv_13_output_0 /PRelu_13_output_0 0=64 +Convolution /Conv_14 1 1 /PRelu_13_output_0 /Conv_14_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_14 1 1 /Conv_14_output_0 /PRelu_14_output_0 0=64 +Convolution /Conv_15 1 1 /PRelu_14_output_0 /Conv_15_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_15 1 1 /Conv_15_output_0 /PRelu_15_output_0 0=64 +Convolution /Conv_16 1 1 /PRelu_15_output_0 /Conv_16_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_16 1 1 /Conv_16_output_0 /PRelu_16_output_0 0=64 +Convolution /Conv_17 1 1 /PRelu_16_output_0 /Conv_17_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_17 1 1 /Conv_17_output_0 /PRelu_17_output_0 0=64 +Convolution /Conv_18 1 1 /PRelu_17_output_0 /Conv_18_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_18 1 1 /Conv_18_output_0 /PRelu_18_output_0 0=64 +Convolution /Conv_19 1 1 /PRelu_18_output_0 /Conv_19_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_19 1 1 /Conv_19_output_0 /PRelu_19_output_0 0=64 +Convolution /Conv_20 1 1 /PRelu_19_output_0 /Conv_20_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_20 1 1 /Conv_20_output_0 /PRelu_20_output_0 0=64 +Convolution /Conv_21 1 1 /PRelu_20_output_0 /Conv_21_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_21 1 1 /Conv_21_output_0 /PRelu_21_output_0 0=64 +Convolution /Conv_22 1 1 /PRelu_21_output_0 /Conv_22_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_22 1 1 /Conv_22_output_0 /PRelu_22_output_0 0=64 +Convolution /Conv_23 1 1 /PRelu_22_output_0 /Conv_23_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_23 1 1 /Conv_23_output_0 /PRelu_23_output_0 0=64 +Convolution /Conv_24 1 1 /PRelu_23_output_0 /Conv_24_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_24 1 1 /Conv_24_output_0 /PRelu_24_output_0 0=64 +Convolution /Conv_25 1 1 /PRelu_24_output_0 /Conv_25_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_25 1 1 /Conv_25_output_0 /PRelu_25_output_0 0=64 +Convolution /Conv_26 1 1 /PRelu_25_output_0 /Conv_26_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_26 1 1 /Conv_26_output_0 /PRelu_26_output_0 0=64 +Convolution /Conv_27 1 1 /PRelu_26_output_0 /Conv_27_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_27 1 1 /Conv_27_output_0 /PRelu_27_output_0 0=64 +Convolution /Conv_28 1 1 /PRelu_27_output_0 /Conv_28_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_28 1 1 /Conv_28_output_0 /PRelu_28_output_0 0=64 +Convolution /Conv_29 1 1 /PRelu_28_output_0 /Conv_29_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_29 1 1 /Conv_29_output_0 /PRelu_29_output_0 0=64 +Convolution /Conv_30 1 1 /PRelu_29_output_0 /Conv_30_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_30 1 1 /Conv_30_output_0 /PRelu_30_output_0 0=64 +Convolution /Conv_31 1 1 /PRelu_30_output_0 /Conv_31_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_31 1 1 /Conv_31_output_0 /PRelu_31_output_0 0=64 +Convolution /Conv_32 1 1 /PRelu_31_output_0 /Conv_32_output_0 0=64 1=3 4=1 5=1 6=36864 +PReLU /PRelu_32 1 1 /Conv_32_output_0 /PRelu_32_output_0 0=64 +Convolution /Conv_33 1 1 /PRelu_32_output_0 /Conv_33_output_0 0=48 1=3 4=1 5=1 6=27648 +PixelShuffle /DepthToSpace 1 1 /Conv_33_output_0 /DepthToSpace_output_0 0=4 +Interp /Resize 1 1 data_splitncnn_0 /Resize_output_0 0=1 1=4.000000e+00 2=4.000000e+00 +BinaryOp /Add 2 1 /DepthToSpace_output_0 /Resize_output_0 /Add_output_0 +Clip /Clip 1 1 /Add_output_0 output 0=0.000000e+00 1=1.000000e+00 diff --git a/src/filter_realesrgan.cpp b/src/filter_realesrgan.cpp index df0febf..0e85c34 100644 --- a/src/filter_realesrgan.cpp +++ b/src/filter_realesrgan.cpp @@ -17,12 +17,14 @@ FilterRealesrgan::FilterRealesrgan( int gpuid, bool tta_mode, int scaling_factor, + int noise_level, const fsutils::StringType model_name ) : realesrgan_(nullptr), gpuid_(gpuid), tta_mode_(tta_mode), scaling_factor_(scaling_factor), + noise_level_(noise_level), model_name_(std::move(model_name)) {} FilterRealesrgan::~FilterRealesrgan() { @@ -35,10 +37,16 @@ int FilterRealesrgan::init(AVCodecContext* dec_ctx, AVCodecContext* enc_ctx, AVB std::filesystem::path model_param_path; std::filesystem::path model_bin_path; - fsutils::StringType param_file_name = - model_name_ + STR("-x") + fsutils::to_string_type(scaling_factor_) + STR(".param"); - fsutils::StringType bin_file_name = - model_name_ + STR("-x") + fsutils::to_string_type(scaling_factor_) + STR(".bin"); + fsutils::StringType param_file_name = model_name_; + fsutils::StringType bin_file_name = model_name_; + + if (model_name_ == STR("realesr-generalv3") && noise_level_ > 0) { + param_file_name += STR("-wdn"); + bin_file_name += STR("-wdn"); + } + + param_file_name += STR("-x") + fsutils::to_string_type(scaling_factor_) + STR(".param"); + bin_file_name += STR("-x") + fsutils::to_string_type(scaling_factor_) + STR(".bin"); // Find the model paths by model name if provided model_param_path = std::filesystem::path(STR("models")) / STR("realesrgan") / param_file_name; diff --git a/src/processor_factory.cpp b/src/processor_factory.cpp index 5c120cc..ae5652f 100644 --- a/src/processor_factory.cpp +++ b/src/processor_factory.cpp @@ -91,6 +91,7 @@ void ProcessorFactory::init_default_processors(ProcessorFactory& factory) { static_cast(vk_device_index), config.tta_mode, proc_cfg.scaling_factor, + proc_cfg.noise_level, config.model_name ); } diff --git a/tools/video2x/src/argparse.cpp b/tools/video2x/src/argparse.cpp index 2c3eec6..45b6540 100644 --- a/tools/video2x/src/argparse.cpp +++ b/tools/video2x/src/argparse.cpp @@ -156,23 +156,23 @@ int parse_args( "anime4k-v4-b, anime4k-v4-b+b, anime4k-v4-c, anime4k-v4-c+a, anime4k-v4.1-gan)") ; - po::options_description realesrgan_opts("RealESRGAN options"); + po::options_description realesrgan_opts("Real-ESRGAN options"); realesrgan_opts.add_options() ("realesrgan-model", PO_STR_VALUE() ->default_value(STR("realesr-animevideov3"), "realesr-animevideov3") ->notifier(validate_realesrgan_model_name), - "Name of the RealESRGAN model to use (realesr-animevideov3, realesrgan-plus-anime, " - "realesrgan-plus)") + "Name of the Real-ESRGAN model to use (realesr-animevideov3, " + "realesrgan-plus-anime, realesrgan-plus, realesr-generalv3)") ; - po::options_description realcugan_opts("RealCUGAN options"); + po::options_description realcugan_opts("Real-CUGAN options"); realcugan_opts.add_options() ("realcugan-model", PO_STR_VALUE() ->default_value(STR("models-se"), "models-se") ->notifier(validate_realcugan_model_name), - "Name of the RealCUGAN model to use (models-nose, models-pro, models-se)") + "Name of the Real-CUGAN model to use (models-nose, models-pro, models-se)") ("realcugan-threads", po::value()->default_value(1), - "Number of threads to use for RealCUGAN") + "Number of threads to use for Real-CUGAN") ("realcugan-syncgap", po::value()->default_value(3), "Sync gap mode; 0:no sync, 1: accurate sync: 2 = rough sync, 3: very rough sync") ; @@ -212,7 +212,7 @@ int parse_args( << " video2x -i input.mp4 -o output.mp4 -w 3840 -h 2160 \\" << std::endl << " -p libplacebo --libplacebo-shader anime4k-v4-a+a" << std::endl << std::endl - << " Upscale a film by 4x using RealESRGAN with custom encoder options:" + << " Upscale a film by 4x using Real-ESRGAN with custom encoder options:" << std::endl << " video2x -i input.mkv -o output.mkv -s 4 \\" << std::endl << " -p realesrgan --realesrgan-model realesrgan-plus \\" << std::endl @@ -385,16 +385,19 @@ int parse_args( } case video2x::processors::ProcessorType::RealESRGAN: { if (!vm.count("realesrgan-model")) { - video2x::logger()->critical("RealESRGAN model name must be set for RealESRGAN." - ); + video2x::logger()->critical("The model name must be set for Real-ESRGAN."); return -1; } if (proc_cfg.scaling_factor < 2 || proc_cfg.scaling_factor > 4) { video2x::logger()->critical( - "Scaling factor must be set to 2, 3, or 4 for RealESRGAN." + "Scaling factor must be set to 2, 3, or 4 for Real-ESRGAN." ); return -1; } + if (proc_cfg.noise_level < 0 || proc_cfg.noise_level > 1) { + video2x::logger()->critical("Noise level must be 0 or 1 for Real-ESRGAN."); + return -1; + } proc_cfg.processor_type = video2x::processors::ProcessorType::RealESRGAN; video2x::processors::RealESRGANConfig realesrgan_config; @@ -406,31 +409,31 @@ int parse_args( } case video2x::processors::ProcessorType::RealCUGAN: { if (!vm.count("realcugan-model")) { - video2x::logger()->critical("RealCUGAN model name must be set for RealCUGAN."); + video2x::logger()->critical("The model name must be set for Real-CUGAN."); return -1; } if (vm.count("realcugan-threads") && vm["realcugan-threads"].as() < 1) { video2x::logger()->critical( - "Number of threads must be at least 1 for RealCUGAN." + "Number of threads must be at least 1 for Real-CUGAN." ); return -1; } if (vm.count("realcugan-syncgap") && (vm["realcugan-syncgap"].as() < 0 || vm["realcugan-syncgap"].as() > 3)) { video2x::logger()->critical( - "Sync gap mode must be set to 0, 1, 2, or 3 for RealCUGAN." + "Sync gap mode must be set to 0, 1, 2, or 3 for Real-CUGAN." ); return -1; } if (proc_cfg.scaling_factor < 2 || proc_cfg.scaling_factor > 4) { video2x::logger()->critical( - "Scaling factor must be set to 2, 3, or 4 for RealCUGAN." + "Scaling factor must be set to 2, 3, or 4 for Real-CUGAN." ); return -1; } if (proc_cfg.noise_level < -1 || proc_cfg.noise_level > 3) { video2x::logger()->critical( - "Noise level must be set to -1, 0, 1, 2, or 3 for RealCUGAN." + "Noise level must be set to -1, 0, 1, 2, or 3 for Real-CUGAN." ); return -1; } @@ -447,7 +450,7 @@ int parse_args( } case video2x::processors::ProcessorType::RIFE: { if (!vm.count("rife-model")) { - video2x::logger()->critical("RIFE model name must be set for RIFE."); + video2x::logger()->critical("The model name must be set for RIFE."); return -1; } if (proc_cfg.frm_rate_mul < 2) { diff --git a/tools/video2x/src/validators.cpp b/tools/video2x/src/validators.cpp index d6293d0..8e2908a 100644 --- a/tools/video2x/src/validators.cpp +++ b/tools/video2x/src/validators.cpp @@ -24,7 +24,10 @@ void validate_anime4k_shader_name(const video2x::fsutils::StringType& shader_nam void validate_realesrgan_model_name(const video2x::fsutils::StringType& model_name) { static const std::unordered_set valid_realesrgan_models = { - STR("realesrgan-plus"), STR("realesrgan-plus-anime"), STR("realesr-animevideov3") + STR("realesrgan-plus"), + STR("realesrgan-plus-anime"), + STR("realesr-animevideov3"), + STR("realesr-generalv3"), }; if (valid_realesrgan_models.count(model_name) == 0) { throw po::validation_error(