27 #include <AMF/components/PreAnalysis.h>
29 #define OFFSET(x) offsetof(AMFEncoderContext, x)
30 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
35 {
"usage",
"Encoder Usage",
OFFSET(
usage),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY_HIGH_QUALITY,
VE, .unit =
"usage" },
36 {
"transcoding",
"Generic Transcoding", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_TRANSCODING }, 0, 0,
VE, .unit =
"usage" },
37 {
"ultralowlatency",
"Ultra low latency usecase", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY }, 0, 0,
VE, .unit =
"usage" },
38 {
"lowlatency",
"Low latency usecase", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY }, 0, 0,
VE, .unit =
"usage" },
39 {
"webcam",
"Webcam", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_WEBCAM }, 0, 0,
VE, .unit =
"usage" },
40 {
"high_quality",
"High quality usecase", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_HIGH_QUALITY }, 0, 0,
VE, .unit =
"usage" },
41 {
"lowlatency_high_quality",
"Low latency yet high quality usecase", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY_HIGH_QUALITY }, 0, 0,
VE, .unit =
"usage" },
45 {
"main",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_PROFILE_MAIN }, 0, 0,
VE, .unit =
"profile" },
46 {
"high",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_PROFILE_HIGH }, 0, 0,
VE, .unit =
"profile" },
47 {
"constrained_baseline",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_BASELINE }, 0, 0,
VE, .unit =
"profile" },
48 {
"constrained_high",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH }, 0, 0,
VE, .unit =
"profile" },
76 {
"quality",
"Set the encoding quality preset",
OFFSET(
quality),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AMF_VIDEO_ENCODER_QUALITY_PRESET_HIGH_QUALITY,
VE, .unit =
"quality" },
77 {
"preset",
"Set the encoding quality preset",
OFFSET(
quality),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AMF_VIDEO_ENCODER_QUALITY_PRESET_HIGH_QUALITY,
VE, .unit =
"quality" },
78 {
"balanced",
"Balanced", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_QUALITY_PRESET_BALANCED }, 0, 0,
VE, .unit =
"quality" },
79 {
"speed",
"Prefer Speed", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_QUALITY_PRESET_SPEED }, 0, 0,
VE, .unit =
"quality" },
80 {
"quality",
"Prefer Quality", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_QUALITY_PRESET_QUALITY }, 0, 0,
VE, .unit =
"quality" },
81 {
"high_quality",
"Prefer High Quality", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_QUALITY_PRESET_HIGH_QUALITY }, 0, 0,
VE, .unit =
"quality" },
85 {
"rc",
"Rate Control Method",
OFFSET(rate_control_mode),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN }, AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN, AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_HIGH_QUALITY_CBR,
VE, .unit =
"rc" },
86 {
"cqp",
"Constant Quantization Parameter", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP }, 0, 0,
VE, .unit =
"rc" },
87 {
"cbr",
"Constant Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR }, 0, 0,
VE, .unit =
"rc" },
88 {
"vbr_peak",
"Peak Constrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR }, 0, 0,
VE, .unit =
"rc" },
89 {
"vbr_latency",
"Latency Constrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR }, 0, 0,
VE, .unit =
"rc" },
90 {
"qvbr",
"Quality Variable Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_QUALITY_VBR }, 0, 0,
VE, .unit =
"rc" },
91 {
"hqvbr",
"High Quality Variable Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_HIGH_QUALITY_VBR }, 0, 0,
VE, .unit =
"rc" },
92 {
"hqcbr",
"High Quality Constant Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_HIGH_QUALITY_CBR }, 0, 0,
VE, .unit =
"rc" },
94 {
"qvbr_quality_level",
"Sets the QVBR quality level",
OFFSET(qvbr_quality_level),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51,
VE },
100 {
"frame_skipping",
"Rate Control Based Frame Skip",
OFFSET(skip_frame),
AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1,
VE },
111 {
"max_au_size",
"Maximum Access Unit Size for rate control (in bits)",
OFFSET(max_au_size),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX,
VE },
114 {
"header_spacing",
"Header Insertion Spacing",
OFFSET(header_spacing),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1000,
VE },
123 {
"bf_ref_delta_qp",
"Reference B-Picture Delta QP",
OFFSET(ref_b_frame_delta_qp),
AV_OPT_TYPE_INT, { .i64 = 4 }, -10, 10,
VE },
125 {
"max_b_frames",
"Maximum number of consecutive B Pictures",
OFFSET(max_consecutive_b_frames),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 3,
VE },
129 {
"intra_refresh_mb",
"Intra Refresh MBs Number Per Slot in Macroblocks",
OFFSET(intra_refresh_mb),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX,
VE },
132 {
"coder",
"Coding Type",
OFFSET(coding_mode),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_UNDEFINED }, AMF_VIDEO_ENCODER_UNDEFINED, AMF_VIDEO_ENCODER_CALV,
VE, .unit =
"coder" },
133 {
"auto",
"Automatic", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_UNDEFINED }, 0, 0,
VE, .unit =
"coder" },
134 {
"cavlc",
"Context Adaptive Variable-Length Coding", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_CALV }, 0, 0,
VE, .unit =
"coder" },
135 {
"cabac",
"Context Adaptive Binary Arithmetic Coding", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_CABAC }, 0, 0,
VE, .unit =
"coder" },
137 {
"high_motion_quality_boost_enable",
"Enable High motion quality boost mode",
OFFSET(hw_high_motion_quality_boost),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
145 {
"smart_access_video",
"Enable Smart Access Video to enhance performance by utilizing both APU and dGPU memory access",
OFFSET(smart_access_video),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE},
150 {
"pa_activity_type",
"Set the type of activity analysis",
OFFSET(pa_activity_type),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_PA_ACTIVITY_YUV,
VE, .unit =
"activity_type" },
151 {
"y",
"activity y", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_ACTIVITY_Y }, 0, 0,
VE, .unit =
"activity_type" },
152 {
"yuv",
"activity yuv", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_ACTIVITY_YUV }, 0, 0,
VE, .unit =
"activity_type" },
154 {
"pa_scene_change_detection_enable",
"Enable scene change detection",
OFFSET(pa_scene_change_detection),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
156 {
"pa_scene_change_detection_sensitivity",
"Set the sensitivity of scene change detection",
OFFSET(pa_scene_change_detection_sensitivity),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_HIGH,
VE, .unit =
"scene_change_sensitivity" },
157 {
"low",
"low scene change detection sensitivity", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_LOW }, 0, 0,
VE, .unit =
"scene_change_sensitivity" },
158 {
"medium",
"medium scene change detection sensitivity", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_MEDIUM }, 0, 0,
VE, .unit =
"scene_change_sensitivity" },
159 {
"high",
"high scene change detection sensitivity", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_HIGH }, 0, 0,
VE, .unit =
"scene_change_sensitivity" },
161 {
"pa_static_scene_detection_enable",
"Enable static scene detection",
OFFSET(pa_static_scene_detection),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
163 {
"pa_static_scene_detection_sensitivity",
"Set the sensitivity of static scene detection",
OFFSET(pa_static_scene_detection_sensitivity),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_HIGH,
VE , .unit =
"static_scene_sensitivity" },
164 {
"low",
"low static scene detection sensitivity", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_LOW }, 0, 0,
VE, .unit =
"static_scene_sensitivity" },
165 {
"medium",
"medium static scene detection sensitivity", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_MEDIUM }, 0, 0,
VE, .unit =
"static_scene_sensitivity" },
166 {
"high",
"high static scene detection sensitivity", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_HIGH }, 0, 0,
VE, .unit =
"static_scene_sensitivity" },
168 {
"pa_initial_qp_after_scene_change",
"The QP value that is used immediately after a scene change",
OFFSET(pa_initial_qp),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 51,
VE },
169 {
"pa_max_qp_before_force_skip",
"The QP threshold to allow a skip frame",
OFFSET(pa_max_qp),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 51,
VE },
171 {
"pa_caq_strength",
"Content Adaptive Quantization strength",
OFFSET(pa_caq_strength),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_PA_CAQ_STRENGTH_HIGH,
VE , .unit =
"caq_strength" },
172 {
"low",
"low Content Adaptive Quantization strength", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_CAQ_STRENGTH_LOW }, 0, 0,
VE, .unit =
"caq_strength" },
173 {
"medium",
"medium Content Adaptive Quantization strength", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_CAQ_STRENGTH_MEDIUM }, 0, 0,
VE, .unit =
"caq_strength" },
174 {
"high",
"high Content Adaptive Quantization strength", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_CAQ_STRENGTH_HIGH }, 0, 0,
VE, .unit =
"caq_strength" },
176 {
"pa_frame_sad_enable",
"Enable Frame SAD algorithm",
OFFSET(pa_frame_sad),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
177 {
"pa_ltr_enable",
"Enable long term reference frame management",
OFFSET(pa_ltr),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
180 {
"pa_paq_mode",
"Sets the perceptual adaptive quantization mode",
OFFSET(pa_paq_mode),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_PA_PAQ_MODE_CAQ,
VE , .unit =
"paq_mode" },
181 {
"none",
"no perceptual adaptive quantization", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_PAQ_MODE_NONE }, 0, 0,
VE, .unit =
"paq_mode" },
182 {
"caq",
"caq perceptual adaptive quantization", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_PAQ_MODE_CAQ }, 0, 0,
VE, .unit =
"paq_mode" },
184 {
"pa_taq_mode",
"Sets the temporal adaptive quantization mode",
OFFSET(pa_taq_mode),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_PA_TAQ_MODE_2,
VE , .unit =
"taq_mode" },
185 {
"none",
"no temporal adaptive quantization", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_TAQ_MODE_NONE }, 0, 0,
VE, .unit =
"taq_mode" },
186 {
"1",
"temporal adaptive quantization mode 1", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_TAQ_MODE_1 }, 0, 0,
VE, .unit =
"taq_mode" },
187 {
"2",
"temporal adaptive quantization mode 2", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_TAQ_MODE_2 }, 0, 0,
VE, .unit =
"taq_mode" },
189 {
"pa_high_motion_quality_boost_mode",
"Sets the PA high motion quality boost mode",
OFFSET(pa_high_motion_quality_boost_mode),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE_AUTO,
VE , .unit =
"high_motion_quality_boost_mode" },
190 {
"none",
"no high motion quality boost", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE_NONE }, 0, 0,
VE, .unit =
"high_motion_quality_boost_mode" },
191 {
"auto",
"auto high motion quality boost", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE_AUTO }, 0, 0,
VE, .unit =
"high_motion_quality_boost_mode" },
193 {
"pa_adaptive_mini_gop",
"Enable Adaptive MiniGOP",
OFFSET(pa_adaptive_mini_gop),
AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1,
VE },
200 AMF_RESULT res = AMF_OK;
202 AMFVariantStruct var = { 0 };
204 amf_int64 profile_level = 0;
208 AMFSize framesize = AMFConstructSize(avctx->
width, avctx->
height);
210 amf_int64 color_profile;
224 if (
ctx->usage != -1) {
225 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_USAGE,
ctx->usage);
228 AMF_ASSIGN_PROPERTY_SIZE(res,
ctx->encoder, AMF_VIDEO_ENCODER_FRAMESIZE, framesize);
230 AMF_ASSIGN_PROPERTY_RATE(res,
ctx->encoder, AMF_VIDEO_ENCODER_FRAMERATE,
framerate);
234 profile = AMF_VIDEO_ENCODER_PROFILE_BASELINE;
237 profile = AMF_VIDEO_ENCODER_PROFILE_MAIN;
240 profile = AMF_VIDEO_ENCODER_PROFILE_HIGH;
243 profile = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_BASELINE;
246 profile = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH;
250 if (
ctx->profile != -1) {
256 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_PROFILE,
profile);
259 profile_level = avctx->
level;
261 profile_level =
ctx->level;
264 if (profile_level != 0) {
265 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_PROFILE_LEVEL, profile_level);
269 if (avctx->
refs != -1) {
270 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_MAX_NUM_REFRAMES, avctx->
refs);
274 AMF_ASSIGN_PROPERTY_RATIO(res,
ctx->encoder, AMF_VIDEO_ENCODER_ASPECT_RATIO, ratio);
278 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_OUTPUT_COLOR_PROFILE, color_profile);
292 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_COLOR_BIT_DEPTH, AMF_COLOR_BIT_DEPTH_8);
294 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_OUTPUT_TRANSFER_CHARACTERISTIC, (amf_int64)avctx->
color_trc);
296 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_OUTPUT_COLOR_PRIMARIES, (amf_int64)avctx->
color_primaries);
299 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN) {
300 if (
ctx->qp_i != -1 ||
ctx->qp_p != -1 ||
ctx->qp_b != -1) {
301 ctx->rate_control_mode = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP;
304 ctx->rate_control_mode = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR;
307 ctx->rate_control_mode = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR;
312 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP) {
313 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_PREENCODE_ENABLE, AMF_VIDEO_ENCODER_PREENCODE_DISABLED);
314 if (
ctx->preencode != -1) {
315 if (
ctx->preencode) {
316 av_log(
ctx,
AV_LOG_WARNING,
"Preencode is not supported by cqp Rate Control Method, automatically disabled\n");
321 if (
ctx->preencode != -1) {
322 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_PREENCODE_ENABLE,
ctx->preencode);
326 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_QUALITY_VBR) {
327 if (
ctx->qvbr_quality_level != -1) {
328 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_QVBR_QUALITY_LEVEL,
ctx->qvbr_quality_level);
332 if (
ctx->hw_high_motion_quality_boost != -1) {
333 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_HIGH_MOTION_QUALITY_BOOST_ENABLE, ((
ctx->hw_high_motion_quality_boost == 0) ?
false :
true));
336 if (
ctx->quality != -1) {
337 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_QUALITY_PRESET,
ctx->quality);
341 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD,
ctx->rate_control_mode);
345 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_VBV_BUFFER_SIZE, avctx->
rc_buffer_size);
348 if (amf_buffer_fullness > 64)
349 amf_buffer_fullness = 64;
350 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_INITIAL_VBV_BUFFER_FULLNESS, amf_buffer_fullness);
354 if (
ctx->max_au_size != -1) {
355 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_MAX_AU_SIZE,
ctx->max_au_size);
358 if (
ctx->aud != -1) {
359 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_INSERT_AUD,
ctx->aud);
363 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP) {
364 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_MIN_QP, 0);
365 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_MAX_QP, 51);
367 if (avctx->
qmin != -1) {
368 int qval = avctx->
qmin > 51 ? 51 : avctx->
qmin;
369 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_MIN_QP, qval);
371 if (avctx->
qmax != -1) {
372 int qval = avctx->
qmax > 51 ? 51 : avctx->
qmax;
373 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_MAX_QP, qval);
378 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_QP_I,
ctx->qp_i);
380 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_QP_P,
ctx->qp_p);
382 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_QP_B,
ctx->qp_b);
385 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_TARGET_BITRATE, avctx->
bit_rate);
388 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR) {
390 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_PEAK_BITRATE, avctx->
bit_rate);
395 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_PEAK_BITRATE, avctx->
rc_max_rate);
396 }
else if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR) {
397 av_log(
ctx,
AV_LOG_DEBUG,
"rate control mode is vbr_peak but max_rate is not set, default max_rate will be applied.\n");
400 if (
ctx->latency != -1) {
401 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_LOWLATENCY_MODE, ((
ctx->latency == 0) ?
false :
true));
404 if (
ctx->smart_access_video != -1) {
405 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_ENABLE_SMART_ACCESS_VIDEO,
ctx->smart_access_video != 0);
408 if (
ctx->smart_access_video != 0)
413 if (
ctx->smart_access_video != 0) {
414 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_LOWLATENCY_MODE,
true);
420 if (
ctx->preanalysis != -1) {
421 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_PRE_ANALYSIS_ENABLE, !!((
ctx->preanalysis == 0) ?
false :
true));
424 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_PRE_ANALYSIS_ENABLE, &var);
425 if ((
int)var.int64Value)
427 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_PRE_ANALYSIS_ENABLE,
true);
429 if (
ctx->pa_activity_type != -1) {
430 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_ACTIVITY_TYPE,
ctx->pa_activity_type);
432 if (
ctx->pa_scene_change_detection != -1) {
433 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_PA_SCENE_CHANGE_DETECTION_ENABLE, ((
ctx->pa_scene_change_detection == 0) ?
false :
true));
435 if (
ctx->pa_scene_change_detection_sensitivity != -1) {
436 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY,
ctx->pa_scene_change_detection_sensitivity);
438 if (
ctx->pa_static_scene_detection != -1) {
439 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_PA_STATIC_SCENE_DETECTION_ENABLE, ((
ctx->pa_static_scene_detection == 0) ?
false :
true));
441 if (
ctx->pa_static_scene_detection_sensitivity != -1) {
442 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY,
ctx->pa_static_scene_detection_sensitivity);
444 if (
ctx->pa_initial_qp != -1) {
445 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_INITIAL_QP_AFTER_SCENE_CHANGE,
ctx->pa_initial_qp);
447 if (
ctx->pa_max_qp != -1) {
448 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_MAX_QP_BEFORE_FORCE_SKIP,
ctx->pa_max_qp);
450 if (
ctx->pa_caq_strength != -1) {
451 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_CAQ_STRENGTH,
ctx->pa_caq_strength);
453 if (
ctx->pa_frame_sad != -1) {
454 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_PA_FRAME_SAD_ENABLE, ((
ctx->pa_frame_sad == 0) ?
false :
true));
456 if (
ctx->pa_paq_mode != -1) {
457 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_PAQ_MODE,
ctx->pa_paq_mode);
459 if (
ctx->pa_taq_mode != -1) {
460 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_TAQ_MODE,
ctx->pa_taq_mode);
462 if (
ctx->pa_adaptive_mini_gop != -1) {
463 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_ADAPTIVE_MINIGOP, ((
ctx->pa_adaptive_mini_gop == 0) ?
false :
true));
465 if (
ctx->pa_ltr != -1) {
466 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_PA_LTR_ENABLE, ((
ctx->pa_ltr == 0) ?
false :
true));
468 if (
ctx->pa_lookahead_buffer_depth != -1) {
469 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_LOOKAHEAD_BUFFER_DEPTH,
ctx->pa_lookahead_buffer_depth);
471 if (
ctx->pa_high_motion_quality_boost_mode != -1) {
472 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE,
ctx->pa_high_motion_quality_boost_mode);
477 AMFVariantStruct is_adaptive_b_frames = { 0 };
478 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_ADAPTIVE_MINIGOP, &is_adaptive_b_frames);
479 if (
ctx->max_consecutive_b_frames != -1 ||
ctx->max_b_frames != -1 || is_adaptive_b_frames.boolValue ==
true) {
482 AMFCaps *encoder_caps =
NULL;
483 ctx->encoder->pVtbl->GetCaps(
ctx->encoder, &encoder_caps);
484 if (encoder_caps !=
NULL)
486 res = encoder_caps->pVtbl->GetProperty(encoder_caps, AMF_VIDEO_ENCODER_CAP_BFRAMES, &var);
490 if(var.boolValue ==
true){
492 if (is_adaptive_b_frames.boolValue ==
true)
495 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_MAX_CONSECUTIVE_BPICTURES, 3);
497 if(
ctx->pa_lookahead_buffer_depth < 1)
500 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_LOOKAHEAD_BUFFER_DEPTH, 1);
504 if (
ctx->max_b_frames != -1) {
506 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN,
ctx->max_b_frames);
508 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, &var);
509 av_log(
ctx,
AV_LOG_WARNING,
"B-frames=%d is not supported by this GPU, switched to %d\n",
ctx->max_b_frames, (
int)var.int64Value);
510 ctx->max_b_frames = (int)var.int64Value;
512 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_MAX_CONSECUTIVE_BPICTURES,
ctx->max_b_frames);
519 av_log(
ctx,
AV_LOG_WARNING,
"The current GPU in use does not support H.264 B-frame encoding, there will be no B-frame in bitstream.\n");
527 encoder_caps->pVtbl->Release(encoder_caps);
532 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, &var);
533 if ((
int)var.int64Value) {
534 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_B_PIC_DELTA_QP,
ctx->b_frame_delta_qp);
535 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_B_REFERENCE_ENABLE, !!
ctx->b_frame_ref);
536 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_REF_B_PIC_DELTA_QP,
ctx->ref_b_frame_delta_qp);
539 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP) {
540 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_ENABLE_VBAQ, 0);
541 if (
ctx->enable_vbaq)
544 if (
ctx->enable_vbaq != -1) {
545 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_ENABLE_VBAQ, !!
ctx->enable_vbaq);
550 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_QUERY_TIMEOUT, 1);
551 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_QUERY_TIMEOUT, &var);
552 ctx->query_timeout_supported = res == AMF_OK && var.int64Value;
559 if (
ctx->enforce_hrd != -1) {
560 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_ENFORCE_HRD, ((
ctx->enforce_hrd == 0) ?
false :
true));
563 if (
ctx->filler_data != -1) {
564 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_FILLER_DATA_ENABLE, ((
ctx->filler_data == 0) ?
false :
true));
567 if (
ctx->skip_frame != -1) {
568 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_RATE_CONTROL_SKIP_FRAME_ENABLE, ((
ctx->skip_frame == 0) ?
false :
true));
571 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_DE_BLOCKING_FILTER, !!deblocking_filter);
575 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_IDR_PERIOD, avctx->
gop_size);
579 if (
ctx->header_spacing >= 0)
580 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_HEADER_INSERTION_SPACING,
ctx->header_spacing);
583 if (
ctx->intra_refresh_mb != -1)
584 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_INTRA_REFRESH_NUM_MBS_PER_SLOT,
ctx->intra_refresh_mb);
586 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_SLICES_PER_FRAME, avctx->
slices);
589 if (
ctx->coding_mode != 0)
590 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_CABAC_ENABLE,
ctx->coding_mode);
593 if (
ctx->me_half_pel != -1) {
594 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_MOTION_HALF_PIXEL, !!
ctx->me_half_pel);
597 if (
ctx->me_quarter_pel != -1) {
598 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_MOTION_QUARTERPIXEL, !!
ctx->me_quarter_pel);
602 res = AMFVariantInit(&var);
605 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_EXTRADATA, &var);
609 guid = IID_AMFBuffer();
611 res = var.pInterface->pVtbl->QueryInterface(var.pInterface, &guid, (
void**)&
buffer);
613 var.pInterface->pVtbl->Release(var.pInterface);
621 var.pInterface->pVtbl->Release(var.pInterface);
627 var.pInterface->pVtbl->Release(var.pInterface);
652 .
p.
name =
"h264_amf",
668 .p.wrapper_name =
"amf",