diff options
author | Thiago Santos <thiagoss@osg.samsung.com> | 2015-03-13 18:53:11 +0000 |
---|---|---|
committer | Thiago Santos <thiagoss@osg.samsung.com> | 2015-03-13 19:03:01 +0000 |
commit | 5e15d4aa603305d71cad5dd8b76fa9f5b25f4779 (patch) | |
tree | e4890b7f782305a4a2eab543d221eb21a9086c83 | |
parent | 901fea5985b82fcdf3310fa1d34920d231113613 (diff) |
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
-rw-r--r-- | libs/gst/base/gstbasesink.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 44f2ab472..14c2371b2 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; } |