|
|
|
@@ -401,7 +401,7 @@ static av_cold int nvenc_check_cuda(AVCodecContext *avctx) |
|
|
|
|
|
|
|
switch (avctx->codec->id) { |
|
|
|
case AV_CODEC_ID_H264: |
|
|
|
target_smver = 0x30; |
|
|
|
target_smver = avctx->pix_fmt == AV_PIX_FMT_YUV444P ? 0x52 : 0x30; |
|
|
|
break; |
|
|
|
case AV_CODEC_ID_H265: |
|
|
|
target_smver = 0x52; |
|
|
|
@@ -552,6 +552,7 @@ static av_cold int nvenc_encode_init(AVCodecContext *avctx) |
|
|
|
int surfaceCount = 0; |
|
|
|
int i, num_mbs; |
|
|
|
int isLL = 0; |
|
|
|
int lossless = 0; |
|
|
|
int res = 0; |
|
|
|
int dw, dh; |
|
|
|
|
|
|
|
@@ -627,10 +628,16 @@ static av_cold int nvenc_encode_init(AVCodecContext *avctx) |
|
|
|
} else if (!strcmp(ctx->preset, "llhq")) { |
|
|
|
encoder_preset = NV_ENC_PRESET_LOW_LATENCY_HQ_GUID; |
|
|
|
isLL = 1; |
|
|
|
} else if (!strcmp(ctx->preset, "lossless")) { |
|
|
|
encoder_preset = NV_ENC_PRESET_LOSSLESS_DEFAULT_GUID; |
|
|
|
lossless = 1; |
|
|
|
} else if (!strcmp(ctx->preset, "losslesshp")) { |
|
|
|
encoder_preset = NV_ENC_PRESET_LOSSLESS_HP_GUID; |
|
|
|
lossless = 1; |
|
|
|
} else if (!strcmp(ctx->preset, "default")) { |
|
|
|
encoder_preset = NV_ENC_PRESET_DEFAULT_GUID; |
|
|
|
} else { |
|
|
|
av_log(avctx, AV_LOG_FATAL, "Preset \"%s\" is unknown! Supported presets: hp, hq, bd, ll, llhp, llhq, default\n", ctx->preset); |
|
|
|
av_log(avctx, AV_LOG_FATAL, "Preset \"%s\" is unknown! Supported presets: hp, hq, bd, ll, llhp, llhq, lossless, losslesshp, default\n", ctx->preset); |
|
|
|
res = AVERROR(EINVAL); |
|
|
|
goto error; |
|
|
|
} |
|
|
|
@@ -753,7 +760,16 @@ static av_cold int nvenc_encode_init(AVCodecContext *avctx) |
|
|
|
if (avctx->rc_max_rate > 0) |
|
|
|
ctx->encode_config.rcParams.maxBitRate = avctx->rc_max_rate; |
|
|
|
|
|
|
|
if (ctx->cbr) { |
|
|
|
if (lossless) { |
|
|
|
ctx->encode_config.encodeCodecConfig.h264Config.qpPrimeYZeroTransformBypassFlag = 1; |
|
|
|
ctx->encode_config.rcParams.rateControlMode = NV_ENC_PARAMS_RC_CONSTQP; |
|
|
|
ctx->encode_config.rcParams.constQP.qpInterB = 0; |
|
|
|
ctx->encode_config.rcParams.constQP.qpInterP = 0; |
|
|
|
ctx->encode_config.rcParams.constQP.qpIntra = 0; |
|
|
|
|
|
|
|
avctx->qmin = -1; |
|
|
|
avctx->qmax = -1; |
|
|
|
} else if (ctx->cbr) { |
|
|
|
if (!ctx->twopass) { |
|
|
|
ctx->encode_config.rcParams.rateControlMode = NV_ENC_PARAMS_RC_CBR; |
|
|
|
} else if (ctx->twopass == 1 || isLL) { |
|
|
|
@@ -817,6 +833,9 @@ static av_cold int nvenc_encode_init(AVCodecContext *avctx) |
|
|
|
|
|
|
|
if (!ctx->profile) { |
|
|
|
switch (avctx->profile) { |
|
|
|
case FF_PROFILE_H264_HIGH_444_PREDICTIVE: |
|
|
|
ctx->encode_config.profileGUID = NV_ENC_H264_PROFILE_HIGH_444_GUID; |
|
|
|
break; |
|
|
|
case FF_PROFILE_H264_BASELINE: |
|
|
|
ctx->encode_config.profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID; |
|
|
|
break; |
|
|
|
@@ -842,6 +861,9 @@ static av_cold int nvenc_encode_init(AVCodecContext *avctx) |
|
|
|
} else if (!strcmp(ctx->profile, "baseline")) { |
|
|
|
ctx->encode_config.profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID; |
|
|
|
avctx->profile = FF_PROFILE_H264_BASELINE; |
|
|
|
} else if (!strcmp(ctx->profile, "high444p")) { |
|
|
|
ctx->encode_config.profileGUID = NV_ENC_H264_PROFILE_HIGH_444_GUID; |
|
|
|
avctx->profile = FF_PROFILE_H264_HIGH_444_PREDICTIVE; |
|
|
|
} else { |
|
|
|
av_log(avctx, AV_LOG_FATAL, "Profile \"%s\" is unknown! Supported profiles: high, main, baseline\n", ctx->profile); |
|
|
|
res = AVERROR(EINVAL); |
|
|
|
@@ -849,6 +871,8 @@ static av_cold int nvenc_encode_init(AVCodecContext *avctx) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ctx->encode_config.encodeCodecConfig.h264Config.chromaFormatIDC = avctx->profile == FF_PROFILE_H264_HIGH_444_PREDICTIVE ? 3 : 1; |
|
|
|
|
|
|
|
if (ctx->level) { |
|
|
|
res = input_string_to_uint32(avctx, nvenc_h264_level_pairs, ctx->level, &ctx->encode_config.encodeCodecConfig.h264Config.level); |
|
|
|
|
|
|
|
@@ -1378,6 +1402,7 @@ static int nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
static const enum AVPixelFormat pix_fmts_nvenc[] = { |
|
|
|
AV_PIX_FMT_YUV420P, |
|
|
|
AV_PIX_FMT_NV12, |
|
|
|
AV_PIX_FMT_YUV444P, |
|
|
|
AV_PIX_FMT_NONE |
|
|
|
}; |
|
|
|
|
|
|
|
|