From b4027d97498af67313bded746b3da38915e155f5 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Thu, 16 Feb 2012 13:51:17 -0800 Subject: [PATCH] wmapro: change max. block size to 13 bits. WMApro actually support 13-bits block sizes (potentially even up to 14), and thus we should support that also. If we get block sizes beyond what the decoder can handle (14 is possible depending on s->decode_flags), error out instead of crashing. --- libavcodec/sinewin.h | 3 ++- libavcodec/sinewin_tablegen.c | 2 +- libavcodec/sinewin_tablegen.h | 3 ++- libavcodec/wmaprodec.c | 12 ++++++++---- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/libavcodec/sinewin.h b/libavcodec/sinewin.h index eefe5bf..8054191 100644 --- a/libavcodec/sinewin.h +++ b/libavcodec/sinewin.h @@ -53,7 +53,8 @@ extern SINETABLE( 512); extern SINETABLE(1024); extern SINETABLE(2048); extern SINETABLE(4096); +extern SINETABLE(8192); -extern SINETABLE_CONST float * const ff_sine_windows[13]; +extern SINETABLE_CONST float * const ff_sine_windows[14]; #endif /* AVCODEC_SINEWIN_H */ diff --git a/libavcodec/sinewin_tablegen.c b/libavcodec/sinewin_tablegen.c index 2f4d1aa..d5e0689 100644 --- a/libavcodec/sinewin_tablegen.c +++ b/libavcodec/sinewin_tablegen.c @@ -38,7 +38,7 @@ int main(void) write_fileheader(); - for (i = 5; i <= 12; i++) { + for (i = 5; i <= 13; i++) { ff_init_ff_sine_windows(i); printf("SINETABLE(%4i) = {\n", 1 << i); write_float_array(ff_sine_windows[i], 1 << i); diff --git a/libavcodec/sinewin_tablegen.h b/libavcodec/sinewin_tablegen.h index 720f1ab..7d92026 100644 --- a/libavcodec/sinewin_tablegen.h +++ b/libavcodec/sinewin_tablegen.h @@ -38,6 +38,7 @@ SINETABLE( 512); SINETABLE(1024); SINETABLE(2048); SINETABLE(4096); +SINETABLE(8192); #else #include "libavcodec/sinewin_tables.h" #endif @@ -45,7 +46,7 @@ SINETABLE(4096); SINETABLE_CONST float * const ff_sine_windows[] = { NULL, NULL, NULL, NULL, NULL, // unused ff_sine_32 , ff_sine_64 , - ff_sine_128, ff_sine_256, ff_sine_512, ff_sine_1024, ff_sine_2048, ff_sine_4096 + ff_sine_128, ff_sine_256, ff_sine_512, ff_sine_1024, ff_sine_2048, ff_sine_4096, ff_sine_8192 }; // Generate a sine window. diff --git a/libavcodec/wmaprodec.c b/libavcodec/wmaprodec.c index 2f2cbd6..444e8a5 100644 --- a/libavcodec/wmaprodec.c +++ b/libavcodec/wmaprodec.c @@ -105,7 +105,7 @@ #define MAX_FRAMESIZE 32768 ///< maximum compressed frame size #define WMAPRO_BLOCK_MIN_BITS 6 ///< log2 of min block size -#define WMAPRO_BLOCK_MAX_BITS 12 ///< log2 of max block size +#define WMAPRO_BLOCK_MAX_BITS 13 ///< log2 of max block size #define WMAPRO_BLOCK_MAX_SIZE (1 << WMAPRO_BLOCK_MAX_BITS) ///< maximum block size #define WMAPRO_BLOCK_SIZES (WMAPRO_BLOCK_MAX_BITS - WMAPRO_BLOCK_MIN_BITS + 1) ///< possible block sizes @@ -276,7 +276,7 @@ static av_cold int decode_init(AVCodecContext *avctx) WMAProDecodeCtx *s = avctx->priv_data; uint8_t *edata_ptr = avctx->extradata; unsigned int channel_mask; - int i; + int i, bits; int log2_max_num_subframes; int num_possible_block_sizes; @@ -310,8 +310,12 @@ static av_cold int decode_init(AVCodecContext *avctx) s->len_prefix = (s->decode_flags & 0x40); /** get frame len */ - s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(avctx->sample_rate, - 3, s->decode_flags); + bits = ff_wma_get_frame_len_bits(avctx->sample_rate, 3, s->decode_flags); + if (bits > WMAPRO_BLOCK_MAX_BITS) { + av_log_missing_feature(avctx, "14-bits block sizes", 1); + return AVERROR_INVALIDDATA; + } + s->samples_per_frame = 1 << bits; /** subframe info */ log2_max_num_subframes = ((s->decode_flags & 0x38) >> 3); -- 2.7.4