32 #include "AMF/components/VideoConverter.h"
74 output_pix_fmts = output_pix_fmts_default;
85 AMFBuffer *hdrmeta_buffer =
NULL;
86 AMFHDRMetadata *hdrmeta =
NULL;
92 enum AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM amf_color_profile;
94 const int chroma_den = 50000;
95 const int luma_den = 10000;
102 res =
ctx->amf_device_ctx->factory->pVtbl->CreateComponent(
ctx->amf_device_ctx->factory,
ctx->amf_device_ctx->context, AMFVideoConverter, &
ctx->component);
110 AMF_ASSIGN_PROPERTY_SIZE(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_SIZE,
out_size);
113 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_SCALE, (amf_int32)
ctx->scale_type);
116 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN;
118 switch(
ctx->color_profile) {
119 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_601:
120 if (
ctx->out_color_range == AMF_COLOR_RANGE_FULL) {
121 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_601;
123 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_601;
126 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_709:
127 if (
ctx->out_color_range == AMF_COLOR_RANGE_FULL) {
128 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_709;
130 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_709;
133 case AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020:
134 if (
ctx->out_color_range == AMF_COLOR_RANGE_FULL) {
135 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_FULL_2020;
137 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020;
141 amf_color_profile = AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN;
145 if (
ctx->in_color_range != AMF_COLOR_RANGE_UNDEFINED) {
146 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_INPUT_COLOR_RANGE,
ctx->in_color_range);
149 if (
ctx->in_primaries != AMF_COLOR_PRIMARIES_UNDEFINED) {
150 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_INPUT_COLOR_PRIMARIES,
ctx->in_primaries);
153 if (
ctx->in_trc != AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED) {
154 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_INPUT_TRANSFER_CHARACTERISTIC,
ctx->in_trc);
161 if (!
ctx->master_display)
169 if (!
ctx->light_meta)
173 if (
ctx->light_meta ||
ctx->master_display) {
175 res =
ctx->amf_device_ctx->context->pVtbl->AllocBuffer(
ctx->amf_device_ctx->context, AMF_MEMORY_HOST,
sizeof(AMFHDRMetadata), &hdrmeta_buffer);
177 hdrmeta = (AMFHDRMetadata*)hdrmeta_buffer->pVtbl->GetNative(hdrmeta_buffer);
182 AMF_ASSIGN_PROPERTY_INTERFACE(res,
ctx->component, AMF_VIDEO_CONVERTER_INPUT_HDR_METADATA, hdrmeta_buffer);
184 hdrmeta_buffer->pVtbl->Release(hdrmeta_buffer);
189 if (amf_color_profile != AMF_VIDEO_CONVERTER_COLOR_PROFILE_UNKNOWN) {
190 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_COLOR_PROFILE, amf_color_profile);
193 if (
ctx->out_color_range != AMF_COLOR_RANGE_UNDEFINED) {
194 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_COLOR_RANGE,
ctx->out_color_range);
197 if (
ctx->out_primaries != AMF_COLOR_PRIMARIES_UNDEFINED) {
198 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_COLOR_PRIMARIES,
ctx->out_primaries);
201 if (
ctx->out_trc != AMF_COLOR_TRANSFER_CHARACTERISTIC_UNDEFINED) {
202 AMF_ASSIGN_PROPERTY_INT64(res,
ctx->component, AMF_VIDEO_CONVERTER_OUTPUT_TRANSFER_CHARACTERISTIC,
ctx->out_trc);
211 #define OFFSET(x) offsetof(AMFFilterContext, x)
212 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
218 {
"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" },
219 {
"bilinear",
"Bilinear", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_SCALE_BILINEAR }, 0, 0,
FLAGS,
"scale_type" },
220 {
"bicubic",
"Bicubic", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_SCALE_BICUBIC }, 0, 0,
FLAGS,
"scale_type" },
222 {
"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" },
223 {
"bt601",
"BT.601", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_601 }, 0, 0,
FLAGS,
"color_profile" },
224 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_709 }, 0, 0,
FLAGS,
"color_profile" },
225 {
"bt2020",
"BT.2020", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020 }, 0, 0,
FLAGS,
"color_profile" },
227 {
"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" },
228 {
"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" },
229 {
"studio",
"Studio", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_RANGE_STUDIO }, 0, 0,
FLAGS,
"color_range" },
232 {
"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" },
233 {
"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" },
234 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT709 }, 0, 0,
FLAGS,
"primaries" },
235 {
"bt470m",
"BT.470M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT470M }, 0, 0,
FLAGS,
"primaries" },
236 {
"bt470bg",
"BT.470BG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT470BG }, 0, 0,
FLAGS,
"primaries" },
237 {
"smpte170m",
"SMPTE170M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE170M }, 0, 0,
FLAGS,
"primaries" },
238 {
"smpte240m",
"SMPTE240M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE240M }, 0, 0,
FLAGS,
"primaries" },
240 {
"bt2020",
"BT2020", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_BT2020 }, 0, 0,
FLAGS,
"primaries" },
241 {
"smpte428",
"SMPTE428", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE428 }, 0, 0,
FLAGS,
"primaries" },
242 {
"smpte431",
"SMPTE431", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE431 }, 0, 0,
FLAGS,
"primaries" },
243 {
"smpte432",
"SMPTE432", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_SMPTE432 }, 0, 0,
FLAGS,
"primaries" },
244 {
"jedec-p22",
"JEDEC_P22", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_PRIMARIES_JEDEC_P22 }, 0, 0,
FLAGS,
"primaries" },
246 {
"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" },
247 {
"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" },
248 {
"bt709",
"BT.709", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT709 }, 0, 0,
FLAGS,
"trc" },
249 {
"gamma22",
"GAMMA22", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_GAMMA22 }, 0, 0,
FLAGS,
"trc" },
250 {
"gamma28",
"GAMMA28", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_GAMMA28 }, 0, 0,
FLAGS,
"trc" },
251 {
"smpte170m",
"SMPTE170M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE170M }, 0, 0,
FLAGS,
"trc" },
252 {
"smpte240m",
"SMPTE240M", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE240M }, 0, 0,
FLAGS,
"trc" },
253 {
"linear",
"Linear", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LINEAR }, 0, 0,
FLAGS,
"trc" },
254 {
"log",
"LOG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LOG }, 0, 0,
FLAGS,
"trc" },
255 {
"log-sqrt",
"LOG_SQRT", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_LOG_SQRT }, 0, 0,
FLAGS,
"trc" },
256 {
"iec61966-2-4",
"IEC61966_2_4", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_IEC61966_2_4 }, 0, 0,
FLAGS,
"trc" },
257 {
"bt1361-ecg",
"BT1361_ECG", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT1361_ECG }, 0, 0,
FLAGS,
"trc" },
258 {
"iec61966-2-1",
"IEC61966_2_1", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_IEC61966_2_1 }, 0, 0,
FLAGS,
"trc" },
259 {
"bt2020-10",
"BT.2020_10", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT2020_10 }, 0, 0,
FLAGS,
"trc" },
260 {
"bt2020-12",
"BT.2020-12", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_BT2020_12 }, 0, 0,
FLAGS,
"trc" },
261 {
"smpte2084",
"SMPTE2084", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE2084 }, 0, 0,
FLAGS,
"trc" },
262 {
"smpte428",
"SMPTE428", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE428 }, 0, 0,
FLAGS,
"trc" },
263 {
"arib-std-b67",
"ARIB_STD_B67", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_COLOR_TRANSFER_CHARACTERISTIC_ARIB_STD_B67 }, 0, 0,
FLAGS,
"trc" },
269 {
"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 },
270 {
"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 },
297 .p.priv_class = &vpp_amf_class,