diff options
Diffstat (limited to 'gst')
-rw-r--r-- | gst/mpegtsdemux/tsdemux.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index c941be991..6e9107b10 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -114,6 +114,8 @@ struct _TSDemuxStream MpegTSBaseStream stream; GstPad *pad; + /* Whether the pad was added or not */ + gboolean active; /* the return of the latest push */ GstFlowReturn flow_return; @@ -956,6 +958,7 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * bstream, /* Create the pad */ if (bstream->stream_type != 0xff) stream->pad = create_pad_for_stream (base, bstream, program); + stream->active = FALSE; stream->need_newsegment = TRUE; stream->pts = GST_CLOCK_TIME_NONE; @@ -976,7 +979,7 @@ gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream) TSDemuxStream *stream = (TSDemuxStream *) bstream; if (stream->pad) { - if (gst_pad_is_active (stream->pad)) { + if (stream->active && gst_pad_is_active (stream->pad)) { /* Flush out all data */ GST_DEBUG_OBJECT (stream->pad, "Flushing out pending data"); gst_ts_demux_push_pending_data ((GstTSDemux *) base, stream); @@ -986,6 +989,7 @@ gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream) GST_DEBUG_OBJECT (stream->pad, "Deactivating and removing pad"); gst_pad_set_active (stream->pad, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (base), stream->pad); + stream->active = FALSE; } stream->pad = NULL; } @@ -1000,6 +1004,7 @@ activate_pad_for_stream (GstTSDemux * tsdemux, TSDemuxStream * stream) GST_DEBUG_PAD_NAME (stream->pad), stream); gst_pad_set_active (stream->pad, TRUE); gst_element_add_pad ((GstElement *) tsdemux, stream->pad); + stream->active = TRUE; GST_DEBUG_OBJECT (stream->pad, "done adding pad"); } else GST_WARNING_OBJECT (tsdemux, @@ -1049,7 +1054,6 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program) if (demux->program_number == -1 || demux->program_number == program->program_number) { - GList *tmp; GST_LOG ("program %d started", program->program_number); demux->program_number = program->program_number; @@ -1069,12 +1073,7 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program) GST_EVENT_SRC (demux->segment_event) = gst_object_ref (demux); } - /* Activate all stream pads, pads will already have been created */ - if (base->mode != BASE_MODE_SCANNING) { - for (tmp = program->stream_list; tmp; tmp = tmp->next) - activate_pad_for_stream (demux, (TSDemuxStream *) tmp->data); - gst_element_no_more_pads ((GstElement *) demux); - } + /* FIXME : When do we emit no_more_pads ? */ /* Inform scanner we have got our program */ demux->current_program_number = program->program_number; @@ -1456,6 +1455,9 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) if (G_UNLIKELY (stream->state != PENDING_PACKET_BUFFER)) goto beach; + if (G_UNLIKELY (!stream->active)) + activate_pad_for_stream (demux, stream); + if (G_UNLIKELY (stream->pad == NULL)) { g_list_foreach (stream->currentlist, (GFunc) gst_buffer_unref, NULL); g_list_free (stream->currentlist); |