]> git.sesse.net Git - ffmpeg/commitdiff
avformat/aiffdec: avoid double and ldexp()
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 7 Jun 2015 21:50:13 +0000 (23:50 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 11 Jun 2015 11:09:46 +0000 (13:09 +0200)
There is no support for non integer sample rates, using doubles/floats currently could
only lead to rounding differences between platforms

Previous version Reviewed-by: Mark Harris <mark.hsj@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/aiffdec.c

index ff04c2b8f4b509e86f262ac7a6d52e4b28a559cd..f26951dcf86e1f92b1f4677a1e95082e00f7ace1 100644 (file)
@@ -91,7 +91,7 @@ static void get_meta(AVFormatContext *s, const char *key, int size)
 }
 
 /* Returns the number of sound data frames or negative on error */
-static unsigned int get_aiff_header(AVFormatContext *s, int size,
+static int get_aiff_header(AVFormatContext *s, int size,
                                     unsigned version)
 {
     AVIOContext *pb        = s->pb;
@@ -99,7 +99,7 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size,
     AIFFInputContext *aiff = s->priv_data;
     int exp;
     uint64_t val;
-    double sample_rate;
+    int sample_rate;
     unsigned int num_frames;
 
     if (size & 1)
@@ -109,9 +109,16 @@ static unsigned int get_aiff_header(AVFormatContext *s, int size,
     num_frames = avio_rb32(pb);
     codec->bits_per_coded_sample = avio_rb16(pb);
 
-    exp = avio_rb16(pb);
+    exp = avio_rb16(pb) - 16383 - 63;
     val = avio_rb64(pb);
-    sample_rate = ldexp(val, exp - 16383 - 63);
+    if (exp <-63 || exp >63) {
+        av_log(s, AV_LOG_ERROR, "exp %d is out of range\n", exp);
+        return AVERROR_INVALIDDATA;
+    }
+    if (exp >= 0)
+        sample_rate = val << exp;
+    else
+        sample_rate = (val + (1ULL<<(-exp-1))) >> -exp;
     codec->sample_rate = sample_rate;
     size -= 18;