25 #define OFFSET(x) offsetof(AmfContext, x)
26 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
28 {
"usage",
"Set the encoding usage",
OFFSET(
usage),
AV_OPT_TYPE_INT, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING }, AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING, AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY,
VE,
"usage" },
29 {
"transcoding",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING }, 0, 0,
VE,
"usage" },
30 {
"lowlatency",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY }, 0, 0,
VE,
"usage" },
32 {
"profile",
"Set the profile (default main)",
OFFSET(
profile),
AV_OPT_TYPE_INT,{.i64 = AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN }, AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN, AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN,
VE,
"profile" },
33 {
"main",
"", 0,
AV_OPT_TYPE_CONST,{.i64 = AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN }, 0, 0,
VE,
"profile" },
35 {
"level",
"Set the encoding level (default auto)",
OFFSET(
level),
AV_OPT_TYPE_INT,{.i64 = 0 }, 0, AMF_VIDEO_ENCODER_AV1_LEVEL_7_3,
VE,
"level" },
37 {
"2.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_2_0 }, 0, 0,
VE,
"level" },
38 {
"2.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_2_1 }, 0, 0,
VE,
"level" },
39 {
"2.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_2_2 }, 0, 0,
VE,
"level" },
40 {
"2.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_2_3 }, 0, 0,
VE,
"level" },
41 {
"3.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_3_0 }, 0, 0,
VE,
"level" },
42 {
"3.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_3_1 }, 0, 0,
VE,
"level" },
43 {
"3.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_3_2 }, 0, 0,
VE,
"level" },
44 {
"3.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_3_3 }, 0, 0,
VE,
"level" },
45 {
"4.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_4_0 }, 0, 0,
VE,
"level" },
46 {
"4.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_4_1 }, 0, 0,
VE,
"level" },
47 {
"4.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_4_2 }, 0, 0,
VE,
"level" },
48 {
"4.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_4_3 }, 0, 0,
VE,
"level" },
49 {
"5.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_5_0 }, 0, 0,
VE,
"level" },
50 {
"5.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_5_1 }, 0, 0,
VE,
"level" },
51 {
"5.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_5_2 }, 0, 0,
VE,
"level" },
52 {
"5.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_5_3 }, 0, 0,
VE,
"level" },
53 {
"6.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_6_0 }, 0, 0,
VE,
"level" },
54 {
"6.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_6_1 }, 0, 0,
VE,
"level" },
55 {
"6.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_6_2 }, 0, 0,
VE,
"level" },
56 {
"6.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_6_3 }, 0, 0,
VE,
"level" },
57 {
"7.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_7_0 }, 0, 0,
VE,
"level" },
58 {
"7.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_7_1 }, 0, 0,
VE,
"level" },
59 {
"7.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_7_2 }, 0, 0,
VE,
"level" },
60 {
"7.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_7_3 }, 0, 0,
VE,
"level" },
62 {
"quality",
"Set the encoding quality",
OFFSET(
quality),
AV_OPT_TYPE_INT, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_SPEED }, AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_HIGH_QUALITY, AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_SPEED,
VE,
"quality" },
63 {
"balanced",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_BALANCED }, 0, 0,
VE,
"quality" },
64 {
"speed",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_SPEED }, 0, 0,
VE,
"quality" },
65 {
"quality",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_QUALITY }, 0, 0,
VE,
"quality" },
66 {
"high_quality",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_HIGH_QUALITY }, 0, 0,
VE,
"quality" },
68 {
"rc",
"Set the rate control mode",
OFFSET(rate_control_mode),
AV_OPT_TYPE_INT, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN }, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR,
VE,
"rc" },
69 {
"cqp",
"Constant Quantization Parameter", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP }, 0, 0,
VE,
"rc" },
70 {
"vbr_latency",
"Latency Constrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR }, 0, 0,
VE,
"rc" },
71 {
"vbr_peak",
"Peak Contrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR }, 0, 0,
VE,
"rc" },
72 {
"cbr",
"Constant Bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR }, 0, 0,
VE,
"rc" },
74 {
"header_insertion_mode",
"Set header insertion mode",
OFFSET(header_insertion_mode),
AV_OPT_TYPE_INT,{.i64 = AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_NONE }, AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_NONE, AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_KEY_FRAME_ALIGNED,
VE,
"hdrmode" },
75 {
"none",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_NONE }, 0, 0,
VE,
"hdrmode" },
76 {
"gop",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_GOP_ALIGNED }, 0, 0,
VE,
"hdrmode" },
77 {
"frame",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_KEY_FRAME_ALIGNED }, 0, 0,
VE,
"hdrmode" },
84 {
"min_qp_i",
"min quantization parameter for I-frame",
OFFSET(min_qp_i),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
85 {
"max_qp_i",
"max quantization parameter for I-frame",
OFFSET(max_qp_i),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
86 {
"min_qp_p",
"min quantization parameter for P-frame",
OFFSET(min_qp_p),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
87 {
"max_qp_p",
"max quantization parameter for P-frame",
OFFSET(max_qp_p),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
92 {
"align",
"alignment mode",
OFFSET(
align),
AV_OPT_TYPE_INT, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS }, AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY, AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS,
VE,
"align" },
93 {
"64x16",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY }, 0, 0,
VE,
"align" },
94 {
"1080p",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_1080P_CODED_1082 }, 0, 0,
VE,
"align" },
95 {
"none",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS }, 0, 0,
VE,
"align" },
104 AMF_RESULT res = AMF_OK;
106 AMFVariantStruct var = { 0 };
108 amf_int64 profile_level = 0;
112 AMFSize framesize = AMFConstructSize(avctx->
width, avctx->
height);
133 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_USAGE,
ctx->usage);
135 AMF_ASSIGN_PROPERTY_SIZE(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_FRAMESIZE, framesize);
137 AMF_ASSIGN_PROPERTY_RATE(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_FRAMERATE,
framerate);
141 profile = AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN;
149 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PROFILE,
profile);
151 profile_level = avctx->
level;
153 profile_level =
ctx->level;
155 if (profile_level != 0) {
156 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_LEVEL, profile_level);
158 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET,
ctx->quality);
161 if (avctx->
refs != -1) {
162 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_NUM_REFRAMES, avctx->
refs);
166 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_GOP_SIZE, avctx->
gop_size);
168 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE,
ctx->header_insertion_mode);
172 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN) {
173 if (
ctx->min_qp_i != -1 ||
ctx->max_qp_i != -1 ||
174 ctx->min_qp_p != -1 ||
ctx->max_qp_p != -1 ||
175 ctx->qp_i != -1 ||
ctx->qp_p != -1) {
176 ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP;
180 ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR;
184 ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR;
189 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD,
ctx->rate_control_mode);
191 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_VBV_BUFFER_SIZE, avctx->
rc_buffer_size);
195 if (amf_buffer_fullness > 64)
196 amf_buffer_fullness = 64;
197 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_INITIAL_VBV_BUFFER_FULLNESS, amf_buffer_fullness);
202 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PRE_ANALYSIS_ENABLE,
ctx->preanalysis);
205 if (
ctx->max_au_size)
206 ctx->enforce_hrd = 1;
207 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ENFORCE_HRD,
ctx->enforce_hrd);
208 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_FILLER_DATA,
ctx->filler_data);
210 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_TARGET_BITRATE, avctx->
bit_rate);
212 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR) {
213 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PEAK_BITRATE, avctx->
bit_rate);
216 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PEAK_BITRATE, avctx->
rc_max_rate);
218 else if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR) {
222 ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR;
228 case AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY:
231 res = AMF_NOT_SUPPORTED;
236 case AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_1080P_CODED_1082:
243 res = AMF_NOT_SUPPORTED;
248 case AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS:
252 res = AMF_NOT_SUPPORTED;
256 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE,
ctx->align);
264 if (
ctx->min_qp_i != -1) {
265 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTRA,
ctx->min_qp_i);
267 else if (avctx->
qmin != -1) {
268 int qval = avctx->
qmin > 255 ? 255 : avctx->
qmin;
269 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTRA, qval);
271 if (
ctx->max_qp_i != -1) {
272 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTRA,
ctx->max_qp_i);
274 else if (avctx->
qmax != -1) {
275 int qval = avctx->
qmax > 255 ? 255 : avctx->
qmax;
276 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTRA, qval);
278 if (
ctx->min_qp_p != -1) {
279 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER,
ctx->min_qp_p);
281 else if (avctx->
qmin != -1) {
282 int qval = avctx->
qmin > 255 ? 255 : avctx->
qmin;
283 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER, qval);
285 if (
ctx->max_qp_p != -1) {
286 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER,
ctx->max_qp_p);
288 else if (avctx->
qmax != -1) {
289 int qval = avctx->
qmax > 255 ? 255 : avctx->
qmax;
290 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER, qval);
293 if (
ctx->qp_p != -1) {
294 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTER,
ctx->qp_p);
296 if (
ctx->qp_i != -1) {
297 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTRA,
ctx->qp_i);
299 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_SKIP_FRAME,
ctx->skip_frame);
303 res = AMFVariantInit(&var);
306 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_AV1_EXTRA_DATA, &var);
310 guid = IID_AMFBuffer();
312 res = var.pInterface->pVtbl->QueryInterface(var.pInterface, &guid, (
void**)&
buffer);
314 var.pInterface->pVtbl->Release(var.pInterface);
322 var.pInterface->pVtbl->Release(var.pInterface);
328 var.pInterface->pVtbl->Release(var.pInterface);
365 .p.wrapper_name =
"amf",