@ -39,6 +39,9 @@
# include "dsputil.h"
# include "random.h"
/** Maximum possible frame size when the specification limit is ignored */
# define AC3_MAX_FRAME_SIZE 21695
/**
* Table of bin locations for rematrixing bands
* reference : Section 7.5 .2 Rematrixing : Frequency Band Definitions
@ -191,6 +194,7 @@ typedef struct {
GetBitContext gbc ; ///< bitstream reader
AVRandomState dith_state ; ///< for dither generation
AVCodecContext * avctx ; ///< parent context
uint8_t input_buffer [ AC3_MAX_FRAME_SIZE ] ; ///< temp buffer to prevent overread
} AC3DecodeContext ;
/**
@ -1133,7 +1137,14 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size,
int i , blk , ch , err ;
/* initialize the GetBitContext with the start of valid AC-3 Frame */
if ( avctx - > error_resilience > = FF_ER_CAREFUL ) {
/* copy input buffer to decoder context to avoid reading past the end
of the buffer , which can be caused by a damaged input stream . */
memcpy ( s - > input_buffer , buf , FFMIN ( buf_size , AC3_MAX_FRAME_SIZE ) ) ;
init_get_bits ( & s - > gbc , s - > input_buffer , buf_size * 8 ) ;
} else {
init_get_bits ( & s - > gbc , buf , buf_size * 8 ) ;
}
/* parse the syncinfo */
err = ac3_parse_header ( s ) ;