libs: video-format: Make all YUV format available

The YUV formats have no ambiguity for drivers, so we can add them all.
Some old driver(i965) does not implement full get/put image functions
but can use derive image funtions for the YUV format. It does not
report that kind of formats correctly in image query, but will derive
that YUV format image from surface. The dynamic mapping of YUV format
will block that manner.
Adding more YUV format mapping has no side effect. So considering the
legacy driver conformance, we add all YUV formats mapping statically
and dynamic mapping RBG formats

Fix: #189
Fix: #190
This commit is contained in:
He Junyan 2019-09-11 11:56:35 +08:00 committed by Víctor Manuel Jáquez Leal
parent 499e248d4c
commit f5e1946036

View file

@ -491,41 +491,48 @@ video_format_create_map_once (gpointer data)
guint n = ((struct ImageFormatsData *) data)->n;
GArray *array = NULL;
if (formats == NULL || n == 0)
return NULL;
array = g_array_new (FALSE, TRUE, sizeof (GstVideoFormatMap));
if (array == NULL)
return NULL;
for (i = 0; i < n; i++) {
src_entry = get_map_in_default_by_va_format (&formats[i]);
if (src_entry) {
entry = get_map_by_gst_format (array, src_entry->format);
if (entry && !va_format_is_same (&entry->va_format, &formats[i])) {
GST_INFO ("va_format1 with fourcc %" GST_FOURCC_FORMAT
" byte order: %d, BPP: %d, depth %d, red mask 0x%4x,"
" green mask 0x%4x, blue mask 0x%4x, alpha mask 0x%4x"
" conflict with va_foramt2 fourcc %" GST_FOURCC_FORMAT
" byte order: %d, BPP: %d, depth %d, red mask 0x%4x,"
" green mask 0x%4x, blue mask 0x%4x, alpha mask 0x%4x."
" Both map to the same GST format: %s, which is not"
" allowed, va_format1 will be skipped",
GST_FOURCC_ARGS (entry->va_format.fourcc),
entry->va_format.byte_order, entry->va_format.bits_per_pixel,
entry->va_format.depth, entry->va_format.red_mask,
entry->va_format.green_mask, entry->va_format.blue_mask,
entry->va_format.alpha_mask,
GST_FOURCC_ARGS (formats[i].fourcc),
formats[i].byte_order, formats[i].bits_per_pixel, formats[i].depth,
formats[i].red_mask, formats[i].green_mask, formats[i].blue_mask,
formats[i].alpha_mask, gst_video_format_to_string (entry->format));
continue;
}
g_array_append_val (array, (*src_entry));
}
/* All the YUV format has no ambiguity */
for (i = 0; i < G_N_ELEMENTS (gst_vaapi_video_default_formats); i++) {
if (va_format_is_yuv (&gst_vaapi_video_default_formats[i].va_format))
g_array_append_val (array, gst_vaapi_video_default_formats[i]);
}
if (formats) {
for (i = 0; i < n; i++) {
if (!va_format_is_rgb (&formats[i]))
continue;
src_entry = get_map_in_default_by_va_format (&formats[i]);
if (src_entry) {
entry = get_map_by_gst_format (array, src_entry->format);
if (entry && !va_format_is_same (&entry->va_format, &formats[i])) {
GST_INFO ("va_format1 with fourcc %" GST_FOURCC_FORMAT
" byte order: %d, BPP: %d, depth %d, red mask 0x%4x,"
" green mask 0x%4x, blue mask 0x%4x, alpha mask 0x%4x"
" conflict with va_foramt2 fourcc %" GST_FOURCC_FORMAT
" byte order: %d, BPP: %d, depth %d, red mask 0x%4x,"
" green mask 0x%4x, blue mask 0x%4x, alpha mask 0x%4x."
" Both map to the same GST format: %s, which is not"
" allowed, va_format1 will be skipped",
GST_FOURCC_ARGS (entry->va_format.fourcc),
entry->va_format.byte_order, entry->va_format.bits_per_pixel,
entry->va_format.depth, entry->va_format.red_mask,
entry->va_format.green_mask, entry->va_format.blue_mask,
entry->va_format.alpha_mask,
GST_FOURCC_ARGS (formats[i].fourcc),
formats[i].byte_order, formats[i].bits_per_pixel,
formats[i].depth, formats[i].red_mask, formats[i].green_mask,
formats[i].blue_mask, formats[i].alpha_mask,
gst_video_format_to_string (entry->format));
continue;
}
g_array_append_val (array, (*src_entry));
}
if (va_format_is_rgb (&formats[i])) {
GST_LOG ("%s to map RGB va_format with fourcc: %"
GST_FOURCC_FORMAT
", byte order: %d BPP: %d, depth %d, red mask %4x,"
@ -535,13 +542,6 @@ video_format_create_map_once (gpointer data)
formats[i].bits_per_pixel, formats[i].depth, formats[i].red_mask,
formats[i].green_mask, formats[i].blue_mask, formats[i].alpha_mask,
src_entry ? gst_video_format_to_string (src_entry->format) : "any");
} else {
GST_LOG ("%s to map YUV va format with fourcc: %"
GST_FOURCC_FORMAT ", byte order: %d BPP: %d to %s gstreamer"
" video format", src_entry ? "succeed" : "failed",
GST_FOURCC_ARGS (formats[i].fourcc), formats[i].byte_order,
formats[i].bits_per_pixel,
src_entry ? gst_video_format_to_string (src_entry->format) : "any");
}
}