From: Edward Hervey Date: Wed, 6 Nov 2019 13:22:07 +0000 (+0100) Subject: tsdemux: Handle continuity mismatch in more cases X-Git-Tag: 1.16.2~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cfa0f1858075a3390def50250eafc89d270178d3;p=platform%2Fupstream%2Fgst-plugins-bad.git tsdemux: Handle continuity mismatch in more cases Packets of a given PID are meant to have sequential continuity counters (modulo 16). If there are not sequential, this is the sign of a broken stream, which we then consider as a discontinuity. But if that new packet is a frame start (PUSI is true), then we can resume from that packet without any damage. --- diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index c28516ef7..49f56498e 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -2399,10 +2399,21 @@ gst_ts_demux_queue_data (GstTSDemux * demux, TSDemuxStream * stream, (stream->continuity_counter == MAX_CONTINUITY && cc == 0))) { GST_LOG ("CONTINUITY: Got expected %d", cc); } else { - GST_WARNING ("CONTINUITY: Mismatch packet %d, stream %d", - cc, stream->continuity_counter); - if (stream->state != PENDING_PACKET_EMPTY) - stream->state = PENDING_PACKET_DISCONT; + if (stream->state != PENDING_PACKET_EMPTY) { + if (packet->payload_unit_start_indicator) { + /* A mismatch is fatal, except if this is the beginning of a new + * frame (from which we can recover) */ + if (G_UNLIKELY (stream->data)) { + g_free (stream->data); + stream->data = NULL; + } + stream->state = PENDING_PACKET_HEADER; + } else { + GST_WARNING ("CONTINUITY: Mismatch packet %d, stream %d", + cc, stream->continuity_counter); + stream->state = PENDING_PACKET_DISCONT; + } + } } stream->continuity_counter = cc;