eglglessink: Always use an RGBA configuration
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 5 Mar 2013 11:47:07 +0000 (12:47 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 21 Mar 2013 09:20:44 +0000 (10:20 +0100)
Conflicts:
ext/eglgles/gsteglglessink.c

ext/eglgles/gsteglglessink.c
ext/eglgles/gsteglglessink.h

index 4bbddb65910dc4aef0d343b8b78147e6bdaae542..db1bae4b715a4a6d6f14eee684481d5b4c8559ef 100644 (file)
@@ -295,6 +295,16 @@ static const char *frag_NV12_NV21_prog = {
 };
 /* *INDENT-ON* */
 
+static const EGLint eglglessink_RGBA8888_attribs[] = {
+  EGL_RED_SIZE, 8,
+  EGL_GREEN_SIZE, 8,
+  EGL_BLUE_SIZE, 8,
+  EGL_ALPHA_SIZE, 8,
+  EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+  EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+  EGL_NONE
+};
+
 /* Input capabilities. */
 static GstStaticPadTemplate gst_eglglessink_sink_template_factory =
 GST_STATIC_PAD_TEMPLATE ("sink",
@@ -304,8 +314,7 @@ GST_STATIC_PAD_TEMPLATE ("sink",
             "RGBA, BGRA, ARGB, ABGR, "
             "RGBx, BGRx, xRGB, xBGR, "
             "AYUV, Y444, I420, YV12, "
-            "NV12, NV21, Y41B, RGB, "
-            "BGR, RGB16 }")));
+            "NV12, NV21, Y41B, RGB, " "BGR, RGB16 }")));
 
 /* Filter signals and args */
 enum
@@ -321,35 +330,6 @@ enum
   PROP_FORCE_ASPECT_RATIO,
 };
 
-/* will probably move elsewhere */
-static const EGLint eglglessink_RGBA8888_attribs[] = {
-  EGL_RED_SIZE, 8,
-  EGL_GREEN_SIZE, 8,
-  EGL_BLUE_SIZE, 8,
-  EGL_ALPHA_SIZE, 8,
-  EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
-  EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-  EGL_NONE
-};
-
-static const EGLint eglglessink_RGB888_attribs[] = {
-  EGL_RED_SIZE, 8,
-  EGL_GREEN_SIZE, 8,
-  EGL_BLUE_SIZE, 8,
-  EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
-  EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-  EGL_NONE
-};
-
-static const EGLint eglglessink_RGB565_attribs[] = {
-  EGL_RED_SIZE, 5,
-  EGL_GREEN_SIZE, 6,
-  EGL_BLUE_SIZE, 5,
-  EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
-  EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-  EGL_NONE
-};
-
 static void gst_eglglessink_finalize (GObject * object);
 static void gst_eglglessink_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
@@ -376,12 +356,10 @@ static void gst_eglglessink_set_render_rectangle (GstVideoOverlay * overlay,
     gint x, gint y, gint width, gint height);
 
 /* Utility */
-static GstEglGlesImageFmt *gst_eglglessink_get_compat_format_from_caps
-    (GstEglGlesSink * eglglessink, GstCaps * caps);
 static EGLNativeWindowType gst_eglglessink_create_window (GstEglGlesSink *
     eglglessink, gint width, gint height);
-static inline gint
-gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink);
+static gboolean gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink *
+    eglglessink);
 static gboolean gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink);
 static gboolean gst_eglglessink_choose_config (GstEglGlesSink * eglglessink);
 static gboolean gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink);
@@ -396,7 +374,6 @@ static GstFlowReturn gst_eglglessink_queue_object (GstEglGlesSink * sink,
     GstMiniObject * obj);
 static inline gboolean got_gl_error (const char *wtf);
 static inline gboolean got_egl_error (const char *wtf);
-static void gst_eglglessink_wipe_fmt (gpointer data);
 static inline gboolean egl_init (GstEglGlesSink * eglglessink);
 static gboolean gst_eglglessink_context_make_current (GstEglGlesSink *
     eglglessink, gboolean bind);
@@ -407,40 +384,6 @@ G_DEFINE_TYPE_WITH_CODE (GstEglGlesSink, gst_eglglessink, GST_TYPE_VIDEO_SINK,
     G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY,
         gst_eglglessink_videooverlay_init));
 
