Fix NXP's custom glupload path for certain formats.

These both show a red solid frame:
gst-launch-1.0 videotestsrc pattern=red ! video/x-raw,format=BGRA ! kmssink
gst-launch-1.0 videotestsrc pattern=red ! video/x-raw,format=BGRA ! waylandsink

This shows a solid BLUE frame:
gst-launch-1.0 videotestsrc pattern=red ! video/x-raw,format=BGRA ! glimagesink

NXP uses _drm_fourcc_from_info in their custom gst_egl_image_from_dmabuf_singleplaner
but that function is for GStreamer's internal shader conversion and isn't
suitable for direct DRM use.

A similar upload path is coming in GStreamer 1.15 so adapt a fix from there.

Change-Id: Iba969ad5d9db41cd71480f1c7bfb3730e1a8e80c
diff --git a/gst-libs/gst/gl/egl/gsteglimage.c b/gst-libs/gst/gl/egl/gsteglimage.c
index 3902441..254478f 100644
--- a/gst-libs/gst/gl/egl/gsteglimage.c
+++ b/gst-libs/gst/gl/egl/gsteglimage.c
@@ -404,6 +404,107 @@
   }
 }
 
+/*
+ * From GStreamer 1.15
+ * Variant of _drm_rgba_fourcc_from_info() that is used in case the GPU can
+ * handle YUV formats directly (by using internal shaders, or hardwired
+ * YUV->RGB conversion matrices etc.)
+ */
+static int
+_drm_direct_fourcc_from_info (GstVideoInfo * info)
+{
+  GstVideoFormat format = GST_VIDEO_INFO_FORMAT (info);
+
+  GST_DEBUG ("Getting DRM fourcc for %s", gst_video_format_to_string (format));
+
+  switch (format) {
+    case GST_VIDEO_FORMAT_YUY2:
+      return DRM_FORMAT_YUYV;
+
+    case GST_VIDEO_FORMAT_YVYU:
+      return DRM_FORMAT_YVYU;
+
+    case GST_VIDEO_FORMAT_UYVY:
+      return DRM_FORMAT_UYVY;
+
+    case GST_VIDEO_FORMAT_VYUY:
+      return DRM_FORMAT_VYUY;
+
+    case GST_VIDEO_FORMAT_AYUV:
+      return DRM_FORMAT_AYUV;
+
+    case GST_VIDEO_FORMAT_NV12:
+      return DRM_FORMAT_NV12;
+
+    case GST_VIDEO_FORMAT_NV21:
+      return DRM_FORMAT_NV21;
+
+    case GST_VIDEO_FORMAT_NV16:
+      return DRM_FORMAT_NV16;
+
+    case GST_VIDEO_FORMAT_NV61:
+      return DRM_FORMAT_NV61;
+
+    case GST_VIDEO_FORMAT_NV24:
+      return DRM_FORMAT_NV24;
+
+    case GST_VIDEO_FORMAT_YUV9:
+      return DRM_FORMAT_YUV410;
+
+    case GST_VIDEO_FORMAT_YVU9:
+      return DRM_FORMAT_YVU410;
+
+    case GST_VIDEO_FORMAT_Y41B:
+      return DRM_FORMAT_YUV411;
+
+    case GST_VIDEO_FORMAT_I420:
+      return DRM_FORMAT_YUV420;
+
+    case GST_VIDEO_FORMAT_YV12:
+      return DRM_FORMAT_YVU420;
+
+    case GST_VIDEO_FORMAT_Y42B:
+      return DRM_FORMAT_YUV422;
+
+    case GST_VIDEO_FORMAT_Y444:
+      return DRM_FORMAT_YUV444;
+
+    case GST_VIDEO_FORMAT_RGB16:
+      return DRM_FORMAT_RGB565;
+
+    case GST_VIDEO_FORMAT_BGR16:
+      return DRM_FORMAT_BGR565;
+
+    case GST_VIDEO_FORMAT_RGBA:
+      return DRM_FORMAT_ABGR8888;
+
+    case GST_VIDEO_FORMAT_RGBx:
+      return DRM_FORMAT_XBGR8888;
+
+    case GST_VIDEO_FORMAT_BGRA:
+      return DRM_FORMAT_ARGB8888;
+
+    case GST_VIDEO_FORMAT_BGRx:
+      return DRM_FORMAT_XRGB8888;
+
+    case GST_VIDEO_FORMAT_ARGB:
+      return DRM_FORMAT_BGRA8888;
+
+    case GST_VIDEO_FORMAT_xRGB:
+      return DRM_FORMAT_BGRX8888;
+
+    case GST_VIDEO_FORMAT_ABGR:
+      return DRM_FORMAT_RGBA8888;
+
+    case GST_VIDEO_FORMAT_xBGR:
+      return DRM_FORMAT_RGBX8888;
+
+    default:
+      GST_INFO ("Unsupported format for direct DMABuf.");
+      return -1;
+  }
+}
+
 /**
  * gst_egl_image_from_dmabuf:
  * @context: a #GstGLContext (must be an EGL context)
@@ -488,17 +589,9 @@
   };
   EGLImageKHR img = EGL_NO_IMAGE_KHR;
 
-  fourcc = _drm_fourcc_from_info (in_info, 0);
-
-  if(GST_VIDEO_INFO_IS_YUV(in_info)) {
-    fourcc = gst_video_format_to_fourcc (GST_VIDEO_INFO_FORMAT(in_info));
-
-    /* gstreamer fourcc is not compatible with DRM FOURCC*/
-    if(GST_VIDEO_INFO_FORMAT(in_info) == GST_VIDEO_FORMAT_I420)
-      fourcc = DRM_FORMAT_YUV420;
-    if(GST_VIDEO_INFO_FORMAT(in_info) == GST_VIDEO_FORMAT_YUY2)
-      fourcc = DRM_FORMAT_YUYV;
-  }
+  fourcc = _drm_direct_fourcc_from_info (in_info);
+  if (fourcc == -1)
+    return NULL;
 
   GST_DEBUG ("fourcc %.4s (%d) n_planes %d (%dx%d)",
       (char *) &fourcc, fourcc, n_planes,