From 5e15d4aa603305d71cad5dd8b76fa9f5b25f4779 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Fri, 13 Mar 2015 18:53:11 +0000 Subject: [PATCH] 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 --- libs/gst/base/gstbasesink.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) 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; } -- 2.7.4