-
-static GstEglGlesImageFmt *
-gst_eglglessink_get_compat_format_from_caps (GstEglGlesSink * eglglessink,
-    GstCaps * caps)
-{
-
-  GList *list;
-  GstEglGlesImageFmt *format;
-
-  g_return_val_if_fail (GST_IS_EGLGLESSINK (eglglessink), 0);
-
-  list = eglglessink->supported_fmts;
-
-  /* Traverse the list trying to find a compatible format */
-  while (list) {
-    format = list->data;
-    GST_DEBUG_OBJECT (eglglessink, "Checking compatibility between listed %"
-        GST_PTR_FORMAT " and %" GST_PTR_FORMAT, format->caps, caps);
-    if (format) {
-      if (gst_caps_can_intersect (caps, format->caps)) {
-        GST_INFO_OBJECT (eglglessink, "Found compatible format %d",
-            format->fmt);
-        GST_DEBUG_OBJECT (eglglessink,
-            "Got caps %" GST_PTR_FORMAT " and this format can do %"
-            GST_PTR_FORMAT, caps, format->caps);
-        return format;
-      }
-    }
-    list = g_list_next (list);
-  }
-
-  return NULL;
-}
-
 static GstCaps *
 _gst_video_format_new_template_caps (GstVideoFormat format)
 {
@@ -451,12 +394,11 @@ _gst_video_format_new_template_caps (GstVideoFormat format)
       "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
 }
 
-static inline gint
+static gboolean
 gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
 {
-  gint ret = 0;
+  gboolean ret = FALSE;
   EGLint cfg_number;
-  GstEglGlesImageFmt *format;
   GstCaps *caps;
 
   GST_DEBUG_OBJECT (eglglessink,
@@ -467,79 +409,48 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
 
   if (eglChooseConfig (eglglessink->eglglesctx.display,
           eglglessink_RGBA8888_attribs, NULL, 1, &cfg_number) != EGL_FALSE) {
-    format = g_new0 (GstEglGlesImageFmt, 1);
-    format->fmt = GST_EGLGLESSINK_IMAGE_RGBA8888;
-    format->attribs = eglglessink_RGBA8888_attribs;
-    format->caps = _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGBA);
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_BGRA));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_ARGB));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_ABGR));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGBx));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_BGRx));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_xRGB));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_xBGR));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_AYUV));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_Y444));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
+        _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGB));
+    gst_caps_append (caps,
+        _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_BGR));
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_I420));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_YV12));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_NV12));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_NV21));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_Y42B));
-    gst_caps_append (format->caps,
+    gst_caps_append (caps,
         _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_Y41B));
-    eglglessink->supported_fmts =
-        g_list_append (eglglessink->supported_fmts, format);
-    ret++;
-    gst_caps_append (caps, gst_caps_ref (format->caps));
+    gst_caps_append (caps,
+        _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGB16));
+    ret = TRUE;
   } else {
     GST_INFO_OBJECT (eglglessink,
         "EGL display doesn't support RGBA8888 config");
   }
 
-  if (eglChooseConfig (eglglessink->eglglesctx.display,
-          eglglessink_RGB888_attribs, NULL, 1, &cfg_number) != EGL_FALSE) {
-    format = g_new0 (GstEglGlesImageFmt, 1);
-    format->fmt = GST_EGLGLESSINK_IMAGE_RGB888;
-    format->attribs = eglglessink_RGB888_attribs;
-    format->caps = _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGB);
-    gst_caps_append (format->caps,
-        _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_BGR));
-    eglglessink->supported_fmts =
-        g_list_append (eglglessink->supported_fmts, format);
-    ret++;
-    gst_caps_append (caps, gst_caps_ref (format->caps));
-  } else {
-    GST_INFO_OBJECT (eglglessink, "EGL display doesn't support RGB888 config");
-  }
-
-  if (eglChooseConfig (eglglessink->eglglesctx.display,
-          eglglessink_RGB565_attribs, NULL, 1, &cfg_number) != EGL_FALSE) {
-    format = g_new0 (GstEglGlesImageFmt, 1);
-    format->fmt = GST_EGLGLESSINK_IMAGE_RGB565;
-    format->attribs = eglglessink_RGB565_attribs;
-    format->caps = _gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGB16);
-    eglglessink->supported_fmts =
-        g_list_append (eglglessink->supported_fmts, format);
-    ret++;
-    gst_caps_append (caps, gst_caps_ref (format->caps));
-  } else {
-    GST_INFO_OBJECT (eglglessink, "EGL display doesn't support RGB565 config");
-  }
-
   GST_OBJECT_LOCK (eglglessink);
   gst_caps_replace (&eglglessink->sinkcaps, caps);
   GST_OBJECT_UNLOCK (eglglessink);
