From 2327ac4a13e44c205ef92d6afc5696dfd2b501ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Sat, 1 Aug 2020 15:03:22 +0200 Subject: [PATCH] va: caps: add raw caps image formats with same chroma of surfaces Instead of adding a list of ad-hoc formats for raw caps (I420 and YV12), the display queries the available image formats and we assume that driver can download frames in that available format with same chroma of the config surfaces chroma. Part-of: --- sys/va/gstvacaps.c | 66 ++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/sys/va/gstvacaps.c b/sys/va/gstvacaps.c index 415aa97379..0ef7cd8454 100644 --- a/sys/va/gstvacaps.c +++ b/sys/va/gstvacaps.c @@ -93,20 +93,6 @@ bail: return NULL; } -static gboolean -_array_has_format (GArray * formats, GstVideoFormat format) -{ - GstVideoFormat fmt; - guint i; - - for (i = 0; i < formats->len; i++) { - fmt = g_array_index (formats, GstVideoFormat, i); - if (fmt == format) - return TRUE; - } - return FALSE; -} - static gboolean _gst_caps_set_format_array (GstCaps * caps, GArray * formats) { @@ -241,21 +227,51 @@ gst_va_create_raw_caps_from_config (GstVaDisplay * display, VAConfigID config) caps = gst_caps_merge (caps, feature_caps); } /* raw caps */ + /* XXX(victor): assumption -- drivers can only download to image + * formats with same chroma of surface's format + */ { - feature_caps = - gst_caps_new_simple ("video/x-raw", "width", GST_TYPE_INT_RANGE, - min_width, max_width, "height", GST_TYPE_INT_RANGE, min_height, - max_height, NULL); + GstCaps *raw_caps; + GArray *image_formats = gst_va_display_get_image_formats (display); - if (_array_has_format (formats, GST_VIDEO_FORMAT_NV12)) { - for (i = 0; i < G_N_ELEMENTS (extra_formats); i++) - g_array_append_val (formats, extra_formats[i]); + if (!image_formats) { + raw_caps = gst_caps_copy (base_caps); + } else { + GArray *raw_formats = g_array_new (FALSE, FALSE, sizeof (GstVideoFormat)); + guint j, surface_chroma, image_chroma; + GstVideoFormat image_format; + + raw_caps = + gst_caps_new_simple ("video/x-raw", "width", GST_TYPE_INT_RANGE, + min_width, max_width, "height", GST_TYPE_INT_RANGE, min_height, + max_height, NULL); + + for (i = 0; i < formats->len; i++) { + format = g_array_index (formats, GstVideoFormat, i); + surface_chroma = gst_va_chroma_from_video_format (format); + if (surface_chroma == 0) + continue; + + g_array_append_val (raw_formats, format); + + for (j = 0; j < image_formats->len; j++) { + image_format = g_array_index (image_formats, GstVideoFormat, j); + image_chroma = gst_va_chroma_from_video_format (image_format); + if (image_format != format && surface_chroma == image_chroma) + g_array_append_val (raw_formats, image_format); + } + } + + if (!_gst_caps_set_format_array (raw_caps, raw_formats)) { + gst_caps_unref (raw_caps); + raw_caps = gst_caps_copy (base_caps); + } + + g_array_unref (raw_formats); + g_array_unref (image_formats); } - if (_gst_caps_set_format_array (feature_caps, formats)) - caps = gst_caps_merge (caps, feature_caps); - else - gst_clear_caps (&feature_caps); + caps = gst_caps_merge (caps, raw_caps); } gst_caps_unref (base_caps);