29 #define OFFSET(x) offsetof(AMFEncoderContext, x)
30 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
33 {
"usage",
"Set the encoding usage",
OFFSET(
usage),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY_HIGH_QUALITY,
VE, .unit =
"usage" },
34 {
"transcoding",
"Generic Transcoding", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING }, 0, 0,
VE, .unit =
"usage" },
35 {
"ultralowlatency",
"ultra low latency transcoding", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_ULTRA_LOW_LATENCY }, 0, 0,
VE, .unit =
"usage" },
36 {
"lowlatency",
"Low latency usecase", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY }, 0, 0,
VE, .unit =
"usage" },
37 {
"webcam",
"Webcam", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_WEBCAM }, 0, 0,
VE, .unit =
"usage" },
38 {
"high_quality",
"high quality transcoding", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_HIGH_QUALITY }, 0, 0,
VE, .unit =
"usage" },
39 {
"lowlatency_high_quality",
"low latency yet high quality transcoding", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY_HIGH_QUALITY }, 0, 0,
VE, .unit =
"usage" },
41 {
"bitdepth",
"Set color bit deph",
OFFSET(
bit_depth),
AV_OPT_TYPE_INT, {.i64 = AMF_COLOR_BIT_DEPTH_UNDEFINED }, AMF_COLOR_BIT_DEPTH_UNDEFINED, AMF_COLOR_BIT_DEPTH_10,
VE, .unit =
"bitdepth" },
42 {
"8",
"8 bit", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_COLOR_BIT_DEPTH_8 }, 0, 0,
VE, .unit =
"bitdepth" },
43 {
"10",
"10 bit", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_COLOR_BIT_DEPTH_10 }, 0, 0,
VE, .unit =
"bitdepth" },
46 {
"main",
"", 0,
AV_OPT_TYPE_CONST,{.i64 = AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN }, 0, 0,
VE, .unit =
"profile" },
48 {
"level",
"Set the encoding level (default auto)",
OFFSET(
level),
AV_OPT_TYPE_INT,{.i64 = -1 }, -1, AMF_VIDEO_ENCODER_AV1_LEVEL_7_3,
VE, .unit =
"level" },
50 {
"2.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_2_0 }, 0, 0,
VE, .unit =
"level" },
51 {
"2.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_2_1 }, 0, 0,
VE, .unit =
"level" },
52 {
"2.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_2_2 }, 0, 0,
VE, .unit =
"level" },
53 {
"2.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_2_3 }, 0, 0,
VE, .unit =
"level" },
54 {
"3.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_3_0 }, 0, 0,
VE, .unit =
"level" },
55 {
"3.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_3_1 }, 0, 0,
VE, .unit =
"level" },
56 {
"3.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_3_2 }, 0, 0,
VE, .unit =
"level" },
57 {
"3.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_3_3 }, 0, 0,
VE, .unit =
"level" },
58 {
"4.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_4_0 }, 0, 0,
VE, .unit =
"level" },
59 {
"4.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_4_1 }, 0, 0,
VE, .unit =
"level" },
60 {
"4.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_4_2 }, 0, 0,
VE, .unit =
"level" },
61 {
"4.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_4_3 }, 0, 0,
VE, .unit =
"level" },
62 {
"5.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_5_0 }, 0, 0,
VE, .unit =
"level" },
63 {
"5.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_5_1 }, 0, 0,
VE, .unit =
"level" },
64 {
"5.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_5_2 }, 0, 0,
VE, .unit =
"level" },
65 {
"5.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_5_3 }, 0, 0,
VE, .unit =
"level" },
66 {
"6.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_6_0 }, 0, 0,
VE, .unit =
"level" },
67 {
"6.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_6_1 }, 0, 0,
VE, .unit =
"level" },
68 {
"6.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_6_2 }, 0, 0,
VE, .unit =
"level" },
69 {
"6.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_6_3 }, 0, 0,
VE, .unit =
"level" },
70 {
"7.0",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_7_0 }, 0, 0,
VE, .unit =
"level" },
71 {
"7.1",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_7_1 }, 0, 0,
VE, .unit =
"level" },
72 {
"7.2",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_7_2 }, 0, 0,
VE, .unit =
"level" },
73 {
"7.3",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_LEVEL_7_3 }, 0, 0,
VE, .unit =
"level" },
75 {
"quality",
"Set the encoding quality preset",
OFFSET(
quality),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_SPEED,
VE, .unit =
"quality" },
76 {
"preset",
"Set the encoding quality preset",
OFFSET(
quality),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_SPEED,
VE, .unit =
"quality" },
77 {
"high_quality",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_HIGH_QUALITY }, 0, 0,
VE, .unit =
"quality" },
78 {
"quality",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_QUALITY }, 0, 0,
VE, .unit =
"quality" },
79 {
"balanced",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_BALANCED }, 0, 0,
VE, .unit =
"quality" },
80 {
"speed",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_SPEED }, 0, 0,
VE, .unit =
"quality" },
82 {
"latency",
"Set the encoding latency mode",
OFFSET(latency),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_LOWEST_LATENCY,
VE, .unit =
"latency_mode" },
83 {
"none",
"No encoding latency requirement.", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_NONE }, 0, 0,
VE, .unit =
"latency_mode" },
84 {
"power_saving_real_time",
"Try the best to finish encoding a frame within 1/framerate sec.", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_POWER_SAVING_REAL_TIME }, 0, 0,
VE, .unit =
"latency_mode" },
85 {
"real_time",
"Try the best to finish encoding a frame within 1/(2 x framerate) sec.", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_REAL_TIME }, 0, 0,
VE, .unit =
"latency_mode" },
86 {
"lowest_latency",
"Encoding as fast as possible. This mode causes highest power consumption", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_LOWEST_LATENCY }, 0, 0,
VE, .unit =
"latency_mode" },
88 {
"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_HIGH_QUALITY_CBR,
VE, .unit =
"rc" },
89 {
"cqp",
"Constant Quantization Parameter", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP }, 0, 0,
VE, .unit =
"rc" },
90 {
"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, .unit =
"rc" },
91 {
"vbr_peak",
"Peak Constrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR }, 0, 0,
VE, .unit =
"rc" },
92 {
"cbr",
"Constant Bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR }, 0, 0,
VE, .unit =
"rc" },
93 {
"qvbr",
"Quality Variable Bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_QUALITY_VBR }, 0, 0,
VE, .unit =
"rc" },
94 {
"hqvbr",
"High Quality Variable Bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_HIGH_QUALITY_VBR }, 0, 0,
VE, .unit =
"rc" },
95 {
"hqcbr",
"High Quality Constant Bitrate", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_HIGH_QUALITY_CBR }, 0, 0,
VE, .unit =
"rc" },
97 {
"qvbr_quality_level",
"Sets the QVBR quality level",
OFFSET(qvbr_quality_level),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 51,
VE },
99 {
"header_insertion_mode",
"Set header insertion mode",
OFFSET(header_insertion_mode),
AV_OPT_TYPE_INT,{.i64 = -1 }, -1, AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_KEY_FRAME_ALIGNED,
VE, .unit =
"hdrmode" },
100 {
"none",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_NONE }, 0, 0,
VE, .unit =
"hdrmode" },
101 {
"gop",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_GOP_ALIGNED }, 0, 0,
VE, .unit =
"hdrmode" },
102 {
"frame",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE_KEY_FRAME_ALIGNED }, 0, 0,
VE, .unit =
"hdrmode" },
111 {
"max_b_frames",
"Maximum number of consecutive B Pictures",
OFFSET(max_consecutive_b_frames),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 3,
VE },
114 {
"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 },
117 {
"min_qp_i",
"min quantization parameter for I-frame",
OFFSET(min_qp_i),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
118 {
"max_qp_i",
"max quantization parameter for I-frame",
OFFSET(max_qp_i),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
119 {
"min_qp_p",
"min quantization parameter for P-frame",
OFFSET(min_qp_p),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
120 {
"max_qp_p",
"max quantization parameter for P-frame",
OFFSET(max_qp_p),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
121 {
"min_qp_b",
"min quantization parameter for B-frame",
OFFSET(min_qp_b),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
122 {
"max_qp_b",
"max quantization parameter for B-frame",
OFFSET(max_qp_b),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 255,
VE },
128 {
"aq_mode",
"adaptive quantization mode",
OFFSET(aq_mode),
AV_OPT_TYPE_INT, {.i64 = -1 }, -1, AMF_VIDEO_ENCODER_AV1_AQ_MODE_CAQ,
VE , .unit =
"adaptive_quantisation_mode" },
129 {
"none",
"no adaptive quantization", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_AQ_MODE_NONE }, 0, 0,
VE, .unit =
"adaptive_quantisation_mode" },
130 {
"caq",
"context adaptive quantization", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_AQ_MODE_CAQ }, 0, 0,
VE, .unit =
"adaptive_quantisation_mode" },
134 {
"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, .unit =
"align" },
135 {
"64x16",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY }, 0, 0,
VE, .unit =
"align" },
136 {
"1080p",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_1080P_CODED_1082 }, 0, 0,
VE, .unit =
"align" },
137 {
"none",
"", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS }, 0, 0,
VE, .unit =
"align" },
139 {
"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},
144 {
"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" },
145 {
"y",
"activity y", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_ACTIVITY_Y }, 0, 0,
VE, .unit =
"activity_type" },
146 {
"yuv",
"activity yuv", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_ACTIVITY_YUV }, 0, 0,
VE, .unit =
"activity_type" },
148 {
"pa_scene_change_detection_enable",
"Enable scene change detection",
OFFSET(pa_scene_change_detection),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
150 {
"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" },
151 {
"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" },
152 {
"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" },
153 {
"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" },
155 {
"pa_static_scene_detection_enable",
"Enable static scene detection",
OFFSET(pa_static_scene_detection),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
157 {
"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" },
158 {
"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" },
159 {
"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" },
160 {
"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" },
162 {
"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 },
163 {
"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 },
165 {
"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" },
166 {
"low",
"low Content Adaptive Quantization strength", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_CAQ_STRENGTH_LOW }, 0, 0,
VE, .unit =
"caq_strength" },
167 {
"medium",
"medium Content Adaptive Quantization strength", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_CAQ_STRENGTH_MEDIUM }, 0, 0,
VE, .unit =
"caq_strength" },
168 {
"high",
"high Content Adaptive Quantization strength", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_CAQ_STRENGTH_HIGH }, 0, 0,
VE, .unit =
"caq_strength" },
170 {
"pa_frame_sad_enable",
"Enable Frame SAD algorithm",
OFFSET(pa_frame_sad),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
171 {
"pa_ltr_enable",
"Enable long term reference frame management",
OFFSET(pa_ltr),
AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1,
VE },
174 {
"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" },
175 {
"none",
"no perceptual adaptive quantization", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_PAQ_MODE_NONE }, 0, 0,
VE, .unit =
"paq_mode" },
176 {
"caq",
"caq perceptual adaptive quantization", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_PAQ_MODE_CAQ }, 0, 0,
VE, .unit =
"paq_mode" },
178 {
"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" },
179 {
"none",
"no temporal adaptive quantization", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_TAQ_MODE_NONE }, 0, 0,
VE, .unit =
"taq_mode" },
180 {
"1",
"temporal adaptive quantization mode 1", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_TAQ_MODE_1 }, 0, 0,
VE, .unit =
"taq_mode" },
181 {
"2",
"temporal adaptive quantization mode 2", 0,
AV_OPT_TYPE_CONST, {.i64 = AMF_PA_TAQ_MODE_2 }, 0, 0,
VE, .unit =
"taq_mode" },
183 {
"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" },
184 {
"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" },
185 {
"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" },
187 {
"pa_adaptive_mini_gop",
"Enable Adaptive B-frame",
OFFSET(pa_adaptive_mini_gop),
AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1,
VE },
196 AMF_RESULT res = AMF_OK;
198 AMFVariantStruct var = { 0 };
200 amf_int64 profile_level = 0;
204 AMFSize framesize = AMFConstructSize(avctx->
width, avctx->
height);
206 amf_int64 color_profile;
211 uint32_t crop_right = 0;
212 uint32_t crop_bottom = 0;
213 int width_alignment_factor = -1;
214 int height_alignment_factor = -1;
227 if (
ctx->usage != -1) {
228 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_USAGE,
ctx->usage);
231 AMF_ASSIGN_PROPERTY_SIZE(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_FRAMESIZE, framesize);
233 AMF_ASSIGN_PROPERTY_RATE(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_FRAMERATE,
framerate);
237 profile = AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN;
243 if (
ctx->profile != -1) {
249 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PROFILE,
profile);
258 if (
bit_depth == AMF_COLOR_BIT_DEPTH_UNDEFINED) {
259 bit_depth = pix_desc->
comp[0].
depth >= 10 ? AMF_COLOR_BIT_DEPTH_10 : AMF_COLOR_BIT_DEPTH_8;
261 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_COLOR_BIT_DEPTH,
bit_depth);
265 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PROFILE, color_profile);
276 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_TRANSFER_CHARACTERISTIC, avctx->
color_trc);
284 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PRIMARIES, avctx->
color_primaries);
288 profile_level = avctx->
level;
290 profile_level =
ctx->level;
293 if (profile_level != -1) {
294 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_LEVEL, profile_level);
297 if (
ctx->quality != -1) {
298 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET,
ctx->quality);
302 if (avctx->
refs != -1) {
303 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_NUM_REFRAMES, avctx->
refs);
308 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_GOP_SIZE, avctx->
gop_size);
312 if (
ctx->header_insertion_mode != -1) {
313 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_HEADER_INSERTION_MODE,
ctx->header_insertion_mode);
318 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN) {
319 if (
ctx->min_qp_i != -1 ||
ctx->max_qp_i != -1 ||
320 ctx->min_qp_p != -1 ||
ctx->max_qp_p != -1 ||
321 ctx->min_qp_b != -1 ||
ctx->max_qp_b != -1 ||
322 ctx->qp_i != -1 ||
ctx->qp_p != -1 ||
ctx->qp_b != -1) {
323 ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP;
327 ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR;
331 ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR;
335 if (
ctx->smart_access_video != -1) {
336 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ENABLE_SMART_ACCESS_VIDEO,
ctx->smart_access_video != 0);
339 if (
ctx->smart_access_video != 0)
344 if (
ctx->smart_access_video != 0) {
345 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE, AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_LOWEST_LATENCY);
352 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP) {
353 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_PREENCODE, 0);
354 if (
ctx->preencode != -1) {
355 if (
ctx->preencode) {
356 av_log(
ctx,
AV_LOG_WARNING,
"Preencode is not supported by cqp Rate Control Method, automatically disabled\n");
361 if (
ctx->preencode != -1) {
362 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_PREENCODE, ((
ctx->preencode == 0) ?
false :
true));
366 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_QUALITY_VBR) {
367 if (
ctx->qvbr_quality_level != -1) {
368 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_QVBR_QUALITY_LEVEL,
ctx->qvbr_quality_level);
372 if (
ctx->hw_high_motion_quality_boost != -1) {
373 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_HIGH_MOTION_QUALITY_BOOST, ((
ctx->hw_high_motion_quality_boost == 0) ?
false :
true));
376 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD,
ctx->rate_control_mode);
379 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_VBV_BUFFER_SIZE, avctx->
rc_buffer_size);
383 if (amf_buffer_fullness > 64)
384 amf_buffer_fullness = 64;
385 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_INITIAL_VBV_BUFFER_FULLNESS, amf_buffer_fullness);
390 if (
ctx->enforce_hrd != -1) {
391 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ENFORCE_HRD, ((
ctx->enforce_hrd == 0) ?
false :
true));
394 if (
ctx->filler_data != -1) {
395 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_FILLER_DATA, ((
ctx->filler_data == 0) ?
false :
true));
399 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_TARGET_BITRATE, avctx->
bit_rate);
402 if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR) {
404 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PEAK_BITRATE, avctx->
bit_rate);
409 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PEAK_BITRATE, avctx->
rc_max_rate);
411 else if (
ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR) {
412 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");
415 ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR;
421 case AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY:
424 res = AMF_NOT_SUPPORTED;
429 case AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_1080P_CODED_1082:
436 res = AMF_NOT_SUPPORTED;
441 case AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS:
445 res = AMF_NOT_SUPPORTED;
449 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE,
ctx->align);
451 if (
ctx->aq_mode != -1) {
452 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_AQ_MODE,
ctx->aq_mode);
455 if (
ctx->latency != -1) {
456 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE,
ctx->latency);
459 if (
ctx->preanalysis != -1) {
460 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PRE_ANALYSIS_ENABLE, !!((
ctx->preanalysis == 0) ?
false :
true));
463 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PRE_ANALYSIS_ENABLE, &var);
464 if ((
int)var.int64Value)
466 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_PRE_ANALYSIS_ENABLE,
true);
468 if (
ctx->pa_activity_type != -1) {
469 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_ACTIVITY_TYPE,
ctx->pa_activity_type);
471 if (
ctx->pa_scene_change_detection != -1) {
472 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_PA_SCENE_CHANGE_DETECTION_ENABLE, ((
ctx->pa_scene_change_detection == 0) ?
false :
true));
474 if (
ctx->pa_scene_change_detection_sensitivity != -1) {
475 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY,
ctx->pa_scene_change_detection_sensitivity);
477 if (
ctx->pa_static_scene_detection != -1) {
478 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_PA_STATIC_SCENE_DETECTION_ENABLE, ((
ctx->pa_static_scene_detection == 0) ?
false :
true));
480 if (
ctx->pa_static_scene_detection_sensitivity != -1) {
481 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY,
ctx->pa_static_scene_detection_sensitivity);
483 if (
ctx->pa_initial_qp != -1) {
484 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_INITIAL_QP_AFTER_SCENE_CHANGE,
ctx->pa_initial_qp);
486 if (
ctx->pa_max_qp != -1) {
487 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_MAX_QP_BEFORE_FORCE_SKIP,
ctx->pa_max_qp);
489 if (
ctx->pa_caq_strength != -1) {
490 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_CAQ_STRENGTH,
ctx->pa_caq_strength);
492 if (
ctx->pa_frame_sad != -1) {
493 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_PA_FRAME_SAD_ENABLE, ((
ctx->pa_frame_sad == 0) ?
false :
true));
495 if (
ctx->pa_paq_mode != -1) {
496 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_PAQ_MODE,
ctx->pa_paq_mode);
498 if (
ctx->pa_taq_mode != -1) {
499 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_TAQ_MODE,
ctx->pa_taq_mode);
501 if (
ctx->pa_adaptive_mini_gop != -1) {
502 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ADAPTIVE_MINIGOP, ((
ctx->pa_adaptive_mini_gop == 0) ?
false :
true));
504 if (
ctx->pa_ltr != -1) {
505 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_PA_LTR_ENABLE, ((
ctx->pa_ltr == 0) ?
false :
true));
507 if (
ctx->pa_lookahead_buffer_depth != -1) {
508 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_LOOKAHEAD_BUFFER_DEPTH,
ctx->pa_lookahead_buffer_depth);
510 if (
ctx->pa_high_motion_quality_boost_mode != -1) {
511 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE,
ctx->pa_high_motion_quality_boost_mode);
516 AMFVariantStruct is_adaptive_b_frames = { 0 };
517 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_AV1_ADAPTIVE_MINIGOP, &is_adaptive_b_frames);
518 if (
ctx->max_consecutive_b_frames != -1 ||
ctx->max_b_frames != -1 || is_adaptive_b_frames.boolValue ==
true) {
521 AMFCaps *encoder_caps =
NULL;
522 ctx->encoder->pVtbl->GetCaps(
ctx->encoder, &encoder_caps);
523 if (encoder_caps !=
NULL)
525 res = encoder_caps->pVtbl->GetProperty(encoder_caps, AMF_VIDEO_ENCODER_AV1_CAP_BFRAMES, &var);
529 if(var.boolValue ==
true){
531 if (is_adaptive_b_frames.boolValue ==
true)
534 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_CONSECUTIVE_BPICTURES, 3);
536 if(
ctx->pa_lookahead_buffer_depth < 1)
539 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_PA_LOOKAHEAD_BUFFER_DEPTH, 1);
543 if (
ctx->max_b_frames != -1) {
545 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_B_PIC_PATTERN,
ctx->max_b_frames);
547 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_AV1_B_PIC_PATTERN, &var);
548 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);
549 ctx->max_b_frames = (int)var.int64Value;
551 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_CONSECUTIVE_BPICTURES,
ctx->max_b_frames);
558 av_log(
ctx,
AV_LOG_WARNING,
"The current GPU in use does not support AV1 B-frame encoding, there will be no B-frame in bitstream.\n");
566 encoder_caps->pVtbl->Release(encoder_caps);
572 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_QUERY_TIMEOUT, 1);
573 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_AV1_QUERY_TIMEOUT, &var);
574 ctx->query_timeout_supported = res == AMF_OK && var.int64Value;
581 if (
ctx->min_qp_i != -1) {
582 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTRA,
ctx->min_qp_i);
584 else if (avctx->
qmin != -1) {
585 int qval = avctx->
qmin > 255 ? 255 : avctx->
qmin;
586 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTRA, qval);
588 if (
ctx->max_qp_i != -1) {
589 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTRA,
ctx->max_qp_i);
591 else if (avctx->
qmax != -1) {
592 int qval = avctx->
qmax > 255 ? 255 : avctx->
qmax;
593 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTRA, qval);
595 if (
ctx->min_qp_p != -1) {
596 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER,
ctx->min_qp_p);
598 else if (avctx->
qmin != -1) {
599 int qval = avctx->
qmin > 255 ? 255 : avctx->
qmin;
600 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER, qval);
602 if (
ctx->min_qp_b != -1) {
603 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER_B,
ctx->min_qp_b);
605 else if (avctx->
qmin != -1) {
606 int qval = avctx->
qmin > 255 ? 255 : avctx->
qmin;
607 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER_B, qval);
609 if (
ctx->max_qp_p != -1) {
610 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER,
ctx->max_qp_p);
612 else if (avctx->
qmax != -1) {
613 int qval = avctx->
qmax > 255 ? 255 : avctx->
qmax;
614 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER, qval);
616 if (
ctx->max_qp_b != -1) {
617 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER_B,
ctx->max_qp_b);
619 else if (avctx->
qmax != -1) {
620 int qval = avctx->
qmax > 255 ? 255 : avctx->
qmax;
621 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER_B, qval);
624 if (
ctx->qp_p != -1) {
625 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTER,
ctx->qp_p);
627 if (
ctx->qp_i != -1) {
628 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTRA,
ctx->qp_i);
630 if (
ctx->qp_b != -1) {
631 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTER_B,
ctx->qp_b);
634 if (
ctx->skip_frame != -1) {
635 AMF_ASSIGN_PROPERTY_BOOL(res,
ctx->encoder, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_SKIP_FRAME, ((
ctx->skip_frame == 0) ?
false :
true));
639 res = AMFVariantInit(&var);
642 res =
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_AV1_EXTRA_DATA, &var);
646 guid = IID_AMFBuffer();
648 res = var.pInterface->pVtbl->QueryInterface(var.pInterface, &guid, (
void**)&
buffer);
650 var.pInterface->pVtbl->Release(var.pInterface);
658 var.pInterface->pVtbl->Release(var.pInterface);
664 var.pInterface->pVtbl->Release(var.pInterface);
667 if (
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_AV1_CAP_WIDTH_ALIGNMENT_FACTOR, &var) != AMF_OK)
669 width_alignment_factor = 64;
671 width_alignment_factor = (int)var.int64Value;
673 if (
ctx->encoder->pVtbl->GetProperty(
ctx->encoder, AMF_VIDEO_ENCODER_AV1_CAP_HEIGHT_ALIGNMENT_FACTOR, &var) != AMF_OK)
675 height_alignment_factor = 16;
677 height_alignment_factor = (int)var.int64Value;
679 if (width_alignment_factor != -1 && height_alignment_factor != -1) {
680 if (avctx->
width % width_alignment_factor != 0)
681 crop_right = width_alignment_factor - (avctx->
width & (width_alignment_factor - 1));
683 if (avctx->
height % height_alignment_factor != 0)
684 crop_bottom = height_alignment_factor - (avctx->
height & (height_alignment_factor - 1));
687 if (crop_bottom == 8)
691 if (crop_right != 0 || crop_bottom != 0) {
756 .p.wrapper_name =
"amf",