@@ -612,8 +523,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
       GstBuffer *buf = GST_BUFFER_CAST (item->object);
 
       if (eglglessink->configured_caps) {
-        last_flow =
-            gst_eglglessink_render_and_display (eglglessink, buf);
+        last_flow = gst_eglglessink_render_and_display (eglglessink, buf);
       } else {
         last_flow = GST_FLOW_OK;
         GST_DEBUG_OBJECT (eglglessink,
@@ -1497,7 +1407,8 @@ gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink)
 
 #ifdef USE_EGL_RPI
   /* See https://github.com/raspberrypi/firmware/issues/99 */
-  if (!eglMakeCurrent ((EGLDisplay) 1, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) {
+  if (!eglMakeCurrent ((EGLDisplay) 1, EGL_NO_SURFACE, EGL_NO_SURFACE,
+          EGL_NO_CONTEXT)) {
     got_egl_error ("eglMakeCurrent");
     GST_ERROR_OBJECT (eglglessink, "Couldn't unbind context");
     return FALSE;
@@ -1549,7 +1460,7 @@ gst_eglglessink_choose_config (GstEglGlesSink * eglglessink)
   GLint egl_configs;
 
   if ((eglChooseConfig (eglglessink->eglglesctx.display,
-              eglglessink->selected_fmt->attribs,
+              eglglessink_RGBA8888_attribs,
               &eglglessink->eglglesctx.config, 1, &egl_configs)) == EGL_FALSE) {
     got_egl_error ("eglChooseConfig");
     GST_ERROR_OBJECT (eglglessink, "eglChooseConfig failed");
@@ -1637,7 +1548,7 @@ gst_eglglessink_queue_object (GstEglGlesSink * eglglessink, GstMiniObject * obj)
   g_mutex_lock (&eglglessink->render_lock);
   last_flow = eglglessink->last_flow;
   g_mutex_unlock (&eglglessink->render_lock);
+
   if (last_flow != GST_FLOW_OK)
     return last_flow;
 
@@ -1721,8 +1632,9 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
     GST_DEBUG_OBJECT (eglglessink,
         "Got buffer %p: %dx%d size %d", buf, w, h, gst_buffer_get_size (buf));
 
-    switch (eglglessink->selected_fmt->fmt) {
-      case GST_EGLGLESSINK_IMAGE_RGB888:{
+    switch (eglglessink->configured_info.finfo->format) {
+      case GST_VIDEO_FORMAT_BGR:
+      case GST_VIDEO_FORMAT_RGB:{
         gint stride;
         gint stride_width;
         gint c_w;
@@ -1760,13 +1672,12 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
           goto HANDLE_ERROR;
 
         eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
-
         glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
         glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, stride_width, h, 0, GL_RGB,
             GL_UNSIGNED_BYTE, GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0));
         break;
       }
-      case GST_EGLGLESSINK_IMAGE_RGB565:{
+      case GST_VIDEO_FORMAT_RGB16:{
         gint stride;
         gint stride_width;
         gint c_w;
@@ -1785,7 +1696,7 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
         } else {
           stride_width = stride;
 
-          if (GST_ROUND_UP_8 (stride_width * 4) == stride) {
+          if (GST_ROUND_UP_8 (stride_width * 2) == stride) {
             glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
           } else if (GST_ROUND_UP_4 (stride_width * 2) == stride) {
             glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
@@ -1800,322 +1711,359 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
           goto HANDLE_ERROR;
 
         eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
-
         glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
         glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, stride_width, h, 0, GL_RGB,
             GL_UNSIGNED_SHORT_5_6_5, GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0));
         break;
       }
-      case GST_EGLGLESSINK_IMAGE_RGBA8888:
-
-        switch (eglglessink->configured_info.finfo->format) {
-          case GST_VIDEO_FORMAT_RGBA:
-          case GST_VIDEO_FORMAT_BGRA:
-          case GST_VIDEO_FORMAT_ARGB:
-          case GST_VIDEO_FORMAT_ABGR:
-          case GST_VIDEO_FORMAT_RGBx:
-          case GST_VIDEO_FORMAT_BGRx:
-          case GST_VIDEO_FORMAT_xRGB:
-          case GST_VIDEO_FORMAT_xBGR:{
-            gint stride;
-            gint stride_width;
-            gint c_w;
-
-            stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
-            stride_width = c_w = GST_VIDEO_FRAME_WIDTH (&vframe);
-
-            glActiveTexture (GL_TEXTURE0);
-
-            if (GST_ROUND_UP_8 (c_w * 4) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-            } else if (c_w * 4 == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-            } else {
-              stride_width = stride;
-
-              if (GST_ROUND_UP_8 (stride_width * 4) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-              } else if (stride_width * 4 == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-              } else {
-                GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
-                goto HANDLE_ERROR;
-              }
-            }
-            if (got_gl_error ("glPixelStorei"))
-              goto HANDLE_ERROR;
-
-            eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
-
-            glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
-            glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, stride_width, h, 0,
-                GL_RGBA, GL_UNSIGNED_BYTE, GST_VIDEO_FRAME_PLANE_DATA (&vframe,
-                    0));
-            break;
+      case GST_VIDEO_FORMAT_RGBA:
+      case GST_VIDEO_FORMAT_BGRA:
+      case GST_VIDEO_FORMAT_ARGB:
+      case GST_VIDEO_FORMAT_ABGR:
+      case GST_VIDEO_FORMAT_RGBx:
+      case GST_VIDEO_FORMAT_BGRx:
+      case GST_VIDEO_FORMAT_xRGB:
+      case GST_VIDEO_FORMAT_xBGR:{
+        gint stride;
+        gint stride_width;
+        gint c_w;
+
+        stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
+        stride_width = c_w = GST_VIDEO_FRAME_WIDTH (&vframe);
+
+        glActiveTexture (GL_TEXTURE0);
+
+        if (GST_ROUND_UP_8 (c_w * 4) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+        } else if (c_w * 4 == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+        } else {
+          stride_width = stride;
+
+          if (GST_ROUND_UP_8 (stride_width * 4) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+          } else if (stride_width * 4 == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+          } else {
+            GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
+            goto HANDLE_ERROR;
           }
-          case GST_VIDEO_FORMAT_AYUV:{
-            gint stride;
-            gint stride_width;
-            gint c_w;
-
-            stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
-            stride_width = c_w = GST_VIDEO_FRAME_WIDTH (&vframe);
-
-            glActiveTexture (GL_TEXTURE0);
-
-            if (GST_ROUND_UP_8 (c_w * 4) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-            } else if (c_w * 4 == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-            } else {
-              stride_width = stride;
-
-              if (GST_ROUND_UP_8 (stride_width * 4) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-              } else if (stride_width * 4 == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-              } else {
-                GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
-                goto HANDLE_ERROR;
-              }
-            }
-            if (got_gl_error ("glPixelStorei"))
-              goto HANDLE_ERROR;
-
-            eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
-
-            glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
-            glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, stride_width, h, 0,
-                GL_RGBA, GL_UNSIGNED_BYTE, GST_VIDEO_FRAME_PLANE_DATA (&vframe,
-                    0));
-            break;
+        }
+        if (got_gl_error ("glPixelStorei"))
+          goto HANDLE_ERROR;
+
+        eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
+
+        glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, stride_width, h, 0,
+            GL_RGBA, GL_UNSIGNED_BYTE, GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0));
+        break;
+      }
+      case GST_VIDEO_FORMAT_AYUV:{
+        gint stride;
+        gint stride_width;
+        gint c_w;
+
+        stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
+        stride_width = c_w = GST_VIDEO_FRAME_WIDTH (&vframe);
+
+        glActiveTexture (GL_TEXTURE0);
+
+        if (GST_ROUND_UP_8 (c_w * 4) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+        } else if (c_w * 4 == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+        } else {
+          stride_width = stride;
+
+          if (GST_ROUND_UP_8 (stride_width * 4) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+          } else if (stride_width * 4 == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+          } else {
+            GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
+            goto HANDLE_ERROR;
           }
-          case GST_VIDEO_FORMAT_Y444:
-          case GST_VIDEO_FORMAT_I420:
-          case GST_VIDEO_FORMAT_YV12:
-          case GST_VIDEO_FORMAT_Y42B:
-          case GST_VIDEO_FORMAT_Y41B:{
-            gint stride;
-            gint stride_width;
-            gint c_w;
-
-            stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
-            stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 0);
-
-            glActiveTexture (GL_TEXTURE0);
-
-            if (GST_ROUND_UP_8 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-            } else if (GST_ROUND_UP_4 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-            } else if (GST_ROUND_UP_2 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-            } else if (c_w == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-            } else {
-              stride_width = stride;
-
-              if (GST_ROUND_UP_8 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-              } else if (GST_ROUND_UP_4 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-              } else if (GST_ROUND_UP_2 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-              } else if (stride_width == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-              } else {
-                GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
-                goto HANDLE_ERROR;
-              }
-            }
-            if (got_gl_error ("glPixelStorei"))
-              goto HANDLE_ERROR;
-
-            eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
-
-            glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
-            glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
-                stride_width,
-                GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 0),
-                0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
-                GST_VIDEO_FRAME_COMP_DATA (&vframe, 0));
-
-
-            stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1);
-            stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 1);
-
-            glActiveTexture (GL_TEXTURE1);
-
-            if (GST_ROUND_UP_8 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-            } else if (GST_ROUND_UP_4 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-            } else if (GST_ROUND_UP_2 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-            } else if (c_w == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-            } else {
-              stride_width = stride;
-
-              if (GST_ROUND_UP_8 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-              } else if (GST_ROUND_UP_4 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-              } else if (GST_ROUND_UP_2 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-              } else if (stride_width == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-              } else {
-                GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
-                goto HANDLE_ERROR;
-              }
-            }
-            if (got_gl_error ("glPixelStorei"))
-              goto HANDLE_ERROR;
-
-            eglglessink->stride[1] = ((gdouble) stride_width) / ((gdouble) c_w);
-
-            glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[1]);
-            glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
-                stride_width,
-                GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 1),
-                0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
-                GST_VIDEO_FRAME_COMP_DATA (&vframe, 1));
-
-
-            stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 2);
-            stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 2);
-
-            glActiveTexture (GL_TEXTURE2);
-
-            if (GST_ROUND_UP_8 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-            } else if (GST_ROUND_UP_4 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-            } else if (GST_ROUND_UP_2 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-            } else if (c_w == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-            } else {
-              stride_width = stride;
-
-              if (GST_ROUND_UP_8 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-              } else if (GST_ROUND_UP_4 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-              } else if (GST_ROUND_UP_2 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-              } else if (stride_width == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-              } else {
-                GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
-                goto HANDLE_ERROR;
-              }
-            }
-            if (got_gl_error ("glPixelStorei"))
-              goto HANDLE_ERROR;
-
-            eglglessink->stride[2] = ((gdouble) stride_width) / ((gdouble) c_w);
-
-            glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[2]);
-            glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
-                stride_width,
-                GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 2),
-                0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
-                GST_VIDEO_FRAME_COMP_DATA (&vframe, 2));
-            break;
+        }
+        if (got_gl_error ("glPixelStorei"))
+          goto HANDLE_ERROR;
+
+        eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
+
+        glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, stride_width, h, 0,
+            GL_RGBA, GL_UNSIGNED_BYTE, GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0));
+        break;
+      }
+      case GST_VIDEO_FORMAT_Y444:
+      case GST_VIDEO_FORMAT_I420:
+      case GST_VIDEO_FORMAT_YV12:
+      case GST_VIDEO_FORMAT_Y42B:
+      case GST_VIDEO_FORMAT_Y41B:{
+        gint stride;
+        gint stride_width;
+        gint c_w;
+
+        stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
+        stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 0);
+
+        glActiveTexture (GL_TEXTURE0);
+
+        if (GST_ROUND_UP_8 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+        } else if (GST_ROUND_UP_4 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+        } else if (GST_ROUND_UP_2 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+        } else if (c_w == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+        } else {
+          stride_width = stride;
+
+          if (GST_ROUND_UP_8 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+          } else if (GST_ROUND_UP_4 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+          } else if (GST_ROUND_UP_2 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+          } else if (stride_width == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+          } else {
+            GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
+            goto HANDLE_ERROR;
           }
-          case GST_VIDEO_FORMAT_NV12:
-          case GST_VIDEO_FORMAT_NV21:{
-            gint stride;
-            gint stride_width;
-            gint c_w;
-
-            stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
-            stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 0);
-
-            glActiveTexture (GL_TEXTURE0);
-
-            if (GST_ROUND_UP_8 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-            } else if (GST_ROUND_UP_4 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-            } else if (GST_ROUND_UP_2 (c_w) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-            } else if (c_w == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-            } else {
-              stride_width = stride;
-
-              if (GST_ROUND_UP_8 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-              } else if (GST_ROUND_UP_4 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-              } else if (GST_ROUND_UP_2 (stride_width) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-              } else if (stride_width == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
-              } else {
-                GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
-                goto HANDLE_ERROR;
-              }
-            }
-            if (got_gl_error ("glPixelStorei"))
-              goto HANDLE_ERROR;
-
-            eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
-
-            glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
-            glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
-                stride_width,
-                GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 0),
-                0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
-                GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0));
-
-
-            stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1);
-            stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 1);
-
-            glActiveTexture (GL_TEXTURE1);
-
-            if (GST_ROUND_UP_8 (c_w * 2) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-            } else if (GST_ROUND_UP_4 (c_w * 2) == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-            } else if (c_w * 2 == stride) {
-              glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-            } else {
-              stride_width = stride / 2;
-
-              if (GST_ROUND_UP_8 (stride_width * 2) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
-              } else if (GST_ROUND_UP_4 (stride_width * 2) == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
-              } else if (stride_width * 2 == stride) {
-                glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
-              } else {
-                GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
-                goto HANDLE_ERROR;
-              }
-            }
-            if (got_gl_error ("glPixelStorei"))
-              goto HANDLE_ERROR;
-
-            eglglessink->stride[1] = ((gdouble) stride_width) / ((gdouble) c_w);
-
-            glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[1]);
-            glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA,
-                stride_width,
-                GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 1),
-                0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
-                GST_VIDEO_FRAME_PLANE_DATA (&vframe, 1));
-            break;
+        }
+        if (got_gl_error ("glPixelStorei"))
+          goto HANDLE_ERROR;
+
+        eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
+
+        glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
+            stride_width,
+            GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 0),
+            0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
+            GST_VIDEO_FRAME_COMP_DATA (&vframe, 0));
+
+
+        stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1);
+        stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 1);
+
+        glActiveTexture (GL_TEXTURE1);
+
+        if (GST_ROUND_UP_8 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+        } else if (GST_ROUND_UP_4 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+        } else if (GST_ROUND_UP_2 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+        } else if (c_w == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+        } else {
+          stride_width = stride;
+
+          if (GST_ROUND_UP_8 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+          } else if (GST_ROUND_UP_4 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+          } else if (GST_ROUND_UP_2 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+          } else if (stride_width == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+          } else {
+            GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
+            goto HANDLE_ERROR;
           }
-          default:
-            g_assert_not_reached ();
-            break;
         }
