26 #define OFFSET(x) offsetof(NvencContext, x)
27 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
29 #ifdef NVENC_HAVE_NEW_PRESETS
46 #ifdef NVENC_HAVE_NEW_PRESETS
47 {
"p1",
"fastest (lowest quality)", 0,
AV_OPT_TYPE_CONST, { .i64 = PRESET_P1 }, 0, 0,
VE, .unit =
"preset" },
48 {
"p2",
"faster (lower quality)", 0,
AV_OPT_TYPE_CONST, { .i64 = PRESET_P2 }, 0, 0,
VE, .unit =
"preset" },
49 {
"p3",
"fast (low quality)", 0,
AV_OPT_TYPE_CONST, { .i64 = PRESET_P3 }, 0, 0,
VE, .unit =
"preset" },
50 {
"p4",
"medium (default)", 0,
AV_OPT_TYPE_CONST, { .i64 = PRESET_P4 }, 0, 0,
VE, .unit =
"preset" },
51 {
"p5",
"slow (good quality)", 0,
AV_OPT_TYPE_CONST, { .i64 = PRESET_P5 }, 0, 0,
VE, .unit =
"preset" },
52 {
"p6",
"slower (better quality)", 0,
AV_OPT_TYPE_CONST, { .i64 = PRESET_P6 }, 0, 0,
VE, .unit =
"preset" },
53 {
"p7",
"slowest (best quality)", 0,
AV_OPT_TYPE_CONST, { .i64 = PRESET_P7 }, 0, 0,
VE, .unit =
"preset" },
54 {
"tune",
"Set the encoding tuning info",
OFFSET(tuning_info),
AV_OPT_TYPE_INT, { .i64 = NV_ENC_TUNING_INFO_HIGH_QUALITY }, NV_ENC_TUNING_INFO_HIGH_QUALITY, NV_ENC_TUNING_INFO_COUNT - 1,
VE, .unit =
"tune" },
55 {
"hq",
"High quality", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TUNING_INFO_HIGH_QUALITY }, 0, 0,
VE, .unit =
"tune" },
56 #ifdef NVENC_HAVE_UHQ_TUNING
57 {
"uhq",
"Ultra high quality", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TUNING_INFO_ULTRA_HIGH_QUALITY }, 0, 0,
VE, .unit =
"tune" },
59 {
"ll",
"Low latency", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TUNING_INFO_LOW_LATENCY }, 0, 0,
VE, .unit =
"tune" },
60 {
"ull",
"Ultra low latency", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TUNING_INFO_ULTRA_LOW_LATENCY }, 0, 0,
VE, .unit =
"tune" },
61 {
"lossless",
"Lossless", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TUNING_INFO_LOSSLESS }, 0, 0,
VE, .unit =
"tune" },
67 {
"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, .unit =
"level" },
68 {
"auto",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_AUTOSELECT }, 0, 0,
VE, .unit =
"level" },
69 {
"1",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_1 }, 0, 0,
VE, .unit =
"level" },
70 {
"1.0",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_1 }, 0, 0,
VE, .unit =
"level" },
71 {
"2",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_2 }, 0, 0,
VE, .unit =
"level" },
72 {
"2.0",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_2 }, 0, 0,
VE, .unit =
"level" },
73 {
"2.1",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_21 }, 0, 0,
VE, .unit =
"level" },
74 {
"3",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_3 }, 0, 0,
VE, .unit =
"level" },
75 {
"3.0",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_3 }, 0, 0,
VE, .unit =
"level" },
76 {
"3.1",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_31 }, 0, 0,
VE, .unit =
"level" },
77 {
"4",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_4 }, 0, 0,
VE, .unit =
"level" },
78 {
"4.0",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_4 }, 0, 0,
VE, .unit =
"level" },
79 {
"4.1",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_41 }, 0, 0,
VE, .unit =
"level" },
80 {
"5",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_5 }, 0, 0,
VE, .unit =
"level" },
81 {
"5.0",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_5 }, 0, 0,
VE, .unit =
"level" },
82 {
"5.1",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_51 }, 0, 0,
VE, .unit =
"level" },
83 {
"5.2",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_52 }, 0, 0,
VE, .unit =
"level" },
84 {
"6",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_6 }, 0, 0,
VE, .unit =
"level" },
85 {
"6.0",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_6 }, 0, 0,
VE, .unit =
"level" },
86 {
"6.1",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_61 }, 0, 0,
VE, .unit =
"level" },
87 {
"6.2",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_62 }, 0, 0,
VE, .unit =
"level" },
88 {
"tier",
"Set the encoding tier",
OFFSET(
tier),
AV_OPT_TYPE_INT, { .i64 = NV_ENC_TIER_HEVC_MAIN }, NV_ENC_TIER_HEVC_MAIN, NV_ENC_TIER_HEVC_HIGH,
VE, .unit =
"tier"},
89 {
"main",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TIER_HEVC_MAIN }, 0, 0,
VE, .unit =
"tier" },
90 {
"high",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TIER_HEVC_HIGH }, 0, 0,
VE, .unit =
"tier" },
91 {
"rc",
"Override the preset rate-control",
OFFSET(rc),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX,
VE, .unit =
"rc" },
92 {
"constqp",
"Constant QP mode", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP }, 0, 0,
VE, .unit =
"rc" },
93 {
"vbr",
"Variable bitrate mode", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR }, 0, 0,
VE, .unit =
"rc" },
94 {
"cbr",
"Constant bitrate mode", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR }, 0, 0,
VE, .unit =
"rc" },
95 #ifndef NVENC_NO_DEPRECATED_RC
96 {
"vbr_minqp",
"Variable bitrate mode with MinQP (deprecated)", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_VBR_MINQP) }, 0, 0,
VE, .unit =
"rc" },
97 {
"ll_2pass_quality",
"Multi-pass optimized for image quality (deprecated)",
99 {
"ll_2pass_size",
"Multi-pass optimized for constant frame size (deprecated)",
101 {
"vbr_2pass",
"Multi-pass variable bitrate mode (deprecated)", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_2_PASS_VBR) }, 0, 0,
VE, .unit =
"rc" },
102 {
"cbr_ld_hq",
"Constant bitrate low delay high quality mode", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ) }, 0, 0,
VE, .unit =
"rc" },
103 {
"cbr_hq",
"Constant bitrate high quality mode", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_CBR_HQ) }, 0, 0,
VE, .unit =
"rc" },
104 {
"vbr_hq",
"Variable bitrate high quality mode", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_VBR_HQ) }, 0, 0,
VE, .unit =
"rc" },
106 {
"vbr_minqp",
"Variable bitrate mode with MinQP (deprecated)", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_VBR) }, 0, 0,
VE, .unit =
"rc" },
107 {
"ll_2pass_quality",
"Multi-pass optimized for image quality (deprecated)",
109 {
"ll_2pass_size",
"Multi-pass optimized for constant frame size (deprecated)",
111 {
"vbr_2pass",
"Multi-pass variable bitrate mode (deprecated)", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_VBR) }, 0, 0,
VE, .unit =
"rc" },
112 {
"cbr_ld_hq",
"Constant bitrate low delay high quality mode", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_CBR) }, 0, 0,
VE, .unit =
"rc" },
113 {
"cbr_hq",
"Constant bitrate high quality mode", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_CBR) }, 0, 0,
VE, .unit =
"rc" },
114 {
"vbr_hq",
"Variable bitrate high quality mode", 0,
AV_OPT_TYPE_CONST, { .i64 =
RCD(NV_ENC_PARAMS_RC_VBR) }, 0, 0,
VE, .unit =
"rc" },
116 {
"rc-lookahead",
"Number of frames to look ahead for rate-control",
121 {
"gpu",
"Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on.",
125 {
"rgb_mode",
"Configure how nvenc handles packed RGB input.",
129 {
"disabled",
"Disables support, throws an error.", 0,
AV_OPT_TYPE_CONST, { .i64 =
NVENC_RGB_MODE_DISABLED }, 0, 0,
VE, .unit =
"rgb_mode" },
130 {
"delay",
"Delay frame output by the given amount of frames",
132 {
"no-scenecut",
"When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts",
134 {
"forced-idr",
"If forcing keyframes, force them as IDR frames.",
140 {
"zerolatency",
"Set 1 to indicate zero latency operation (no reordering delay)",
142 {
"nonref_p",
"Set this to 1 to enable automatic insertion of non-reference P-frames",
144 {
"strict_gop",
"Set 1 to minimize GOP-to-GOP rate fluctuations",
146 {
"aq-strength",
"When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive)",
148 {
"cq",
"Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control",
151 {
"bluray-compat",
"Bluray compatibility workarounds",
OFFSET(bluray_compat),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
155 {
"qp",
"Constant quantization parameter rate control method",
157 {
"qp_cb_offset",
"Quantization parameter offset for cb channel",
159 {
"qp_cr_offset",
"Quantization parameter offset for cr channel",
161 {
"weighted_pred",
"Set 1 to enable weighted prediction",
163 #ifdef NVENC_HAVE_HEVC_BFRAME_REF_MODE
164 {
"b_ref_mode",
"Use B frames as references",
OFFSET(b_ref_mode),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, NV_ENC_BFRAME_REF_MODE_MIDDLE,
VE, .unit =
"b_ref_mode" },
165 {
"disabled",
"B frames will not be used for reference", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_BFRAME_REF_MODE_DISABLED }, 0, 0,
VE, .unit =
"b_ref_mode" },
166 {
"each",
"Each B frame will be used for reference", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_BFRAME_REF_MODE_EACH }, 0, 0,
VE, .unit =
"b_ref_mode" },
167 {
"middle",
"Only (number of B frames)/2 will be used for reference", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_BFRAME_REF_MODE_MIDDLE }, 0, 0,
VE, .unit =
"b_ref_mode" },
169 {
"b_ref_mode",
"(not supported)",
OFFSET(b_ref_mode),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX,
VE, .unit =
"b_ref_mode" },
176 {
"dpb_size",
"Specifies the DPB size used for encoding (0 means automatic)",
178 #ifdef NVENC_HAVE_MULTIPASS
179 {
"multipass",
"Set the multipass encoding",
OFFSET(multipass),
AV_OPT_TYPE_INT, { .i64 = NV_ENC_MULTI_PASS_DISABLED }, NV_ENC_MULTI_PASS_DISABLED, NV_ENC_TWO_PASS_FULL_RESOLUTION,
VE, .unit =
"multipass" },
180 {
"disabled",
"Single Pass", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_MULTI_PASS_DISABLED }, 0, 0,
VE, .unit =
"multipass" },
181 {
"qres",
"Two Pass encoding is enabled where first Pass is quarter resolution",
182 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TWO_PASS_QUARTER_RESOLUTION }, 0, 0,
VE, .unit =
"multipass" },
183 {
"fullres",
"Two Pass encoding is enabled where first Pass is full resolution",
184 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TWO_PASS_FULL_RESOLUTION }, 0, 0,
VE, .unit =
"multipass" },
186 #ifdef NVENC_HAVE_NEW_BIT_DEPTH_API
187 {
"highbitdepth",
"Enable 10 bit encode for 8 bit input",
OFFSET(highbitdepth),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
189 #ifdef NVENC_HAVE_LDKFS
190 {
"ldkfs",
"Low delay key frame scale; Specifies the Scene Change frame size increase allowed in case of single frame VBV and CBR",
193 {
"extra_sei",
"Pass on extra SEI data (e.g. a53 cc) to be included in the bitstream",
195 {
"udu_sei",
"Pass on user data unregistered SEI if available",
197 {
"intra-refresh",
"Use Periodic Intra Refresh instead of IDR frames",
199 {
"single-slice-intra-refresh",
"Use single slice intra refresh",
201 {
"max_slice_size",
"Maximum encoded slice size in bytes",
203 {
"constrained-encoding",
"Enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices",
205 #ifdef NVENC_HAVE_TEMPORAL_FILTER
206 {
"tf_level",
"Specifies the strength of the temporal filtering",
208 {
"0",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TEMPORAL_FILTER_LEVEL_0 }, 0, 0,
VE, .unit =
"tf_level" },
209 {
"4",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TEMPORAL_FILTER_LEVEL_4 }, 0, 0,
VE, .unit =
"tf_level" },
211 #ifdef NVENC_HAVE_LOOKAHEAD_LEVEL
212 {
"lookahead_level",
"Specifies the lookahead level. Higher level may improve quality at the expense of performance.",
213 OFFSET(lookahead_level),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, NV_ENC_LOOKAHEAD_LEVEL_AUTOSELECT,
VE, .unit =
"lookahead_level" },
214 {
"auto",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LOOKAHEAD_LEVEL_AUTOSELECT }, 0, 0,
VE, .unit =
"lookahead_level" },
215 {
"0",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LOOKAHEAD_LEVEL_0 }, 0, 0,
VE, .unit =
"lookahead_level" },
216 {
"1",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LOOKAHEAD_LEVEL_1 }, 0, 0,
VE, .unit =
"lookahead_level" },
217 {
"2",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LOOKAHEAD_LEVEL_2 }, 0, 0,
VE, .unit =
"lookahead_level" },
218 {
"3",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LOOKAHEAD_LEVEL_3 }, 0, 0,
VE, .unit =
"lookahead_level" },
220 #ifdef NVENC_HAVE_UNIDIR_B
221 {
"unidir_b",
"Enable use of unidirectional B-Frames.",
OFFSET(unidir_b),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
223 #ifdef NVENC_HAVE_SPLIT_FRAME_ENCODING
224 {
"split_encode_mode",
"Specifies the split encoding mode",
OFFSET(split_encode_mode),
AV_OPT_TYPE_INT, { .i64 = NV_ENC_SPLIT_AUTO_MODE }, 0, NV_ENC_SPLIT_DISABLE_MODE,
VE, .unit =
"split_encode_mode" },
225 {
"disabled",
"Disabled for all configurations", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_DISABLE_MODE }, 0, 0,
VE, .unit =
"split_encode_mode" },
226 {
"auto",
"Enabled or disabled depending on the preset and tuning info", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_AUTO_MODE }, 0, 0,
VE, .unit =
"split_encode_mode" },
227 {
"forced",
"Enabled with number of horizontal strips selected by the driver", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_AUTO_FORCED_MODE }, 0, 0,
VE, .unit =
"split_encode_mode" },
228 {
"2",
"Enabled with number of horizontal strips forced to 2 when number of NVENCs > 1", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_TWO_FORCED_MODE }, 0, 0,
VE, .unit =
"split_encode_mode" },
229 {
"3",
"Enabled with number of horizontal strips forced to 3 when number of NVENCs > 2", 0,
AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_THREE_FORCED_MODE }, 0, 0,
VE, .unit =
"split_encode_mode" },
255 .
p.
name =
"hevc_nvenc",
273 .p.wrapper_name =
"nvenc",