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.
This commit is contained in:
Edward Hervey 2019-11-06 14:22:07 +01:00 committed by Edward Hervey
parent 56333073a9
commit 60cec38591

View file

@ -2431,10 +2431,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;