+        if (got_gl_error ("glPixelStorei"))
+          goto HANDLE_ERROR;
+
+        eglglessink->stride[1] = ((gdouble) stride_width) / ((gdouble) c_w);
+
+        glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[1]);
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
+            stride_width,
+            GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 1),
+            0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
+            GST_VIDEO_FRAME_COMP_DATA (&vframe, 1));
+
+
+        stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 2);
+        stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 2);
+
+        glActiveTexture (GL_TEXTURE2);
+
+        if (GST_ROUND_UP_8 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+        } else if (GST_ROUND_UP_4 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+        } else if (GST_ROUND_UP_2 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+        } else if (c_w == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+        } else {
+          stride_width = stride;
+
+          if (GST_ROUND_UP_8 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+          } else if (GST_ROUND_UP_4 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+          } else if (GST_ROUND_UP_2 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+          } else if (stride_width == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+          } else {
+            GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
+            goto HANDLE_ERROR;
+          }
+        }
+        if (got_gl_error ("glPixelStorei"))
+          goto HANDLE_ERROR;
+
+        eglglessink->stride[2] = ((gdouble) stride_width) / ((gdouble) c_w);
+
+        glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[2]);
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
+            stride_width,
+            GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 2),
+            0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
+            GST_VIDEO_FRAME_COMP_DATA (&vframe, 2));
+        break;
+      }
+      case GST_VIDEO_FORMAT_NV12:
+      case GST_VIDEO_FORMAT_NV21:{
+        gint stride;
+        gint stride_width;
+        gint c_w;
+
+        stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
+        stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 0);
+
+        glActiveTexture (GL_TEXTURE0);
+
+        if (GST_ROUND_UP_8 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+        } else if (GST_ROUND_UP_4 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+        } else if (GST_ROUND_UP_2 (c_w) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+        } else if (c_w == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+        } else {
+          stride_width = stride;
+
+          if (GST_ROUND_UP_8 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+          } else if (GST_ROUND_UP_4 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+          } else if (GST_ROUND_UP_2 (stride_width) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+          } else if (stride_width == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+          } else {
+            GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
+            goto HANDLE_ERROR;
+          }
+        }
+        if (got_gl_error ("glPixelStorei"))
+          goto HANDLE_ERROR;
+
+        eglglessink->stride[0] = ((gdouble) stride_width) / ((gdouble) c_w);
+
+        glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
+            stride_width,
+            GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 0),
+            0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
+            GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0));
+
+
+        stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1);
+        stride_width = c_w = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, 1);
+
+        glActiveTexture (GL_TEXTURE1);
+
+        if (GST_ROUND_UP_8 (c_w * 2) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+        } else if (GST_ROUND_UP_4 (c_w * 2) == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+        } else if (c_w * 2 == stride) {
+          glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+        } else {
+          stride_width = stride / 2;
+
+          if (GST_ROUND_UP_8 (stride_width * 2) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 8);
+          } else if (GST_ROUND_UP_4 (stride_width * 2) == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+          } else if (stride_width * 2 == stride) {
+            glPixelStorei (GL_UNPACK_ALIGNMENT, 2);
+          } else {
+            GST_ERROR_OBJECT (eglglessink, "Unsupported stride %d", stride);
+            goto HANDLE_ERROR;
+          }
+        }
+        if (got_gl_error ("glPixelStorei"))
+          goto HANDLE_ERROR;
+
+        eglglessink->stride[1] = ((gdouble) stride_width) / ((gdouble) c_w);
+
+        glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[1]);
+        glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA,
+            stride_width,
+            GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, 1),
+            0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+            GST_VIDEO_FRAME_PLANE_DATA (&vframe, 1));
+        break;
+      }
+      default:
+        g_assert_not_reached ();
+        break;
     }
