summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <thiagoss@osg.samsung.com>2015-03-13 18:53:11 +0000
committerThiago Santos <thiagoss@osg.samsung.com>2015-03-13 19:03:01 +0000
commit5e15d4aa603305d71cad5dd8b76fa9f5b25f4779 (patch)
treee4890b7f782305a4a2eab543d221eb21a9086c83
parent901fea5985b82fcdf3310fa1d34920d231113613 (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.c22
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;
}