libs: utils: treat va_rt_format as bitwise flag
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Fri, 16 Aug 2019 17:17:48 +0000 (19:17 +0200)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Mon, 19 Aug 2019 17:26:55 +0000 (17:26 +0000)
The return value of vaGetConfigAttributes() of VAConfigAttribRTFormat
is a bitwise flag with *all* the supported chroma types.

Previously it was assumed that the return value was a single value,
thus when returning the GST_VAAPI_CHROMA_TYPE_XXX the code was a
simple case. But it is wrong.

This patch changes the case block with a sequence of ifs testing the
bitwise. For now we assume a "priority" list in the testing sequence.

gst-libs/gst/vaapi/gstvaapiutils.c

index 55fcee9..461baf3 100644 (file)
@@ -383,61 +383,39 @@ string_of_VARateControl (guint rate_control)
 guint
 to_GstVaapiChromaType (guint va_rt_format)
 {
-  guint chroma_type;
-
-  switch (va_rt_format) {
-    case VA_RT_FORMAT_YUV420:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420;
-      break;
-    case VA_RT_FORMAT_YUV422:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV422;
-      break;
-    case VA_RT_FORMAT_YUV444:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV444;
-      break;
-    case VA_RT_FORMAT_YUV411:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV411;
-      break;
-    case VA_RT_FORMAT_YUV400:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV400;
-      break;
-    case VA_RT_FORMAT_RGB32:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_RGB32;
-      break;
-    case VA_RT_FORMAT_RGB16:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_RGB16;
-      break;
-    case VA_RT_FORMAT_RGBP:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_RGBP;
-      break;
-    case VA_RT_FORMAT_YUV420_10BPP:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420_10BPP;
-      break;
+  if (va_rt_format & VA_RT_FORMAT_YUV420)
+    return GST_VAAPI_CHROMA_TYPE_YUV420;
+  if (va_rt_format & VA_RT_FORMAT_YUV422)
+    return GST_VAAPI_CHROMA_TYPE_YUV422;
+  if (va_rt_format & VA_RT_FORMAT_YUV444)
+    return GST_VAAPI_CHROMA_TYPE_YUV444;
+  if (va_rt_format & VA_RT_FORMAT_YUV411)
+    return GST_VAAPI_CHROMA_TYPE_YUV411;
+  if (va_rt_format & VA_RT_FORMAT_YUV400)
+    return GST_VAAPI_CHROMA_TYPE_YUV400;
+  if (va_rt_format & VA_RT_FORMAT_RGB32)
+    return GST_VAAPI_CHROMA_TYPE_RGB32;
+  if (va_rt_format & VA_RT_FORMAT_RGB16)
+    return GST_VAAPI_CHROMA_TYPE_RGB16;
+  if (va_rt_format & VA_RT_FORMAT_RGBP)
+    return GST_VAAPI_CHROMA_TYPE_RGBP;
+  if (va_rt_format & VA_RT_FORMAT_YUV420_10BPP)
+    return GST_VAAPI_CHROMA_TYPE_YUV420_10BPP;
 #if VA_CHECK_VERSION(1,2,0)
-    case VA_RT_FORMAT_YUV422_10:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV422_10BPP;
-      break;
-    case VA_RT_FORMAT_YUV444_10:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV444_10BPP;
-      break;
-    case VA_RT_FORMAT_YUV420_12:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420_12BPP;
-      break;
-    case VA_RT_FORMAT_YUV422_12:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV422_12BPP;
-      break;
-    case VA_RT_FORMAT_YUV444_12:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_YUV444_12BPP;
-      break;
-    case VA_RT_FORMAT_RGB32_10:
-      chroma_type = GST_VAAPI_CHROMA_TYPE_RGB32_10BPP;
-      break;
+  if (va_rt_format & VA_RT_FORMAT_YUV422_10)
+    return GST_VAAPI_CHROMA_TYPE_YUV422_10BPP;
+  if (va_rt_format & VA_RT_FORMAT_YUV444_10)
+    return GST_VAAPI_CHROMA_TYPE_YUV444_10BPP;
+  if (va_rt_format & VA_RT_FORMAT_YUV420_12)
+    return GST_VAAPI_CHROMA_TYPE_YUV420_12BPP;
+  if (va_rt_format & VA_RT_FORMAT_YUV422_12)
+    return GST_VAAPI_CHROMA_TYPE_YUV422_12BPP;
+  if (va_rt_format & VA_RT_FORMAT_YUV444_12)
+    return GST_VAAPI_CHROMA_TYPE_YUV444_12BPP;
+  if (va_rt_format & VA_RT_FORMAT_RGB32_10)
+    return GST_VAAPI_CHROMA_TYPE_RGB32_10BPP;
 #endif
-    default:
-      chroma_type = 0;
-      break;
-  }
-  return chroma_type;
+  return 0;
 }
 
 /**