diff --git a/gst/asfdemux/gstasfdemux.c b/gst/asfdemux/gstasfdemux.c index 29d4884acd..75ee9512bc 100644 --- a/gst/asfdemux/gstasfdemux.c +++ b/gst/asfdemux/gstasfdemux.c @@ -203,6 +203,23 @@ gst_asf_demux_reset (GstASFDemux * demux, gboolean chain_reset) NULL); g_slist_free (demux->ext_stream_props); demux->ext_stream_props = NULL; + + while (demux->old_num_streams > 0) { + gst_asf_demux_free_stream (demux, + &demux->old_stream[demux->old_num_streams - 1]); + --demux->old_num_streams; + } + memset (demux->old_stream, 0, sizeof (demux->old_stream)); + demux->old_num_streams = 0; + + /* when resetting for a new chained asf, we don't want to remove the pads + * before adding the new ones */ + if (chain_reset) { + memcpy (demux->old_stream, demux->stream, sizeof (demux->stream)); + demux->old_num_streams = demux->num_streams; + demux->num_streams = 0; + } + while (demux->num_streams > 0) { gst_asf_demux_free_stream (demux, &demux->stream[demux->num_streams - 1]); --demux->num_streams; @@ -796,6 +813,17 @@ gst_asf_demux_chain_headers (GstASFDemux * demux) if (flow != GST_FLOW_OK) goto parse_failed; + /* release old pads (only happens on chained asfs) */ + while (demux->old_num_streams > 0) { + gst_pad_push_event (demux->old_stream[demux->old_num_streams - 1].pad, + gst_event_new_eos ()); + gst_asf_demux_free_stream (demux, + &demux->old_stream[demux->old_num_streams - 1]); + --demux->old_num_streams; + } + memset (demux->old_stream, 0, sizeof (demux->old_stream)); + demux->old_num_streams = 0; + /* calculate where the packet data starts */ demux->data_offset = obj.size + 50; diff --git a/gst/asfdemux/gstasfdemux.h b/gst/asfdemux/gstasfdemux.h index 344314b277..07acc4d95e 100644 --- a/gst/asfdemux/gstasfdemux.h +++ b/gst/asfdemux/gstasfdemux.h @@ -158,6 +158,11 @@ struct _GstASFDemux { AsfStream stream[GST_ASF_DEMUX_NUM_STREAMS]; gboolean activated_streams; + /* for chained asf handling, we need to hold the old asf streams until + * we detect the new ones */ + AsfStream old_stream[GST_ASF_DEMUX_NUM_STREAMS]; + gboolean old_num_streams; + GstClockTime first_ts; /* first timestamp found */ guint32 packet_size;