eglglessink: Configure caps from the setcaps function already
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Sun, 30 Dec 2012 09:18:05 +0000 (10:18 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 21 Mar 2013 09:01:07 +0000 (10:01 +0100)
ext/eglgles/gsteglglessink.c

index 4bb21d3150370c497976e4bd9df0a0111f7dda9a..18d8f74e0d60b8f9599201c24a0fba02a6694728 100644 (file)
@@ -413,8 +413,8 @@ static gboolean
 gst_eglglessink_configure_caps (GstEglGlesSink * eglglessink, GstCaps * caps);
 static GstFlowReturn gst_eglglessink_render_and_display (GstEglGlesSink * sink,
     GstBuffer * buf);
-static GstFlowReturn gst_eglglessink_queue_buffer (GstEglGlesSink * sink,
-    GstBuffer * buf);
+static GstFlowReturn gst_eglglessink_queue_object (GstEglGlesSink * sink,
+    GstMiniObject * obj);
 static inline gboolean got_gl_error (const char *wtf);
 static inline void show_egl_error (const char *wtf);
 static void gst_eglglessink_wipe_fmt (gpointer data);
@@ -623,18 +623,12 @@ render_thread_func (GstEglGlesSink * eglglessink)
   eglBindAPI (EGL_OPENGL_ES_API);
 
   while (gst_data_queue_pop (eglglessink->queue, &item)) {
-    GstBuffer *buf = NULL;
-
     GST_DEBUG_OBJECT (eglglessink, "Handling object %" GST_PTR_FORMAT,
         item->object);
 
-    if (item->object) {
-      GstSample *sample;
-      GstCaps *caps;
+    if (GST_IS_CAPS (item->object)) {
+      GstCaps *caps = GST_CAPS_CAST (item->object);
 
-      sample = GST_SAMPLE (item->object);
-      buf = gst_sample_get_buffer (sample);
-      caps = gst_sample_get_caps (sample);
       if (caps != eglglessink->configured_caps) {
         if (!gst_eglglessink_configure_caps (eglglessink, caps)) {
           eglglessink->last_flow = GST_FLOW_NOT_NEGOTIATED;
@@ -645,17 +639,20 @@ render_thread_func (GstEglGlesSink * eglglessink)
           break;
         }
       }
-    }
+    } else if (GST_IS_BUFFER (item->object) || !item->object) {
+      GstBuffer *buf = GST_BUFFER_CAST (item->object);
 
-    if (eglglessink->configured_caps) {
-      eglglessink->last_flow =
-          gst_eglglessink_render_and_display (eglglessink, buf);
-    } else {
-      GST_DEBUG_OBJECT (eglglessink,
-          "No caps configured yet, not drawing anything");
+      if (eglglessink->configured_caps) {
+        eglglessink->last_flow =
+            gst_eglglessink_render_and_display (eglglessink, buf);
+      } else {
+        GST_DEBUG_OBJECT (eglglessink,
+            "No caps configured yet, not drawing anything");
+      }
     }
 
-    if (buf) {
+
+    if (item->object) {
       g_mutex_lock (&eglglessink->render_lock);
       g_cond_broadcast (&eglglessink->render_cond);
       g_mutex_unlock (&eglglessink->render_lock);
@@ -891,7 +888,7 @@ gst_eglglessink_expose (GstVideoOverlay * overlay)
   GST_DEBUG_OBJECT (eglglessink, "Expose catched, redisplay");
 
   /* Render from last seen buffer */
-  ret = gst_eglglessink_queue_buffer (eglglessink, NULL);
+  ret = gst_eglglessink_queue_object (eglglessink, NULL);
   if (ret == GST_FLOW_ERROR)
     GST_ERROR_OBJECT (eglglessink, "Redisplay failed");
 }
@@ -1663,24 +1660,19 @@ queue_item_destroy (GstDataQueueItem * item)
 }
 
 static GstFlowReturn
-gst_eglglessink_queue_buffer (GstEglGlesSink * eglglessink, GstBuffer * buf)
+gst_eglglessink_queue_object (GstEglGlesSink * eglglessink, GstMiniObject * obj)
 {
   GstDataQueueItem *item = g_slice_new0 (GstDataQueueItem);
-  GstSample *sample;
 
-  sample =
-      (buf ? gst_sample_new (buf, eglglessink->current_caps, NULL,
-          NULL) : NULL);
-
-  item->object = GST_MINI_OBJECT_CAST (sample);
-  item->size = (buf ? gst_buffer_get_size (buf) : 0);
-  item->duration = (buf ? GST_BUFFER_DURATION (buf) : GST_CLOCK_TIME_NONE);
-  item->visible = (buf ? TRUE : FALSE);
+  item->object = obj ? gst_mini_object_ref (obj) : NULL;
+  item->size = 0;
+  item->duration = GST_CLOCK_TIME_NONE;
+  item->visible = TRUE;
   item->destroy = (GDestroyNotify) queue_item_destroy;
 
-  GST_DEBUG_OBJECT (eglglessink, "Queueing buffer %" GST_PTR_FORMAT, buf);
+  GST_DEBUG_OBJECT (eglglessink, "Queueing object %" GST_PTR_FORMAT, obj);
 
-  if (buf)
+  if (obj)
     g_mutex_lock (&eglglessink->render_lock);
   if (!gst_data_queue_push (eglglessink->queue, item)) {
     item->destroy (item);
@@ -1689,15 +1681,15 @@ gst_eglglessink_queue_buffer (GstEglGlesSink * eglglessink, GstBuffer * buf)
     return GST_FLOW_FLUSHING;
   }
 
-  if (buf) {
-    GST_DEBUG_OBJECT (eglglessink, "Waiting for buffer to be rendered");
+  if (obj) {
+    GST_DEBUG_OBJECT (eglglessink, "Waiting for obj to be handled");
     g_cond_wait (&eglglessink->render_cond, &eglglessink->render_lock);
     GST_DEBUG_OBJECT (eglglessink, "Buffer rendered: %s",
         gst_flow_get_name (eglglessink->last_flow));
     g_mutex_unlock (&eglglessink->render_lock);
   }
 
-  return (buf ? eglglessink->last_flow : GST_FLOW_OK);
+  return (obj ? eglglessink->last_flow : GST_FLOW_OK);
 }
 
 static gboolean
@@ -2390,7 +2382,7 @@ gst_eglglessink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
   eglglessink = GST_EGLGLESSINK (vsink);
   GST_DEBUG_OBJECT (eglglessink, "Got buffer: %p", buf);
 
-  return gst_eglglessink_queue_buffer (eglglessink, buf);
+  return gst_eglglessink_queue_object (eglglessink, GST_MINI_OBJECT_CAST (buf));
 }
 
 static GstCaps *
@@ -2535,6 +2527,12 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps)
       "Current caps %" GST_PTR_FORMAT ", setting caps %"
       GST_PTR_FORMAT, eglglessink->current_caps, caps);
 
+  if (gst_eglglessink_queue_object (eglglessink,
+          GST_MINI_OBJECT_CAST (caps)) != GST_FLOW_OK) {
+    GST_ERROR_OBJECT (eglglessink, "Failed to configure caps");
+    return FALSE;
+  }
+
   gst_caps_replace (&eglglessink->current_caps, caps);
 
   return TRUE;