Commit fe0119c3 authored by andoma's avatar andoma

add support for reading duration from VBRI-tag in mp3 files



git-svn-id: file:///var/local/repositories/ffmpeg/trunk@10851 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent f2058af5
...@@ -426,9 +426,9 @@ static int mp3_read_probe(AVProbeData *p) ...@@ -426,9 +426,9 @@ static int mp3_read_probe(AVProbeData *p)
} }
/** /**
* Try to extract a xing tag from the stream and if found, decode it * Try to find Xing/Info/VBRI tags and compute duration from info therein
*/ */
static void mp3_parse_xing(AVFormatContext *s, AVStream *st) static void mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, offset_t base)
{ {
uint32_t v, spf; uint32_t v, spf;
int frames = -1; /* Total number of frames in file */ int frames = -1; /* Total number of frames in file */
...@@ -448,6 +448,18 @@ static void mp3_parse_xing(AVFormatContext *s, AVStream *st) ...@@ -448,6 +448,18 @@ static void mp3_parse_xing(AVFormatContext *s, AVStream *st)
frames = get_be32(&s->pb); frames = get_be32(&s->pb);
} }
/* Check for VBRI tag (always 32 bytes after end of mpegaudio header) */
url_fseek(&s->pb, base + 4 + 32, SEEK_SET);
v = get_be32(&s->pb);
if(v == MKBETAG('V', 'B', 'R', 'I')) {
/* Check tag version */
if(get_be16(&s->pb) == 1) {
/* skip delay, quality and total bytes */
url_fseek(&s->pb, 8, SEEK_CUR);
frames = get_be32(&s->pb);
}
}
if(frames < 0) if(frames < 0)
return; return;
...@@ -503,7 +515,7 @@ static int mp3_read_header(AVFormatContext *s, ...@@ -503,7 +515,7 @@ static int mp3_read_header(AVFormatContext *s,
} }
off = url_ftell(&s->pb); off = url_ftell(&s->pb);
mp3_parse_xing(s, st); mp3_parse_vbr_tags(s, st, off);
url_fseek(&s->pb, off, SEEK_SET); url_fseek(&s->pb, off, SEEK_SET);
/* the parameters will be extracted from the compressed bitstream */ /* the parameters will be extracted from the compressed bitstream */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment