@ -23,9 +23,17 @@
# include "ac3_decoder.h"
# include "ac3_exponent.h"
static const s16 exps_1 [ 128 ] = { - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 } ;
static const s16 exps_2 [ 128 ] = { - 2 , - 2 , - 2 , - 2 , - 2 , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , - 2 , - 2 , - 2 , - 2 , - 2 , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , - 2 , - 2 , - 2 } ;
static const s16 exps_3 [ 128 ] = { - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 , 1 , 2 , - 2 , - 1 , 0 } ;
/*
static const s16 exps_1 [ 128 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 5 , 5 , 5 } ;
static const s16 exps_2 [ 128 ] = { 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 0 , 0 , 0 } ;
static const s16 exps_3 [ 128 ] = { 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 , 3 , 4 , 0 , 1 , 2 } ;
*/
static __inline__ void exp_unpack_ch ( u16 type , u16 expstr , u16 ngrps , u16 initial_exp , u16 exps [ ] , u16 * dest )
{
@ -35,8 +43,10 @@ static __inline__ void exp_unpack_ch( u16 type, u16 expstr, u16 ngrps, u16 initi
s16 exp_1 , exp_2 , exp_3 ;
*/
if ( expstr = = EXP_REUSE )
if ( expstr = = EXP_REUSE )
{
return ;
}
/* Handle the initial absolute exponent */
exp_acc = initial_exp ;
@ -44,10 +54,85 @@ static __inline__ void exp_unpack_ch( u16 type, u16 expstr, u16 ngrps, u16 initi
/* In the case of a fbw channel then the initial absolute values is
* also an exponent */
if ( type ! = UNPACK_CPL )
if ( type ! = UNPACK_CPL )
{
dest [ j + + ] = exp_acc ;
}
/* Loop through the groups and fill the dest array appropriately */
switch ( expstr )
{
case EXP_D45 :
for ( i = 0 ; i < ngrps ; i + + )
{
# ifdef AC3_SIGSEGV
if ( exps [ i ] > 127 )
{
fprintf ( stderr , " ac3dec debug: invalid exponent \n " ) ;
}
# endif
exp_acc + = ( exps_1 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
exp_acc + = ( exps_2 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
exp_acc + = ( exps_3 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
}
break ;
case EXP_D25 :
for ( i = 0 ; i < ngrps ; i + + )
{
# ifdef AC3_SIGSEGV
if ( exps [ i ] > 127 )
{
fprintf ( stderr , " ac3dec debug: invalid exponent \n " ) ;
}
# endif
exp_acc + = ( exps_1 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
exp_acc + = ( exps_2 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
exp_acc + = ( exps_3 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
dest [ j + + ] = exp_acc ;
}
break ;
case EXP_D15 :
for ( i = 0 ; i < ngrps ; i + + )
{
# ifdef AC3_SIGSEGV
if ( exps [ i ] > 127 )
{
fprintf ( stderr , " ac3dec debug: invalid exponent \n " ) ;
}
# endif
exp_acc + = ( exps_1 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
exp_acc + = ( exps_2 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
exp_acc + = ( exps_3 [ exps [ i ] ] /*- 2*/ ) ;
dest [ j + + ] = exp_acc ;
}
break ;
default :
fprintf ( stderr , " ac3dec debug: expstr == %i <maxx@via.ecp.fr> \n " , expstr ) ;
break ;
}
#if 0
for ( i = 0 ; i < ngrps ; i + + )
{
/*
@ -107,21 +192,25 @@ static __inline__ void exp_unpack_ch( u16 type, u16 expstr, u16 ngrps, u16 initi
break ;
}
}
# endif
}
void exponent_unpack ( ac3dec_thread_t * p_ac3dec )
{
u16 i ;
for ( i = 0 ; i < p_ac3dec - > bsi . nfchans ; i + + )
exp_unpack_ch ( UNPACK_FBW , p_ac3dec - > audblk . chexpstr [ i ] , p_ac3dec - > audblk . nchgrps [ i ] , p_ac3dec - > audblk . exps [ i ] [ 0 ] ,
& p_ac3dec - > audblk . exps [ i ] [ 1 ] , p_ac3dec - > audblk . fbw_exp [ i ] ) ;
for ( i = 0 ; i < p_ac3dec - > bsi . nfchans ; i + + )
{
exp_unpack_ch ( UNPACK_FBW , p_ac3dec - > audblk . chexpstr [ i ] , p_ac3dec - > audblk . nchgrps [ i ] , p_ac3dec - > audblk . exps [ i ] [ 0 ] , & p_ac3dec - > audblk . exps [ i ] [ 1 ] , p_ac3dec - > audblk . fbw_exp [ i ] ) ;
}
if ( p_ac3dec - > audblk . cplinu )
exp_unpack_ch ( UNPACK_CPL , p_ac3dec - > audblk . cplexpstr , p_ac3dec - > audblk . ncplgrps , p_ac3dec - > audblk . cplabsexp < < 1 ,
p_ac3dec - > audblk . cplexps , & p_ac3dec - > audblk . cpl_exp [ p_ac3dec - > audblk . cplstrtmant ] ) ;
if ( p_ac3dec - > audblk . cplinu )
{
exp_unpack_ch ( UNPACK_CPL , p_ac3dec - > audblk . cplexpstr , p_ac3dec - > audblk . ncplgrps , p_ac3dec - > audblk . cplabsexp < < 1 , p_ac3dec - > audblk . cplexps , & p_ac3dec - > audblk . cpl_exp [ p_ac3dec - > audblk . cplstrtmant ] ) ;
}
if ( p_ac3dec - > bsi . lfeon )
exp_unpack_ch ( UNPACK_LFE , p_ac3dec - > audblk . lfeexpstr , 2 , p_ac3dec - > audblk . lfeexps [ 0 ] ,
& p_ac3dec - > audblk . lfeexps [ 1 ] , p_ac3dec - > audblk . lfe_exp ) ;
if ( p_ac3dec - > bsi . lfeon )
{
exp_unpack_ch ( UNPACK_LFE , p_ac3dec - > audblk . lfeexpstr , 2 , p_ac3dec - > audblk . lfeexps [ 0 ] , & p_ac3dec - > audblk . lfeexps [ 1 ] , p_ac3dec - > audblk . lfe_exp ) ;
}
}