]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
some changes to nvenc
authorfat-fred <iphone@fatfred.net>
Wed, 1 Dec 2021 10:25:51 +0000 (11:25 +0100)
committerFlole998 <Flole998@users.noreply.github.com>
Sun, 2 Jan 2022 14:08:50 +0000 (15:08 +0100)
  -cleanup of profiles

  -include level selection for nvenc

src/transcoding/codec/codecs/libs/nvenc.c
src/transcoding/codec/internals.h

index 0a3c6d4b3b3b9f1df1d3f42877ca590d17492a92..92aac725b0c819002bf4f18664b0422f7880c663 100644 (file)
 #define NV_ENC_PARAMS_RC_CONSTQP               1
 #define NV_ENC_PARAMS_RC_VBR                   2
 #define NV_ENC_PARAMS_RC_CBR                   3
-//(deprecated)#define NV_ENC_PARAMS_RC_VBR_MINQP             4
-//(deprecated)#define NV_ENC_PARAMS_RC_2_PASS_QUALITY        5
-//(deprecated)#define NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP  6
-//(deprecated)#define NV_ENC_PARAMS_RC_2_PASS_VBR            7
 #define NV_ENC_PARAMS_RC_CBR_LD_HQ             8
 #define NV_ENC_PARAMS_RC_CBR_HQ                16
 #define NV_ENC_PARAMS_RC_VBR_HQ                32
 
-#define  FF_PROFILE_H264_NVENC_BASELINE                            0
-#define  FF_PROFILE_H264_NVENC_MAIN                            1
-#define  FF_PROFILE_H264_NVENC_HIGH                            2
-#define  FF_PROFILE_H264_NVENC_HIGH_444_PREDICTIVE     3
-
-#define FF_PROFILE_HEVC_NVENC_MAIN                             0
-#define FF_PROFILE_HEVC_NVENC_MAIN_10                      1
-#define FF_PROFILE_HEVC_NVENC_REXT                             2
+#define NV_ENC_H264_PROFILE_BASELINE                       0
+#define NV_ENC_H264_PROFILE_MAIN                               1
+#define NV_ENC_H264_PROFILE_HIGH                               2
+#define NV_ENC_H264_PROFILE_HIGH_444P                  3
+
+#define NV_ENC_HEVC_PROFILE_MAIN                               0
+#define NV_ENC_HEVC_PROFILE_MAIN_10                        1
+#define NV_ENC_HEVC_PROFILE_REXT                               2
+
+#define NV_ENC_PROFILE_UNKNOWN                      4
+
+#define NV_ENC_LEVEL_AUTOSELECT                     0
+
+#define NV_ENC_LEVEL_H264_1                         10
+#define NV_ENC_LEVEL_H264_1b                        9
+#define NV_ENC_LEVEL_H264_11                        11
+#define NV_ENC_LEVEL_H264_12                        12
+#define NV_ENC_LEVEL_H264_13                        13
+#define NV_ENC_LEVEL_H264_2                         20
+#define NV_ENC_LEVEL_H264_21                        21
+#define NV_ENC_LEVEL_H264_22                        22
+#define NV_ENC_LEVEL_H264_3                         30
+#define NV_ENC_LEVEL_H264_31                        31
+#define NV_ENC_LEVEL_H264_32                        32
+#define NV_ENC_LEVEL_H264_4                         40
+#define NV_ENC_LEVEL_H264_41                        41
+#define NV_ENC_LEVEL_H264_42                        42
+#define NV_ENC_LEVEL_H264_5                         50
+#define NV_ENC_LEVEL_H264_51                        51
+#define NV_ENC_LEVEL_H264_6                         60
+#define NV_ENC_LEVEL_H264_61                        61
+#define NV_ENC_LEVEL_H264_62                        62
+
+#define NV_ENC_LEVEL_HEVC_1                         30
+#define NV_ENC_LEVEL_HEVC_2                         60
+#define NV_ENC_LEVEL_HEVC_21                        63
+#define NV_ENC_LEVEL_HEVC_3                         90
+#define NV_ENC_LEVEL_HEVC_31                        93
+#define NV_ENC_LEVEL_HEVC_4                         120
+#define NV_ENC_LEVEL_HEVC_41                        123
+#define NV_ENC_LEVEL_HEVC_5                         150
+#define NV_ENC_LEVEL_HEVC_51                        153
+#define NV_ENC_LEVEL_HEVC_52                        156
+#define NV_ENC_LEVEL_HEVC_6                         180
+#define NV_ENC_LEVEL_HEVC_61                        183
+#define NV_ENC_LEVEL_HEVC_62                        186
 
 #define AV_DICT_SET_CQ(d, v, a) \
     AV_DICT_SET_INT((d), "cq", (v) ? (v) : (a), AV_DICT_DONT_OVERWRITE)
