@ -62,6 +62,7 @@
typedef struct AC3Block {
uint8_t * * bap ; ///< bit allocation pointers (bap)
CoefType * * mdct_coef ; ///< MDCT coefficients
int32_t * * fixed_coef ; ///< fixed-point MDCT coefficients
uint8_t * * exp ; ///< original exponents
uint8_t * * grouped_exp ; ///< grouped exponents
int16_t * * psd ; ///< psd per frequency bin
@ -128,6 +129,7 @@ typedef struct AC3EncodeContext {
uint8_t * bap_buffer ;
uint8_t * bap1_buffer ;
CoefType * mdct_coef_buffer ;
int32_t * fixed_coef_buffer ;
uint8_t * exp_buffer ;
uint8_t * grouped_exp_buffer ;
int16_t * psd_buffer ;
@ -153,6 +155,8 @@ static void apply_window(SampleType *output, const SampleType *input,
static int normalize_samples ( AC3EncodeContext * s ) ;
static void scale_coefficients ( AC3EncodeContext * s ) ;
/**
* LUT for number of exponent groups .
@ -286,11 +290,11 @@ static void extract_exponents(AC3EncodeContext *s)
for ( blk = 0 ; blk < AC3_MAX_BLOCKS ; blk + + ) {
AC3Block * block = & s - > blocks [ blk ] ;
uint8_t * exp = block - > exp [ ch ] ;
CoefType * coef = block - > mdct _coef[ ch ] ;
int32_t * coef = block - > fixed _coef[ ch ] ;
int exp_shift = block - > exp_shift [ ch ] ;
for ( i = 0 ; i < AC3_MAX_COEFS ; i + + ) {
int e ;
int v = abs ( SCALE_COEF ( coef [ i ] ) ) ;
int v = abs ( coef [ i ] ) ;
if ( v = = 0 )
e = 24 ;
else {
@ -1017,7 +1021,7 @@ static inline int asym_quant(int c, int e, int qbits)
/**
* Quantize a set of mantissas for a single channel in a single block .
*/
static void quantize_mantissas_blk_ch ( AC3EncodeContext * s , CoefType * mdct _coef,
static void quantize_mantissas_blk_ch ( AC3EncodeContext * s , int32_t * fixed _coef,
int8_t exp_shift , uint8_t * exp ,
uint8_t * bap , uint16_t * qmant , int n )
{
@ -1025,7 +1029,7 @@ static void quantize_mantissas_blk_ch(AC3EncodeContext *s, CoefType *mdct_coef,
for ( i = 0 ; i < n ; i + + ) {
int v ;
int c = SCALE_COEF ( mdct _coef[ i ] ) ;
int c = fixed _coef[ i ] ;
int e = exp [ i ] - exp_shift ;
int b = bap [ i ] ;
switch ( b ) {
@ -1122,7 +1126,7 @@ static void quantize_mantissas(AC3EncodeContext *s)
s - > qmant1_ptr = s - > qmant2_ptr = s - > qmant4_ptr = NULL ;
for ( ch = 0 ; ch < s - > channels ; ch + + ) {
quantize_mantissas_blk_ch ( s , block - > mdct _coef[ ch ] , block - > exp_shift [ ch ] ,
quantize_mantissas_blk_ch ( s , block - > fixed _coef[ ch ] , block - > exp_shift [ ch ] ,
block - > exp [ ch ] , block - > bap [ ch ] ,
block - > qmant [ ch ] , s - > nb_coefs [ ch ] ) ;
}
@ -1390,6 +1394,8 @@ static int ac3_encode_frame(AVCodecContext *avctx, unsigned char *frame,
apply_mdct ( s ) ;
scale_coefficients ( s ) ;
process_exponents ( s ) ;
ret = compute_bit_allocation ( s ) ;
@ -1420,6 +1426,7 @@ static av_cold int ac3_encode_close(AVCodecContext *avctx)
av_freep ( & s - > bap_buffer ) ;
av_freep ( & s - > bap1_buffer ) ;
av_freep ( & s - > mdct_coef_buffer ) ;
av_freep ( & s - > fixed_coef_buffer ) ;
av_freep ( & s - > exp_buffer ) ;
av_freep ( & s - > grouped_exp_buffer ) ;
av_freep ( & s - > psd_buffer ) ;
@ -1430,6 +1437,7 @@ static av_cold int ac3_encode_close(AVCodecContext *avctx)
AC3Block * block = & s - > blocks [ blk ] ;
av_freep ( & block - > bap ) ;
av_freep ( & block - > mdct_coef ) ;
av_freep ( & block - > fixed_coef ) ;
av_freep ( & block - > exp ) ;
av_freep ( & block - > grouped_exp ) ;
av_freep ( & block - > psd ) ;
@ -1639,6 +1647,26 @@ static av_cold int allocate_buffers(AVCodecContext *avctx)
}
}
if ( CONFIG_AC3ENC_FLOAT ) {
FF_ALLOC_OR_GOTO ( avctx , s - > fixed_coef_buffer , AC3_MAX_BLOCKS * s - > channels *
AC3_MAX_COEFS * sizeof ( * s - > fixed_coef_buffer ) , alloc_fail ) ;
for ( blk = 0 ; blk < AC3_MAX_BLOCKS ; blk + + ) {
AC3Block * block = & s - > blocks [ blk ] ;
FF_ALLOCZ_OR_GOTO ( avctx , block - > fixed_coef , s - > channels *
sizeof ( * block - > fixed_coef ) , alloc_fail ) ;
for ( ch = 0 ; ch < s - > channels ; ch + + )
block - > fixed_coef [ ch ] = & s - > fixed_coef_buffer [ AC3_MAX_COEFS * ( blk * s - > channels + ch ) ] ;
}
} else {
for ( blk = 0 ; blk < AC3_MAX_BLOCKS ; blk + + ) {
AC3Block * block = & s - > blocks [ blk ] ;
FF_ALLOCZ_OR_GOTO ( avctx , block - > fixed_coef , s - > channels *
sizeof ( * block - > fixed_coef ) , alloc_fail ) ;
for ( ch = 0 ; ch < s - > channels ; ch + + )
block - > fixed_coef [ ch ] = ( int32_t * ) block - > mdct_coef [ ch ] ;
}
}
return 0 ;
alloc_fail :
return AVERROR ( ENOMEM ) ;