From adfb090b59a7f8537e27a6926cb21a5a26dd7354 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 1 Aug 2011 15:46:12 +0200 Subject: [PATCH] mpegtsbase: Remove programs on EOS Allows subclasses to properly flush out pending data. --- gst/mpegtsdemux/mpegtsbase.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index e3be7c8..2a81f75 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -212,6 +212,10 @@ mpegts_base_reset (MpegTSBase * base) gst_segment_init (&base->segment, GST_FORMAT_UNDEFINED); + base->mode = BASE_MODE_STREAMING; + base->seen_pat = FALSE; + base->first_pat_offset = -1; + if (klass->reset) klass->reset (base); } @@ -236,15 +240,10 @@ mpegts_base_init (MpegTSBase * base, MpegTSBaseClass * klass) base->is_pes = g_new0 (guint8, 1024); base->known_psi = g_new0 (guint8, 1024); - mpegts_base_reset (base); base->program_size = sizeof (MpegTSBaseProgram); base->stream_size = sizeof (MpegTSBaseStream); - base->mode = BASE_MODE_STREAMING; - base->seen_pat = FALSE; - base->first_pat_offset = -1; - - gst_segment_init (&base->segment, GST_FORMAT_UNDEFINED); + mpegts_base_reset (base); } static void @@ -1135,6 +1134,23 @@ mpegts_base_get_tags_from_eit (MpegTSBase * base, GstStructure * eit_info) } } +static void +remove_each_program (gpointer key, MpegTSBaseProgram * program, + MpegTSBase * base) +{ + /* First deactivate it */ + mpegts_base_deactivate_program (base, program); + /* Then remove it */ + mpegts_base_remove_program (base, program->program_number); +} + +static gboolean +gst_mpegts_base_handle_eos (MpegTSBase * base) +{ + g_hash_table_foreach (base->programs, (GHFunc) remove_each_program, base); + /* finally remove */ + return TRUE; +} static gboolean mpegts_base_sink_event (GstPad * pad, GstEvent * event) @@ -1166,6 +1182,9 @@ mpegts_base_sink_event (GstPad * pad, GstEvent * event) gst_event_unref (event); } break; + case GST_EVENT_EOS: + res = gst_mpegts_base_handle_eos (base); + break; case GST_EVENT_FLUSH_START: gst_segment_init (&base->segment, GST_FORMAT_UNDEFINED); mpegts_packetizer_flush (base->packetizer); -- 2.7.4