@@ -68,6 +102,7 @@ typedef struct {
     int devicenum;
     int preset;
     int rc;
+    int level;
     int quality;
 } tvh_codec_profile_nvenc_t;
 
@@ -93,10 +128,6 @@ tvh_codec_profile_nvenc_open(tvh_codec_profile_nvenc_t *self,
         {"constqp",          NV_ENC_PARAMS_RC_CONSTQP},
         {"vbr",           NV_ENC_PARAMS_RC_VBR},
         {"cbr",           NV_ENC_PARAMS_RC_CBR},
-        //(deprecated){"vbr_minqp",         NV_ENC_PARAMS_RC_VBR_MINQP},
-        //(deprecated){"ll_2pass_quality",  NV_ENC_PARAMS_RC_2_PASS_QUALITY},
-        //(deprecated){"ll_2pass_size",     NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP},
-        //(deprecated){"vbr_2pass",         NV_ENC_PARAMS_RC_2_PASS_VBR},
         {"cbr_ld_hq",     NV_ENC_PARAMS_RC_CBR_LD_HQ},
         {"cbr_hq",        NV_ENC_PARAMS_RC_CBR_HQ},
         {"vbr_hq",        NV_ENC_PARAMS_RC_VBR_HQ},
@@ -154,10 +185,6 @@ codec_profile_nvenc_class_rc_list(void *obj, const char *lang)
         {N_("Constant QP mode"),      NV_ENC_PARAMS_RC_CONSTQP},
         {N_("VBR mode"),                         NV_ENC_PARAMS_RC_VBR},
         {N_("CBR mode"),                         NV_ENC_PARAMS_RC_CBR},
-        //(deprecated){N_("VBR mode with MinQP"),                NV_ENC_PARAMS_RC_VBR_MINQP},
-        //(deprecated){N_("VBR multi-pass LL quality mode"),     NV_ENC_PARAMS_RC_2_PASS_QUALITY},
-        //(deprecated){N_("VBR multi-pass LL frame size mode"), NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP},
-        //(deprecated){N_("VBR multi-pass mode"),                NV_ENC_PARAMS_RC_2_PASS_VBR},
         {N_("CBR LD HQ"),                        NV_ENC_PARAMS_RC_CBR_LD_HQ},
         {N_("CBR High Quality"),         NV_ENC_PARAMS_RC_CBR_HQ},
         {N_("VBR High Quality"),         NV_ENC_PARAMS_RC_VBR_HQ},
@@ -190,7 +217,7 @@ static const codec_profile_class_t codec_profile_nvenc_class = {
                 .get_opts = codec_profile_class_profile_get_opts,
                 .off      = offsetof(tvh_codec_profile_nvenc_t, nvenc_profile),
                 .list     = codec_profile_nvenc_class_profile_list,
-                .def.i    = FF_PROFILE_UNKNOWN,
+                .def.i    = NV_ENC_PROFILE_UNKNOWN,
             },
             {
                 .type     = PT_INT,
@@ -246,12 +273,13 @@ static const codec_profile_class_t codec_profile_nvenc_class = {
 
 /* h264_nvenc =============================================================== */
 
+
 static const AVProfile nvenc_h264_profiles[] = {
-    { FF_PROFILE_H264_NVENC_BASELINE,             "Baseline" },
-    { FF_PROFILE_H264_NVENC_MAIN,                 "Main" },
-    { FF_PROFILE_H264_NVENC_HIGH,                 "High" },
-    { FF_PROFILE_H264_NVENC_HIGH_444_PREDICTIVE,  "High 444P" },
-    { FF_PROFILE_UNKNOWN },
+    { NV_ENC_H264_PROFILE_BASELINE,             "Baseline" },
+    { NV_ENC_H264_PROFILE_MAIN,                 "Main" },
+    { NV_ENC_H264_PROFILE_HIGH,                 "High" },
+    { NV_ENC_H264_PROFILE_HIGH_444P,            "High 444P" },
+    { NV_ENC_PROFILE_UNKNOWN },
 };
 
 static int
@@ -259,19 +287,84 @@ tvh_codec_profile_nvenc_h264_open(tvh_codec_profile_nvenc_t *self,
                                   AVDictionary **opts)
 {
     static const struct strtab profiletab[] = {
-        {"baseline",    FF_PROFILE_H264_NVENC_BASELINE},
-        {"main",        FF_PROFILE_H264_NVENC_MAIN},
-        {"high",        FF_PROFILE_H264_NVENC_HIGH,},
-        {"high444p",    FF_PROFILE_H264_NVENC_HIGH_444_PREDICTIVE},
+        {"baseline",    NV_ENC_H264_PROFILE_BASELINE},
+        {"main",        NV_ENC_H264_PROFILE_MAIN},
+        {"high",        NV_ENC_H264_PROFILE_HIGH},
+        {"high444p",    NV_ENC_H264_PROFILE_HIGH_444P},
+    };
+    static const struct strtab leveltab[] = {
+        {"Auto",             NV_ENC_LEVEL_AUTOSELECT},
+        {"1.0",           NV_ENC_LEVEL_H264_1},
+        {"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.0",           NV_ENC_LEVEL_H264_2},
+        {"2.1",           NV_ENC_LEVEL_H264_21},
+        {"2.2",           NV_ENC_LEVEL_H264_22},
+        {"3.0",           NV_ENC_LEVEL_H264_3},
+        {"3.1",           NV_ENC_LEVEL_H264_31},
+        {"3.2",           NV_ENC_LEVEL_H264_32},
+        {"4.0",           NV_ENC_LEVEL_H264_4},
+        {"4.1",           NV_ENC_LEVEL_H264_41},
+        {"4.2",           NV_ENC_LEVEL_H264_42},
+        {"5.0",           NV_ENC_LEVEL_H264_5},
+        {"5.1",           NV_ENC_LEVEL_H264_51},
+        {"6.0",           NV_ENC_LEVEL_H264_6},
+        {"6.1",           NV_ENC_LEVEL_H264_61},
+        {"6.2",           NV_ENC_LEVEL_H264_62},
     };
+
     const char *s;
 
-    if (self->nvenc_profile != FF_PROFILE_UNKNOWN &&
+    if (self->level != NV_ENC_LEVEL_AUTOSELECT &&
+        (s = val2str(self->level, leveltab)) != NULL) {
+        AV_DICT_SET(opts, "level", s, 0);
+    }
+
+    if (self->nvenc_profile != NV_ENC_PROFILE_UNKNOWN &&
         (s = val2str(self->nvenc_profile, profiletab)) != NULL)
       AV_DICT_SET(opts, "profile", s, 0);
+      // ------ Set Defaults ---------
+      AV_DICT_SET_INT(opts, "qmin", "-1", 0);
+      AV_DICT_SET_INT(opts, "qmax", "-1", 0);
+      AV_DICT_SET_INT(opts, "qdiff", "-1", 0);
+      AV_DICT_SET_INT(opts, "qblur", "-1", 0);
+      AV_DICT_SET_INT(opts, "qcomp", "-1", 0);
+      AV_DICT_SET_INT(opts, "g", "250", 0);
+      AV_DICT_SET_INT(opts, "bf", "0", 0);
+      AV_DICT_SET_INT(opts, "refs", "0", 0);
     return 0;
 }
 
+static htsmsg_t *
+codec_profile_nvenc_class_level_list_h264(void *obj, const char *lang)
+{
+    static const struct strtab tab[] = {
+        {N_("Auto"),         NV_ENC_LEVEL_AUTOSELECT},
+        {N_("1.0"),           NV_ENC_LEVEL_H264_1},
+        {N_("1.0b"),          NV_ENC_LEVEL_H264_1b},
+        {N_("1.1"),           NV_ENC_LEVEL_H264_11},
+        {N_("1.2"),           NV_ENC_LEVEL_H264_12},
+        {N_("1.3"),           NV_ENC_LEVEL_H264_13},
+        {N_("2.0"),           NV_ENC_LEVEL_H264_2},
+        {N_("2.1"),           NV_ENC_LEVEL_H264_21},
+        {N_("2.2"),           NV_ENC_LEVEL_H264_22},
+        {N_("3.0"),           NV_ENC_LEVEL_H264_3},
+        {N_("3.1"),           NV_ENC_LEVEL_H264_31},
+        {N_("3.2"),           NV_ENC_LEVEL_H264_32},
+        {N_("4.0"),           NV_ENC_LEVEL_H264_4},
+        {N_("4.1"),           NV_ENC_LEVEL_H264_41},
+        {N_("4.2"),           NV_ENC_LEVEL_H264_42},
+        {N_("5.0"),           NV_ENC_LEVEL_H264_5},
+        {N_("5.1"),           NV_ENC_LEVEL_H264_51},
+        {N_("6.0"),           NV_ENC_LEVEL_H264_6},
+        {N_("6.1"),           NV_ENC_LEVEL_H264_61},
+        {N_("6.2"),           NV_ENC_LEVEL_H264_62},
+    };
+    return strtab2htsmsg(tab, 1, lang);
+}
 
 static const codec_profile_class_t codec_profile_nvenc_h264_class = {
     {
@@ -279,6 +372,17 @@ static const codec_profile_class_t codec_profile_nvenc_h264_class = {
         .ic_class      = "codec_profile_nvenc_h264",
         .ic_caption    = N_("nvenc_h264"),
         .ic_properties = (const property_t[]){
+            {
+                .type     = PT_INT,
+                .id       = "level",
+                .name     = N_("Level"),
+                .group    = 4,
+                .desc     = N_("Override the preset level."),
+                .opts     = PO_EXPERT,
+                .off      = offsetof(tvh_codec_profile_nvenc_t, level),
+                .list     = codec_profile_nvenc_class_level_list_h264,
+                .def.i    = NV_ENC_LEVEL_AUTOSELECT,
+            },
             {}
         }
     },
@@ -297,10 +401,10 @@ TVHVideoCodec tvh_codec_nvenc_h264 = {
 /* hevc_nvenc =============================================================== */
 
 static const AVProfile nvenc_hevc_profiles[] = {
-    { FF_PROFILE_HEVC_NVENC_MAIN,    "Main" },
-    { FF_PROFILE_HEVC_NVENC_MAIN_10, "Main 10" },
-    { FF_PROFILE_HEVC_NVENC_REXT, "Rext" },
-    { FF_PROFILE_UNKNOWN },
+    { NV_ENC_HEVC_PROFILE_MAIN,    "Main" },
+    { NV_ENC_HEVC_PROFILE_MAIN_10, "Main 10" },
+    { NV_ENC_HEVC_PROFILE_REXT, "Rext" },
+    { NV_ENC_PROFILE_UNKNOWN },
 };
 
 static int
@@ -308,30 +412,97 @@ tvh_codec_profile_nvenc_hevc_open(tvh_codec_profile_nvenc_t *self,
                                   AVDictionary **opts)
 {
     static const struct strtab profiletab[] = {
-        {"main",        FF_PROFILE_HEVC_NVENC_MAIN},
-        {"main10",      FF_PROFILE_HEVC_NVENC_MAIN_10,},
-        {"rext",        FF_PROFILE_HEVC_NVENC_REXT,},
+        {"main",        NV_ENC_HEVC_PROFILE_MAIN},
+        {"main10",      NV_ENC_HEVC_PROFILE_MAIN_10},
+        {"rext",        NV_ENC_HEVC_PROFILE_REXT},
     };
+
+    static const struct strtab leveltab[] = {
+        {"Auto",          NV_ENC_LEVEL_AUTOSELECT},
+        {"1.0",           NV_ENC_LEVEL_HEVC_1},
+        {"2.0",           NV_ENC_LEVEL_HEVC_2},
+        {"2.1",           NV_ENC_LEVEL_HEVC_21},
+        {"3.0",           NV_ENC_LEVEL_HEVC_3},
+        {"3.1",           NV_ENC_LEVEL_HEVC_31},
+        {"4.0",           NV_ENC_LEVEL_HEVC_4},
+        {"4.1",           NV_ENC_LEVEL_HEVC_41},
+        {"5.0",           NV_ENC_LEVEL_HEVC_5},
+        {"5.1",           NV_ENC_LEVEL_HEVC_51},
+        {"5.2",           NV_ENC_LEVEL_HEVC_52},
+        {"6.0",           NV_ENC_LEVEL_HEVC_6},
+        {"6.1",           NV_ENC_LEVEL_HEVC_61},
+        {"6.2",           NV_ENC_LEVEL_HEVC_62},
+    };
+
     const char *s;
 
-    if (self->nvenc_profile != FF_PROFILE_UNKNOWN &&
-        (s = val2str(self->nvenc_profile, profiletab)) != NULL)
-      AV_DICT_SET(opts, "profile", s, 0);
-    AV_DICT_SET_INT(opts, "bf", 0, 0);
+    if (self->level != NV_ENC_LEVEL_AUTOSELECT &&
+        (s = val2str(self->level, leveltab)) != NULL) {
+        AV_DICT_SET(opts, "level", s, 0);
+        }
+
+    if (self->nvenc_profile != NV_ENC_PROFILE_UNKNOWN &&
+        (s = val2str(self->nvenc_profile, profiletab)) != NULL) {
+        AV_DICT_SET(opts, "profile", s, 0);
+        }
+    
+    // ------ Set Defaults ---------
+    AV_DICT_SET_INT(opts, "qmin", "-1", 0);
+    AV_DICT_SET_INT(opts, "qmax", "-1", 0);
+    AV_DICT_SET_INT(opts, "qdiff", "-1", 0);
+    AV_DICT_SET_INT(opts, "qblur", "-1", 0);
+    AV_DICT_SET_INT(opts, "qcomp", "-1", 0);
+    AV_DICT_SET_INT(opts, "g", "250", 0);
+    AV_DICT_SET_INT(opts, "bf", "0", 0);
+    AV_DICT_SET_INT(opts, "refs", "0", 0);
     return 0;
 }
 
+static htsmsg_t *
+codec_profile_nvenc_class_level_list_hevc(void *obj, const char *lang)
+{
+    static const struct strtab tab[] = {
+        {N_("Auto"),         NV_ENC_LEVEL_AUTOSELECT},
+        {N_("1.0"),           NV_ENC_LEVEL_HEVC_1},
+        {N_("2.0"),           NV_ENC_LEVEL_HEVC_2},
+        {N_("2.1"),           NV_ENC_LEVEL_HEVC_21},
+        {N_("3.0"),           NV_ENC_LEVEL_HEVC_3},
+        {N_("3.1"),           NV_ENC_LEVEL_HEVC_31},
+        {N_("4.0"),           NV_ENC_LEVEL_HEVC_4},
+        {N_("4.1"),           NV_ENC_LEVEL_HEVC_41},
+        {N_("5.0"),           NV_ENC_LEVEL_HEVC_5},
+        {N_("5.1"),           NV_ENC_LEVEL_HEVC_51},
+        {N_("5.2"),           NV_ENC_LEVEL_HEVC_52},
+        {N_("6.0"),           NV_ENC_LEVEL_HEVC_6},
+        {N_("6.1"),           NV_ENC_LEVEL_HEVC_61},
+        {N_("6.2"),           NV_ENC_LEVEL_HEVC_62},
+    };
+    return strtab2htsmsg(tab, 1, lang);
+}
 
 static const codec_profile_class_t codec_profile_nvenc_hevc_class = {
     {
         .ic_super      = (idclass_t *)&codec_profile_nvenc_class,
         .ic_class      = "codec_profile_nvenc_hevc",
-        .ic_caption    = N_("nvenc_hevc")
+        .ic_caption    = N_("nvenc_hevc"),
+        .ic_properties = (const property_t[]){
+            {
+                .type     = PT_INT,
+                .id       = "level",
+                .name     = N_("Level"),
+                .group    = 4,
+                .desc     = N_("Override the preset level."),
+                .opts     = PO_EXPERT,
+                .off      = offsetof(tvh_codec_profile_nvenc_t, level),
+                .list     = codec_profile_nvenc_class_level_list_hevc,
+                .def.i    = NV_ENC_LEVEL_AUTOSELECT,
+            },
+            {}
+        }
     },
     .open = (codec_profile_open_meth)tvh_codec_profile_nvenc_hevc_open,
 };
 
-
 TVHVideoCodec tvh_codec_nvenc_hevc = {
     .name     = "hevc_nvenc",
     .size     = sizeof(tvh_codec_profile_nvenc_t),
index 908f172a5f44d1acab287da8a3a11aba79f36bc3..7ce22acef43566b82aa8a4e97f1f432a6f2daf8c 100644 (file)
@@ -26,7 +26,7 @@
 #include "transcoding/memutils.h"
 
 
-#define AUTO_STR "auto"
+#define AUTO_STR "Auto"
 
 #define ADD_ENTRY(l, m, kt, k, vt, v) \
     do { \
@@ -167,6 +167,9 @@ tvh_codec_base_get_opts(TVHCodec *self, uint32_t opts, int visible);
 htsmsg_t *
 tvh_codec_get_list_profiles(TVHCodec *self);
 
+/*htsmsg_t *
+tvh_codec_get_list_level(TVHCodec *self);*/
+
 /* codec_profile_video_class */
 
 typedef struct tvh_codec_video {