|
|
|
@@ -17,6 +17,7 @@ |
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
|
|
*/ |
|
|
|
#include "avformat.h" |
|
|
|
#include "mpegaudio.h" |
|
|
|
|
|
|
|
#define ID3_HEADER_SIZE 10 |
|
|
|
#define ID3_TAG_SIZE 128 |
|
|
|
@@ -243,27 +244,38 @@ static void id3_create_tag(AVFormatContext *s, uint8_t *buf) |
|
|
|
|
|
|
|
static int mp3_read_probe(AVProbeData *p) |
|
|
|
{ |
|
|
|
int d; |
|
|
|
int max_frames; |
|
|
|
int fsize, frames; |
|
|
|
uint32_t header; |
|
|
|
uint8_t *buf, *buf2, *end; |
|
|
|
AVCodecContext avctx; |
|
|
|
|
|
|
|
if(p->buf_size < 4) |
|
|
|
if(p->buf_size < ID3_HEADER_SIZE) |
|
|
|
return 0; |
|
|
|
|
|
|
|
if(p->buf[0] == 'I' && p->buf[1] == 'D' && p->buf[2] == '3' && |
|
|
|
p->buf[3] < 5) |
|
|
|
if(id3_match(p->buf)) |
|
|
|
return AVPROBE_SCORE_MAX; |
|
|
|
|
|
|
|
if(p->buf[0] != 0xff) |
|
|
|
return 0; |
|
|
|
|
|
|
|
d = p->buf[1]; |
|
|
|
if((d & 0xe0) != 0xe0 || ((d & 0x18) == 0x08 || (d & 0x06) == 0)) |
|
|
|
return 0; |
|
|
|
max_frames = 0; |
|
|
|
buf = p->buf; |
|
|
|
end = buf + FFMIN(4096, p->buf_size - sizeof(uint32_t)); |
|
|
|
|
|
|
|
d = p->buf[2]; |
|
|
|
if((d & 0xf0) == 0xf0 || (d & 0x0c) == 0x0c) |
|
|
|
return 0; |
|
|
|
for(; buf < end; buf++) { |
|
|
|
buf2 = buf; |
|
|
|
|
|
|
|
return AVPROBE_SCORE_MAX; |
|
|
|
for(frames = 0; buf < end; frames++) { |
|
|
|
header = (buf2[0] << 24) | (buf2[1] << 16) | (buf2[2] << 8) | buf2[3]; |
|
|
|
fsize = mpa_decode_header(&avctx, header); |
|
|
|
if(fsize < 0) |
|
|
|
break; |
|
|
|
buf2 += fsize; |
|
|
|
} |
|
|
|
max_frames = FFMAX(max_frames, frames); |
|
|
|
} |
|
|
|
if (max_frames>=3) return AVPROBE_SCORE_MAX/2+1; |
|
|
|
else if(max_frames==2) return AVPROBE_SCORE_MAX/4; |
|
|
|
else if(max_frames==1) return 1; |
|
|
|
else return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int mp3_read_header(AVFormatContext *s, |
|
|
|
|