summaryrefslogtreecommitdiff
path: root/libavformat/aiffdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-06-07 23:50:13 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-06-11 13:09:46 +0200
commit70af8a5efb238b0c7a4a220facd8083455e9857d (patch)
tree317d735933bba71e47078f6a9811f4da6c00b320 /libavformat/aiffdec.c
parente4fb8816f99d09aa6436bff0e4e2453a02b053e1 (diff)
downloadffmpeg-70af8a5efb238b0c7a4a220facd8083455e9857d.tar.gz
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 <mark.hsj@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/aiffdec.c')
-rw-r--r--libavformat/aiffdec.c15
1 files 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;