Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>tags/n3.1
| @@ -603,9 +603,6 @@ static av_cold void nvenc_setup_rate_control(AVCodecContext *avctx) | |||
| ctx->encode_config.rcParams.maxBitRate = avctx->rc_max_rate; | |||
| if (ctx->flags & NVENC_LOSSLESS) { | |||
| if (avctx->codec->id == AV_CODEC_ID_H264) | |||
| ctx->encode_config.encodeCodecConfig.h264Config.qpPrimeYZeroTransformBypassFlag = 1; | |||
| set_lossless(avctx); | |||
| avctx->qmin = -1; | |||
| @@ -710,42 +707,26 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx) | |||
| h264->outputAUD = 1; | |||
| if (!ctx->profile && !(ctx->flags & NVENC_LOSSLESS)) { | |||
| switch (avctx->profile) { | |||
| case FF_PROFILE_H264_HIGH_444_PREDICTIVE: | |||
| cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_444_GUID; | |||
| break; | |||
| case FF_PROFILE_H264_BASELINE: | |||
| if (ctx->flags & NVENC_LOSSLESS) { | |||
| h264->qpPrimeYZeroTransformBypassFlag = 1; | |||
| } else { | |||
| switch(ctx->profile) { | |||
| case NV_ENC_H264_PROFILE_BASELINE: | |||
| cc->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID; | |||
| avctx->profile = FF_PROFILE_H264_BASELINE; | |||
| break; | |||
| case FF_PROFILE_H264_MAIN: | |||
| case NV_ENC_H264_PROFILE_MAIN: | |||
| cc->profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID; | |||
| avctx->profile = FF_PROFILE_H264_MAIN; | |||
| break; | |||
| case FF_PROFILE_H264_HIGH: | |||
| case FF_PROFILE_UNKNOWN: | |||
| cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID; | |||
| break; | |||
| default: | |||
| av_log(avctx, AV_LOG_WARNING, "Unsupported profile requested, falling back to high\n"); | |||
| cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID; | |||
| break; | |||
| } | |||
| } else if (!(ctx->flags & NVENC_LOSSLESS)) { | |||
| if (!strcmp(ctx->profile, "high")) { | |||
| case NV_ENC_H264_PROFILE_HIGH: | |||
| cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID; | |||
| avctx->profile = FF_PROFILE_H264_HIGH; | |||
| } else if (!strcmp(ctx->profile, "main")) { | |||
| cc->profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID; | |||
| avctx->profile = FF_PROFILE_H264_MAIN; | |||
| } else if (!strcmp(ctx->profile, "baseline")) { | |||
| cc->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID; | |||
| avctx->profile = FF_PROFILE_H264_BASELINE; | |||
| } else if (!strcmp(ctx->profile, "high444p")) { | |||
| break; | |||
| case NV_ENC_H264_PROFILE_HIGH_444P: | |||
| cc->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); | |||
| return AVERROR(EINVAL); | |||
| break; | |||
| } | |||
| } | |||
| @@ -119,6 +119,13 @@ enum { | |||
| PRESET_LOSSLESS_HP, | |||
| }; | |||
| enum { | |||
| NV_ENC_H264_PROFILE_BASELINE, | |||
| NV_ENC_H264_PROFILE_MAIN, | |||
| NV_ENC_H264_PROFILE_HIGH, | |||
| NV_ENC_H264_PROFILE_HIGH_444P, | |||
| }; | |||
| enum { | |||
| NVENC_LOWLATENCY = 1, | |||
| NVENC_LOSSLESS = 2, | |||
| @@ -160,7 +167,7 @@ typedef struct NvencContext | |||
| void *nvencoder; | |||
| int preset; | |||
| char *profile; | |||
| int profile; | |||
| char *level; | |||
| char *tier; | |||
| int cbr; | |||
| @@ -39,7 +39,11 @@ static const AVOption options[] = { | |||
| { "llhp", "low latency hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_HP }, 0, 0, VE, "preset" }, | |||
| { "lossless", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_DEFAULT }, 0, 0, VE, "preset" }, | |||
| { "losslesshp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_HP }, 0, 0, VE, "preset" }, | |||
| { "profile", "Set the encoding profile (high, main, baseline or high444p)", OFFSET(profile), AV_OPT_TYPE_STRING, { .str = "main" }, 0, 0, VE }, | |||
| { "profile", "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = NV_ENC_H264_PROFILE_MAIN }, NV_ENC_H264_PROFILE_BASELINE, NV_ENC_H264_PROFILE_HIGH_444P, VE, "profile" }, | |||
| { "baseline", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_BASELINE }, 0, 0, VE, "profile" }, | |||
| { "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_MAIN }, 0, 0, VE, "profile" }, | |||
| { "high", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_HIGH }, 0, 0, VE, "profile" }, | |||
| { "high444p", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_HIGH_444P }, 0, 0, VE, "profile" }, | |||
| { "level", "Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1)", OFFSET(level), AV_OPT_TYPE_STRING, { .str = "auto" }, 0, 0, VE }, | |||
| { "cbr", "Use cbr encoding mode", OFFSET(cbr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, | |||
| { "2pass", "Use 2pass encoding mode", OFFSET(twopass), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE }, | |||
| @@ -39,7 +39,8 @@ static const AVOption options[] = { | |||
| { "llhp", "low latency hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_HP }, 0, 0, VE, "preset" }, | |||
| { "lossless", "lossless", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_DEFAULT }, 0, 0, VE, "preset" }, | |||
| { "losslesshp", "lossless hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_HP }, 0, 0, VE, "preset" }, | |||
| { "profile", "Set the encoding profile (high, main, baseline or high444p)", OFFSET(profile), AV_OPT_TYPE_STRING, { .str = "main" }, 0, 0, VE }, | |||
| { "profile", "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = FF_PROFILE_HEVC_MAIN }, FF_PROFILE_HEVC_MAIN, FF_PROFILE_HEVC_MAIN, VE, "profile" }, | |||
| { "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = FF_PROFILE_HEVC_MAIN }, 0, 0, VE, "profile" }, | |||
| { "level", "Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1)", OFFSET(level), AV_OPT_TYPE_STRING, { .str = "auto" }, 0, 0, VE }, | |||
| { "tier", "Set the encoding tier (main or high)", OFFSET(tier), AV_OPT_TYPE_STRING, { .str = "main" }, 0, 0, VE }, | |||
| { "cbr", "Use cbr encoding mode", OFFSET(cbr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, | |||