#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)
int devicenum;
int preset;
int rc;
+ int level;
int quality;
} tvh_codec_profile_nvenc_t;
{"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},
{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},
.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,
/* 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
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 = {
{
.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,
+ },
{}
}
},
/* 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
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),