From: fat-fred Date: Wed, 1 Dec 2021 10:25:51 +0000 (+0100) Subject: some changes to nvenc X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0165f365cd58bbcc3734e4ec9ce696b42870ff8e;p=thirdparty%2Ftvheadend.git some changes to nvenc -cleanup of profiles -include level selection for nvenc --- diff --git a/src/transcoding/codec/codecs/libs/nvenc.c b/src/transcoding/codec/codecs/libs/nvenc.c index 0a3c6d4b3..92aac725b 100644 --- a/src/transcoding/codec/codecs/libs/nvenc.c +++ b/src/transcoding/codec/codecs/libs/nvenc.c @@ -39,22 +39,56 @@ #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), diff --git a/src/transcoding/codec/internals.h b/src/transcoding/codec/internals.h index 908f172a5..7ce22acef 100644 --- a/src/transcoding/codec/internals.h +++ b/src/transcoding/codec/internals.h @@ -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 {