diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index ad2bccef3b..1108242357 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -1409,14 +1409,20 @@ mpegts_base_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) MpegTSPacketizerPacketReturn pret; MpegTSPacketizer2 *packetizer; MpegTSPacketizerPacket packet; + MpegTSBaseClass *klass; base = GST_MPEGTS_BASE (parent); + klass = GST_MPEGTS_BASE_GET_CLASS (base); + packetizer = base->packetizer; if (G_UNLIKELY (base->queried_latency == FALSE)) { query_upstream_latency (base); } + if (klass->input_done) + gst_buffer_ref (buf); + mpegts_packetizer_push (base->packetizer, buf); while (res == GST_FLOW_OK) { @@ -1465,6 +1471,13 @@ mpegts_base_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) mpegts_packetizer_clear_packet (base->packetizer, &packet); } + if (klass->input_done) { + if (res == GST_FLOW_OK) + res = klass->input_done (base, buf); + else + gst_buffer_unref (buf); + } + return res; } diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h index 98de1d9516..8f36e0bca6 100644 --- a/gst/mpegtsdemux/mpegtsbase.h +++ b/gst/mpegtsdemux/mpegtsbase.h @@ -168,6 +168,9 @@ struct _MpegTSBaseClass { /* flush all streams */ void (*flush) (MpegTSBase * base); + /* Notifies subclasses input buffer has been handled */ + GstFlowReturn (*input_done) (MpegTSBase *base, GstBuffer *buffer); + /* signals */ void (*pat_info) (GstStructure *pat); void (*pmt_info) (GstStructure *pmt);