From 70af8a5efb238b0c7a4a220facd8083455e9857d Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 7 Jun 2015 23:50:13 +0200 Subject: [PATCH] avformat/aiffdec: avoid double and ldexp() 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 Signed-off-by: Michael Niedermayer --- libavformat/aiffdec.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c index ff04c2b8f4..f26951dcf8 100644 --- a/libavformat/aiffdec.c +++ b/libavformat/aiffdec.c @@ -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;