@ -1445,14 +1445,17 @@ static int mpegps_read_pes_header(AVFormatContext *s,
{
MpegDemuxContext * m = s - > priv_data ;
int len , size , startcode , c , flags , header_len ;
int64_t pts , dts , last_pos ;
int64_t pts , dts ;
int64_t last_sync = url_ftell ( & s - > pb ) ;
last_pos = - 1 ;
error_redo :
url_fseek ( & s - > pb , last_sync , SEEK_SET ) ;
redo :
/* next start code (should be immediately after) */
m - > header_state = 0xff ;
size = MAX_SYNC_SIZE ;
startcode = find_next_start_code ( & s - > pb , & size , & m - > header_state ) ;
last_sync = url_ftell ( & s - > pb ) ;
//printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(&s->pb));
if ( startcode < 0 )
return AVERROR_IO ;
@ -1486,7 +1489,7 @@ static int mpegps_read_pes_header(AVFormatContext *s,
/* stuffing */
for ( ; ; ) {
if ( len < 1 )
goto redo ;
goto error_ redo;
c = get_byte ( & s - > pb ) ;
len - - ;
/* XXX: for mpeg1, should test only bit 7 */
@ -1496,19 +1499,19 @@ static int mpegps_read_pes_header(AVFormatContext *s,
if ( ( c & 0xc0 ) = = 0x40 ) {
/* buffer scale & size */
if ( len < 2 )
goto redo ;
goto error_ redo;
get_byte ( & s - > pb ) ;
c = get_byte ( & s - > pb ) ;
len - = 2 ;
}
if ( ( c & 0xf0 ) = = 0x20 ) {
if ( len < 4 )
goto redo ;
goto error_ redo;
dts = pts = get_pts ( & s - > pb , c ) ;
len - = 4 ;
} else if ( ( c & 0xf0 ) = = 0x30 ) {
if ( len < 9 )
goto redo ;
goto error_ redo;
pts = get_pts ( & s - > pb , c ) ;
dts = get_pts ( & s - > pb , - 1 ) ;
len - = 9 ;
@ -1524,18 +1527,18 @@ static int mpegps_read_pes_header(AVFormatContext *s,
header_len = get_byte ( & s - > pb ) ;
len - = 2 ;
if ( header_len > len )
goto redo ;
goto error_ redo;
if ( ( flags & 0xc0 ) = = 0x80 ) {
dts = pts = get_pts ( & s - > pb , - 1 ) ;
if ( header_len < 5 )
goto redo ;
goto error_ redo;
header_len - = 5 ;
len - = 5 ;
} if ( ( flags & 0xc0 ) = = 0xc0 ) {
pts = get_pts ( & s - > pb , - 1 ) ;
dts = get_pts ( & s - > pb , - 1 ) ;
if ( header_len < 10 )
goto redo ;
goto error_ redo;
header_len - = 10 ;
len - = 10 ;
}
@ -1550,13 +1553,13 @@ static int mpegps_read_pes_header(AVFormatContext *s,
if ( startcode = = PRIVATE_STREAM_1 & & ! m - > psm_es_type [ startcode & 0xff ] ) {
if ( len < 1 )
goto redo ;
goto error_ redo;
startcode = get_byte ( & s - > pb ) ;
len - - ;
if ( startcode > = 0x80 & & startcode < = 0xbf ) {
/* audio: skip header */
if ( len < 3 )
goto redo ;
goto error_ redo;
get_byte ( & s - > pb ) ;
get_byte ( & s - > pb ) ;
get_byte ( & s - > pb ) ;