eglglessink: Draft set_render_rectangle() from the xOverlay interface
authorReynaldo H. Verdejo Pinochet <reynaldo@collabora.com>
Fri, 21 Sep 2012 03:09:06 +0000 (00:09 -0300)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 18 Oct 2012 12:35:13 +0000 (14:35 +0200)
ext/eglgles/gsteglglessink.c
ext/eglgles/gsteglglessink.h

index 846dc1a88aec91c224060421528d7efe9c7822fb..abd01d80368a7ca241808ebd8d847353e0acad01 100644 (file)
@@ -183,8 +183,7 @@ static const char *frag_AYUV_prog = {
 
 /* Input capabilities.
  *
- * OpenGL ES Standard does not mandate YUV support
- * so we are going to stick to RGB for the time being
+ * Note: OpenGL ES Standard does not mandate YUV support.
  */
 static GstStaticPadTemplate gst_eglglessink_sink_template_factory =
     GST_STATIC_PAD_TEMPLATE ("sink",
@@ -266,6 +265,8 @@ static void gst_eglglessink_init_interfaces (GType type);
 static void gst_eglglessink_expose (GstXOverlay * overlay);
 static void gst_eglglessink_set_window_handle (GstXOverlay * overlay,
     guintptr id);
+static void gst_eglglessink_set_render_rectangle (GstXOverlay *overlay, gint x,
+    gint y, gint width, gint height);
 
 /* Custom Buffer funcs */
 static void gst_eglglesbuffer_destroy (GstEglGlesBuffer * eglglessink);
@@ -949,6 +950,7 @@ gst_eglglessink_xoverlay_init (GstXOverlayClass * iface)
 {
   iface->set_window_handle = gst_eglglessink_set_window_handle;
   iface->expose = gst_eglglessink_expose;
+  iface->set_render_rectangle = gst_eglglessink_set_render_rectangle;
 }
 
 static gboolean
@@ -1482,6 +1484,36 @@ HANDLE_ERROR:
   return;
 }
 
+/* Drafted */
+static void
+gst_eglglessink_set_render_rectangle (GstXOverlay *overlay, gint x, gint y,
+    gint width, gint height)
+{
+  GstEglGlesSink *eglglessink = GST_EGLGLESSINK (overlay);
+
+  g_return_if_fail (GST_IS_EGLGLESSINK (eglglessink));
+
+  g_mutex_lock (eglglessink->flow_lock);
+
+  if (width == -1 && height == -1) {
+  /* This is the set_defaults condition according to
+   * the xOverlay interface docs
+   */
+    eglglessink->display_region.w = 0;
+    eglglessink->display_region.h = 0;
+  } else {
+    g_mutex_lock (eglglessink->flow_lock);
+    eglglessink->display_region.x = x;
+    eglglessink->display_region.y = y;
+    eglglessink->display_region.w = width;
+    eglglessink->display_region.h = height;
+  }
+
+  g_mutex_unlock (eglglessink->flow_lock);
+
+  return;
+}
+
 /* Rendering and display */
 static GstFlowReturn
 gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
@@ -1560,7 +1592,23 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
       if (got_gl_error ("glTexImage2D"))
         goto HANDLE_ERROR;
 
-      glViewport (0, 0, w, h);
+      /* If no one has set a display rectangle on us initialize
+       * a sane default. According to the docs on the xOverlay
+       * interface we are supposed to fill the overlay 100%
+       *
+       * XXX: If this is not desired just use calculated pos with
+       * lower left corner as 0,0 and w,h from the decoded frame.
+       */
+      if (!eglglessink->display_region.w || !eglglessink->display_region.h)
+      {
+        eglglessink->display_region.x = 0;
+        eglglessink->display_region.y = 0;
+        eglglessink->display_region.w = eglglessink->surface_width;
+        eglglessink->display_region.h = eglglessink->surface_height;
+      }
+
+      glViewport (eglglessink->display_region.x, eglglessink->display_region.y,
+          eglglessink->display_region.w, eglglessink->display_region.h);
 
       glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);
       if (got_gl_error ("glDrawElements"))
index beee0ec514dec51a371ac3f745cdfe6f297918e0..37b60e43188f385a335fbb3e17d4dcb90980ff86 100644 (file)
@@ -126,6 +126,7 @@ struct _GstEglGlesSink
    * the platform supported fmts. Right now we just add one
    * format/caps at init.
    */
+  GstVideoRectangle display_region;
   GList *supported_fmts;
   GstEglGlesImageFmt *selected_fmt;