[FFmpeg-cvslog] avformat/mp3dec: read TOC even if not all needed information is available

Michael Niedermayer git at videolan.org
Sun Jul 7 13:22:54 CEST 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sun Jul  7 12:50:41 2013 +0200| [19d416333114bd9bc2a76132709bf0a4463605bd] | committer: Michael Niedermayer

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 at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=19d416333114bd9bc2a76132709bf0a4463605bd
---

 libavformat/mp3dec.c |   10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
index 522ccf7..d2f35d0 100644
--- a/libavformat/mp3dec.c
+++ b/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)



More information about the ffmpeg-cvslog mailing list