avcodec/nvenc: convert levels to AVOptions
authorAndrey Turkin <andrey.turkin@gmail.com>
Wed, 25 May 2016 15:00:52 +0000 (18:00 +0300)
committerTimo Rothenpieler <timo@rothenpieler.org>
Tue, 31 May 2016 13:48:43 +0000 (15:48 +0200)
Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
libavcodec/nvenc.c
libavcodec/nvenc.h
libavcodec/nvenc_h264.c
libavcodec/nvenc_hevc.c

index d984b58..a078043 100644 (file)
@@ -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, &timestamp, 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")) {
index b5a0a2a..fdb8853 100644 (file)
@@ -168,7 +168,7 @@ typedef struct NvencContext
 
     int preset;
     int profile;
-    char *level;
+    int level;
     char *tier;
     int cbr;
     int twopass;
index 4e29478..57304f1 100644 (file)
@@ -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 },
index 990d730..2278bb7 100644 (file)
@@ -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 },