+  }
+
+  if (got_gl_error ("glTexImage2D"))
+    goto HANDLE_ERROR;
+
+  gst_video_frame_unmap (&vframe);
+
+  return TRUE;
+
+HANDLE_ERROR:
+  {
+    if (vframe.buffer)
+      gst_video_frame_unmap (&vframe);
+    return FALSE;
+  }
+}
+
+/* Rendering and display */
+static GstFlowReturn
+gst_eglglessink_upload (GstEglGlesSink * eglglessink, GstBuffer * buf)
+{
+  GstVideoCropMeta *crop = NULL;
+
+  if (!buf) {
+    GST_DEBUG_OBJECT (eglglessink, "Rendering previous buffer again");
+  } else if (buf) {
+    GstMemory *mem;
+
+    crop = gst_buffer_get_video_crop_meta (buf);
+
+    if (gst_eglglessink_crop_changed (eglglessink, crop)) {
+      if (crop) {
+        eglglessink->crop.x = crop->x;
+        eglglessink->crop.y = crop->y;
+        eglglessink->crop.w = crop->width;
+        eglglessink->crop.h = crop->height;
+      } else {
+        eglglessink->crop.x = 0;
+        eglglessink->crop.y = 0;
+        eglglessink->crop.w = eglglessink->configured_info.width;
+        eglglessink->crop.h = eglglessink->configured_info.height;
+      }
+      eglglessink->crop_changed = TRUE;
+  >>>>>>>ebe5849 ... eglglessink:Always use an RGBA configuration}
 
     if (got_gl_error ("glTexImage2D"))
       goto HANDLE_ERROR;
@@ -2362,7 +2310,6 @@ static gboolean
 gst_eglglessink_configure_caps (GstEglGlesSink * eglglessink, GstCaps * caps)
 {
   gboolean ret = TRUE;
-  GstEglGlesImageFmt *format;
   GstVideoInfo info;
 
   gst_video_info_init (&info);
@@ -2371,16 +2318,6 @@ gst_eglglessink_configure_caps (GstEglGlesSink * eglglessink, GstCaps * caps)
     goto HANDLE_ERROR;
   }
 
-  format = gst_eglglessink_get_compat_format_from_caps (eglglessink, caps);
-  if (!format) {
-    GST_ERROR_OBJECT (eglglessink,
-        "No supported and compatible EGL/GLES format found for given caps");
-    goto HANDLE_ERROR;
-  } else
-    GST_INFO_OBJECT (eglglessink, "Selected compatible EGL/GLES format %d",
-        format->fmt);
-
-  eglglessink->selected_fmt = format;
   eglglessink->configured_info = info;
   GST_VIDEO_SINK_WIDTH (eglglessink) = info.width;
   GST_VIDEO_SINK_HEIGHT (eglglessink) = info.height;
@@ -2473,14 +2410,6 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps)
   return TRUE;
 }
 
