diff options
author | Edward Hervey <edward@centricular.com> | 2021-06-03 11:24:53 +0200 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2021-09-06 17:22:28 +0100 |
commit | 49224b9c57a45da919abef628d83763cac1a5aef (patch) | |
tree | b5fe49e457bd380f6e9c101ae4926c2360c9626f | |
parent | 520f516a4bc5e9750cd3ceeb153a095b43085b5b (diff) | |
download | gstreamer-plugins-bad-49224b9c57a45da919abef628d83763cac1a5aef.tar.gz |
tsdemux: Clear all streams when rewinding
This avoids sending out partial invalid data downstream which could cause
decoders (ex: `dvdlpmdec`) to error out.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2511>
-rw-r--r-- | gst/mpegtsdemux/tsdemux.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 409869e80..f95c325fa 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -3091,16 +3091,30 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream, stream->seeked_dts = stream->dts; stream->needs_keyframe = FALSE; } else { + GList *tmp; + GST_DEBUG_OBJECT (stream->pad, "Rewinding after keyframe seek failure"); base->seek_offset = demux->last_seek_offset - 200 * base->packetsize; if (demux->last_seek_offset < 200 * base->packetsize) base->seek_offset = 0; demux->last_seek_offset = base->seek_offset; mpegts_packetizer_flush (base->packetizer, FALSE); + + /* Reset all streams accordingly */ + for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) { + TSDemuxStream *cand = tmp->data; + + GST_DEBUG_OBJECT (cand->pad, "Clearing stream"); + cand->continuity_counter = CONTINUITY_UNSET; + cand->state = PENDING_PACKET_EMPTY; + if (cand->data) + g_free (cand->data); + cand->data = NULL; + cand->allocated_size = 0; + cand->current_size = 0; + } base->mode = BASE_MODE_SEEKING; - stream->continuity_counter = CONTINUITY_UNSET; res = GST_FLOW_REWINDING; - g_free (stream->data); goto beach; } } else { @@ -3306,8 +3320,11 @@ gst_ts_demux_handle_packet (GstTSDemux * demux, TSDemuxStream * stream, FLAGS_HAS_PAYLOAD (packet->scram_afc_cc)) { /* Flush previous data */ res = gst_ts_demux_push_pending_data (demux, stream, NULL); - /* Tell the data collecting to expect this header */ - stream->state = PENDING_PACKET_HEADER; + if (res != GST_FLOW_REWINDING) { + /* Tell the data collecting to expect this header. We don't do this when + * rewinding since the states will have been resetted accordingly */ + stream->state = PENDING_PACKET_HEADER; + } } if (packet->payload && (res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED) |