Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion avidemux_core/cmake/admFFmpegBuild_crossMingw.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
2 changes: 1 addition & 1 deletion avidemux_core/cmake/admFFmpegBuild_native.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()

#@@
Expand Down
2 changes: 1 addition & 1 deletion avidemux_core/cmake/admFFmpegBuild_vs.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
123 changes: 75 additions & 48 deletions avidemux_plugins/ADM_videoEncoder/ffNvEnc/ADM_ffNvEnc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -62,27 +64,20 @@ 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
#if defined(H265_ENCODER) || defined(AV1_ENCODER)
NvEncSettings.bframes;
#else
(NvEncSettings.profile != NV_FF_PROFILE_BASELINE)? NvEncSettings.bframes : 0;
Expand All @@ -95,11 +90,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);
Expand Down Expand Up @@ -146,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")
Expand All @@ -155,6 +148,17 @@ bool ADM_ffNvEncEncoder::configureContext(void)
#undef MIAOU
};

switch(NvEncSettings.tune) {
case NV_FF_TUNE_HQ: av_dict_set(&_options, "tune", "hq", 0); break;
#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;
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;
Expand All @@ -174,7 +178,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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -304,35 +312,42 @@ 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},
#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},
{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},
#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},
{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
};

Expand All @@ -349,9 +364,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}
};

Expand All @@ -361,16 +374,25 @@ 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);

#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);
Expand All @@ -381,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);
Expand All @@ -394,6 +418,7 @@ bool ffNvEncConfigure(void)

rateControl.swallow(&rcmode);
rateControl.swallow(&qzPreset);
rateControl.swallow(&tune);
rateControl.swallow(&qual);
rateControl.swallow(&bitrate);
rateControl.swallow(&maxBitrate);
Expand All @@ -405,10 +430,8 @@ bool ffNvEncConfigure(void)
rcmode.link(meRcMode+3,1,&bitrate);
rcmode.link(meRcMode+3,1,&maxBitrate);

#ifdef H265_ENCODER
bFrameRef.link(meBframeRef,1,&maxRefs);
bFrameRef.link(meBframeRef+2,1,&maxRefs);
#else
#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);
#endif
Expand All @@ -423,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
Expand All @@ -447,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
Expand Down
Loading