-static void
-gst_eglglessink_wipe_fmt (gpointer data)
-{
-  GstEglGlesImageFmt *format = data;
-  gst_caps_unref (format->caps);
-  g_free (format);
-}
-
 static gboolean
 gst_eglglessink_open (GstEglGlesSink * eglglessink)
 {
@@ -2499,9 +2428,6 @@ gst_eglglessink_close (GstEglGlesSink * eglglessink)
     eglglessink->eglglesctx.display = NULL;
   }
 
-  eglglessink->selected_fmt = NULL;
-  g_list_free_full (eglglessink->supported_fmts, gst_eglglessink_wipe_fmt);
-  eglglessink->supported_fmts = NULL;
   gst_caps_unref (eglglessink->sinkcaps);
   eglglessink->sinkcaps = NULL;
   eglglessink->egl_started = FALSE;
index b96f7bab641b9a49055b64d12392b4af8efcb5a7..e3d70873df9cab1bcabd9ec3e570f9d1b3496b34 100644 (file)
@@ -67,10 +67,7 @@ G_BEGIN_DECLS
   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EGLGLESSINK))
 #define GST_IS_EGLGLESSINK_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EGLGLESSINK))
-#define GST_EGLGLESSINK_IMAGE_NOFMT 0
-#define GST_EGLGLESSINK_IMAGE_RGB888 1
-#define GST_EGLGLESSINK_IMAGE_RGB565 2
-#define GST_EGLGLESSINK_IMAGE_RGBA8888 3
+
 #define GST_EGLGLESSINK_EGL_MIN_VERSION 1
 typedef struct _GstEglGlesSink GstEglGlesSink;
 typedef struct _GstEglGlesSinkClass GstEglGlesSinkClass;
