X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fbinkaudio.c;h=381fc4cd1509a25fa1e05aafe0ecedbccd5c81f7;hb=e15371061d23457554d241a80dc471515ac13ad4;hp=96cf968c66e6e2bb4eccc2986eaab865d7279cd6;hpb=409e684e79b6ee0c511292326f09b13fe230e58e;p=ffmpeg diff --git a/libavcodec/binkaudio.c b/libavcodec/binkaudio.c index 96cf968c66e..381fc4cd150 100644 --- a/libavcodec/binkaudio.c +++ b/libavcodec/binkaudio.c @@ -30,6 +30,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/intfloat.h" +#include "libavutil/mem_internal.h" #define BITSTREAM_READER_LE #include "avcodec.h" @@ -40,8 +41,6 @@ #include "rdft.h" #include "wma_freqs.h" -static float quant_table[96]; - #define MAX_CHANNELS 2 #define BINK_BLOCK_MAX_SIZE (MAX_CHANNELS << 11) @@ -54,10 +53,10 @@ typedef struct BinkAudioContext { int overlap_len; ///< overlap size (samples) int block_size; int num_bands; - unsigned int *bands; float root; - DECLARE_ALIGNED(32, FFTSample, coeffs)[BINK_BLOCK_MAX_SIZE]; + unsigned int bands[26]; float previous[MAX_CHANNELS][BINK_BLOCK_MAX_SIZE / 16]; ///< coeffs from previous audio block + float quant_table[96]; AVPacket *pkt; union { RDFTContext rdft; @@ -95,6 +94,8 @@ static av_cold int decode_init(AVCodecContext *avctx) if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) { // audio is already interleaved for the RDFT format variant avctx->sample_fmt = AV_SAMPLE_FMT_FLT; + if (sample_rate > INT_MAX / avctx->channels) + return AVERROR_INVALIDDATA; sample_rate *= avctx->channels; s->channels = 1; if (!s->version_b) @@ -107,14 +108,14 @@ static av_cold int decode_init(AVCodecContext *avctx) s->frame_len = 1 << frame_len_bits; s->overlap_len = s->frame_len / 16; s->block_size = (s->frame_len - s->overlap_len) * s->channels; - sample_rate_half = (sample_rate + 1) / 2; + sample_rate_half = (sample_rate + 1LL) / 2; if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) s->root = 2.0 / (sqrt(s->frame_len) * 32768.0); else s->root = s->frame_len / (sqrt(s->frame_len) * 32768.0); for (i = 0; i < 96; i++) { /* constant is result of 0.066399999/log10(M_E) */ - quant_table[i] = expf(i * 0.15289164787221953823f) * s->root; + s->quant_table[i] = expf(i * 0.15289164787221953823f) * s->root; } /* calculate number of bands */ @@ -122,10 +123,6 @@ static av_cold int decode_init(AVCodecContext *avctx) if (sample_rate_half <= ff_wma_critical_freqs[s->num_bands - 1]) break; - s->bands = av_malloc((s->num_bands + 1) * sizeof(*s->bands)); - if (!s->bands) - return AVERROR(ENOMEM); - /* populate bands data */ s->bands[0] = 2; for (i = 1; i < s->num_bands; i++) @@ -151,7 +148,7 @@ static av_cold int decode_init(AVCodecContext *avctx) static float get_float(GetBitContext *gb) { int power = get_bits(gb, 5); - float f = ldexpf(get_bits_long(gb, 23), power - 23); + float f = ldexpf(get_bits(gb, 23), power - 23); if (get_bits1(gb)) f = -f; return f; @@ -195,7 +192,7 @@ static int decode_block(BinkAudioContext *s, float **out, int use_dct) return AVERROR_INVALIDDATA; for (i = 0; i < s->num_bands; i++) { int value = get_bits(gb, 8); - quant[i] = quant_table[FFMIN(value, 95)]; + quant[i] = s->quant_table[FFMIN(value, 95)]; } k = 0; @@ -273,7 +270,6 @@ static int decode_block(BinkAudioContext *s, float **out, int use_dct) static av_cold int decode_end(AVCodecContext *avctx) { BinkAudioContext * s = avctx->priv_data; - av_freep(&s->bands); if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) ff_rdft_end(&s->trans.rdft); else if (CONFIG_BINKAUDIO_DCT_DECODER)