mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-08-20 08:15:06 +02:00
avcodec/nvenc: convert profile parsing to AVOptions
Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
This commit is contained in:
parent
faffff88c2
commit
9824321b32
@ -603,9 +603,6 @@ static av_cold void nvenc_setup_rate_control(AVCodecContext *avctx)
|
|||||||
ctx->encode_config.rcParams.maxBitRate = avctx->rc_max_rate;
|
ctx->encode_config.rcParams.maxBitRate = avctx->rc_max_rate;
|
||||||
|
|
||||||
if (ctx->flags & NVENC_LOSSLESS) {
|
if (ctx->flags & NVENC_LOSSLESS) {
|
||||||
if (avctx->codec->id == AV_CODEC_ID_H264)
|
|
||||||
ctx->encode_config.encodeCodecConfig.h264Config.qpPrimeYZeroTransformBypassFlag = 1;
|
|
||||||
|
|
||||||
set_lossless(avctx);
|
set_lossless(avctx);
|
||||||
|
|
||||||
avctx->qmin = -1;
|
avctx->qmin = -1;
|
||||||
@ -710,42 +707,26 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx)
|
|||||||
|
|
||||||
h264->outputAUD = 1;
|
h264->outputAUD = 1;
|
||||||
|
|
||||||
if (!ctx->profile && !(ctx->flags & NVENC_LOSSLESS)) {
|
if (ctx->flags & NVENC_LOSSLESS) {
|
||||||
switch (avctx->profile) {
|
h264->qpPrimeYZeroTransformBypassFlag = 1;
|
||||||
case FF_PROFILE_H264_HIGH_444_PREDICTIVE:
|
} else {
|
||||||
cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_444_GUID;
|
switch(ctx->profile) {
|
||||||
break;
|
case NV_ENC_H264_PROFILE_BASELINE:
|
||||||
case FF_PROFILE_H264_BASELINE:
|
|
||||||
cc->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID;
|
|
||||||
break;
|
|
||||||
case FF_PROFILE_H264_MAIN:
|
|
||||||
cc->profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID;
|
|
||||||
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")) {
|
|
||||||
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;
|
cc->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID;
|
||||||
avctx->profile = FF_PROFILE_H264_BASELINE;
|
avctx->profile = FF_PROFILE_H264_BASELINE;
|
||||||
} else if (!strcmp(ctx->profile, "high444p")) {
|
break;
|
||||||
|
case NV_ENC_H264_PROFILE_MAIN:
|
||||||
|
cc->profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID;
|
||||||
|
avctx->profile = FF_PROFILE_H264_MAIN;
|
||||||
|
break;
|
||||||
|
case NV_ENC_H264_PROFILE_HIGH:
|
||||||
|
cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_GUID;
|
||||||
|
avctx->profile = FF_PROFILE_H264_HIGH;
|
||||||
|
break;
|
||||||
|
case NV_ENC_H264_PROFILE_HIGH_444P:
|
||||||
cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_444_GUID;
|
cc->profileGUID = NV_ENC_H264_PROFILE_HIGH_444_GUID;
|
||||||
avctx->profile = FF_PROFILE_H264_HIGH_444_PREDICTIVE;
|
avctx->profile = FF_PROFILE_H264_HIGH_444_PREDICTIVE;
|
||||||
} else {
|
break;
|
||||||
av_log(avctx, AV_LOG_FATAL, "Profile \"%s\" is unknown! Supported profiles: high, main, baseline\n", ctx->profile);
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +119,13 @@ enum {
|
|||||||
PRESET_LOSSLESS_HP,
|
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 {
|
enum {
|
||||||
NVENC_LOWLATENCY = 1,
|
NVENC_LOWLATENCY = 1,
|
||||||
NVENC_LOSSLESS = 2,
|
NVENC_LOSSLESS = 2,
|
||||||
@ -160,7 +167,7 @@ typedef struct NvencContext
|
|||||||
void *nvencoder;
|
void *nvencoder;
|
||||||
|
|
||||||
int preset;
|
int preset;
|
||||||
char *profile;
|
int profile;
|
||||||
char *level;
|
char *level;
|
||||||
char *tier;
|
char *tier;
|
||||||
int cbr;
|
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" },
|
{ "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" },
|
{ "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" },
|
{ "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 },
|
{ "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 },
|
{ "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 },
|
{ "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" },
|
{ "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" },
|
{ "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" },
|
{ "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 },
|
{ "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 },
|
{ "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 },
|
{ "cbr", "Use cbr encoding mode", OFFSET(cbr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
|
||||||
|
Loading…
Reference in New Issue
Block a user