From efaa1cd530cbb1e1fc29faacc3fa9655a01fd464 Mon Sep 17 00:00:00 2001 From: Jukka Tastula Date: Fri, 18 Sep 2026 21:15:18 +0300 Subject: [PATCH 1/2] videoEncoder/ffNvEnc: untangle profiles and tunes, remove ancient limitations --- .../ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp | 95 ++++++++++--------- .../ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h | 63 ++++++------ .../ADM_videoEncoder/ffNvEnc/ffnvenc.conf | 1 + .../ADM_videoEncoder/ffNvEnc/ffnvenc.h | 1 + .../ADM_videoEncoder/ffNvEnc/ffnvenc_desc.cpp | 1 + .../ADM_videoEncoder/ffNvEnc/ffnvenc_json.cpp | 1 + 6 files changed, 86 insertions(+), 76 deletions(-) diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp index 6b29a98375..13674fc693 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp @@ -62,25 +62,18 @@ bool ADM_ffNvEncEncoder::configureContext(void) switch(NvEncSettings.preset) { -#define MIAOU(x,y) case NV_FF_PRESET_##x: av_dict_set(&_options,"preset",y,0); break; - MIAOU(DEFAULT,"default") - MIAOU(SLOW,"slow") - MIAOU(MEDIUM,"medium") - MIAOU(FAST,"fast") - MIAOU(HP,"hp") - MIAOU(HQ,"hq") - MIAOU(BD,"bd") - MIAOU(LL,"ll") - MIAOU(LLHP,"llhp") - MIAOU(LLHQ,"llhq") - MIAOU(LOSSLESS,"lossless") - MIAOU(LOSSLESSHP,"losslesshp") - default:break; -#undef MIAOU + case NV_FF_PRESET_P1: av_dict_set(&_options,"preset","p1",0); break; + case NV_FF_PRESET_P2: av_dict_set(&_options,"preset","p2",0); break; + case NV_FF_PRESET_P3: av_dict_set(&_options,"preset","p3",0); break; + case NV_FF_PRESET_P4: av_dict_set(&_options,"preset","p4",0); break; + case NV_FF_PRESET_P5: av_dict_set(&_options,"preset","p5",0); break; + case NV_FF_PRESET_P6: av_dict_set(&_options,"preset","p6",0); break; + case NV_FF_PRESET_P7: av_dict_set(&_options,"preset","p7",0); break; + default: av_dict_set(&_options,"preset","p4",0); break; } _context->gop_size = NvEncSettings.gopsize; - _context->refs = (NvEncSettings.b_ref_mode != NV_FF_BFRAME_REF_EACH)? NvEncSettings.refs : 0; // avoid encoding failure and hang in ff_nvenc_encode_close() + _context->refs = NvEncSettings.refs; _context->max_b_frames = #ifdef H265_ENCODER NvEncSettings.bframes; @@ -95,11 +88,7 @@ bool ADM_ffNvEncEncoder::configureContext(void) case NV_FF_BFRAME_REF_DISABLED: break; case NV_FF_BFRAME_REF_EACH: -#ifdef H265_ENCODER av_dict_set(&_options,"b_ref_mode","each",0); -#else - ADM_warning("b_ref_mode %u (\"each\") is invalid for h264_nvenc, ignoring.\n",NvEncSettings.b_ref_mode); -#endif break; case NV_FF_BFRAME_REF_MIDDLE: av_dict_set(&_options,"b_ref_mode","middle",0); @@ -155,6 +144,17 @@ bool ADM_ffNvEncEncoder::configureContext(void) #undef MIAOU }; + switch(NvEncSettings.tune) { + case NV_FF_TUNE_HQ: av_dict_set(&_options, "tune", "hq", 0); break; +#ifdef H265_ENCODER + case NV_FF_TUNE_UHQ: av_dict_set(&_options, "tune", "uhq", 0); break; +#endif + case NV_FF_TUNE_LL: av_dict_set(&_options, "tune", "ll", 0); break; + case NV_FF_TUNE_ULL: av_dict_set(&_options, "tune", "ull", 0); break; + case NV_FF_TUNE_LOSSLESS: av_dict_set(&_options, "tune", "lossless", 0); break; + default: break; + }; + if(NvEncSettings.lookahead) { int range = NvEncSettings.lookahead; @@ -174,7 +174,7 @@ bool ADM_ffNvEncEncoder::configureContext(void) if(NvEncSettings.spatial_aq) { - if(NvEncSettings.preset == NV_FF_PRESET_LOSSLESS || NvEncSettings.preset == NV_FF_PRESET_LOSSLESSHP) + if(NvEncSettings.preset == NV_FF_TUNE_LOSSLESS) { ADM_warning("Adaptive quantization is incompatible with lossless presets, disabling."); }else @@ -304,35 +304,40 @@ int sz,q; bool ffNvEncConfigure(void) { diaMenuEntry meRcMode[]={ - {NV_FF_RC_AUTO,QT_TRANSLATE_NOOP("ffnvenc","Controlled by Preset"),NULL}, - {NV_FF_RC_CONSTQP,QT_TRANSLATE_NOOP("ffnvenc","Constant Quantizer"),NULL}, - {NV_FF_RC_CBR,QT_TRANSLATE_NOOP("ffnvenc","Constant Bitrate"),NULL}, - {NV_FF_RC_VBR,QT_TRANSLATE_NOOP("ffnvenc","Variable Bitrate"),NULL} + {NV_FF_RC_AUTO, QT_TRANSLATE_NOOP("ffnvenc","Controlled by Preset"),NULL}, + {NV_FF_RC_CONSTQP, QT_TRANSLATE_NOOP("ffnvenc","Constant Quantizer"),NULL}, + {NV_FF_RC_CBR, QT_TRANSLATE_NOOP("ffnvenc","Constant Bitrate"),NULL}, + {NV_FF_RC_VBR, QT_TRANSLATE_NOOP("ffnvenc","Variable Bitrate"),NULL} }; diaMenuEntry mePreset[]={ - {NV_FF_PRESET_DEFAULT,QT_TRANSLATE_NOOP("ffnvenc","Default"),NULL}, - {NV_FF_PRESET_SLOW,QT_TRANSLATE_NOOP("ffnvenc","Slow"),NULL}, - {NV_FF_PRESET_MEDIUM,QT_TRANSLATE_NOOP("ffnvenc","Medium"),NULL}, - {NV_FF_PRESET_FAST,QT_TRANSLATE_NOOP("ffnvenc","Fast"),NULL}, - {NV_FF_PRESET_HP,QT_TRANSLATE_NOOP("ffnvenc","High Performance"),NULL}, - {NV_FF_PRESET_HQ,QT_TRANSLATE_NOOP("ffnvenc","High Quality"),NULL}, - {NV_FF_PRESET_BD,QT_TRANSLATE_NOOP("ffnvenc","BluRay"),NULL}, - {NV_FF_PRESET_LL,QT_TRANSLATE_NOOP("ffnvenc","Low Latency"),NULL}, - {NV_FF_PRESET_LLHP,QT_TRANSLATE_NOOP("ffnvenc","Low Latency (HP)"),NULL}, - {NV_FF_PRESET_LLHQ,QT_TRANSLATE_NOOP("ffnvenc","Low Latency (HQ)"),NULL}, - {NV_FF_PRESET_LOSSLESS,QT_TRANSLATE_NOOP("ffnvenc","Lossless"),NULL}, - {NV_FF_PRESET_LOSSLESSHP,QT_TRANSLATE_NOOP("ffnvenc","Lossless (HP)"),NULL} + {NV_FF_PRESET_P1, QT_TRANSLATE_NOOP("ffnvenc","P1 - Fastest (Lowest Quality)"),NULL}, + {NV_FF_PRESET_P2, QT_TRANSLATE_NOOP("ffnvenc","P2 - Faster"),NULL}, + {NV_FF_PRESET_P3, QT_TRANSLATE_NOOP("ffnvenc","P3 - Fast"),NULL}, + {NV_FF_PRESET_P4, QT_TRANSLATE_NOOP("ffnvenc","P4 - Medium (Default)"),NULL}, + {NV_FF_PRESET_P5, QT_TRANSLATE_NOOP("ffnvenc","P5 - Slow"),NULL}, + {NV_FF_PRESET_P6, QT_TRANSLATE_NOOP("ffnvenc","P6 - Slower"),NULL}, + {NV_FF_PRESET_P7, QT_TRANSLATE_NOOP("ffnvenc","P7 - Slowest (Best Quality)"),NULL} + }; + + diaMenuEntry meTune[]={ + {NV_FF_TUNE_HQ, QT_TRANSLATE_NOOP("ffnvenc","High Quality"),NULL}, +#ifdef H265_ENCODER + {NV_FF_TUNE_UHQ, QT_TRANSLATE_NOOP("ffnvenc","Ultra High Quality"),NULL}, +#endif + {NV_FF_TUNE_LL, QT_TRANSLATE_NOOP("ffnvenc","Low Latency"),NULL}, + {NV_FF_TUNE_ULL, QT_TRANSLATE_NOOP("ffnvenc","Ultra Low Latency"),NULL}, + {NV_FF_TUNE_LOSSLESS, QT_TRANSLATE_NOOP("ffnvenc","Lossless"),NULL} }; diaMenuEntry meProfile[]={ #ifdef H265_ENCODER - {NV_FF_PROFILE_MAIN,QT_TRANSLATE_NOOP("ffnvenc","Main"),NULL}, - {NV_FF_PROFILE_MAIN10,QT_TRANSLATE_NOOP("ffnvenc","Main10"),NULL}, + {NV_FF_PROFILE_MAIN, QT_TRANSLATE_NOOP("ffnvenc","Main"),NULL}, + {NV_FF_PROFILE_MAIN10, QT_TRANSLATE_NOOP("ffnvenc","Main10"),NULL}, #else {NV_FF_PROFILE_BASELINE,QT_TRANSLATE_NOOP("ffnvenc","Baseline"),NULL}, - {NV_FF_PROFILE_MAIN,QT_TRANSLATE_NOOP("ffnvenc","Main"),NULL}, - {NV_FF_PROFILE_HIGH,QT_TRANSLATE_NOOP("ffnvenc","High"),NULL} + {NV_FF_PROFILE_MAIN, QT_TRANSLATE_NOOP("ffnvenc","Main"),NULL}, + {NV_FF_PROFILE_HIGH, QT_TRANSLATE_NOOP("ffnvenc","High"),NULL} #endif }; @@ -349,9 +354,7 @@ bool ffNvEncConfigure(void) diaMenuEntry meBframeRef[]={ {NV_FF_BFRAME_REF_DISABLED,QT_TRANSLATE_NOOP("ffnvenc","Disabled"),NULL}, -#ifdef H265_ENCODER {NV_FF_BFRAME_REF_EACH,QT_TRANSLATE_NOOP("ffnvenc","Each"),NULL}, -#endif {NV_FF_BFRAME_REF_MIDDLE,QT_TRANSLATE_NOOP("ffnvenc","Middle"),NULL} }; @@ -361,6 +364,7 @@ bool ffNvEncConfigure(void) #define MZ(x) sizeof(x)/sizeof(diaMenuEntry) diaElemMenu rcmode(PX(rc_mode),QT_TRANSLATE_NOOP("ffnvenc","RC Mode:"),MZ(meRcMode),meRcMode); diaElemMenu qzPreset(PX(preset),QT_TRANSLATE_NOOP("ffnvenc","Preset:"),MZ(mePreset),mePreset); + diaElemMenu tune(PX(tune),QT_TRANSLATE_NOOP("ffnvenc","Tune:"),MZ(meTune),meTune); diaElemMenu profile(PX(profile),QT_TRANSLATE_NOOP("ffnvenc","Profile:"),MZ(meProfile),meProfile); diaElemMenu bFrameRef(PX(b_ref_mode),QT_TRANSLATE_NOOP("ffnvenc","Use B-Frames as References:"),MZ(meBframeRef),meBframeRef); diaElemMenu maxRefs(PX(refs),QT_TRANSLATE_NOOP("ffnvenc","Maximum Reference Frames:"),MZ(meNumRef),meNumRef); @@ -394,6 +398,7 @@ bool ffNvEncConfigure(void) rateControl.swallow(&rcmode); rateControl.swallow(&qzPreset); + rateControl.swallow(&tune); rateControl.swallow(&qual); rateControl.swallow(&bitrate); rateControl.swallow(&maxBitrate); @@ -406,9 +411,7 @@ bool ffNvEncConfigure(void) rcmode.link(meRcMode+3,1,&maxBitrate); #ifdef H265_ENCODER - bFrameRef.link(meBframeRef,1,&maxRefs); - bFrameRef.link(meBframeRef+2,1,&maxRefs); -#else +#else // h264 baseline has no B frames profile.link(meProfile+1,1,&maxBframes); profile.link(meProfile+2,1,&maxBframes); #endif diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h index cc9afb5316..2722be0e58 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h @@ -19,22 +19,26 @@ #include "ADM_coreVideoEncoderFFmpeg.h" #include "ffnvenc.h" -// These are legacy presets, deprecated in SDK 10.x. -// Matching new presets, not supported by FFmpeg 4.2.x, are given for reference. +enum FF_NVencTune +{ + NV_FF_TUNE_HQ = 1, +#ifdef H265_ENCODER + NV_FF_TUNE_UHQ = 5, +#endif + NV_FF_TUNE_LL = 2, + NV_FF_TUNE_ULL = 3, + NV_FF_TUNE_LOSSLESS = 4 +}; + enum FF_NVencPreset { - NV_FF_PRESET_DEFAULT=0, // P4 - NV_FF_PRESET_SLOW=1, - NV_FF_PRESET_MEDIUM=2, - NV_FF_PRESET_FAST=3, - NV_FF_PRESET_HP=4, // P1 - NV_FF_PRESET_HQ=5, // P7 - NV_FF_PRESET_BD=6, // P5 - NV_FF_PRESET_LL=7, // P4 - NV_FF_PRESET_LLHP=8, // P1 - NV_FF_PRESET_LLHQ=9, // P7 - NV_FF_PRESET_LOSSLESS=10, // P4 - NV_FF_PRESET_LOSSLESSHP=11 // P1 + NV_FF_PRESET_P1 = 3, // fastest (lowest quality) + NV_FF_PRESET_P2 = 4, // faster (lower quality) + NV_FF_PRESET_P3 = 5, // fast (low quality) + NV_FF_PRESET_P4 = 6, // medium (default) + NV_FF_PRESET_P5 = 7, // slow (good quality) + NV_FF_PRESET_P6 = 8, // slower (better quality) + NV_FF_PRESET_P7 = 9 // slowest (best quality) }; enum FF_NVencProfile @@ -51,38 +55,36 @@ enum FF_NVencProfile enum FF_NVencRateControl { - NV_FF_RC_AUTO=0, // controlled by preset - NV_FF_RC_CONSTQP=1, - NV_FF_RC_CBR=2, - NV_FF_RC_CBR_LOWDELAY_HQ=3, - NV_FF_RC_CBR_HQ=4, - NV_FF_RC_VBR=5, - NV_FF_RC_VBR_HQ=6 + NV_FF_RC_AUTO=0, // controlled by preset + NV_FF_RC_CONSTQP=1, // by qp setting + NV_FF_RC_CBR=2, // by set bitrate + NV_FF_RC_VBR=5 // by cq and bitrate settings }; -// B-frames as references require SDK 8.1 (driver >= 390.77 on Windows) +// B-frames as references require SDK 8.1 (driver >= 390.77 on Windows) and Turing+ enum FF_NVencBframeRefMode { NV_FF_BFRAME_REF_DISABLED=0, - NV_FF_BFRAME_REF_EACH=1, // invalid for H.264 + NV_FF_BFRAME_REF_EACH=1, NV_FF_BFRAME_REF_MIDDLE=2 }; #ifdef H265_ENCODER # define NVENC_CONF_DEFAULT \ { \ - NV_FF_PRESET_HQ, /* preset */ \ + NV_FF_PRESET_P4, /* preset */ \ NV_FF_PROFILE_MAIN, /* profile */ \ + NV_FF_TUNE_HQ, /* tune */ \ NV_FF_RC_AUTO, /* rc_mode */ \ 20, /* quality */ \ 5000, /* bitrate */ \ 10000, /* max_bitrate */ \ 100, /* gopsize */ \ 0, /* refs */ \ - 0, /* bframes */ \ + 2, /* bframes */ \ 2, /* b_ref_mode */ \ 0, /* lookahead */ \ - 0, /* aq_strength */ \ + 8, /* aq_strength */ \ 0, /* spatial_aq */ \ 0, /* temporal_aq */ \ 0 /* weighted_pred */ \ @@ -90,18 +92,19 @@ enum FF_NVencBframeRefMode #else # define NVENC_CONF_DEFAULT \ { \ - NV_FF_PRESET_HQ, /* preset */ \ + NV_FF_PRESET_P4, /* preset */ \ NV_FF_PROFILE_HIGH, /* profile */ \ + NV_FF_TUNE_HQ, /* tune */ \ NV_FF_RC_AUTO, /* rc_mode */ \ 20, /* quality */ \ 10000, /* bitrate */ \ 20000, /* max_bitrate */ \ 100, /* gopsize */ \ 0, /* refs */ \ - 0, /* bframes */ \ - 0, /* b_ref_mode */ \ + 2, /* bframes */ \ + 1, /* b_ref_mode */ \ 0, /* lookahead */ \ - 0, /* aq_strength */ \ + 8, /* aq_strength */ \ 0, /* spatial_aq */ \ 0, /* temporal_aq */ \ 0 /* weighted_pred */ \ diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc.conf b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc.conf index c37e7a1776..d6ce3b19d1 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc.conf +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc.conf @@ -1,6 +1,7 @@ ffnvenc_encoder{ uint32_t:preset uint32_t:profile +uint32_t:tune uint32_t:rc_mode uint32_t:quality uint32_t:bitrate diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc.h b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc.h index 192ff33460..4ab3c77ebd 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc.h +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc.h @@ -4,6 +4,7 @@ typedef struct { uint32_t preset; uint32_t profile; +uint32_t tune; uint32_t rc_mode; uint32_t quality; uint32_t bitrate; diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc_desc.cpp b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc_desc.cpp index 3918859343..944ee6979f 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc_desc.cpp +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc_desc.cpp @@ -2,6 +2,7 @@ extern const ADM_paramList ffnvenc_encoder_param[]={ {"preset",offsetof(ffnvenc_encoder,preset),"uint32_t",ADM_param_uint32_t}, {"profile",offsetof(ffnvenc_encoder,profile),"uint32_t",ADM_param_uint32_t}, + {"tune",offsetof(ffnvenc_encoder,tune),"uint32_t",ADM_param_uint32_t}, {"rc_mode",offsetof(ffnvenc_encoder,rc_mode),"uint32_t",ADM_param_uint32_t}, {"quality",offsetof(ffnvenc_encoder,quality),"uint32_t",ADM_param_uint32_t}, {"bitrate",offsetof(ffnvenc_encoder,bitrate),"uint32_t",ADM_param_uint32_t}, diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc_json.cpp b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc_json.cpp index 8fccc6dbe2..b9e0423353 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc_json.cpp +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffnvenc_json.cpp @@ -7,6 +7,7 @@ bool ffnvenc_encoder_jserialize(const char *file, const ffnvenc_encoder *key){ admJson json; json.addUint32("preset",key->preset); json.addUint32("profile",key->profile); +json.addUint32("tune",key->tune); json.addUint32("rc_mode",key->rc_mode); json.addUint32("quality",key->quality); json.addUint32("bitrate",key->bitrate); From 88ba0e6bc00e42994ba341a46a5fb7f8b5103701 Mon Sep 17 00:00:00 2001 From: Jukka Tastula Date: Fri, 18 Sep 2026 21:50:21 +0300 Subject: [PATCH 2/2] videoEncoder/ffNvEnc: add AV1 encoder --- .../cmake/admFFmpegBuild_crossMingw.cmake | 2 +- .../cmake/admFFmpegBuild_native.cmake | 2 +- avidemux_core/cmake/admFFmpegBuild_vs.cmake | 2 +- .../ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp | 32 ++++++++++++++++--- .../ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h | 32 ++++++++++++++++--- .../ADM_videoEncoder/ffNvEnc/CMakeLists.txt | 3 ++ .../ffNvEnc/ffNvEncPlugin.cpp | 11 +++++++ 7 files changed, 72 insertions(+), 12 deletions(-) diff --git a/avidemux_core/cmake/admFFmpegBuild_crossMingw.cmake b/avidemux_core/cmake/admFFmpegBuild_crossMingw.cmake index b748b9bf4f..9e52c4d3c0 100644 --- a/avidemux_core/cmake/admFFmpegBuild_crossMingw.cmake +++ b/avidemux_core/cmake/admFFmpegBuild_crossMingw.cmake @@ -4,7 +4,7 @@ INCLUDE(admFFmpegBuild_helpers) ADM_FF_SET_DEFAULT() IF(USE_NVENC) - SET(FFMPEG_ENCODERS ${FFMPEG_ENCODERS} h264_nvenc hevc_nvenc) + SET(FFMPEG_ENCODERS ${FFMPEG_ENCODERS} h264_nvenc hevc_nvenc av1_nvenc) SET(FFMPEG_DECODERS ${FFMPEG_DECODERS} nvdec) ENDIF() diff --git a/avidemux_core/cmake/admFFmpegBuild_native.cmake b/avidemux_core/cmake/admFFmpegBuild_native.cmake index 6e16a5e6b9..8ed91d4729 100644 --- a/avidemux_core/cmake/admFFmpegBuild_native.cmake +++ b/avidemux_core/cmake/admFFmpegBuild_native.cmake @@ -11,7 +11,7 @@ IF(USE_NVENC) xadd("--enable-nvenc") xadd("--enable-nvdec") xadd("--extra-cflags=-I${NVENC_INCLUDE_DIR}") - SET(FFMPEG_ENCODERS ${FFMPEG_ENCODERS} h264_nvenc hevc_nvenc) + SET(FFMPEG_ENCODERS ${FFMPEG_ENCODERS} h264_nvenc hevc_nvenc av1_nvenc) ENDIF() #@@ diff --git a/avidemux_core/cmake/admFFmpegBuild_vs.cmake b/avidemux_core/cmake/admFFmpegBuild_vs.cmake index ef3896bb5f..1fa682d55b 100644 --- a/avidemux_core/cmake/admFFmpegBuild_vs.cmake +++ b/avidemux_core/cmake/admFFmpegBuild_vs.cmake @@ -4,7 +4,7 @@ INCLUDE(admFFmpegBuild_helpers) ADM_FF_SET_DEFAULT() IF(USE_NVENC) - SET(FFMPEG_ENCODERS ${FFMPEG_ENCODERS} h264_nvenc hevc_nvenc) + SET(FFMPEG_ENCODERS ${FFMPEG_ENCODERS} h264_nvenc hevc_nvenc av1_nvenc) SET(FFMPEG_DECODERS ${FFMPEG_DECODERS} nvdec) ENDIF() diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp index 13674fc693..f4ea2c7ca9 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp @@ -44,6 +44,8 @@ ADM_ffNvEncEncoder::ADM_ffNvEncEncoder(ADM_coreVideoFilter *src,bool globalHeade //targetColorSpace=ADM_COLOR_YUV422P; #ifdef H265_ENCODER ADM_info("(HEVC) Creating.\n"); +#elif defined(AV1_ENCODER) + ADM_info("(AV1) Creating.\n"); #else ADM_info("(H264) Creating.\n"); #endif @@ -75,7 +77,7 @@ bool ADM_ffNvEncEncoder::configureContext(void) _context->gop_size = NvEncSettings.gopsize; _context->refs = NvEncSettings.refs; _context->max_b_frames = -#ifdef H265_ENCODER +#if defined(H265_ENCODER) || defined(AV1_ENCODER) NvEncSettings.bframes; #else (NvEncSettings.profile != NV_FF_PROFILE_BASELINE)? NvEncSettings.bframes : 0; @@ -135,6 +137,8 @@ bool ADM_ffNvEncEncoder::configureContext(void) #ifdef H265_ENCODER MIAOU(MAIN,"main") MIAOU(MAIN10,"main10") +#elif defined(AV1_ENCODER) + // AV1 NVENC does not have profile options #else MIAOU(BASELINE,"baseline") MIAOU(MAIN,"main") @@ -146,7 +150,7 @@ bool ADM_ffNvEncEncoder::configureContext(void) switch(NvEncSettings.tune) { case NV_FF_TUNE_HQ: av_dict_set(&_options, "tune", "hq", 0); break; -#ifdef H265_ENCODER +#if defined(H265_ENCODER) || defined(AV1_ENCODER) case NV_FF_TUNE_UHQ: av_dict_set(&_options, "tune", "uhq", 0); break; #endif case NV_FF_TUNE_LL: av_dict_set(&_options, "tune", "ll", 0); break; @@ -212,6 +216,8 @@ bool ADM_ffNvEncEncoder::setup(void) #define MKSTRING(x) STR(x) #ifdef H265_ENCODER # define LAVC_ENCODER_NAME hevc_nvenc +#elif defined(AV1_ENCODER) +# define LAVC_ENCODER_NAME av1_nvenc #else # define LAVC_ENCODER_NAME h264_nvenc #endif @@ -252,6 +258,8 @@ const char *ADM_ffNvEncEncoder::getFourcc(void) { #ifdef H265_ENCODER return "HEVC"; +#elif defined(AV1_ENCODER) + return "av01"; #else return "H264"; #endif @@ -322,7 +330,7 @@ bool ffNvEncConfigure(void) diaMenuEntry meTune[]={ {NV_FF_TUNE_HQ, QT_TRANSLATE_NOOP("ffnvenc","High Quality"),NULL}, -#ifdef H265_ENCODER +#if defined(H265_ENCODER) || defined(AV1_ENCODER) {NV_FF_TUNE_UHQ, QT_TRANSLATE_NOOP("ffnvenc","Ultra High Quality"),NULL}, #endif {NV_FF_TUNE_LL, QT_TRANSLATE_NOOP("ffnvenc","Low Latency"),NULL}, @@ -334,6 +342,8 @@ bool ffNvEncConfigure(void) #ifdef H265_ENCODER {NV_FF_PROFILE_MAIN, QT_TRANSLATE_NOOP("ffnvenc","Main"),NULL}, {NV_FF_PROFILE_MAIN10, QT_TRANSLATE_NOOP("ffnvenc","Main10"),NULL}, +#elif defined(AV1_ENCODER) + // AV1 does not have profile options #else {NV_FF_PROFILE_BASELINE,QT_TRANSLATE_NOOP("ffnvenc","Baseline"),NULL}, {NV_FF_PROFILE_MAIN, QT_TRANSLATE_NOOP("ffnvenc","Main"),NULL}, @@ -369,12 +379,20 @@ bool ffNvEncConfigure(void) diaElemMenu bFrameRef(PX(b_ref_mode),QT_TRANSLATE_NOOP("ffnvenc","Use B-Frames as References:"),MZ(meBframeRef),meBframeRef); diaElemMenu maxRefs(PX(refs),QT_TRANSLATE_NOOP("ffnvenc","Maximum Reference Frames:"),MZ(meNumRef),meNumRef); +#ifdef AV1_ENCODER + diaElemUInteger qual(PX(quality),QT_TRANSLATE_NOOP("ffnvenc","Quality:"),0,63); +#else diaElemUInteger qual(PX(quality),QT_TRANSLATE_NOOP("ffnvenc","Quality:"),0,51); +#endif diaElemUInteger bitrate(PX(bitrate),QT_TRANSLATE_NOOP("ffnvenc","Bitrate (kbps):"),1,500000); diaElemUInteger maxBitrate(PX(max_bitrate),QT_TRANSLATE_NOOP("ffnvenc","Max Bitrate (kbps):"),1,500000); diaElemUInteger gopSize(PX(gopsize),QT_TRANSLATE_NOOP("ffnvenc","GOP Size:"),0,1000); +#ifdef AV1_ENCODER + diaElemUInteger maxBframes(PX(bframes),QT_TRANSLATE_NOOP("ffnvenc","Maximum Consecutive B-Frames:"),0,31); +#else diaElemUInteger maxBframes(PX(bframes),QT_TRANSLATE_NOOP("ffnvenc","Maximum Consecutive B-Frames:"),0,5); +#endif diaElemUInteger lookAhead(PX(lookahead),QT_TRANSLATE_NOOP("ffnvenc","Lookahead:"),0,NV_MX_LOOKAHEAD); diaElemUInteger aqStrength(PX(aq_strength),QT_TRANSLATE_NOOP("ffnvenc","AQ Strength:"),1,15); @@ -385,6 +403,8 @@ bool ffNvEncConfigure(void) #ifdef H265_ENCODER diaElemReadOnlyText hintBasic(QT_TRANSLATE_NOOP("ffnvenc","Even with HEVC encoding support present, " "lossless presets and B-frames may be unavailable with older hardware"),NULL); +#elif defined(AV1_ENCODER) + diaElemReadOnlyText hintBasic(QT_TRANSLATE_NOOP("ffnvenc","AV1 encoding requires Ada or newer hardware"),NULL); #else diaElemReadOnlyText hintBasic(QT_TRANSLATE_NOOP("ffnvenc","Even with H.264 encoding support present, " "lossless presets may be unavailable with older hardware"),NULL); @@ -410,7 +430,7 @@ bool ffNvEncConfigure(void) rcmode.link(meRcMode+3,1,&bitrate); rcmode.link(meRcMode+3,1,&maxBitrate); -#ifdef H265_ENCODER +#if defined(H265_ENCODER) || defined(AV1_ENCODER) #else // h264 baseline has no B frames profile.link(meProfile+1,1,&maxBframes); profile.link(meProfile+2,1,&maxBframes); @@ -426,7 +446,9 @@ bool ffNvEncConfigure(void) #define NB_ELEM(x) sizeof(x)/sizeof(diaElem *) /* First Tab : basic settings */ diaElem *basics[]={ +#if !defined(AV1_ENCODER) &profile, +#endif &rateControl, &frameControl, &hintBasic @@ -450,6 +472,8 @@ bool ffNvEncConfigure(void) if(diaFactoryRunTabs( #ifdef H265_ENCODER QT_TRANSLATE_NOOP("ffnvenc","NVENC HEVC configuration"), +#elif defined(AV1_ENCODER) + QT_TRANSLATE_NOOP("ffnvenc","NVENC AV1 configuration"), #else QT_TRANSLATE_NOOP("ffnvenc","NVENC H.264 configuration"), #endif diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h index 2722be0e58..2255e4923f 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.h @@ -22,7 +22,7 @@ enum FF_NVencTune { NV_FF_TUNE_HQ = 1, -#ifdef H265_ENCODER +#if defined(H265_ENCODER) || defined(AV1_ENCODER) NV_FF_TUNE_UHQ = 5, #endif NV_FF_TUNE_LL = 2, @@ -46,6 +46,8 @@ enum FF_NVencProfile #ifdef H265_ENCODER NV_FF_PROFILE_MAIN=0, NV_FF_PROFILE_MAIN10=1 +#elif defined(AV1_ENCODER) + // AV1 does not have profile options #else NV_FF_PROFILE_BASELINE=0, NV_FF_PROFILE_MAIN=1, @@ -55,10 +57,10 @@ enum FF_NVencProfile enum FF_NVencRateControl { - NV_FF_RC_AUTO=0, // controlled by preset - NV_FF_RC_CONSTQP=1, // by qp setting - NV_FF_RC_CBR=2, // by set bitrate - NV_FF_RC_VBR=5 // by cq and bitrate settings + NV_FF_RC_AUTO=0, // controlled by preset + NV_FF_RC_CONSTQP=1, + NV_FF_RC_CBR=2, + NV_FF_RC_VBR=5 }; // B-frames as references require SDK 8.1 (driver >= 390.77 on Windows) and Turing+ @@ -89,6 +91,26 @@ enum FF_NVencBframeRefMode 0, /* temporal_aq */ \ 0 /* weighted_pred */ \ } +#elif defined(AV1_ENCODER) +# define NVENC_CONF_DEFAULT \ +{ \ + NV_FF_PRESET_P4, /* preset */ \ + 0, /* AV1 does not have profile options */ \ + NV_FF_TUNE_HQ, /* tune */ \ + NV_FF_RC_AUTO, /* rc_mode */ \ + 25, /* quality */ \ + 5000, /* bitrate */ \ + 10000, /* max_bitrate */ \ + 100, /* gopsize */ \ + 0, /* refs */ \ + 2, /* bframes */ \ + 2, /* b_ref_mode */ \ + 0, /* lookahead */ \ + 8, /* aq_strength */ \ + 0, /* spatial_aq */ \ + 0, /* temporal_aq */ \ + 0 /* weighted_pred */ \ +} #else # define NVENC_CONF_DEFAULT \ { \ diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/CMakeLists.txt b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/CMakeLists.txt index d8b4106ee6..d030275d8e 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/CMakeLists.txt +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/CMakeLists.txt @@ -10,6 +10,8 @@ MACRO(DEFINE_VID_ENCODER codec) ADD_VIDEO_ENCODER(${outName} ${${family}${codec}_SRCS}) IF("${codec}" STREQUAL "HEVC") TARGET_COMPILE_DEFINITIONS(${outName} PUBLIC H265_ENCODER) + ELSEIF("${codec}" STREQUAL "AV1") + TARGET_COMPILE_DEFINITIONS(${outName} PUBLIC AV1_ENCODER) ENDIF("${codec}" STREQUAL "HEVC") INSTALL_VIDEO_ENCODER(${outName}) TARGET_LINK_LIBRARIES(${outName} PRIVATE ADM_libavcodec ADM_libavutil) @@ -17,3 +19,4 @@ ENDMACRO(DEFINE_VID_ENCODER codec) DEFINE_VID_ENCODER(H264) DEFINE_VID_ENCODER(HEVC) +DEFINE_VID_ENCODER(AV1) diff --git a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffNvEncPlugin.cpp b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffNvEncPlugin.cpp index d2a1b9c039..4d920a068b 100644 --- a/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffNvEncPlugin.cpp +++ b/avidemux_plugins/ADM_videoEncoder/ffNvEnc/ffNvEncPlugin.cpp @@ -89,6 +89,17 @@ ADM_DECLARE_VIDEO_ENCODER_MAIN_EX("ffNvEncHEVC", &NvEncSettings,NULL,NULL, // conf var nvEncProbe ); +#elif defined(AV1_ENCODER) +ADM_DECLARE_VIDEO_ENCODER_MAIN_EX("ffNvEncAV1", + "Nvidia AV1", + "Nvidia hw encoder", + ffNvEncConfigure, // configuration + ADM_UI_ALL, + 1,0,0, + ffnvenc_encoder_param, // conf template + &NvEncSettings,NULL,NULL, // conf var + nvEncProbe +); #else ADM_DECLARE_VIDEO_ENCODER_MAIN_EX("ffNvEncH264", "Nvidia H264",