From bb22b7d79c23b026bcec03ccf6d0ea3f3be39f45 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Fri, 10 Jul 2020 17:11:08 +0200 Subject: [PATCH] aggregator: expose gst_aggregator_finish_buffer_list API See https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1276 Part-of: --- libs/gst/base/gstaggregator.c | 50 ++++++++++++++++++++++++++++++++++++++++--- libs/gst/base/gstaggregator.h | 17 ++++++++++++++- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/libs/gst/base/gstaggregator.c b/libs/gst/base/gstaggregator.c index 640dc02..faf7831 100644 --- a/libs/gst/base/gstaggregator.c +++ b/libs/gst/base/gstaggregator.c @@ -41,16 +41,17 @@ * * When data is queued on all pads, the aggregate vmethod is called. * * * One can peek at the data on any given GstAggregatorPad with the - * gst_aggregator_pad_peek_buffer () method, and remove it from the pad + * gst_aggregator_pad_peek_buffer() method, and remove it from the pad * with the gst_aggregator_pad_pop_buffer () method. When a buffer * has been taken with pop_buffer (), a new buffer can be queued * on that pad. * * * If the subclass wishes to push a buffer downstream in its aggregate * implementation, it should do so through the - * gst_aggregator_finish_buffer () method. This method will take care + * gst_aggregator_finish_buffer() method. This method will take care * of sending and ordering mandatory events such as stream start, caps - * and segment. + * and segment. Buffer lists can also be pushed out with + * gst_aggregator_finish_buffer_list(). * * * Same goes for EOS events, which should not be pushed directly by the * subclass, it should instead return GST_FLOW_EOS in its aggregate @@ -636,6 +637,48 @@ gst_aggregator_finish_buffer (GstAggregator * aggregator, GstBuffer * buffer) return klass->finish_buffer (aggregator, buffer); } +static GstFlowReturn +gst_aggregator_default_finish_buffer_list (GstAggregator * self, + GstBufferList * bufferlist) +{ + gst_aggregator_push_mandatory_events (self); + + GST_OBJECT_LOCK (self); + if (!self->priv->flushing && gst_pad_is_active (self->srcpad)) { + GST_TRACE_OBJECT (self, "pushing bufferlist%" GST_PTR_FORMAT, bufferlist); + GST_OBJECT_UNLOCK (self); + return gst_pad_push_list (self->srcpad, bufferlist); + } else { + GST_INFO_OBJECT (self, "Not pushing (active: %i, flushing: %i)", + self->priv->flushing, gst_pad_is_active (self->srcpad)); + GST_OBJECT_UNLOCK (self); + gst_buffer_list_unref (bufferlist); + return GST_FLOW_OK; + } +} + +/** + * gst_aggregator_finish_buffer_list: + * @aggregator: The #GstAggregator + * @bufferlist: (transfer full): the #GstBufferList to push. + * + * This method will push the provided output buffer list downstream. If needed, + * mandatory events such as stream-start, caps, and segment events will be + * sent before pushing the buffer. + * + * Since: 1.18 + */ +GstFlowReturn +gst_aggregator_finish_buffer_list (GstAggregator * aggregator, + GstBufferList * bufferlist) +{ + GstAggregatorClass *klass = GST_AGGREGATOR_GET_CLASS (aggregator); + + g_assert (klass->finish_buffer_list != NULL); + + return klass->finish_buffer_list (aggregator, bufferlist); +} + static void gst_aggregator_push_eos (GstAggregator * self) { @@ -2557,6 +2600,7 @@ gst_aggregator_class_init (GstAggregatorClass * klass) g_type_class_adjust_private_offset (klass, &aggregator_private_offset); klass->finish_buffer = gst_aggregator_default_finish_buffer; + klass->finish_buffer_list = gst_aggregator_default_finish_buffer_list; klass->sink_event = gst_aggregator_default_sink_event; klass->sink_query = gst_aggregator_default_sink_query; diff --git a/libs/gst/base/gstaggregator.h b/libs/gst/base/gstaggregator.h index dcbfceb..57e3f8f 100644 --- a/libs/gst/base/gstaggregator.h +++ b/libs/gst/base/gstaggregator.h @@ -330,8 +330,19 @@ struct _GstAggregatorClass { GstAggregatorPad * aggregator_pad, GstQuery * query); + /** + * GstAggregatorClass::finish_buffer_list: + * + * Optional. Equivalent of #GstAggregatorClass::finish_buffer for + * buffer lists. + * + * Since: 1.18 + */ + GstFlowReturn (*finish_buffer_list) (GstAggregator * aggregator, + GstBufferList * bufferlist); + /*< private >*/ - gpointer _gst_reserved[GST_PADDING_LARGE-3]; + gpointer _gst_reserved[GST_PADDING_LARGE-4]; }; /************************************ @@ -357,6 +368,10 @@ GstFlowReturn gst_aggregator_finish_buffer (GstAggregator GstBuffer * buffer); GST_BASE_API +GstFlowReturn gst_aggregator_finish_buffer_list (GstAggregator * aggregator, + GstBufferList * bufferlist); + +GST_BASE_API void gst_aggregator_set_src_caps (GstAggregator * self, GstCaps * caps); -- 2.7.4