From: Thiago Santos Date: Fri, 13 Mar 2015 18:53:11 +0000 (+0000) Subject: basesink: drain on allocation query X-Git-Tag: 1.6.1~486 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5e15d4aa603305d71cad5dd8b76fa9f5b25f4779;p=platform%2Fupstream%2Fgstreamer.git basesink: drain on allocation query Allows buffers to be reclaimed when caps is to be renegotiated so that bufferpools can be stopped. As the allocation query is serialized all buffers have been already drained from the pipeline, except this last_sample one. https://bugzilla.gnome.org/show_bug.cgi?id=682770 --- diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 44f2ab4..14c2371 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -4805,6 +4805,18 @@ default_element_query (GstElement * element, GstQuery * query) return res; } +static void +gst_base_sink_drain (GstBaseSink * basesink) +{ + GstBuffer *old; + + GST_OBJECT_LOCK (basesink); + if ((old = basesink->priv->last_buffer)) + basesink->priv->last_buffer = gst_buffer_copy_deep (old); + GST_OBJECT_UNLOCK (basesink); + if (old) + gst_buffer_unref (old); +} static gboolean gst_base_sink_default_query (GstBaseSink * basesink, GstQuery * query) @@ -4817,6 +4829,7 @@ gst_base_sink_default_query (GstBaseSink * basesink, GstQuery * query) switch (GST_QUERY_TYPE (query)) { case GST_QUERY_ALLOCATION: { + gst_base_sink_drain (basesink); if (bclass->propose_allocation) res = bclass->propose_allocation (basesink, query); else @@ -4853,14 +4866,7 @@ gst_base_sink_default_query (GstBaseSink * basesink, GstQuery * query) } case GST_QUERY_DRAIN: { - GstBuffer *old; - - GST_OBJECT_LOCK (basesink); - if ((old = basesink->priv->last_buffer)) - basesink->priv->last_buffer = gst_buffer_copy_deep (old); - GST_OBJECT_UNLOCK (basesink); - if (old) - gst_buffer_unref (old); + gst_base_sink_drain (basesink); res = TRUE; break; }