libs/gst/base/gstbasesink.c: Sinks that don't preroll can always be queried for the...
authorWim Taymans <wim.taymans@gmail.com>
Fri, 14 Sep 2007 23:06:31 +0000 (23:06 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Fri, 14 Sep 2007 23:06:31 +0000 (23:06 +0000)
Original commit message from CVS:
* libs/gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_flush),
(gst_base_sink_event), (gst_base_sink_change_state):
Sinks that don't preroll can always be queried for the latency.
Don't post ASYNC start when we are not async.

ChangeLog
libs/gst/base/gstbasesink.c

index 58c66a3..58dbc97 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2007-09-14  Wim Taymans  <wim.taymans@gmail.com>
 
+       * libs/gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_flush),
+       (gst_base_sink_event), (gst_base_sink_change_state):
+       Sinks that don't preroll can always be queried for the latency.
+       Don't post ASYNC start when we are not async.
+
+2007-09-14  Wim Taymans  <wim.taymans@gmail.com>
+
        * plugins/elements/gstqueue.c: (gst_queue_locked_enqueue),
        (gst_queue_handle_sink_event), (gst_queue_chain),
        (gst_queue_push_one), (gst_queue_handle_src_query),
index 84248fd..d466128 100644 (file)
@@ -994,9 +994,11 @@ gst_base_sink_preroll_queue_flush (GstBaseSink * basesink, GstPad * pad)
   basesink->buffers_queued = 0;
   basesink->events_queued = 0;
   /* can't report latency anymore until we preroll again */
-  GST_OBJECT_LOCK (basesink);
-  basesink->priv->have_latency = FALSE;
-  GST_OBJECT_UNLOCK (basesink);
+  if (basesink->priv->async_enabled) {
+    GST_OBJECT_LOCK (basesink);
+    basesink->priv->have_latency = FALSE;
+    GST_OBJECT_UNLOCK (basesink);
+  }
   /* and signal any waiters now */
   GST_PAD_PREROLL_SIGNAL (pad);
 }
@@ -2192,10 +2194,14 @@ gst_base_sink_event (GstPad * pad, GstEvent * event)
        * anymore */
       GST_PAD_STREAM_LOCK (pad);
       gst_base_sink_reset_qos (basesink);
-      /* and we need to commit our state again on the next
-       * prerolled buffer */
-      basesink->playing_async = TRUE;
-      gst_element_lost_state (GST_ELEMENT_CAST (basesink));
+      if (basesink->priv->async_enabled) {
+        /* and we need to commit our state again on the next
+         * prerolled buffer */
+        basesink->playing_async = TRUE;
+        gst_element_lost_state (GST_ELEMENT_CAST (basesink));
+      } else {
+        basesink->priv->have_latency = TRUE;
+      }
       GST_PAD_STREAM_UNLOCK (pad);
 
       gst_event_unref (event);
@@ -3037,6 +3043,8 @@ gst_base_sink_change_state (GstElement * element, GstStateChange transition)
         ret = GST_STATE_CHANGE_ASYNC;
         gst_element_post_message (GST_ELEMENT_CAST (basesink),
             gst_message_new_async_start (GST_OBJECT_CAST (basesink), FALSE));
+      } else {
+        basesink->priv->have_latency = TRUE;
       }
       GST_PAD_PREROLL_UNLOCK (basesink->sinkpad);
       break;
@@ -3167,6 +3175,7 @@ gst_base_sink_change_state (GstElement * element, GstStateChange transition)
       }
       basesink->priv->current_sstart = 0;
       basesink->priv->current_sstop = 0;
+      basesink->priv->have_latency = FALSE;
       GST_PAD_PREROLL_UNLOCK (basesink->sinkpad);
       break;
     case GST_STATE_CHANGE_READY_TO_NULL: