mirror of
https://github.com/mpv-player/mpv
synced 2024-12-15 19:35:49 +00:00
handle broken ts packets before parsing the rest
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@20506 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
7d91ecbd14
commit
3675d0466d
@ -2588,11 +2588,11 @@ static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, unsigned char *packet,
|
||||
len = stream_read(stream, &packet[1], 3);
|
||||
if (len != 3)
|
||||
return 0;
|
||||
buf_size -= 4;
|
||||
|
||||
if((packet[1] >> 7) & 0x01) //transport error
|
||||
ts_error = 1;
|
||||
|
||||
buf_size -= 4;
|
||||
|
||||
is_start = packet[1] & 0x40;
|
||||
pid = ((packet[1] & 0x1f) << 8) | packet[2];
|
||||
@ -2605,6 +2605,21 @@ static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, unsigned char *packet,
|
||||
continue;
|
||||
}
|
||||
|
||||
cc = (packet[3] & 0xf);
|
||||
cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc));
|
||||
tss->last_cc = cc;
|
||||
|
||||
bad = ts_error; // || (! cc_ok);
|
||||
if(bad)
|
||||
{
|
||||
if(priv->keep_broken == 0)
|
||||
{
|
||||
stream_skip(stream, buf_size-1+junk);
|
||||
continue;
|
||||
}
|
||||
|
||||
is_start = 0; //queued to the packet data
|
||||
}
|
||||
|
||||
if(is_start)
|
||||
tss->is_synced = 1;
|
||||
@ -2615,11 +2630,6 @@ static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, unsigned char *packet,
|
||||
continue;
|
||||
}
|
||||
|
||||
cc = (packet[3] & 0xf);
|
||||
cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc));
|
||||
tss->last_cc = cc;
|
||||
|
||||
bad = ts_error; // || (! cc_ok);
|
||||
|
||||
afc = (packet[3] >> 4) & 3;
|
||||
if(! (afc % 2)) //no payload in this TS packet
|
||||
@ -2652,23 +2662,6 @@ static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, unsigned char *packet,
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(bad)
|
||||
{
|
||||
// logically this packet should be dropped, but if I do it
|
||||
// certain streams play corrupted. Maybe the decoders know
|
||||
// how to deal with it, but at least I consider the packet
|
||||
// as "not initial"
|
||||
mp_msg(MSGT_DEMUX, MSGL_V, "ts_parse: PID=%d, Transport error: %d, CC_OK: %s\n\n", tss->pid, ts_error, (cc_ok ? "yes" : "no"));
|
||||
|
||||
if(priv->keep_broken == 0)
|
||||
{
|
||||
stream_skip(stream, buf_size-1+junk);
|
||||
continue;
|
||||
}
|
||||
|
||||
is_start = 0; //queued to the packet data
|
||||
}
|
||||
|
||||
//find the program that the pid belongs to; if (it's the right one or -1) && pid_type==SL_SECTION
|
||||
//call parse_sl_section()
|
||||
|
Loading…
Reference in New Issue
Block a user