diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2007-11-03 13:48:30 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2007-11-03 13:48:30 +0000 |
commit | c6dcd0d7f082ac046612cb4cd561fb51d09ddfb2 (patch) | |
tree | ca3e1851eba3ff5e3491009296307fcfee16de76 | |
parent | d447fc3132e79ace820a761d052930fe10573d23 (diff) | |
download | ffmpeg-c6dcd0d7f082ac046612cb4cd561fb51d09ddfb2.tar.gz |
fix misdetection of mp3could_not_find_codec_parameters.mp3
Originally committed as revision 10908 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/mpeg.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 0f8270a4fc..a362e29e8b 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -44,6 +44,26 @@ static int cdxa_probe(AVProbeData *p) return 0; } +static int check_pes(uint8_t *p, uint8_t *end){ + int pes1; + int pes2= (p[3] & 0xC0) == 0x80 + && (p[4] & 0xC0) != 0x40 + &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0)); + + for(p+=3; p<end && *p == 0xFF; p++); + if((*p&0xC0) == 0x40) p+=2; + if((*p&0xF0) == 0x20){ + pes1= p[0]&p[2]&p[4]&1; + p+=5; + }else if((*p&0xF0) == 0x30){ + pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1; + p+=10; + }else + pes1 = *p == 0x0F; + + return pes1||pes2; +} + static int mpegps_probe(AVProbeData *p) { uint32_t code= -1; @@ -58,11 +78,13 @@ static int mpegps_probe(AVProbeData *p) for(i=0; i<p->buf_size; i++){ code = (code<<8) + p->buf[i]; if ((code & 0xffffff00) == 0x100) { + int pes= check_pes(p->buf+i, p->buf+i+p->buf_size); + if(code == SYSTEM_HEADER_START_CODE) sys++; else if(code == PRIVATE_STREAM_1) priv1++; else if(code == PACK_START_CODE) pspack++; - else if((code & 0xf0) == VIDEO_ID) vid++; - else if((code & 0xe0) == AUDIO_ID) audio++; + else if((code & 0xf0) == VIDEO_ID && pes) vid++; + else if((code & 0xe0) == AUDIO_ID && pes) audio++; } } |