va: basedec: Always select first available format.

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>
This commit is contained in:
Víctor Manuel Jáquez Leal 2022-05-03 16:23:09 +02:00
parent 260c085a59
commit 4c97ffeafb

View 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)); "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 static GstVideoFormat
_find_video_format_from_chroma (const GValue * formats, guint chroma_type) _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; return GST_VIDEO_FORMAT_UNKNOWN;
if (G_VALUE_HOLDS_STRING (formats)) { if (G_VALUE_HOLDS_STRING (formats)) {
fmt = gst_video_format_from_string (g_value_get_string (formats)); return gst_video_format_from_string (g_value_get_string (formats));
if (gst_va_chroma_from_video_format (fmt) == chroma_type)
return fmt;
} else if (GST_VALUE_HOLDS_LIST (formats)) { } else if (GST_VALUE_HOLDS_LIST (formats)) {
GValue *val, *first_val = NULL;
num_values = gst_value_list_get_size (formats); num_values = gst_value_list_get_size (formats);
for (i = 0; i < num_values; i++) { 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) if (!val)
continue; continue;
if (!first_val)
first_val = val;
fmt = gst_video_format_from_string (g_value_get_string (val)); fmt = gst_video_format_from_string (g_value_get_string (val));
if (gst_va_chroma_from_video_format (fmt) == chroma_type) if (gst_va_chroma_from_video_format (fmt) == chroma_type)
return fmt; return fmt;
} }
if (first_val)
return gst_video_format_from_string (g_value_get_string (first_val));
} }
return GST_VIDEO_FORMAT_UNKNOWN; return GST_VIDEO_FORMAT_UNKNOWN;