@ -219,6 +219,51 @@ static inline int16_t dither_int16(dither_state *state)
/* END Mersenne Twister */
/**
* Generate a Kaiser Window .
*/
static void
k_window_init ( int alpha , double * window , int n , int iter )
{
int j , k ;
double a , x ;
a = alpha * M_PI / n ;
a = a * a ;
for ( k = 0 ; k < n ; k + + ) {
x = k * ( n - k ) * a ;
window [ k ] = 1.0 ;
for ( j = iter ; j > 0 ; j - - ) {
window [ k ] = ( window [ k ] * x / ( j * j ) ) + 1.0 ;
}
}
}
/**
* Generate a Kaiser - Bessel Derived Window .
* @ param alpha determines window shape
* @ param window array to fill with window values
* @ param n length of the window
* @ param iter number of iterations to use in BesselI0
*/
static void
kbd_window_init ( int alpha , double * window , int n , int iter )
{
int k , n2 ;
double * kwindow ;
n2 = n > > 1 ;
kwindow = & window [ n2 ] ;
k_window_init ( alpha , kwindow , n2 , iter ) ;
window [ 0 ] = kwindow [ 0 ] ;
for ( k = 1 ; k < n2 ; k + + ) {
window [ k ] = window [ k - 1 ] + kwindow [ k ] ;
}
for ( k = 0 ; k < n2 ; k + + ) {
window [ k ] = sqrt ( window [ k ] / ( window [ n2 - 1 ] + 1 ) ) ;
window [ n - 1 - k ] = window [ k ] ;
}
}
static void generate_quantizers_table ( int16_t quantizers [ ] , int level , int length )
{
int i ;
@ -342,6 +387,9 @@ static void ac3_tables_init(void)
x_cos2 [ i ] = - cos ( alpha ) ;
x_sin2 [ i ] = - sin ( alpha ) ;
}
/* Kaiser-Bessel derived window. */
kbd_window_init ( 5 , window , 256 , 100 ) ;
}
@ -374,8 +422,6 @@ static int ac3_parse_sync_info(AC3DecodeContext *ctx)
GetBitContext * gb = & ctx - > gb ;
int frmsizecod , bsid ;
memset ( ctx , sizeof ( AC3DecodeContext ) , 0 ) ;
skip_bits ( gb , 16 ) ; //skip the sync_word, sync_info->sync_word = get_bits(gb, 16);
ctx - > crc1 = get_bits ( gb , 16 ) ;
ctx - > fscod = get_bits ( gb , 2 ) ;
@ -471,7 +517,6 @@ static void ac3_parse_bsi(AC3DecodeContext *ctx)
static int decode_exponents ( GetBitContext * gb , int expstr , int ngrps , uint8_t absexp , uint8_t * dexps )
{
int exps ;
av_log ( NULL , AV_LOG_INFO , " %d \n " , ngrps ) ;
while ( ngrps - - ) {
exps = get_bits ( gb , 7 ) ;
@ -530,7 +575,7 @@ static inline int logadd(int a, int b)
int c = a - b ;
int address ;
address = FFMIN ( ABS ( c ) > > 1 , 255 ) ;
address = FFMIN ( ( ABS ( c ) > > 1 ) , 255 ) ;
if ( c > = 0 )
return ( a + latab [ address ] ) ;
@ -544,16 +589,16 @@ static inline int calc_lowcomp(int a, int b0, int b1, int bin)
if ( ( b0 + 256 ) = = b1 )
a = 384 ;
else if ( b0 > b1 )
a = FFMAX ( 0 , a - 64 ) ;
a = FFMAX ( 0 , ( a - 64 ) ) ;
}
else if ( bin < 20 ) {
if ( ( b0 + 256 ) = = b1 )
a = 320 ;
else if ( b0 > b1 )
a = FFMAX ( 0 , a - 64 ) ;
a = FFMAX ( 0 , ( a - 64 ) ) ;
}
else
a = FFMAX ( 0 , a - 128 ) ;
a = FFMAX ( 0 , ( a - 128 ) ) ;
return a ;
}
@ -563,17 +608,16 @@ static inline int calc_lowcomp(int a, int b0, int b1, int bin)
* chnl = 5 coupling channel
* chnl = 6 lfe channel
*/
static void do_bit_allocation1 ( AC3DecodeContext * ctx , int chnl )
static void do_bit_allocation ( AC3DecodeContext * ctx , int chnl )
{
int16_t psd [ 256 ] , bndpsd [ 50 ] , excite [ 50 ] , mask [ 50 ] , delta ;
int sdecay , fdecay , sgain , dbknee , floor ;
int lowcomp = 0 , fgain = 0 , snroffset = 0 , fastleak = 0 , slowleak = 0 ;
int psd [ 256 ] , bndpsd [ 50 ] , excite [ 50 ] , mask [ 50 ] , delta ;
int lowcomp = 0 , fgain = 0 , snroffset = 0 , fastleak = 0 , slowleak = 0 , do_delta = 0 ;
int start = 0 , end = 0 , bin = 0 , i = 0 , j = 0 , k = 0 , lastbin = 0 , bndstrt = 0 ;
int bndend = 0 , begin = 0 , deltnseg = 0 , band = 0 , seg = 0 , address = 0 ;
int fscod = ctx - > fscod ;
uint8_t * exps , * deltoffst = 0 , * deltlen = 0 , * deltba = 0 ;
uint8_t * baps ;
int do_delta = 0 ;
uint8_t * deltoffst = 0 , * deltlen = 0 , * deltba = 0 ;
uint8_t * exps = 0 , * bap = 0 ;
/* initialization */
sdecay = sdecaytab [ ctx - > sdcycod ] ;
@ -590,8 +634,8 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
fastleak = ( ctx - > cplfleak < < 8 ) + 768 ;
slowleak = ( ctx - > cplsleak < < 8 ) + 768 ;
exps = ctx - > dcplexps ;
baps = ctx - > cplbap ;
if ( ctx - > cpldeltbae = = AC3_DBASTR_NEW ) {
bap = ctx - > cplbap ;
if ( ctx - > cpldeltbae = = AC3_DBASTR_NEW | | ctx - > deltbae = = AC3_DBASTR_REUSE ) {
do_delta = 1 ;
deltnseg = ctx - > cpldeltnseg ;
deltoffst = ctx - > cpldeltoffst ;
@ -608,7 +652,7 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
fgain = fgaintab [ ctx - > lfefgaincod ] ;
snroffset = ( ( ( ctx - > csnroffst - 15 ) < < 4 ) + ctx - > lfefsnroffst ) < < 2 ;
exps = ctx - > dlfeexps ;
baps = ctx - > lfebap ;
bap = ctx - > lfebap ;
}
else {
start = 0 ;
@ -619,8 +663,8 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
fgain = fgaintab [ ctx - > fgaincod [ chnl ] ] ;
snroffset = ( ( ( ctx - > csnroffst - 15 ) < < 4 ) + ctx - > fsnroffst [ chnl ] ) < < 2 ;
exps = ctx - > dexps [ chnl ] ;
baps = ctx - > bap [ chnl ] ;
if ( ctx - > deltbae [ chnl ] = = AC3_DBASTR_NEW ) {
bap = ctx - > bap [ chnl ] ;
if ( ctx - > deltbae [ chnl ] = = AC3_DBASTR_NEW | | ctx - > deltbae [ chnl ] = = AC3_DBASTR_REUSE ) {
do_delta = 1 ;
deltnseg = ctx - > deltnseg [ chnl ] ;
deltoffst = ctx - > deltoffst [ chnl ] ;
@ -630,13 +674,13 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
}
for ( bin = start ; bin < end ; bin + + ) /* exponent mapping into psd */
psd [ bin ] = ( 3072 - ( ( int ) ( exps [ bin ] ) < < 7 ) ) ;
psd [ bin ] = ( 3072 - ( exps [ bin ] < < 7 ) ) ;
/* psd integration */
j = start ;
k = masktab [ start ] ;
do {
lastbin = FFMIN ( bndtab [ k ] + bndsz [ k ] , end ) ;
lastbin = FFMIN ( ( bndtab [ k ] + bndsz [ k ] ) , end ) ;
bndpsd [ k ] = psd [ j ] ;
j + + ;
for ( i = j ; i < lastbin ; i + + ) {
@ -656,25 +700,25 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
excite [ 1 ] = bndpsd [ 1 ] - fgain - lowcomp ;
begin = 7 ;
for ( bin = 2 ; bin < 7 ; bin + + ) {
if ( ! ( chnl = = 6 & & bin = = 6 ) )
if ( ( bndend ! = 7 ) | | ( bin ! = 6 ) )
lowcomp = calc_lowcomp ( lowcomp , bndpsd [ bin ] , bndpsd [ bin + 1 ] , bin ) ;
fastleak = bndpsd [ bin ] - fgain ;
slowleak = bndpsd [ bin ] - sgain ;
excite [ bin ] = fastleak - lowcomp ;
if ( ! ( chnl = = 6 & & bin = = 6 ) )
if ( ( bndend ! = 7 ) | | ( bin ! = 6 ) )
if ( bndpsd [ bin ] < = bndpsd [ bin + 1 ] ) {
begin = bin + 1 ;
break ;
}
}
for ( bin = begin ; bin < FFMIN ( bndend , 22 ) ; bin + + ) {
if ( ! ( chnl = = 6 & & bin = = 6 ) )
if ( ( bndend ! = 7 ) | | ( bin ! = 6 ) )
lowcomp = calc_lowcomp ( lowcomp , bndpsd [ bin ] , bndpsd [ bin + 1 ] , bin ) ;
fastleak - = fdecay ;
fastleak = FFMAX ( fastleak , bndpsd [ bin ] - fgain ) ;
fastleak = FFMAX ( fastleak , ( bndpsd [ bin ] - fgain ) ) ;
slowleak - = sdecay ;
slowleak = FFMAX ( slowleak , bndpsd [ bin ] - sgain ) ;
excite [ bin ] = FFMAX ( fastleak - lowcomp , slowleak ) ;
slowleak = FFMAX ( slowleak , ( bndpsd [ bin ] - sgain ) ) ;
excite [ bin ] = FFMAX ( ( fastleak - lowcomp ) , slowleak ) ;
}
begin = 22 ;
}
@ -683,9 +727,9 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
}
for ( bin = begin ; bin < bndend ; bin + + ) {
fastleak - = fdecay ;
fastleak = FFMAX ( fastleak , bndpsd [ bin ] - fgain ) ;
fastleak = FFMAX ( fastleak , ( bndpsd [ bin ] - fgain ) ) ;
slowleak - = sdecay ;
slowleak = FFMAX ( slowleak , bndpsd [ bin ] - sgain ) ;
slowleak = FFMAX ( slowleak , ( bndpsd [ bin ] - sgain ) ) ;
excite [ bin ] = FFMAX ( fastleak , slowleak ) ;
}
@ -700,12 +744,12 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
if ( do_delta ) {
band = 0 ;
for ( seg = 0 ; seg < deltnseg + 1 ; seg + + ) {
band + = ( int ) ( deltoffst [ seg ] ) ;
if ( ( int ) ( deltba [ seg ] ) > = 4 )
delta = ( ( int ) ( deltba [ seg ] ) - 3 ) < < 7 ;
band + = deltoffst [ seg ] ;
if ( deltba [ seg ] > = 4 )
delta = ( deltba [ seg ] - 3 ) < < 7 ;
else
delta = ( ( int ) ( deltba [ seg ] ) - 4 ) < < 7 ;
for ( k = 0 ; k < ( int ) ( deltlen [ seg ] ) ; k + + ) {
delta = ( deltba [ seg ] - 4 ) < < 7 ;
for ( k = 0 ; k < deltlen [ seg ] ; k + + ) {
mask [ band ] + = delta ;
band + + ;
}
@ -716,7 +760,7 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
i = start ;
j = masktab [ start ] ;
do {
lastbin = FFMIN ( bndtab [ j ] + bndsz [ j ] , end ) ;
lastbin = FFMIN ( ( bndtab [ j ] + bndsz [ j ] ) , end ) ;
mask [ j ] - = snroffset ;
mask [ j ] - = floor ;
if ( mask [ j ] < 0 )
@ -725,48 +769,28 @@ static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
mask [ j ] + = floor ;
for ( k = i ; k < lastbin ; k + + ) {
address = ( psd [ i ] - mask [ j ] ) > > 5 ;
address = FFMIN ( 63 , FFMAX ( 0 , address ) ) ;
baps [ i ] = baptab [ address ] ;
address = FFMIN ( 63 , ( FFMAX ( 0 , address ) ) ) ;
bap [ i ] = baptab [ address ] ;
i + + ;
}
j + + ;
} while ( end > lastbin ) ;
}
static void do_bit_allocation ( AC3DecodeContext * ctx , int flags )
/* Check if snroffsets are zero. */
static int is_snr_offsets_zero ( AC3DecodeContext * ctx )
{
int i , zerosnroffst = 1 ;
if ( ! flags ) /* bit allocation is not required */
return ;
int i ;
/* Check if snroffsets are zero. */
if ( ( ctx - > csnroffst ) | | ( ctx - > chincpl & & ctx - > cplfsnroffst ) | |
if ( ( ctx - > csnroffst ) | | ( ctx - > cplinu & & ctx - > cplfsnroffst ) | |
( ctx - > lfeon & & ctx - > lfefsnroffst ) )
zerosnroffst = 0 ;
if ( zerosnroffst )
for ( i = 0 ; i < ctx - > nfchans ; i + + )
if ( ctx - > fsnroffst [ i ] ) {
zerosnroffst = 0 ;
break ;
}
if ( zerosnroffst ) {
memset ( ctx - > cplbap , 0 , sizeof ( ctx - > cplbap ) ) ;
for ( i = 0 ; i < ctx - > nfchans ; i + + )
memset ( ctx - > bap [ i ] , 0 , sizeof ( ctx - > bap [ i ] ) ) ;
memset ( ctx - > lfebap , 0 , sizeof ( ctx - > lfebap ) ) ;
return ;
}
return 0 ;
/* perform bit allocation */
if ( ctx - > cplinu & & ( flags & 64 ) )
do_bit_allocation1 ( ctx , 5 ) ;
for ( i = 0 ; i < ctx - > nfchans ; i + + )
if ( flags & ( 1 < < i ) )
do_bit_allocation1 ( ctx , i ) ;
if ( ctx - > lfeon & & ( flags & 32 ) )
do_bit_allocation1 ( ctx , 6 ) ;
if ( ctx - > fsnroffst [ i ] )
return 0 ;
return 1 ;
}
typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */
@ -776,7 +800,6 @@ typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantizati
int l3ptr ;
int l5ptr ;
int l11ptr ;
int bits ;
} mant_groups ;
# define TRANSFORM_COEFF(tc, m, e, f) (tc) = (m) * (f)[(e)]
@ -789,13 +812,11 @@ typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantizati
static int get_transform_coeffs_cpling ( AC3DecodeContext * ctx , mant_groups * m )
{
GetBitContext * gb = & ctx - > gb ;
int ch , bin , start , end , cplbndstrc , bnd , gcode , tbap ;
int ch , start , end , cplbndstrc , bnd , gcode , tbap ;
float cplcos [ 5 ] , cplcoeff ;
uint8_t * exps = ctx - > dcplexps ;
uint8_t * bap = ctx - > cplbap ;
int bits_consumed = m - > bits ;
cplbndstrc = ctx - > cplbndstrc ;
start = ctx - > cplstrtmant ;
bnd = 0 ;
@ -815,9 +836,9 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m)
tbap = bap [ start ] ;
switch ( tbap ) {
case 0 :
for ( ch = 0 ; ch < ctx - > nfchans ; ctx + + )
for ( ch = 0 ; ch < ctx - > nfchans ; ch + + )
if ( ( ( ctx - > chincpl ) > > ch ) & 1 ) {
if ( ( ( ctx - > dithflag ) > > ch ) & 1 ) {
if ( ! ( ( ( ctx - > dithflag ) > > ch ) & 1 ) ) {
TRANSFORM_COEFF ( cplcoeff , dither_int16 ( & ctx - > dith_state ) , exps [ start ] , scale_factors ) ;
ctx - > transform_coeffs [ ch + 1 ] [ start ] = cplcoeff * cplcos [ ch ] ;
} else
@ -828,13 +849,10 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m)
case 1 :
if ( m - > l3ptr > 2 ) {
gcode = get_bits ( gb , 5 ) ;
/*if (gcode > 26)
return - 1 ; */
m - > l3_quantizers [ 0 ] = l3_quantizers_1 [ gcode ] ;
m - > l3_quantizers [ 1 ] = l3_quantizers_2 [ gcode ] ;
m - > l3_quantizers [ 2 ] = l3_quantizers_3 [ gcode ] ;
m - > l3ptr = 0 ;
m - > bits + = 5 ;
}
TRANSFORM_COEFF ( cplcoeff , m - > l3_quantizers [ m - > l3ptr + + ] , exps [ start ] , scale_factors ) ;
break ;
@ -842,89 +860,84 @@ static int get_transform_coeffs_cpling(AC3DecodeContext *ctx, mant_groups *m)
case 2 :
if ( m - > l5ptr > 2 ) {
gcode = get_bits ( gb , 7 ) ;
/*if (gcode > 124)
return - 1 ; */
m - > l5_quantizers [ 0 ] = l5_quantizers_1 [ gcode ] ;
m - > l5_quantizers [ 1 ] = l5_quantizers_2 [ gcode ] ;
m - > l5_quantizers [ 2 ] = l5_quantizers_3 [ gcode ] ;
m - > l5ptr = 0 ;
m - > bits + = 7 ;
}
TRANSFORM_COEFF ( cplcoeff , m - > l5_quantizers [ m - > l5ptr + + ] , exps [ start ] , scale_factors ) ;
break ;
case 3 :
gcode = get_bits ( gb , 3 ) ;
/*if (gcode > 6)
return - 1 ; */
m - > bits + = 3 ;
TRANSFORM_COEFF ( cplcoeff , l7_quantizers [ gcode ] , exps [ start ] , scale_factors ) ;
TRANSFORM_COEFF ( cplcoeff , l7_quantizers [ get_bits ( gb , 3 ) ] , exps [ start ] , scale_factors ) ;
break ;
case 4 :
if ( m - > l11ptr > 1 ) {
gcode = get_bits ( gb , 7 ) ;
/*if (gcode > 120)
return - 1 ; */
m - > l11_quantizers [ 0 ] = l11_quantizers_1 [ gcode ] ;
m - > l11_quantizers [ 1 ] = l11_quantizers_2 [ gcode ] ;
m - > l11ptr = 0 ;
m - > bits + = 7 ;
}
TRANSFORM_COEFF ( cplcoeff , m - > l11_quantizers [ m - > l11ptr + + ] , exps [ start ] , scale_factors ) ;
break ;
case 5 :
gcode = get_bits ( gb , 4 ) ;
/*if (gcode > 14)
return - 1 ; */
m - > bits + = 4 ;
TRANSFORM_COEFF ( cplcoeff , l15_quantizers [ gcode ] , exps [ start ] , scale_factors ) ;
TRANSFORM_COEFF ( cplcoeff , l15_quantizers [ get_bits ( gb , 4 ) ] , exps [ start ] , scale_factors ) ;
break ;
default :
m - > bits + = qntztab [ bap [ bin ] ] ;
TRANSFORM_COEFF ( cplcoeff , get_bits ( gb , qntztab [ tbap ] ) < < ( 16 - qntztab [ tbap ] ) ,
exps [ bin ] , scale_factors ) ;
exps [ start ] , scale_factors ) ;
}
for ( ch = 0 ; ch < ctx - > nfchans ; ch + + )
if ( ( ctx - > chincpl > > ch ) & 1 )
ctx - > transform_coeffs [ ch ] [ bin ] = cplcoeff * cplcos [ ch ] ;
ctx - > transform_coeffs [ ch + 1 ] [ start ] = cplcoeff * cplcos [ ch ] ;
start + + ;
}
}
bits_consumed = m - > bits - bits_consumed ;
av_log ( NULL , AV_LOG_INFO , " \t bits consumed by coupling = %d \n " , bits_consumed ) ;
return 0 ;
}
/* Get the transform coefficients for particular channel */
static int get_transform_coeffs_ch ( uint8_t * exps , uint8_t * bap , float chcoeff ,
float * coeffs , int start , int end , int dith_flag , GetBitContext * gb ,
dither_state * state , mant_groups * m )
static int get_transform_coeffs_ch ( AC3DecodeContext * ctx , int ch_index , mant_groups * m )
{
int i ;
int gcode ;
int tbap ;
GetBitContext * gb = & ctx - > gb ;
int i , gcode , tbap , dithflag , end ;
uint8_t * exps ;
uint8_t * bap ;
float * coeffs ;
float factors [ 25 ] ;
int bits_consumed = m - > bits ;
for ( i = 0 ; i < 25 ; i + + )
factors [ i ] = scale_factors [ i ] * chcoeff ;
factors [ i ] = scale_factors [ i ] * ctx - > chcoeffs [ ch_index ] ;
if ( ch_index ! = - 1 ) { /* fbw channels */
dithflag = ( ctx - > dithflag > > ch_index ) & 1 ;
exps = ctx - > dexps [ ch_index ] ;
bap = ctx - > bap [ ch_index ] ;
coeffs = ctx - > transform_coeffs [ ch_index + 1 ] ;
end = ctx - > endmant [ ch_index ] ;
} else if ( ch_index = = - 1 ) {
dithflag = 0 ;
exps = ctx - > dlfeexps ;
bap = ctx - > lfebap ;
coeffs = ctx - > transform_coeffs [ 0 ] ;
end = 7 ;
}
for ( i = start ; i < end ; i + + ) {
for ( i = 0 ; i < end ; i + + ) {
tbap = bap [ i ] ;
switch ( tbap ) {
case 0 :
if ( ! dith_flag ) {
if ( dithflag ) {
coeffs [ i ] = 0 ;
continue ;
}
else {
TRANSFORM_COEFF ( coeffs [ i ] , dither_int16 ( state ) , exps [ i ] , factors ) ;
TRANSFORM_COEFF ( coeffs [ i ] , dither_int16 ( & ctx - > dith_ state) , exps [ i ] , factors ) ;
coeffs [ i ] * = LEVEL_PLUS_3DB ;
continue ;
}
@ -932,13 +945,10 @@ static int get_transform_coeffs_ch(uint8_t *exps, uint8_t *bap, float chcoeff,
case 1 :
if ( m - > l3ptr > 2 ) {
gcode = get_bits ( gb , 5 ) ;
/*if (gcode > 26)
return - 1 ; */
m - > l3_quantizers [ 0 ] = l3_quantizers_1 [ gcode ] ;
m - > l3_quantizers [ 1 ] = l3_quantizers_2 [ gcode ] ;
m - > l3_quantizers [ 2 ] = l3_quantizers_3 [ gcode ] ;
m - > l3ptr = 0 ;
m - > bits + = 5 ;
}
TRANSFORM_COEFF ( coeffs [ i ] , m - > l3_quantizers [ m - > l3ptr + + ] , exps [ i ] , factors ) ;
continue ;
@ -946,56 +956,38 @@ static int get_transform_coeffs_ch(uint8_t *exps, uint8_t *bap, float chcoeff,
case 2 :
if ( m - > l5ptr > 2 ) {
gcode = get_bits ( gb , 7 ) ;
/*if (gcode > 124)
return - 1 ; */
m - > l5_quantizers [ 0 ] = l5_quantizers_1 [ gcode ] ;
m - > l5_quantizers [ 1 ] = l5_quantizers_2 [ gcode ] ;
m - > l5_quantizers [ 2 ] = l5_quantizers_3 [ gcode ] ;
m - > l5ptr = 0 ;
m - > bits + = 7 ;
}
TRANSFORM_COEFF ( coeffs [ i ] , m - > l5_quantizers [ m - > l5ptr + + ] , exps [ i ] , factors ) ;
continue ;
case 3 :
gcode = get_bits ( gb , 3 ) ;
/*if (gcode > 6)
return - 1 ; */
m - > bits + = 3 ;
TRANSFORM_COEFF ( coeffs [ i ] , l7_quantizers [ gcode ] , exps [ i ] , factors ) ;
TRANSFORM_COEFF ( coeffs [ i ] , l7_quantizers [ get_bits ( gb , 3 ) ] , exps [ i ] , factors ) ;
continue ;
case 4 :
if ( m - > l11ptr > 1 ) {
gcode = get_bits ( gb , 7 ) ;
/*if (gcode > 120)
return - 1 ; */
m - > l11_quantizers [ 0 ] = l11_quantizers_1 [ gcode ] ;
m - > l11_quantizers [ 1 ] = l11_quantizers_2 [ gcode ] ;
m - > l11ptr = 0 ;
m - > bits + = 7 ;
}
TRANSFORM_COEFF ( coeffs [ i ] , m - > l11_quantizers [ m - > l11ptr + + ] , exps [ i ] , factors ) ;
continue ;
case 5 :
gcode = get_bits ( gb , 4 ) ;
/*if (gcode > 14)
return - 1 ; */
m - > bits + = 4 ;
TRANSFORM_COEFF ( coeffs [ i ] , l15_quantizers [ gcode ] , exps [ i ] , factors ) ;
TRANSFORM_COEFF ( coeffs [ i ] , l15_quantizers [ get_bits ( gb , 4 ) ] , exps [ i ] , factors ) ;
continue ;
default :
m - > bits + = qntztab [ bap [ i ] ] ;
TRANSFORM_COEFF ( coeffs [ i ] , get_bits ( gb , qntztab [ tbap ] ) < < ( 16 - qntztab [ tbap ] ) , exps [ i ] , factors ) ;
continue ;
}
}
bits_consumed = m - > bits - bits_consumed ;
av_log ( NULL , AV_LOG_INFO , " \t bits consumed by channel = %d \n " , bits_consumed ) ;
return 0 ;
}
@ -1003,17 +995,13 @@ static int get_transform_coeffs(AC3DecodeContext * ctx)
{
int i , end ;
int got_cplchan = 0 ;
int dithflag = 0 ;
mant_groups m ;
m . l3ptr = m . l5ptr = m . l11ptr = 3 ;
m . bits = 0 ;
for ( i = 0 ; i < ctx - > nfchans ; i + + ) {
dithflag = ( ctx - > dithflag > > i ) & 1 ;
/* transform coefficients for individual channel */
if ( get_transform_coeffs_ch ( ctx - > dexps [ i ] , ctx - > bap [ i ] , ctx - > chcoeffs [ i ] , ctx - > transform_coeffs [ i + 1 ] ,
0 , ctx - > endmant [ i ] , dithflag , & ctx - > gb , & ctx - > dith_state , & m ) )
if ( get_transform_coeffs_ch ( ctx , i , & m ) )
return - 1 ;
/* tranform coefficients for coupling channels */
if ( ( ctx - > chincpl > > i ) & 1 ) {
@ -1032,15 +1020,13 @@ static int get_transform_coeffs(AC3DecodeContext * ctx)
while ( + + end < 256 ) ;
}
if ( ctx - > lfeon ) {
if ( get_transform_coeffs_ch ( ctx - > dlfeexps , ctx - > lfebap , 1.0f , ctx - > transform_coeffs [ 0 ] , 0 , 7 , 0 , & ctx - > gb , & ctx - > dith_state , & m ) )
if ( get_transform_coeffs_ch ( ctx , - 1 , & m ) )
return - 1 ;
for ( i = 7 ; i < 256 ; i + + ) {
ctx - > transform_coeffs [ 0 ] [ i ] = 0 ;
}
}
av_log ( NULL , AV_LOG_INFO , " bits consumed by get_transform_coeffs = %d \n " , m . bits ) ;
return 0 ;
}
@ -1059,22 +1045,27 @@ static void do_rematrixing1(AC3DecodeContext *ctx, int start, int end)
static void do_rematrixing ( AC3DecodeContext * ctx )
{
uint8_t bnd1 = 13 , bnd2 = 25 , bnd3 = 37 , bnd4 = 61 ;
uint8_t bndend ;
int bnd1 = 13 , bnd2 = 25 , bnd3 = 37 , bnd4 = 61 ;
int end , bndend ;
end = FFMIN ( ctx - > endmant [ 0 ] , ctx - > endmant [ 1 ] ) ;
bndend = FFMIN ( ctx - > endmant [ 0 ] , ctx - > endmant [ 1 ] ) ;
if ( ctx - > rematflg & 1 )
do_rematrixing1 ( ctx , bnd1 , bnd2 ) ;
if ( ctx - > rematflg & 2 )
do_rematrixing1 ( ctx , bnd2 , bnd3 ) ;
if ( ctx - > rematflg & 4 ) {
if ( ctx - > cplbegf > 0 & & ctx - > cplbegf < = 2 & & ( ctx - > chincpl ) )
bndend = bnd4 ;
if ( bndend > end ) {
bndend = end ;
if ( ctx - > rematflg & 4 )
do_rematrixing1 ( ctx , bnd3 , bndend ) ;
else {
} else {
if ( ctx - > rematflg & 4 )
do_rematrixing1 ( ctx , bnd3 , bnd4 ) ;
if ( ctx - > rematflg & 8 )
do_rematrixing1 ( ctx , bnd4 , bndend ) ;
}
if ( ctx - > rematflg & 8 )
do_rematrixing1 ( ctx , bnd4 , end ) ;
}
}
@ -1118,7 +1109,7 @@ static void get_downmix_coeffs(AC3DecodeContext *ctx)
case AC3_OUTPUT_MONO :
ctx - > chcoeffs [ 0 ] * = LEVEL_MINUS_3DB ;
ctx - > chcoeffs [ 2 ] * = LEVEL_MINUS_3DB ;
ctx - > chcoeffs [ 1 ] * = clev * LEVEL_PLUS_3DB ;
ctx - > chcoeffs [ 1 ] * = ( clev * LEVEL_PLUS_3DB ) ;
break ;
case AC3_OUTPUT_STEREO :
ctx - > chcoeffs [ 1 ] * = clev ;
@ -1561,14 +1552,13 @@ static void do_imdct_256(FFTContext *fft_ctx, float *coeffs, float *output,
CMUL ( z2 [ k ] . re , z2 [ k ] . im , x2 [ n4 - 2 * k - 1 ] , x2 [ 2 * k ] , x_cos2 [ k ] , x_sin2 [ k ] ) ;
}
/* Permutation needed before calling ff_fft_calc. */
ff_fft_permute ( fft_ctx , z1 ) ;
ff_fft_permute ( fft_ctx , z2 ) ;
/* N/8 pointe complex IFFT. */
ff_fft_permute ( fft_ctx , z1 ) ;
ff_fft_calc ( fft_ctx , z1 ) ;
ff_fft_permute ( fft_ctx , z2 ) ;
ff_fft_calc ( fft_ctx , z2 ) ;
/* Post IFFT Complex Multiply Step. */
for ( k = 0 ; k < n8 ; k + + ) {
CMUL ( z1 [ k ] . re , z1 [ k ] . im , z1 [ k ] . re , z1 [ k ] . im , x_cos2 [ k ] , x_sin2 [ k ] ) ;
@ -1646,11 +1636,12 @@ static inline void do_imdct(AC3DecodeContext *ctx)
do_imdct_512 ( & ctx - > fft_128 , ctx - > transform_coeffs [ 0 ] , ctx - > output [ 0 ] ,
ctx - > delay [ 0 ] , ctx - > tmp_imdct , ctx - > tmp_output ) ;
}
for ( i = 0 ; i < ctx - > nfchans + 1 ; i + + ) {
if ( ! ( ( ( ctx - > blksw ) > > i ) & 1 ) ) {
for ( i = 0 ; i < ctx - > nfchans ; i + + ) {
if ( ! ( ( ctx - > blksw > > i ) & 1 ) ) {
do_imdct_512 ( & ctx - > fft_128 , ctx - > transform_coeffs [ i + 1 ] , ctx - > output [ i + 1 ] ,
ctx - > delay [ i + 1 ] , ctx - > tmp_imdct , ctx - > tmp_output ) ;
} else {
av_log ( NULL , AV_LOG_INFO , " block switching enabled. \n " ) ;
do_imdct_256 ( & ctx - > fft_64 , ctx - > transform_coeffs [ i + 1 ] , ctx - > output [ i + 1 ] ,
ctx - > delay [ i + 1 ] , ctx - > tmp_imdct , ctx - > tmp_output ) ;
}
@ -1664,9 +1655,9 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
int i , bnd , rbnd , seg , grpsize ;
GetBitContext * gb = & ctx - > gb ;
int bit_alloc_flags = 0 ;
float drange , tmpco ;
float drange ;
uint8_t * dexps ;
int mstrcplco , cplcoexp , cplcomant , sbnd , cplbndstrc ;
int mstrcplco , cplcoexp , cplcomant ;
int dynrng , chbwcod , ngrps , cplabsexp , skipl ;
for ( i = 0 ; i < 5 ; i + + )
@ -1695,14 +1686,12 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
if ( get_bits1 ( gb ) ) { /* coupling strategy */
ctx - > cplinu = get_bits1 ( gb ) ;
ctx - > cplbndstrc = 0 ;
ctx - > chincpl = 0 ;
if ( ctx - > cplinu ) { /* coupling in use */
ctx - > chincpl = 0 ;
for ( i = 0 ; i < nfchans ; i + + )
ctx - > chincpl | = get_bits1 ( gb ) < < i ;
if ( acmod = = 0x00 | | acmod = = 0x01 ) //atleast two shared channels required
return - 1 ;
if ( acmod = = 0x02 )
ctx - > phsflginu = get_bits1 ( gb ) ; //phase flag in use
@ -1717,7 +1706,6 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
ctx - > ncplbnd = ctx - > ncplsubnd = 3 + ctx - > cplendf - ctx - > cplbegf ;
ctx - > cplstrtmant = ctx - > cplbegf * 12 + 37 ;
ctx - > cplendmant = ctx - > cplendf * 12 + 73 ;
ctx - > cplbndstrc = 0 ;
for ( i = 0 ; i < ctx - > ncplsubnd - 1 ; i + + ) /* coupling band structure */
if ( get_bits1 ( gb ) ) {
ctx - > cplbndstrc | = 1 < < i ;
@ -1732,9 +1720,8 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
for ( i = 0 ; i < nfchans ; i + + )
if ( ( ctx - > chincpl ) > > i & 1 )
if ( get_bits1 ( gb ) ) { /* coupling co-ordinates */
ctx - > cplcoe = 1 ;
ctx - > cplcoe | = 1 < < i ;
mstrcplco = 3 * get_bits ( gb , 2 ) ;
cplbndstrc = ctx - > cplbndstrc ;
for ( bnd = 0 ; bnd < ctx - > ncplbnd ; bnd + + ) {
cplcoexp = get_bits ( gb , 4 ) ;
cplcomant = get_bits ( gb , 4 ) ;
@ -1746,7 +1733,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
}
}
if ( acmod = = 0x02 & & ctx - > phsflginu & & ctx - > cplcoe )
if ( acmod = = 0x02 & & ctx - > phsflginu & & ( ctx - > cplcoe & 1 | | ctx - > cplcoe & 2 ) )
for ( bnd = 0 ; bnd < ctx - > ncplbnd ; bnd + + )
if ( get_bits1 ( gb ) )
ctx - > cplco [ 1 ] [ bnd ] = - ctx - > cplco [ 1 ] [ bnd ] ;
@ -1789,12 +1776,11 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
return - 1 ;
}
ctx - > endmant [ i ] = chbwcod * 3 + 73 ;
av_log ( NULL , AV_LOG_INFO , " i = %d \t chbwcod = %d \t endmant = %d \n " , i , chbwcod , ctx - > endmant [ i ] ) ;
}
}
if ( ctx - > cplexpstr ! = AC3_EXPSTR_REUSE ) { /* coupling exponents */
bit_alloc_flags | = 64 ;
bit_alloc_flags = 64 ;
cplabsexp = get_bits ( gb , 4 ) < < 1 ;
ngrps = ( ctx - > cplendmant - ctx - > cplstrtmant ) / ( 3 < < ( ctx - > cplexpstr - 1 ) ) ;
if ( decode_exponents ( gb , ctx - > cplexpstr , ngrps , cplabsexp , ctx - > dcplexps + ctx - > cplstrtmant ) ) {
@ -1827,7 +1813,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
}
if ( get_bits1 ( gb ) ) { /* bit allocation information */
bit_alloc_flags | = 127 ;
bit_alloc_flags = 127 ;
ctx - > sdcycod = get_bits ( gb , 2 ) ;
ctx - > fdcycod = get_bits ( gb , 2 ) ;
ctx - > sgaincod = get_bits ( gb , 2 ) ;
@ -1836,7 +1822,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
}
if ( get_bits1 ( gb ) ) { /* snroffset */
bit_alloc_flags | = 127 ;
bit_alloc_flags = 127 ;
ctx - > csnroffst = get_bits ( gb , 6 ) ;
if ( ctx - > cplinu ) { /* couling fine snr offset and fast gain code */
ctx - > cplfsnroffst = get_bits ( gb , 4 ) ;
@ -1852,8 +1838,6 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
}
}
ctx - > cplfleak = 0 ;
ctx - > cplsleak = 0 ;
if ( ctx - > cplinu & & get_bits1 ( gb ) ) { /* coupling leak information */
bit_alloc_flags | = 64 ;
ctx - > cplfleak = get_bits ( gb , 3 ) ;
@ -1861,7 +1845,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
}
if ( get_bits1 ( gb ) ) { /* delta bit allocation information */
bit_alloc_flags | = 127 ;
bit_alloc_flags = 127 ;
if ( ctx - > cplinu ) {
ctx - > cpldeltbae = get_bits ( gb , 2 ) ;
@ -1900,7 +1884,22 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
}
}
do_bit_allocation ( ctx , bit_alloc_flags ) ; /* perform the bit allocation */
if ( bit_alloc_flags ) {
if ( is_snr_offsets_zero ( ctx ) ) {
memset ( ctx - > cplbap , 0 , sizeof ( ctx - > cplbap ) ) ;
memset ( ctx - > lfebap , 0 , sizeof ( ctx - > lfebap ) ) ;
for ( i = 0 ; i < nfchans ; i + + )
memset ( ctx - > bap [ i ] , 0 , sizeof ( ctx - > bap [ i ] ) ) ;
} else {
if ( ctx - > chincpl & & ( bit_alloc_flags & 64 ) )
do_bit_allocation ( ctx , 5 ) ;
for ( i = 0 ; i < nfchans ; i + + )
if ( ( bit_alloc_flags > > i ) & 1 )
do_bit_allocation ( ctx , i ) ;
if ( ctx - > lfeon & & ( bit_alloc_flags & 32 ) )
do_bit_allocation ( ctx , 6 ) ;
}
}
if ( get_bits1 ( gb ) ) { /* unused dummy data */
skipl = get_bits ( gb , 9 ) ;
@ -1918,7 +1917,7 @@ static int ac3_parse_audio_block(AC3DecodeContext * ctx)
dump_floats ( " channel transform coefficients " , 10 , ctx - > transform_coeffs [ i + 1 ] , BLOCK_SIZE ) ; */
/* recover coefficients if rematrixing is in use */
if ( ctx - > rematflg )
if ( ctx - > rematstr )
do_rematrixing ( ctx ) ;
do_imdct ( ctx ) ;