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