mirror of https://git.ffmpeg.org/ffmpeg.git
psxstr: improve probe to not misdetect so much.
The score of 50 can probably be raised if needed Fixes Ticket490 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
4bd37ca6ae
commit
3f7dc480c1
|
@ -68,6 +68,8 @@ static const char sync_header[12] = {0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf
|
|||
static int str_probe(AVProbeData *p)
|
||||
{
|
||||
uint8_t *sector= p->buf;
|
||||
uint8_t *end= sector + p->buf_size;
|
||||
int aud=0, vid=0;
|
||||
|
||||
if (p->buf_size < RAW_CD_SECTOR_SIZE)
|
||||
return 0;
|
||||
|
@ -79,20 +81,52 @@ static int str_probe(AVProbeData *p)
|
|||
sector += RIFF_HEADER_SIZE;
|
||||
}
|
||||
|
||||
while (end - sector >= RAW_CD_SECTOR_SIZE) {
|
||||
/* look for CD sync header (00, 0xFF x 10, 00) */
|
||||
if (memcmp(sector,sync_header,sizeof(sync_header)))
|
||||
return 0;
|
||||
|
||||
if(sector[0x11] >= 32)
|
||||
return 0;
|
||||
if( (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_VIDEO
|
||||
&& (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_AUDIO
|
||||
&& (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_DATA)
|
||||
if (sector[0x11] >= 32)
|
||||
return 0;
|
||||
|
||||
switch (sector[0x12] & CDXA_TYPE_MASK) {
|
||||
case CDXA_TYPE_DATA:
|
||||
case CDXA_TYPE_VIDEO: {
|
||||
int current_sector = AV_RL16(§or[0x1C]);
|
||||
int sector_count = AV_RL16(§or[0x1E]);
|
||||
int frame_size = AV_RL32(§or[0x24]);
|
||||
|
||||
if(!( frame_size>=0
|
||||
&& current_sector < sector_count
|
||||
&& sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*st->codec->width = AV_RL16(§or[0x28]);
|
||||
st->codec->height = AV_RL16(§or[0x2A]);*/
|
||||
|
||||
// if (current_sector == sector_count-1) {
|
||||
vid++;
|
||||
// }
|
||||
|
||||
}
|
||||
break;
|
||||
case CDXA_TYPE_AUDIO:
|
||||
if(sector[0x13]&0x2A)
|
||||
return 0;
|
||||
aud++;
|
||||
break;
|
||||
default:
|
||||
if(sector[0x12] & CDXA_TYPE_MASK)
|
||||
return 0;
|
||||
}
|
||||
sector += RAW_CD_SECTOR_SIZE;
|
||||
}
|
||||
/* MPEG files (like those ripped from VCDs) can also look like this;
|
||||
* only return half certainty */
|
||||
return 50;
|
||||
if(vid+aud > 3) return 50;
|
||||
else if(vid+aud) return 1;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
static int str_read_header(AVFormatContext *s,
|
||||
|
|
Loading…
Reference in New Issue