mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-26 09:12:33 +00:00
avcodec/nvenc: convert levels to AVOptions
Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
This commit is contained in:
parent
9824321b32
commit
b0172873a8
@ -66,63 +66,6 @@ typedef struct NvencData
|
||||
} u;
|
||||
} NvencData;
|
||||
|
||||
typedef struct NvencValuePair
|
||||
{
|
||||
const char *str;
|
||||
uint32_t num;
|
||||
} NvencValuePair;
|
||||
|
||||
static const NvencValuePair nvenc_h264_level_pairs[] = {
|
||||
{ "auto", NV_ENC_LEVEL_AUTOSELECT },
|
||||
{ "1" , NV_ENC_LEVEL_H264_1 },
|
||||
{ "1.0" , NV_ENC_LEVEL_H264_1 },
|
||||
{ "1b" , NV_ENC_LEVEL_H264_1b },
|
||||
{ "1.0b", NV_ENC_LEVEL_H264_1b },
|
||||
{ "1.1" , NV_ENC_LEVEL_H264_11 },
|
||||
{ "1.2" , NV_ENC_LEVEL_H264_12 },
|
||||
{ "1.3" , NV_ENC_LEVEL_H264_13 },
|
||||
{ "2" , NV_ENC_LEVEL_H264_2 },
|
||||
{ "2.0" , NV_ENC_LEVEL_H264_2 },
|
||||
{ "2.1" , NV_ENC_LEVEL_H264_21 },
|
||||
{ "2.2" , NV_ENC_LEVEL_H264_22 },
|
||||
{ "3" , NV_ENC_LEVEL_H264_3 },
|
||||
{ "3.0" , NV_ENC_LEVEL_H264_3 },
|
||||
{ "3.1" , NV_ENC_LEVEL_H264_31 },
|
||||
{ "3.2" , NV_ENC_LEVEL_H264_32 },
|
||||
{ "4" , NV_ENC_LEVEL_H264_4 },
|
||||
{ "4.0" , NV_ENC_LEVEL_H264_4 },
|
||||
{ "4.1" , NV_ENC_LEVEL_H264_41 },
|
||||
{ "4.2" , NV_ENC_LEVEL_H264_42 },
|
||||
{ "5" , NV_ENC_LEVEL_H264_5 },
|
||||
{ "5.0" , NV_ENC_LEVEL_H264_5 },
|
||||
{ "5.1" , NV_ENC_LEVEL_H264_51 },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
static const NvencValuePair nvenc_hevc_level_pairs[] = {
|
||||
{ "auto", NV_ENC_LEVEL_AUTOSELECT },
|
||||
{ "1" , NV_ENC_LEVEL_HEVC_1 },
|
||||
{ "1.0" , NV_ENC_LEVEL_HEVC_1 },
|
||||
{ "2" , NV_ENC_LEVEL_HEVC_2 },
|
||||
{ "2.0" , NV_ENC_LEVEL_HEVC_2 },
|
||||
{ "2.1" , NV_ENC_LEVEL_HEVC_21 },
|
||||
{ "3" , NV_ENC_LEVEL_HEVC_3 },
|
||||
{ "3.0" , NV_ENC_LEVEL_HEVC_3 },
|
||||
{ "3.1" , NV_ENC_LEVEL_HEVC_31 },
|
||||
{ "4" , NV_ENC_LEVEL_HEVC_4 },
|
||||
{ "4.0" , NV_ENC_LEVEL_HEVC_4 },
|
||||
{ "4.1" , NV_ENC_LEVEL_HEVC_41 },
|
||||
{ "5" , NV_ENC_LEVEL_HEVC_5 },
|
||||
{ "5.0" , NV_ENC_LEVEL_HEVC_5 },
|
||||
{ "5.1" , NV_ENC_LEVEL_HEVC_51 },
|
||||
{ "5.2" , NV_ENC_LEVEL_HEVC_52 },
|
||||
{ "6" , NV_ENC_LEVEL_HEVC_6 },
|
||||
{ "6.0" , NV_ENC_LEVEL_HEVC_6 },
|
||||
{ "6.1" , NV_ENC_LEVEL_HEVC_61 },
|
||||
{ "6.2" , NV_ENC_LEVEL_HEVC_62 },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
static const struct {
|
||||
NVENCSTATUS nverr;
|
||||
int averr;
|
||||
@ -181,18 +124,6 @@ static int nvenc_print_error(void *log_ctx, NVENCSTATUS err,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int input_string_to_uint32(AVCodecContext *avctx, const NvencValuePair *pair, const char *input, uint32_t *output)
|
||||
{
|
||||
for (; pair->str; ++pair) {
|
||||
if (!strcmp(input, pair->str)) {
|
||||
*output = pair->num;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
static void timestamp_queue_enqueue(AVFifoBuffer* queue, int64_t timestamp)
|
||||
{
|
||||
av_fifo_generic_write(queue, ×tamp, sizeof(timestamp), NULL);
|
||||
@ -683,7 +614,6 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx)
|
||||
NV_ENC_CONFIG *cc = &ctx->encode_config;
|
||||
NV_ENC_CONFIG_H264 *h264 = &cc->encodeCodecConfig.h264Config;
|
||||
NV_ENC_CONFIG_H264_VUI_PARAMETERS *vui = &h264->h264VUIParameters;
|
||||
int res;
|
||||
|
||||
vui->colourMatrix = avctx->colorspace;
|
||||
vui->colourPrimaries = avctx->color_primaries;
|
||||
@ -738,16 +668,7 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx)
|
||||
|
||||
h264->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, &h264->level);
|
||||
|
||||
if (res) {
|
||||
av_log(avctx, AV_LOG_FATAL, "Level \"%s\" is unknown! Supported levels: auto, 1, 1b, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 3, 3.1, 3.2, 4, 4.1, 4.2, 5, 5.1\n", ctx->level);
|
||||
return res;
|
||||
}
|
||||
} else {
|
||||
h264->level = NV_ENC_LEVEL_AUTOSELECT;
|
||||
}
|
||||
h264->level = ctx->level;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -758,7 +679,6 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx)
|
||||
NV_ENC_CONFIG *cc = &ctx->encode_config;
|
||||
NV_ENC_CONFIG_HEVC *hevc = &cc->encodeCodecConfig.hevcConfig;
|
||||
NV_ENC_CONFIG_HEVC_VUI_PARAMETERS *vui = &hevc->hevcVUIParameters;
|
||||
int res;
|
||||
|
||||
vui->colourMatrix = avctx->colorspace;
|
||||
vui->colourPrimaries = avctx->color_primaries;
|
||||
@ -786,16 +706,7 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx)
|
||||
cc->profileGUID = NV_ENC_HEVC_PROFILE_MAIN_GUID;
|
||||
avctx->profile = FF_PROFILE_HEVC_MAIN;
|
||||
|
||||
if (ctx->level) {
|
||||
res = input_string_to_uint32(avctx, nvenc_hevc_level_pairs, ctx->level, &hevc->level);
|
||||
|
||||
if (res) {
|
||||
av_log(avctx, AV_LOG_FATAL, "Level \"%s\" is unknown! Supported levels: auto, 1, 2, 2.1, 3, 3.1, 4, 4.1, 5, 5.1, 5.2, 6, 6.1, 6.2\n", ctx->level);
|
||||
return res;
|
||||
}
|
||||
} else {
|
||||
hevc->level = NV_ENC_LEVEL_AUTOSELECT;
|
||||
}
|
||||
hevc->level = ctx->level;
|
||||
|
||||
if (ctx->tier) {
|
||||
if (!strcmp(ctx->tier, "main")) {
|
||||
|
@ -168,7 +168,7 @@ typedef struct NvencContext
|
||||
|
||||
int preset;
|
||||
int profile;
|
||||
char *level;
|
||||
int level;
|
||||
char *tier;
|
||||
int cbr;
|
||||
int twopass;
|
||||
|
@ -44,7 +44,30 @@ static const AVOption options[] = {
|
||||
{ "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", OFFSET(level), AV_OPT_TYPE_INT, { .i64 = NV_ENC_LEVEL_AUTOSELECT }, NV_ENC_LEVEL_AUTOSELECT, NV_ENC_LEVEL_H264_51, VE, "level" },
|
||||
{ "auto", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_AUTOSELECT }, 0, 0, VE, "level" },
|
||||
{ "1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_1 }, 0, 0, VE, "level" },
|
||||
{ "1.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_1 }, 0, 0, VE, "level" },
|
||||
{ "1b", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_1b }, 0, 0, VE, "level" },
|
||||
{ "1.0b", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_1b }, 0, 0, VE, "level" },
|
||||
{ "1.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_11 }, 0, 0, VE, "level" },
|
||||
{ "1.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_12 }, 0, 0, VE, "level" },
|
||||
{ "1.3", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_13 }, 0, 0, VE, "level" },
|
||||
{ "2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_2 }, 0, 0, VE, "level" },
|
||||
{ "2.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_2 }, 0, 0, VE, "level" },
|
||||
{ "2.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_21 }, 0, 0, VE, "level" },
|
||||
{ "2.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_22 }, 0, 0, VE, "level" },
|
||||
{ "3", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_3 }, 0, 0, VE, "level" },
|
||||
{ "3.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_3 }, 0, 0, VE, "level" },
|
||||
{ "3.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_31 }, 0, 0, VE, "level" },
|
||||
{ "3.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_32 }, 0, 0, VE, "level" },
|
||||
{ "4", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_4 }, 0, 0, VE, "level" },
|
||||
{ "4.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_4 }, 0, 0, VE, "level" },
|
||||
{ "4.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_41 }, 0, 0, VE, "level" },
|
||||
{ "4.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_42 }, 0, 0, VE, "level" },
|
||||
{ "5", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_5 }, 0, 0, VE, "level" },
|
||||
{ "5.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_5 }, 0, 0, VE, "level" },
|
||||
{ "5.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_51 }, 0, 0, VE, "level" },
|
||||
{ "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 },
|
||||
{ "gpu", "Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on.", OFFSET(gpu), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
|
||||
|
@ -41,7 +41,27 @@ static const AVOption options[] = {
|
||||
{ "losslesshp", "lossless hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_HP }, 0, 0, VE, "preset" },
|
||||
{ "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", OFFSET(level), AV_OPT_TYPE_INT, { .i64 = NV_ENC_LEVEL_AUTOSELECT }, NV_ENC_LEVEL_AUTOSELECT, NV_ENC_LEVEL_HEVC_62, VE, "level" },
|
||||
{ "auto", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_AUTOSELECT }, 0, 0, VE, "level" },
|
||||
{ "1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_1 }, 0, 0, VE, "level" },
|
||||
{ "1.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_1 }, 0, 0, VE, "level" },
|
||||
{ "2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_2 }, 0, 0, VE, "level" },
|
||||
{ "2.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_2 }, 0, 0, VE, "level" },
|
||||
{ "2.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_21 }, 0, 0, VE, "level" },
|
||||
{ "3", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_3 }, 0, 0, VE, "level" },
|
||||
{ "3.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_3 }, 0, 0, VE, "level" },
|
||||
{ "3.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_31 }, 0, 0, VE, "level" },
|
||||
{ "4", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_4 }, 0, 0, VE, "level" },
|
||||
{ "4.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_4 }, 0, 0, VE, "level" },
|
||||
{ "4.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_41 }, 0, 0, VE, "level" },
|
||||
{ "5", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_5 }, 0, 0, VE, "level" },
|
||||
{ "5.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_5 }, 0, 0, VE, "level" },
|
||||
{ "5.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_51 }, 0, 0, VE, "level" },
|
||||
{ "5.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_52 }, 0, 0, VE, "level" },
|
||||
{ "6", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_6 }, 0, 0, VE, "level" },
|
||||
{ "6.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_6 }, 0, 0, VE, "level" },
|
||||
{ "6.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_61 }, 0, 0, VE, "level" },
|
||||
{ "6.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_62 }, 0, 0, VE, "level" },
|
||||
{ "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 },
|
||||
{ "2pass", "Use 2pass encoding mode", OFFSET(twopass), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },
|
||||
|
Loading…
Reference in New Issue
Block a user