mpegtbase: vmethod to notify when we're done processing input
authorEdward Hervey <edward.hervey@collabora.co.uk>
Tue, 26 Jun 2012 16:51:21 +0000 (18:51 +0200)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Tue, 14 Aug 2012 17:05:37 +0000 (19:05 +0200)
This can be used to notify subclasses no more data is expected this
round.
tsparse will use it to push whole buffers (without copy) on the main
source pad.
It could also be used later to decide whether to push pending data
in order to reduce latency.

gst/mpegtsdemux/mpegtsbase.c
gst/mpegtsdemux/mpegtsbase.h

index ad2bccef3b3f6f7e331c25f7a37f2f63b686f85a..1108242357cb454509d65b06b200de50c8904d25 100644 (file)
@@ -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;
 }
 
index 98de1d951645992b54d92eeb104391a598dfe552..8f36e0bca65863381cb2dc733f09e2e04b292064 100644 (file)
@@ -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);