eglglessink: Make sure to wait for the right object to be dequeued
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 3 Jan 2013 09:40:34 +0000 (10:40 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 3 Jan 2013 09:43:43 +0000 (10:43 +0100)
ext/eglgles/gsteglglessink.c
ext/eglgles/gsteglglessink.h

index d1fe3c3..6e8920d 100644 (file)
 GST_DEBUG_CATEGORY_STATIC (gst_eglglessink_debug);
 #define GST_CAT_DEFAULT gst_eglglessink_debug
 
-GST_DEBUG_CATEGORY_EXTERN(GST_CAT_PERFORMANCE);
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
 
 /* GLESv2 GLSL Shaders
  *
@@ -305,8 +305,7 @@ GST_STATIC_PAD_TEMPLATE ("sink",
             "RGBA, BGRA, ARGB, ABGR, "
             "RGBx, BGRx, xRGB, xBGR, "
             "AYUV, Y444, I420, YV12, "
-            "NV12, NV21, Y42B, Y41B, "
-            "RGB, BGR, RGB16 }")));
+            "NV12, NV21, Y42B, Y41B, " "RGB, BGR, RGB16 }")));
 
 /* Filter signals and args */
 enum
@@ -612,19 +611,20 @@ render_thread_func (GstEglGlesSink * eglglessink)
   eglBindAPI (EGL_OPENGL_ES_API);
 
   while (gst_data_queue_pop (eglglessink->queue, &item)) {
-    GST_DEBUG_OBJECT (eglglessink, "Handling object %" GST_PTR_FORMAT,
-        item->object);
+    GstMiniObject *object = item->object;
 
-    if (GST_IS_CAPS (item->object)) {
-      GstCaps *caps = GST_CAPS_CAST (item->object);
+    GST_DEBUG_OBJECT (eglglessink, "Handling object %" GST_PTR_FORMAT, object);
+
+    if (GST_IS_CAPS (object)) {
+      GstCaps *caps = GST_CAPS_CAST (object);
 
       if (caps != eglglessink->configured_caps) {
         if (!gst_eglglessink_configure_caps (eglglessink, caps)) {
           last_flow = GST_FLOW_NOT_NEGOTIATED;
         }
       }
-    } else if (GST_IS_QUERY (item->object)) {
-      GstQuery *query = GST_QUERY_CAST (item->object);
+    } else if (GST_IS_QUERY (object)) {
+      GstQuery *query = GST_QUERY_CAST (object);
       GstStructure *s = (GstStructure *) gst_query_get_structure (query);
 
       if (gst_structure_has_name (s, "eglglessink-allocate-eglimage")) {
@@ -651,7 +651,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
         g_assert_not_reached ();
       }
       last_flow = GST_FLOW_OK;
-    } else if (GST_IS_BUFFER (item->object)) {
+    } else if (GST_IS_BUFFER (object)) {
       GstBuffer *buf = GST_BUFFER_CAST (item->object);
 
       if (eglglessink->configured_caps) {
@@ -661,7 +661,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
         GST_DEBUG_OBJECT (eglglessink,
             "No caps configured yet, not drawing anything");
       }
-    } else if (!item->object) {
+    } else if (!object) {
       if (eglglessink->configured_caps) {
         last_flow = gst_eglglessink_render (eglglessink);
       } else {
@@ -676,6 +676,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
     item->destroy (item);
     g_mutex_lock (&eglglessink->render_lock);
     eglglessink->last_flow = last_flow;
+    eglglessink->dequeued_object = object;
     g_cond_broadcast (&eglglessink->render_cond);
     g_mutex_unlock (&eglglessink->render_lock);
 
@@ -687,6 +688,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
   if (last_flow == GST_FLOW_OK) {
     g_mutex_lock (&eglglessink->render_lock);
     eglglessink->last_flow = GST_FLOW_FLUSHING;
+    eglglessink->dequeued_object = NULL;
     g_cond_broadcast (&eglglessink->render_cond);
     g_mutex_unlock (&eglglessink->render_lock);
   }
@@ -1695,7 +1697,10 @@ gst_eglglessink_queue_object (GstEglGlesSink * eglglessink, GstMiniObject * obj)
   }
 
   GST_DEBUG_OBJECT (eglglessink, "Waiting for object to be handled");
-  g_cond_wait (&eglglessink->render_cond, &eglglessink->render_lock);
+  do {
+    g_cond_wait (&eglglessink->render_cond, &eglglessink->render_lock);
+  } while (eglglessink->dequeued_object != obj
+      && eglglessink->last_flow != GST_FLOW_FLUSHING);
   GST_DEBUG_OBJECT (eglglessink, "Object handled: %s",
       gst_flow_get_name (eglglessink->last_flow));
   last_flow = eglglessink->last_flow;
index 901108c..984f6c5 100644 (file)
@@ -233,6 +233,7 @@ struct _GstEglGlesSink
   GCond render_cond;
   GMutex render_lock;
   GstFlowReturn last_flow;
+  GstMiniObject *dequeued_object;
 
   /* Properties */
   gboolean create_window;