va: basedec: Always select first available format.
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Tue, 3 May 2022 14:23:09 +0000 (16:23 +0200)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Wed, 11 May 2022 13:03:54 +0000 (15:03 +0200)
If the stream chroma doesn't match with any video format in the source
caps template (generated from va config surface formats) instead of
return unknown, return the first available format in the template,
assuming that the driver would be capable to do color conversions.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2404>

subprojects/gst-plugins-bad/sys/va/gstvabasedec.c

index e7eee2c..116d2fc 100644 (file)
@@ -695,6 +695,8 @@ gst_va_base_dec_class_init (GstVaBaseDecClass * klass, GstVaCodecs codec,
           "DRM device path", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 }
 
+/* XXX: if chroma has not an available format, the first format is
+ * returned, relying on an hypothetical internal CSC */
 static GstVideoFormat
 _find_video_format_from_chroma (const GValue * formats, guint chroma_type)
 {
@@ -705,19 +707,24 @@ _find_video_format_from_chroma (const GValue * formats, guint chroma_type)
     return GST_VIDEO_FORMAT_UNKNOWN;
 
   if (G_VALUE_HOLDS_STRING (formats)) {
-    fmt = gst_video_format_from_string (g_value_get_string (formats));
-    if (gst_va_chroma_from_video_format (fmt) == chroma_type)
-      return fmt;
+    return gst_video_format_from_string (g_value_get_string (formats));
   } else if (GST_VALUE_HOLDS_LIST (formats)) {
+    GValue *val, *first_val = NULL;
+
     num_values = gst_value_list_get_size (formats);
     for (i = 0; i < num_values; i++) {
-      const GValue *val = gst_value_list_get_value (formats, i);
+      val = (GValue *) gst_value_list_get_value (formats, i);
       if (!val)
         continue;
+      if (!first_val)
+        first_val = val;
       fmt = gst_video_format_from_string (g_value_get_string (val));
       if (gst_va_chroma_from_video_format (fmt) == chroma_type)
         return fmt;
     }
+
+    if (first_val)
+      return gst_video_format_from_string (g_value_get_string (first_val));
   }
 
   return GST_VIDEO_FORMAT_UNKNOWN;