diff options
author | Thiago Santos <thiagoss@osg.samsung.com> | 2014-08-13 19:46:30 -0300 |
---|---|---|
committer | Thiago Santos <thiagoss@osg.samsung.com> | 2014-08-19 18:35:54 -0300 |
commit | 1f34ce7d941674351b9758d3d9f8c0f4163327c6 (patch) | |
tree | 36abd9b1ef8a933d3533ca92d5a895fbb127eca3 | |
parent | f6888bda7d74c096789e509a902130eea2525910 (diff) |
tsdemux: WIPtsdemux-programchange
-rw-r--r-- | gst/mpegtsdemux/tsdemux.c | 58 | ||||
-rw-r--r-- | gst/mpegtsdemux/tsdemux.h | 2 |
2 files changed, 47 insertions, 13 deletions
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index e91d4c44e..4c146823e 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -1447,37 +1447,64 @@ tsdemux_h264_parsing_info_clear (TSDemuxH264ParsingInfos * h264infos) } static void -gst_ts_demux_stream_finish (GstTSDemux * tsdemux, TSDemuxStream * stream) +gst_ts_demux_stream_finish_pad (GstPad * pad) +{ + GST_DEBUG_OBJECT (pad, "Pushing out EOS"); + gst_pad_push_event (pad, gst_event_new_eos ()); + GST_DEBUG_OBJECT (pad, "Deactivating and removing pad"); + gst_pad_set_active (pad, FALSE); +} + +static void +gst_ts_demux_stream_finish (GstTSDemux * tsdemux, TSDemuxStream * stream, + gboolean eos) { 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 (tsdemux, stream); - GST_DEBUG_OBJECT (stream->pad, "Pushing out EOS"); - gst_pad_push_event (stream->pad, gst_event_new_eos ()); - GST_DEBUG_OBJECT (stream->pad, "Deactivating and removing pad"); - gst_pad_set_active (stream->pad, FALSE); - stream->active = FALSE; - stream->need_newsegment = TRUE; - stream->discont = TRUE; + if (eos) { + gst_ts_demux_stream_finish_pad (stream->pad); + stream->active = FALSE; + stream->need_newsegment = TRUE; + stream->discont = TRUE; + } + } +} + +static void +gst_ts_demux_clear_pads_limbo (GstTSDemux * tsdemux) +{ + while (tsdemux->pads_limbo) { + GstPad *pad = tsdemux->pads_limbo->data; + + tsdemux->pads_limbo = g_list_remove (tsdemux->pads_limbo, pad); + + gst_ts_demux_stream_finish_pad (pad); + gst_element_remove_pad (GST_ELEMENT_CAST (tsdemux), pad); + gst_object_unref (pad); } } static void gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream) { + GstTSDemux *tsdemux = GST_TS_DEMUX_CAST (base); TSDemuxStream *stream = (TSDemuxStream *) bstream; if (stream->pad) { gst_flow_combiner_remove_pad (GST_TS_DEMUX_CAST (base)->flowcombiner, stream->pad); if (stream->active) { - gst_ts_demux_stream_finish ((GstTSDemux *) base, stream); + gst_ts_demux_stream_finish ((GstTSDemux *) base, stream, FALSE); GST_DEBUG_OBJECT (stream->pad, "Removing pad"); - gst_element_remove_pad (GST_ELEMENT_CAST (base), stream->pad); + if (gst_pad_is_active (stream->pad)) { + tsdemux->pads_limbo = g_list_prepend (tsdemux->pads_limbo, stream->pad); + } else { + gst_object_unref (stream->pad); + } } - gst_object_unref (stream->pad); g_free (stream->stream_id); stream->stream_id = NULL; if (stream->caps) @@ -1502,7 +1529,7 @@ gst_ts_demux_remove_old_program (GstTSDemux * tsdemux) for (tmp = tsdemux->old_program->stream_list; tmp; tmp = tmp->next) { TSDemuxStream *stream = (TSDemuxStream *) tmp->data; if (stream->pad) { - gst_ts_demux_stream_finish (tsdemux, stream); + gst_ts_demux_stream_finish (tsdemux, stream, TRUE); gst_flow_combiner_remove_pad (tsdemux->flowcombiner, stream->pad); GST_DEBUG_OBJECT (tsdemux, "Remove pad %s:%s", GST_DEBUG_PAD_NAME (stream->pad)); @@ -1546,6 +1573,7 @@ activate_pad_for_stream (GstTSDemux * tsdemux, TSDemuxStream * stream) TS_DEMUX_PROGRAM (tsdemux->program)->state = PROGRAM_STATE_EXPOSED; gst_element_no_more_pads ((GstElement *) tsdemux); + gst_ts_demux_clear_pads_limbo (tsdemux); gst_ts_demux_remove_old_program (tsdemux); } } else @@ -1632,6 +1660,8 @@ gst_ts_demux_program_stopped (MpegTSBase * base, MpegTSBaseProgram * program) mpegts_base_program_unref (demux->program); demux->program = NULL; demux->program_number = -1; + GST_DEBUG_OBJECT (demux, "Current program stopped"); + gst_event_replace (&demux->segment_event, NULL); } } @@ -2050,7 +2080,7 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) if (demux->segment.rate > 0) { demux->segment.start = firstts; - if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop) ) + if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop)) demux->segment.stop += firstts - demux->segment.start; demux->segment.position = firstts; demux->segment.base += segbase; @@ -2325,6 +2355,8 @@ gst_ts_demux_push (MpegTSBase * base, MpegTSPacketizerPacket * packet, TSDemuxStream *stream = NULL; GstFlowReturn res = GST_FLOW_OK; + GST_ERROR ("TSPUSH"); + GST_OBJECT_LOCK (base); if (G_UNLIKELY ((demux->requested_program_number == -1 && demux->program == NULL) || diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h index 13a0008dd..3280c49e1 100644 --- a/gst/mpegtsdemux/tsdemux.h +++ b/gst/mpegtsdemux/tsdemux.h @@ -87,6 +87,8 @@ struct _GstTSDemux /* Used when seeking for a keyframe to go backward in the stream */ guint64 last_seek_offset; + + GList *pads_limbo; }; struct _GstTSDemuxClass |