From e5eceaaa731f68224b21bfa4972e77c3c1d45561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 12 Oct 2012 15:26:20 +0200 Subject: [PATCH] mpegtsdemux: First push EOS, then destroy all programs And also properly remove the program from the subclass --- gst/mpegtsdemux/mpegtsbase.c | 2 +- gst/mpegtsdemux/tsdemux.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 07db398905..bd73884ba0 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -1346,8 +1346,8 @@ mpegts_base_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) gst_event_unref (event); break; case GST_EVENT_EOS: - res = gst_mpegts_base_handle_eos (base); res = GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, event); + res = gst_mpegts_base_handle_eos (base); break; case GST_EVENT_CAPS: /* FIXME, do something */ diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index e431dad13a..227acfbcac 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -226,6 +226,8 @@ enum /* mpegtsbase methods */ static void gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program); +static void +gst_ts_demux_program_stopped (MpegTSBase * base, MpegTSBaseProgram * program); static void gst_ts_demux_reset (MpegTSBase * base); static GstFlowReturn gst_ts_demux_push (MpegTSBase * base, MpegTSPacketizerPacket * packet, @@ -307,6 +309,7 @@ gst_ts_demux_class_init (GstTSDemuxClass * klass) ts_class->push = GST_DEBUG_FUNCPTR (gst_ts_demux_push); ts_class->push_event = GST_DEBUG_FUNCPTR (push_event); ts_class->program_started = GST_DEBUG_FUNCPTR (gst_ts_demux_program_started); + ts_class->program_stopped = GST_DEBUG_FUNCPTR (gst_ts_demux_program_stopped); ts_class->stream_added = gst_ts_demux_stream_added; ts_class->stream_removed = gst_ts_demux_stream_removed; ts_class->seek = GST_DEBUG_FUNCPTR (gst_ts_demux_do_seek); @@ -1130,7 +1133,16 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program) } } +static void +gst_ts_demux_program_stopped (MpegTSBase * base, MpegTSBaseProgram * program) +{ + GstTSDemux *demux = GST_TS_DEMUX (base); + if (demux->program == program) { + demux->program = NULL; + demux->program_number = -1; + } +} static inline void