avformat/mp3dec: read TOC even if not all needed information is available

This fixes hyothetical bugs with parsing of elements after the TOC

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
pull/27/head
Michael Niedermayer 12 years ago
parent 4cc32e5cad
commit 19d4163331
  1. 10
      libavformat/mp3dec.c

@ -93,22 +93,24 @@ static void read_xing_toc(AVFormatContext *s, int64_t filesize, int64_t duration
{
int i;
MP3DecContext *mp3 = s->priv_data;
int fill_index = mp3->usetoc && duration > 0;
if (!filesize &&
!(filesize = avio_size(s->pb))) {
av_log(s, AV_LOG_WARNING, "Cannot determine file size, skipping TOC table.\n");
return;
fill_index = 0;
}
for (i = 0; i < XING_TOC_COUNT; i++) {
uint8_t b = avio_r8(s->pb);
if (mp3->usetoc)
if (fill_index)
av_add_index_entry(s->streams[0],
av_rescale(b, filesize, 256),
av_rescale(i, duration, XING_TOC_COUNT),
0, 0, AVINDEX_KEYFRAME);
}
mp3->xing_toc = 1;
if (fill_index)
mp3->xing_toc = 1;
}
/**
@ -146,7 +148,7 @@ static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base)
frames = avio_rb32(s->pb);
if(v & XING_FLAG_SIZE)
size = avio_rb32(s->pb);
if (v & XING_FLAG_TOC && frames)
if (v & XING_FLAG_TOC)
read_xing_toc(s, size, av_rescale_q(frames, (AVRational){spf, c.sample_rate},
st->time_base));
if(v & 8)

Loading…
Cancel
Save