+
+ input_props = (VAAPIColourProperties) {
+ .colorspace = vaapi_vpp_frame_is_rgb(input_frame)
+ ? AVCOL_SPC_RGB : input_frame->colorspace,
+ .color_primaries = input_frame->color_primaries,
+ .color_trc = input_frame->color_trc,
+ .color_range = input_frame->color_range,
+ .chroma_sample_location = input_frame->chroma_location,
+ };
+
+ vaapi_vpp_fill_colour_properties(avctx, &input_props,
+ caps.input_color_standards,
+ caps.num_input_color_standards);
+
+ output_props = (VAAPIColourProperties) {
+ .colorspace = vaapi_vpp_frame_is_rgb(output_frame)
+ ? AVCOL_SPC_RGB : output_frame->colorspace,
+ .color_primaries = output_frame->color_primaries,
+ .color_trc = output_frame->color_trc,
+ .color_range = output_frame->color_range,
+ .chroma_sample_location = output_frame->chroma_location,
+ };
+ vaapi_vpp_fill_colour_properties(avctx, &output_props,
+ caps.output_color_standards,
+ caps.num_output_color_standards);
+
+ // If the properties weren't filled completely in the output frame and
+ // we chose a fixed standard then fill the known values in here.
+#if VA_CHECK_VERSION(1, 3, 0)
+ if (output_props.va_color_standard != VAProcColorStandardExplicit)
+#endif
+ {
+ const VAAPIColourProperties *output_standard = NULL;
+ int i;
+
+ for (i = 0; i < FF_ARRAY_ELEMS(vaapi_colour_standard_map); i++) {
+ if (output_props.va_color_standard ==
+ vaapi_colour_standard_map[i].va_color_standard) {
+ output_standard = &vaapi_colour_standard_map[i];
+ break;
+ }
+ }
+ if (output_standard) {
+ output_frame->colorspace = vaapi_vpp_frame_is_rgb(output_frame)
+ ? AVCOL_SPC_RGB : output_standard->colorspace;
+ output_frame->color_primaries = output_standard->color_primaries;
+ output_frame->color_trc = output_standard->color_trc;
+ }
+ }
+
+ params->surface_color_standard = input_props.va_color_standard;
+ params->output_color_standard = output_props.va_color_standard;
+
+#if VA_CHECK_VERSION(1, 1, 0)
+ params->input_color_properties = (VAProcColorProperties) {
+ .chroma_sample_location = input_props.va_chroma_sample_location,
+ .color_range = input_props.va_color_range,
+#if VA_CHECK_VERSION(1, 3, 0)
+ .colour_primaries = input_props.color_primaries,
+ .transfer_characteristics = input_props.color_trc,
+ .matrix_coefficients = input_props.colorspace,
+#endif
+ };
+ params->output_color_properties = (VAProcColorProperties) {
+ .chroma_sample_location = output_props.va_chroma_sample_location,
+ .color_range = output_props.va_color_range,
+#if VA_CHECK_VERSION(1, 3, 0)
+ .colour_primaries = output_props.color_primaries,
+ .transfer_characteristics = output_props.color_trc,
+ .matrix_coefficients = output_props.colorspace,
+#endif
+ };
+#endif
+
+ return 0;
+}
+
+int ff_vaapi_vpp_init_params(AVFilterContext *avctx,
+ VAProcPipelineParameterBuffer *params,
+ const AVFrame *input_frame,
+ AVFrame *output_frame)
+{
+ VAAPIVPPContext *ctx = avctx->priv;
+ VASurfaceID input_surface;
+ int err;
+
+ ctx->input_region = (VARectangle) {
+ .x = input_frame->crop_left,
+ .y = input_frame->crop_top,
+ .width = input_frame->width -
+ (input_frame->crop_left + input_frame->crop_right),
+ .height = input_frame->height -
+ (input_frame->crop_top + input_frame->crop_bottom),
+ };
+ output_frame->crop_top = 0;
+ output_frame->crop_bottom = 0;
+ output_frame->crop_left = 0;
+ output_frame->crop_right = 0;
+
+ input_surface = (VASurfaceID)(uintptr_t)input_frame->data[3],
+
+ *params = (VAProcPipelineParameterBuffer) {
+ .surface = input_surface,
+ .surface_region = &ctx->input_region,
+ .output_region = NULL,
+ .output_background_color = VAAPI_VPP_BACKGROUND_BLACK,
+ .pipeline_flags = 0,
+ .filter_flags = VA_FRAME_PICTURE,
+
+ // Filter and reference data filled by the filter itself.
+
+#if VA_CHECK_VERSION(1, 1, 0)
+ .rotation_state = VA_ROTATION_NONE,
+ .mirror_state = VA_MIRROR_NONE,
+#endif
+ };
+
+ err = vaapi_vpp_colour_properties(avctx, params,
+ input_frame, output_frame);
+ if (err < 0)
+ return err;
+
+ return 0;