@@ -144,33 +141,15 @@ struct _GstEglGlesRenderContext
   unsigned int position_buffer, index_buffer;
 };
 
-/*
- * GstEglGlesImageFmt:
- * @fmt: Internal identifier for the EGL attribs / GST caps pairing
- * @attribs: Pointer to the set of EGL attributes asociated with this format
- * @caps: Pointer to the GST caps asociated with this format
- *
- * This struct holds a pairing between GST caps and the matching EGL attributes
- * associated with a given pixel format
- */
-struct _GstEglGlesImageFmt
-{
-  gint fmt;                     /* Private identifier */
-  const EGLint *attribs;        /* EGL Attributes */
-  GstCaps *caps;                /* Matching caps for the attribs */
-};
-
 /*
  * GstEglGlesSink:
  * @format: Caps' video format field
  * @display_region: Surface region to use as rendering canvas
  * @sinkcaps: Full set of suported caps
  * @current_caps: Current caps
- * @selected_fmt: Pointer to the GST caps/EGL attribs pairing in use
  * @rendering_path: Rendering path (Slow/Fast)
  * @eglglesctx: Pointer to the associated EGL/GLESv2 rendering context
  * @flow_lock: Simple concurrent access ward to the sink's runtime state
- * @supported_fmts: Pointer to the runtime supported format list
  * @have_window: Set if the sink has access to a window to hold it's canvas
  * @using_own_window: Set if the sink created its own window
  * @have_surface: Set if the EGL surface setup has been performed
@@ -202,11 +181,8 @@ struct _GstEglGlesSink
   GstVideoInfo configured_info;
   gfloat stride[3];
 
-  GstEglGlesImageFmt *selected_fmt;
   GstEglGlesRenderContext eglglesctx;
 
-  GList *supported_fmts;
-
   /* Runtime flags */
   gboolean have_window;
   gboolean using_own_window;