|
|
|
@ -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) |
|
|
|
|