|
|
@@ -152,6 +152,70 @@ static int nvenc_print_error(AVCodecContext *avctx, NVENCSTATUS err, |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
typedef struct GUIDTuple { |
|
|
|
const GUID guid; |
|
|
|
int flags; |
|
|
|
} GUIDTuple; |
|
|
|
|
|
|
|
#define PRESET_ALIAS(alias, name, ...) \ |
|
|
|
[PRESET_ ## alias] = { NV_ENC_PRESET_ ## name ## _GUID, __VA_ARGS__ } |
|
|
|
|
|
|
|
#define PRESET(name, ...) PRESET_ALIAS(name, name, __VA_ARGS__) |
|
|
|
|
|
|
|
static void nvenc_map_preset(NvencContext *ctx) |
|
|
|
{ |
|
|
|
GUIDTuple presets[] = { |
|
|
|
#ifdef NVENC_HAVE_NEW_PRESETS |
|
|
|
PRESET(P1), |
|
|
|
PRESET(P2), |
|
|
|
PRESET(P3), |
|
|
|
PRESET(P4), |
|
|
|
PRESET(P5), |
|
|
|
PRESET(P6), |
|
|
|
PRESET(P7), |
|
|
|
PRESET_ALIAS(SLOW, P7, NVENC_TWO_PASSES), |
|
|
|
PRESET_ALIAS(MEDIUM, P4, NVENC_ONE_PASS), |
|
|
|
PRESET_ALIAS(FAST, P1, NVENC_ONE_PASS), |
|
|
|
// Compat aliases |
|
|
|
PRESET_ALIAS(DEFAULT, P4, NVENC_DEPRECATED_PRESET), |
|
|
|
PRESET_ALIAS(HP, P1, NVENC_DEPRECATED_PRESET), |
|
|
|
PRESET_ALIAS(HQ, P7, NVENC_DEPRECATED_PRESET), |
|
|
|
PRESET_ALIAS(BD, P5, NVENC_DEPRECATED_PRESET), |
|
|
|
PRESET_ALIAS(LOW_LATENCY_DEFAULT, P4, NVENC_DEPRECATED_PRESET | NVENC_LOWLATENCY), |
|
|
|
PRESET_ALIAS(LOW_LATENCY_HP, P1, NVENC_DEPRECATED_PRESET | NVENC_LOWLATENCY), |
|
|
|
PRESET_ALIAS(LOW_LATENCY_HQ, P7, NVENC_DEPRECATED_PRESET | NVENC_LOWLATENCY), |
|
|
|
PRESET_ALIAS(LOSSLESS_DEFAULT, P4, NVENC_DEPRECATED_PRESET | NVENC_LOSSLESS), |
|
|
|
PRESET_ALIAS(LOSSLESS_HP, P1, NVENC_DEPRECATED_PRESET | NVENC_LOSSLESS), |
|
|
|
#else |
|
|
|
PRESET(DEFAULT), |
|
|
|
PRESET(HP), |
|
|
|
PRESET(HQ), |
|
|
|
PRESET(BD), |
|
|
|
PRESET_ALIAS(SLOW, HQ, NVENC_TWO_PASSES), |
|
|
|
PRESET_ALIAS(MEDIUM, HQ, NVENC_ONE_PASS), |
|
|
|
PRESET_ALIAS(FAST, HP, NVENC_ONE_PASS), |
|
|
|
PRESET(LOW_LATENCY_DEFAULT, NVENC_LOWLATENCY), |
|
|
|
PRESET(LOW_LATENCY_HP, NVENC_LOWLATENCY), |
|
|
|
PRESET(LOW_LATENCY_HQ, NVENC_LOWLATENCY), |
|
|
|
PRESET(LOSSLESS_DEFAULT, NVENC_LOSSLESS), |
|
|
|
PRESET(LOSSLESS_HP, NVENC_LOSSLESS), |
|
|
|
#endif |
|
|
|
}; |
|
|
|
|
|
|
|
GUIDTuple *t = &presets[ctx->preset]; |
|
|
|
|
|
|
|
ctx->init_encode_params.presetGUID = t->guid; |
|
|
|
ctx->flags = t->flags; |
|
|
|
|
|
|
|
#ifdef NVENC_HAVE_NEW_PRESETS |
|
|
|
if (ctx->tuning_info == NV_ENC_TUNING_INFO_LOSSLESS) |
|
|
|
ctx->flags |= NVENC_LOSSLESS; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
#undef PRESET |
|
|
|
#undef PRESET_ALIAS |
|
|
|
|
|
|
|
static void nvenc_print_driver_requirement(AVCodecContext *avctx, int level) |
|
|
|
{ |
|
|
|
#if NVENCAPI_CHECK_VERSION(11, 1) |
|
|
@@ -366,7 +430,7 @@ static int nvenc_check_capabilities(AVCodecContext *avctx) |
|
|
|
} |
|
|
|
|
|
|
|
ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_LOSSLESS_ENCODE); |
|
|
|
if (ctx->preset >= PRESET_LOSSLESS_DEFAULT && ret <= 0) { |
|
|
|
if (ctx->flags & NVENC_LOSSLESS && ret <= 0) { |
|
|
|
av_log(avctx, AV_LOG_WARNING, "Lossless encoding not supported\n"); |
|
|
|
return AVERROR(ENOSYS); |
|
|
|
} |
|
|
@@ -556,6 +620,11 @@ static av_cold int nvenc_setup_device(AVCodecContext *avctx) |
|
|
|
return AVERROR_BUG; |
|
|
|
} |
|
|
|
|
|
|
|
nvenc_map_preset(ctx); |
|
|
|
|
|
|
|
if (ctx->flags & NVENC_DEPRECATED_PRESET) |
|
|
|
av_log(avctx, AV_LOG_WARNING, "The selected preset is deprecated. Use p1 to p7 + -tune or fast/medium/slow.\n"); |
|
|
|
|
|
|
|
if (avctx->pix_fmt == AV_PIX_FMT_CUDA || avctx->pix_fmt == AV_PIX_FMT_D3D11 || avctx->hw_frames_ctx || avctx->hw_device_ctx) { |
|
|
|
AVHWFramesContext *frames_ctx; |
|
|
|
AVHWDeviceContext *hwdev_ctx; |
|
|
@@ -646,65 +715,6 @@ static av_cold int nvenc_setup_device(AVCodecContext *avctx) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
typedef struct GUIDTuple { |
|
|
|
const GUID guid; |
|
|
|
int flags; |
|
|
|
} GUIDTuple; |
|
|
|
|
|
|
|
#define PRESET_ALIAS(alias, name, ...) \ |
|
|
|
[PRESET_ ## alias] = { NV_ENC_PRESET_ ## name ## _GUID, __VA_ARGS__ } |
|
|
|
|
|
|
|
#define PRESET(name, ...) PRESET_ALIAS(name, name, __VA_ARGS__) |
|
|
|
|
|
|
|
static void nvenc_map_preset(NvencContext *ctx) |
|
|
|
{ |
|
|
|
GUIDTuple presets[] = { |
|
|
|
#ifdef NVENC_HAVE_NEW_PRESETS |
|
|
|
PRESET(P1), |
|
|
|
PRESET(P2), |
|
|
|
PRESET(P3), |
|
|
|
PRESET(P4), |
|
|
|
PRESET(P5), |
|
|
|
PRESET(P6), |
|
|
|
PRESET(P7), |
|
|
|
PRESET_ALIAS(SLOW, P7, NVENC_TWO_PASSES), |
|
|
|
PRESET_ALIAS(MEDIUM, P4, NVENC_ONE_PASS), |
|
|
|
PRESET_ALIAS(FAST, P1, NVENC_ONE_PASS), |
|
|
|
// Compat aliases |
|
|
|
PRESET_ALIAS(DEFAULT, P4, NVENC_DEPRECATED_PRESET), |
|
|
|
PRESET_ALIAS(HP, P1, NVENC_DEPRECATED_PRESET), |
|
|
|
PRESET_ALIAS(HQ, P7, NVENC_DEPRECATED_PRESET), |
|
|
|
PRESET_ALIAS(BD, P5, NVENC_DEPRECATED_PRESET), |
|
|
|
PRESET_ALIAS(LOW_LATENCY_DEFAULT, P4, NVENC_DEPRECATED_PRESET | NVENC_LOWLATENCY), |
|
|
|
PRESET_ALIAS(LOW_LATENCY_HP, P1, NVENC_DEPRECATED_PRESET | NVENC_LOWLATENCY), |
|
|
|
PRESET_ALIAS(LOW_LATENCY_HQ, P7, NVENC_DEPRECATED_PRESET | NVENC_LOWLATENCY), |
|
|
|
PRESET_ALIAS(LOSSLESS_DEFAULT, P4, NVENC_DEPRECATED_PRESET | NVENC_LOSSLESS), |
|
|
|
PRESET_ALIAS(LOSSLESS_HP, P1, NVENC_DEPRECATED_PRESET | NVENC_LOSSLESS), |
|
|
|
#else |
|
|
|
PRESET(DEFAULT), |
|
|
|
PRESET(HP), |
|
|
|
PRESET(HQ), |
|
|
|
PRESET(BD), |
|
|
|
PRESET_ALIAS(SLOW, HQ, NVENC_TWO_PASSES), |
|
|
|
PRESET_ALIAS(MEDIUM, HQ, NVENC_ONE_PASS), |
|
|
|
PRESET_ALIAS(FAST, HP, NVENC_ONE_PASS), |
|
|
|
PRESET(LOW_LATENCY_DEFAULT, NVENC_LOWLATENCY), |
|
|
|
PRESET(LOW_LATENCY_HP, NVENC_LOWLATENCY), |
|
|
|
PRESET(LOW_LATENCY_HQ, NVENC_LOWLATENCY), |
|
|
|
PRESET(LOSSLESS_DEFAULT, NVENC_LOSSLESS), |
|
|
|
PRESET(LOSSLESS_HP, NVENC_LOSSLESS), |
|
|
|
#endif |
|
|
|
}; |
|
|
|
|
|
|
|
GUIDTuple *t = &presets[ctx->preset]; |
|
|
|
|
|
|
|
ctx->init_encode_params.presetGUID = t->guid; |
|
|
|
ctx->flags = t->flags; |
|
|
|
} |
|
|
|
|
|
|
|
#undef PRESET |
|
|
|
#undef PRESET_ALIAS |
|
|
|
|
|
|
|
static av_cold void set_constqp(AVCodecContext *avctx) |
|
|
|
{ |
|
|
|
NvencContext *ctx = avctx->priv_data; |
|
|
@@ -1262,18 +1272,15 @@ static av_cold int nvenc_setup_encoder(AVCodecContext *avctx) |
|
|
|
|
|
|
|
ctx->init_encode_params.encodeConfig = &ctx->encode_config; |
|
|
|
|
|
|
|
nvenc_map_preset(ctx); |
|
|
|
|
|
|
|
if (ctx->flags & NVENC_DEPRECATED_PRESET) |
|
|
|
av_log(avctx, AV_LOG_WARNING, "The selected preset is deprecated. Use p1 to p7 + -tune or fast/medium/slow.\n"); |
|
|
|
|
|
|
|
preset_config.version = NV_ENC_PRESET_CONFIG_VER; |
|
|
|
preset_config.presetCfg.version = NV_ENC_CONFIG_VER; |
|
|
|
|
|
|
|
#ifdef NVENC_HAVE_NEW_PRESETS |
|
|
|
ctx->init_encode_params.tuningInfo = ctx->tuning_info; |
|
|
|
|
|
|
|
if (ctx->flags & NVENC_LOWLATENCY) |
|
|
|
if (ctx->flags & NVENC_LOSSLESS) |
|
|
|
ctx->init_encode_params.tuningInfo = NV_ENC_TUNING_INFO_LOSSLESS; |
|
|
|
else if (ctx->flags & NVENC_LOWLATENCY) |
|
|
|
ctx->init_encode_params.tuningInfo = NV_ENC_TUNING_INFO_LOW_LATENCY; |
|
|
|
|
|
|
|
nv_status = p_nvenc->nvEncGetEncodePresetConfigEx(ctx->nvencoder, |
|
|
@@ -1315,9 +1322,6 @@ static av_cold int nvenc_setup_encoder(AVCodecContext *avctx) |
|
|
|
* */ |
|
|
|
if (ctx->rc_lookahead == 0 && ctx->encode_config.rcParams.enableLookahead) |
|
|
|
ctx->rc_lookahead = ctx->encode_config.rcParams.lookaheadDepth; |
|
|
|
|
|
|
|
if (ctx->init_encode_params.tuningInfo == NV_ENC_TUNING_INFO_LOSSLESS) |
|
|
|
ctx->flags |= NVENC_LOSSLESS; |
|
|
|
#endif |
|
|
|
|
|
|
|
if (ctx->weighted_pred == 1) |
|
|
|