static int decode_audio_specific_config(AACContext *ac,
AVCodecContext *avctx,
MPEG4AudioConfig *m4ac,
- const uint8_t *data, int bit_size,
+ const uint8_t *data, int64_t bit_size,
int sync_extension)
{
GetBitContext gb;
int i, ret;
- ff_dlog(avctx, "audio specific config size %d\n", bit_size >> 3);
+ if (bit_size < 0 || bit_size > INT_MAX) {
+ av_log(avctx, AV_LOG_ERROR, "Audio specific config size is invalid\n");
+ return AVERROR_INVALIDDATA;
+ }
+
+ ff_dlog(avctx, "audio specific config size %d\n", (int)bit_size >> 3);
for (i = 0; i < bit_size >> 3; i++)
ff_dlog(avctx, "%02x ", data[i]);
ff_dlog(avctx, "\n");
if (avctx->extradata_size > 0) {
if ((ret = decode_audio_specific_config(ac, ac->avctx, &ac->oc[1].m4ac,
avctx->extradata,
- avctx->extradata_size * 8,
+ avctx->extradata_size * 8LL,
1)) < 0)
return ret;
} else {
/**
* Convert spectral data to samples, applying all supported tools as appropriate.
*/
-static void spectral_to_sample(AACContext *ac)
+static void spectral_to_sample(AACContext *ac, int samples)
{
int i, type;
void (*imdct_and_window)(AACContext *ac, SingleChannelElement *sce);
{
int j;
/* preparation for resampler */
- for(j = 0; j<2048; j++){
+ for(j = 0; j<samples; j++){
che->ch[0].ret[j] = (int32_t)av_clipl_int32((int64_t)che->ch[0].ret[j]<<7)+0x8000;
- che->ch[1].ret[j] = (int32_t)av_clipl_int32((int64_t)che->ch[1].ret[j]<<7)+0x8000;
+ if(type == TYPE_CPE)
+ che->ch[1].ret[j] = (int32_t)av_clipl_int32((int64_t)che->ch[1].ret[j]<<7)+0x8000;
}
}
#endif /* USE_FIXED */
return err;
}
- spectral_to_sample(ac);
+ spectral_to_sample(ac, samples);
ac->frame->nb_samples = samples;
ac->frame->sample_rate = avctx->sample_rate;
return 0;
}
- spectral_to_sample(ac);
-
multiplier = (ac->oc[1].m4ac.sbr == 1) ? ac->oc[1].m4ac.ext_sample_rate > ac->oc[1].m4ac.sample_rate : 0;
samples <<= multiplier;
+ spectral_to_sample(ac, samples);
+
if (ac->oc[1].status && audio_found) {
avctx->sample_rate = ac->oc[1].m4ac.sample_rate << multiplier;
avctx->frame_size = samples;
push_output_configuration(ac);
if (decode_audio_specific_config(ac, ac->avctx, &ac->oc[1].m4ac,
avctx->extradata,
- avctx->extradata_size*8, 1) < 0) {
+ avctx->extradata_size*8LL, 1) < 0) {
pop_output_configuration(ac);
return AVERROR_INVALIDDATA;
}
if (INT_MAX / 8 <= buf_size)
return AVERROR_INVALIDDATA;
- if ((err = init_get_bits(&gb, buf, buf_size * 8)) < 0)
+ if ((err = init_get_bits8(&gb, buf, buf_size)) < 0)
return err;
switch (ac->oc[1].m4ac.object_type) {