32 #include "AMF/components/VideoConverter.h"
74 output_pix_fmts = output_pix_fmts_default;
85 AMFBuffer *hdrmeta_buffer =
NULL;
86 AMFHDRMetadata *hdrmeta =
NULL;
91 enum AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM amf_color_profile;
99 res =
ctx->amf_device_ctx->factory->pVtbl->CreateComponent(
ctx->amf_device_ctx->factory,
ctx->amf_device_ctx->context, AMFVideoConverter, &
ctx->component);
107 AMF_ASSIGN_PROPERTY_SIZE(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_SIZE,
out_size);
110 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_SCALE, (amf_int32)
ctx->scale_type);
113 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN;
115 switch(
ctx->color_profile) {
116 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_601:
117 if (
ctx->out_color_range == AMF_COLOR_RANGE_FULL) {
118 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_601;
120 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_601;
123 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_709:
124 if (
ctx->out_color_range == AMF_COLOR_RANGE_FULL) {
125 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_709;
127 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_709;
130 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020:
131 if (
ctx->out_color_range == AMF_COLOR_RANGE_FULL) {
132 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_2020;
134 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020;
138 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN;
142 if (
ctx->in_color_range != AMF_COLOR_RANGE_UNDEFINED) {
143 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_INPUT_COLOR_RANGE,
ctx->in_color_range);
146 if (
ctx->in_primaries != AMF_COLOR_PRIMARIES_UNDEFINED) {
147 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_INPUT_COLOR_PRIMARIES,
ctx->in_primaries);
150 if (
ctx->in_trc != AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED) {
151 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_INPUT_TRANSFER_CHARACTERISTIC,
ctx->in_trc);
158 if (!
ctx->master_display)
166 if (!
ctx->light_meta)
170 if (
ctx->light_meta ||
ctx->master_display) {
172 res =
ctx->amf_device_ctx->context->pVtbl->AllocBuffer(
ctx->amf_device_ctx->context, AMF_MEMORY_HOST,
sizeof(AMFHDRMetadata), &hdrmeta_buffer);
174 hdrmeta = (AMFHDRMetadata*)hdrmeta_buffer->pVtbl->GetNative(hdrmeta_buffer);
179 AMF_ASSIGN_PROPERTY_INTERFACE(res,
ctx->component, AMF_VIDEO_CONVERTER_INPUT_HDR_METADATA, hdrmeta_buffer);
181 hdrmeta_buffer->pVtbl->Release(hdrmeta_buffer);
186 if (amf_color_profile != AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN) {
187 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_COLOR_PROFILE, amf_color_profile);
190 if (
ctx->out_color_range != AMF_COLOR_RANGE_UNDEFINED) {
191 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_COLOR_RANGE,
ctx->out_color_range);
194 if (
ctx->out_primaries != AMF_COLOR_PRIMARIES_UNDEFINED) {
195 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_COLOR_PRIMARIES,
ctx->out_primaries);
198 if (
ctx->out_trc != AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED) {
199 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_TRANSFER_CHARACTERISTIC,
ctx->out_trc);
208 #define OFFSET(x) offsetof(AMFFilterContext, x)
209 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
215 {
"scale_type",
"Scale type",
OFFSET(scale_type),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_CONVERTER_SCALE_BILINEAR }, AMF_VIDEO_CONVERTER_SCALE_BILINEAR, AMF_VIDEO_CONVERTER_SCALE_BICUBIC,
FLAGS,
"scale_type" },
216 {
"bilinear",
"Bilinear", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_SCALE_BILINEAR }, 0, 0,
FLAGS,
"scale_type" },
217 {
"bicubic",
"Bicubic", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_SCALE_BICUBIC }, 0, 0,
FLAGS,
"scale_type" },
219 {
"color_profile",
"Color profile",
OFFSET(color_profile),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN }, AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN, AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_2020,
FLAGS,
"color_profile" },
220 {
"bt601",
"BT.601", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_601 }, 0, 0,
FLAGS,
"color_profile" },
221 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_709 }, 0, 0,
FLAGS,
"color_profile" },
222 {
"bt2020",
"BT.2020", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020 }, 0, 0,
FLAGS,
"color_profile" },
224 {
"in_color_range",
"Input color range",
OFFSET(in_color_range),
AV_OPT_TYPE_INT, { .i64 = AMF_COLOR_RANGE_UNDEFINED }, AMF_COLOR_RANGE_UNDEFINED, AMF_COLOR_RANGE_FULL,
FLAGS,
"color_range" },
225 {
"out_color_range",
"Output color range",
OFFSET(out_color_range),
AV_OPT_TYPE_INT, { .i64 = AMF_COLOR_RANGE_UNDEFINED }, AMF_COLOR_RANGE_UNDEFINED, AMF_COLOR_RANGE_FULL,
FLAGS,
"color_range" },
226 {
"studio",
"Studio", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_RANGE_STUDIO }, 0, 0,
FLAGS,
"color_range" },
229 {
"in_primaries",
"Input color primaries",
OFFSET(in_primaries),
AV_OPT_TYPE_INT, { .i64 = AMF_COLOR_PRIMARIES_UNDEFINED }, AMF_COLOR_PRIMARIES_UNDEFINED, AMF_COLOR_PRIMARIES_JEDEC_P22,
FLAGS,
"primaries" },
230 {
"out_primaries",
"Output color primaries",
OFFSET(out_primaries),
AV_OPT_TYPE_INT, { .i64 = AMF_COLOR_PRIMARIES_UNDEFINED }, AMF_COLOR_PRIMARIES_UNDEFINED, AMF_COLOR_PRIMARIES_JEDEC_P22,
FLAGS,
"primaries" },
231 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT709 }, 0, 0,
FLAGS,
"primaries" },
232 {
"bt470m",
"BT.470M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT470M }, 0, 0,
FLAGS,
"primaries" },
233 {
"bt470bg",
"BT.470BG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT470BG }, 0, 0,
FLAGS,
"primaries" },
234 {
"smpte170m",
"SMPTE170M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE170M }, 0, 0,
FLAGS,
"primaries" },
235 {
"smpte240m",
"SMPTE240M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE240M }, 0, 0,
FLAGS,
"primaries" },
237 {
"bt2020",
"BT2020", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT2020 }, 0, 0,
FLAGS,
"primaries" },
238 {
"smpte428",
"SMPTE428", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE428 }, 0, 0,
FLAGS,
"primaries" },
239 {
"smpte431",
"SMPTE431", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE431 }, 0, 0,
FLAGS,
"primaries" },
240 {
"smpte432",
"SMPTE432", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE432 }, 0, 0,
FLAGS,
"primaries" },
241 {
"jedec-p22",
"JEDEC_P22", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_JEDEC_P22 }, 0, 0,
FLAGS,
"primaries" },
243 {
"in_trc",
"Input transfer characteristics",
OFFSET(in_trc),
AV_OPT_TYPE_INT, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED }, AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, AMF_COLOR_TRANSFER_CHARACTERISTIC_ARIB_STD_B67,
FLAGS,
"trc" },
244 {
"out_trc",
"Output transfer characteristics",
OFFSET(out_trc),
AV_OPT_TYPE_INT, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED }, AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED, AMF_COLOR_TRANSFER_CHARACTERISTIC_ARIB_STD_B67,
FLAGS,
"trc" },
245 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT709 }, 0, 0,
FLAGS,
"trc" },
246 {
"gamma22",
"GAMMA22", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_GAMMA22 }, 0, 0,
FLAGS,
"trc" },
247 {
"gamma28",
"GAMMA28", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_GAMMA28 }, 0, 0,
FLAGS,
"trc" },
248 {
"smpte170m",
"SMPTE170M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE170M }, 0, 0,
FLAGS,
"trc" },
249 {
"smpte240m",
"SMPTE240M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE240M }, 0, 0,
FLAGS,
"trc" },
250 {
"linear",
"Linear", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LINEAR }, 0, 0,
FLAGS,
"trc" },
251 {
"log",
"LOG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LOG }, 0, 0,
FLAGS,
"trc" },
252 {
"log-sqrt",
"LOG_SQRT", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LOG_SQRT }, 0, 0,
FLAGS,
"trc" },
253 {
"iec61966-2-4",
"IEC61966_2_4", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_IEC61966_2_4 }, 0, 0,
FLAGS,
"trc" },
254 {
"bt1361-ecg",
"BT1361_ECG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT1361_ECG }, 0, 0,
FLAGS,
"trc" },
255 {
"iec61966-2-1",
"IEC61966_2_1", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_IEC61966_2_1 }, 0, 0,
FLAGS,
"trc" },
256 {
"bt2020-10",
"BT.2020_10", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT2020_10 }, 0, 0,
FLAGS,
"trc" },
257 {
"bt2020-12",
"BT.2020-12", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT2020_12 }, 0, 0,
FLAGS,
"trc" },
258 {
"smpte2084",
"SMPTE2084", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE2084 }, 0, 0,
FLAGS,
"trc" },
259 {
"smpte428",
"SMPTE428", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE428 }, 0, 0,
FLAGS,
"trc" },
260 {
"arib-std-b67",
"ARIB_STD_B67", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_ARIB_STD_B67 }, 0, 0,
FLAGS,
"trc" },
266 {
"force_divisible_by",
"enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used",
OFFSET(force_divisible_by),
AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256,
FLAGS },
267 {
"reset_sar",
"reset SAR to 1 and scale to square pixels if scaling proportionally",
OFFSET(reset_sar),
AV_OPT_TYPE_BOOL, { .i64 = 0}, 0, 1,
FLAGS },
294 .p.priv_class = &vpp_amf_class,