#include "int_types.h"
#include "ac3_decoder.h"
-#include "ac3_mantissa.h"
+#include "ac3_internal.h"
#include "ac3_bit_stream.h"
-#define Q0 ((-2 << 15) / 3)
+#define Q0 ((-2 << 15) / 3.0)
#define Q1 (0)
-#define Q2 ((2 << 15) / 3)
+#define Q2 ((2 << 15) / 3.0)
static float q_1_0[ 32 ] = { Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
#undef Q1
#undef Q2
-#define Q0 ((-4 << 15) / 5)
-#define Q1 ((-2 << 15) / 5)
+#define Q0 ((-4 << 15) / 5.0)
+#define Q1 ((-2 << 15) / 5.0)
#define Q2 (0)
-#define Q3 ((2 << 15) / 5)
-#define Q4 ((4 << 15) / 5)
+#define Q3 ((2 << 15) / 5.0)
+#define Q4 ((4 << 15) / 5.0)
static float q_2_0[ 128 ] =
{ Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,
Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,
#undef Q3
#undef Q4
-#define Q0 ((-10 << 15) / 11)
-#define Q1 ((-8 << 15) / 11)
-#define Q2 ((-6 << 15) / 11)
-#define Q3 ((-4 << 15) / 11)
-#define Q4 ((-2 << 15) / 11)
+#define Q0 ((-10 << 15) / 11.0)
+#define Q1 ((-8 << 15) / 11.0)
+#define Q2 ((-6 << 15) / 11.0)
+#define Q3 ((-4 << 15) / 11.0)
+#define Q4 ((-2 << 15) / 11.0)
#define Q5 (0)
-#define Q6 ((2 << 15) / 11)
-#define Q7 ((4 << 15) / 11)
-#define Q8 ((6 << 15) / 11)
-#define Q9 ((8 << 15) / 11)
-#define QA ((10 << 15) / 11)
+#define Q6 ((2 << 15) / 11.0)
+#define Q7 ((4 << 15) / 11.0)
+#define Q8 ((6 << 15) / 11.0)
+#define Q9 ((8 << 15) / 11.0)
+#define QA ((10 << 15) / 11.0)
static float q_4_0[ 128 ] = { Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
/* Lookup tables of 0.16 two's complement quantization values */
-static float q_3[7] = { (-6 << 15)/7, (-4 << 15)/7, (-2 << 15)/7,
- 0 , ( 2 << 15)/7, ( 4 << 15)/7,
- ( 6 << 15)/7};
+static float q_3[8] = { (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
+ 0 , (2 << 15)/7.0, (4 << 15)/7.0,
+ (6 << 15)/7.0, 0 };
-static float q_5[15] = { (-14 << 15)/15, (-12 << 15)/15, (-10 << 15)/15,
- ( -8 << 15)/15, ( -6 << 15)/15, ( -4 << 15)/15,
- ( -2 << 15)/15, 0 , ( 2 << 15)/15,
- ( 4 << 15)/15, ( 6 << 15)/15, ( 8 << 15)/15,
- ( 10 << 15)/15, ( 12 << 15)/15, ( 14 << 15)/15};
+static float q_5[16] = { (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
+ (-8 << 15)/15.0, (-6 << 15)/15.0, (-4 << 15)/15.0,
+ (-2 << 15)/15.0, 0 , (2 << 15)/15.0,
+ (4 << 15)/15.0, (6 << 15)/15.0, (8 << 15)/15.0,
+ (10 << 15)/15.0, (12 << 15)/15.0, (14 << 15)/15.0,
+ 0 };
/* These store the persistent state of the packed mantissas */
static float q_1[2];
};
/* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
-static __inline__ float float_get( ac3dec_t * p_ac3dec, u16 bap, u16 exp )
+static __inline__ float float_get (ac3dec_t * p_ac3dec, u16 bap, u16 exp)
{
u32 group_code;
/* If the bap is 0-5 then we have special cases to take care of */
- switch ( bap )
- {
- case 0:
- return( 0 );
-
- case 1:
- if ( q_1_pointer >= 0 )
- {
- return( q_1[q_1_pointer--] * exp_lut[exp] );
- }
- NeedBits( &(p_ac3dec->bit_stream), 5 );
- group_code = p_ac3dec->bit_stream.buffer >> (32 - 5);
- DumpBits( &(p_ac3dec->bit_stream), 5 );
+ switch (bap) {
+ case 0:
+ return (0); /* FIXME dither */
- if ( group_code > 26 )
- {
- fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
- }
+ case 1:
+ if (q_1_pointer >= 0) {
+ return (q_1[q_1_pointer--] * exp_lut[exp]);
+ }
- q_1[ 1 ] = q_1_1[ group_code ];
- q_1[ 0 ] = q_1_2[ group_code ];
+ NeedBits (&(p_ac3dec->bit_stream), 5);
+ group_code = p_ac3dec->bit_stream.buffer >> (32 - 5);
+ DumpBits (&(p_ac3dec->bit_stream), 5);
+ if (group_code >= 27) {
+ fprintf (stderr, "ac3dec debug: invalid mantissa\n");
+ }
- q_1_pointer = 1;
+ q_1[ 1 ] = q_1_1[ group_code ];
+ q_1[ 0 ] = q_1_2[ group_code ];
- return( q_1_0[group_code] * exp_lut[exp] );
+ q_1_pointer = 1;
- case 2:
- if ( q_2_pointer >= 0 )
- {
- return( q_2[q_2_pointer--] * exp_lut[exp] );
- }
- NeedBits( &(p_ac3dec->bit_stream), 7 );
- group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
- DumpBits( &(p_ac3dec->bit_stream), 7 );
+ return (q_1_0[group_code] * exp_lut[exp]);
- if ( group_code > 124 )
- {
- fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
- }
+ case 2:
+ if (q_2_pointer >= 0) {
+ return (q_2[q_2_pointer--] * exp_lut[exp]);
+ }
+ NeedBits (&(p_ac3dec->bit_stream), 7);
+ group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
+ DumpBits (&(p_ac3dec->bit_stream), 7);
- q_2[ 1 ] = q_2_1[ group_code ];
- q_2[ 0 ] = q_2_2[ group_code ];
+ if (group_code >= 125) {
+ fprintf (stderr, "ac3dec debug: invalid mantissa\n");
+ }
- q_2_pointer = 1;
+ q_2[ 1 ] = q_2_1[ group_code ];
+ q_2[ 0 ] = q_2_2[ group_code ];
- return( q_2_0[ group_code ] * exp_lut[exp] );
+ q_2_pointer = 1;
- case 3:
- NeedBits( &(p_ac3dec->bit_stream), 3 );
- group_code = p_ac3dec->bit_stream.buffer >> (32 - 3);
- DumpBits( &(p_ac3dec->bit_stream), 3 );
+ return (q_2_0[ group_code ] * exp_lut[exp]);
- if ( group_code > 6 )
- {
- fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
- }
+ case 3:
+ NeedBits (&(p_ac3dec->bit_stream), 3);
+ group_code = p_ac3dec->bit_stream.buffer >> (32 - 3);
+ DumpBits (&(p_ac3dec->bit_stream), 3);
- return( q_3[group_code] * exp_lut[exp] );
+ if (group_code >= 7) {
+ fprintf (stderr, "ac3dec debug: invalid mantissa\n");
+ }
- case 4:
- if ( q_4_pointer >= 0 )
- {
- return( q_4[q_4_pointer--] * exp_lut[exp] );
- }
- NeedBits( &(p_ac3dec->bit_stream), 7 );
- group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
- DumpBits( &(p_ac3dec->bit_stream), 7 );
+ return (q_3[group_code] * exp_lut[exp]);
- if ( group_code > 120 )
- {
- fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
- }
+ case 4:
+ if (q_4_pointer >= 0) {
+ return (q_4[q_4_pointer--] * exp_lut[exp]);
+ }
+ NeedBits (&(p_ac3dec->bit_stream), 7);
+ group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
+ DumpBits (&(p_ac3dec->bit_stream), 7);
- q_4[ 0 ] = q_4_1[ group_code ];
+ if (group_code >= 121) {
+ fprintf (stderr, "ac3dec debug: invalid mantissa\n");
+ }
- q_4_pointer = 0;
+ q_4[ 0 ] = q_4_1[ group_code ];
- return( q_4_0[ group_code ] * exp_lut[exp] );
+ q_4_pointer = 0;
- case 5:
- NeedBits( &(p_ac3dec->bit_stream), 4 );
- group_code = p_ac3dec->bit_stream.buffer >> (32 - 4);
- DumpBits( &(p_ac3dec->bit_stream), 4 );
+ return (q_4_0[ group_code ] * exp_lut[exp]);
- if ( group_code > 14 )
- {
- fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
- }
+ case 5:
+ NeedBits (&(p_ac3dec->bit_stream), 4);
+ group_code = p_ac3dec->bit_stream.buffer >> (32 - 4);
+ DumpBits (&(p_ac3dec->bit_stream), 4);
- return( q_5[group_code] * exp_lut[exp] );
+ if (group_code >= 15) {
+ fprintf (stderr, "ac3dec debug: invalid mantissa\n");
+ }
- default:
- NeedBits( &(p_ac3dec->bit_stream), qnttztab[bap] );
- group_code = (((s32)(p_ac3dec->bit_stream.buffer)) >> (32 - qnttztab[bap])) << (16 - qnttztab[bap]);
- DumpBits( &(p_ac3dec->bit_stream), qnttztab[bap] );
+ return (q_5[group_code] * exp_lut[exp]);
- return( ((s32)group_code) * exp_lut[exp] );
+ default:
+ NeedBits (&(p_ac3dec->bit_stream), qnttztab[bap]);
+ group_code = (((s32)(p_ac3dec->bit_stream.buffer)) >> (32 - qnttztab[bap])) << (16 - qnttztab[bap]);
+ DumpBits (&(p_ac3dec->bit_stream), qnttztab[bap]);
+
+ return (((s32)group_code) * exp_lut[exp]);
}
}
-static __inline__ void uncouple_channel( ac3dec_t * p_ac3dec, u32 ch )
+static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
{
u32 bnd = 0;
u32 i,j;
u32 cpl_exp_tmp;
u32 cpl_mant_tmp;
- for(i=p_ac3dec->audblk.cplstrtmant;i<p_ac3dec->audblk.cplendmant;)
- {
- if(!p_ac3dec->audblk.cplbndstrc[bnd])
- {
+ for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;) {
+ if (!p_ac3dec->audblk.cplbndstrc[bnd]) {
cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
- if(p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
+ if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 12;
else
cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
}
bnd++;
- for(j=0;j < 12; j++)
- {
+ for (j=0;j < 12; j++) {
p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * p_ac3dec->audblk.cplfbw[i];
i++;
}
}
}
-void mantissa_unpack( ac3dec_t * p_ac3dec )
+void mantissa_unpack (ac3dec_t * p_ac3dec)
{
int i, j;
q_2_pointer = -1;
q_4_pointer = -1;
- if ( p_ac3dec->audblk.cplinu )
- {
+ if (p_ac3dec->audblk.cplinu) {
/* 1 */
- for ( i = 0; !p_ac3dec->audblk.chincpl[i]; i++ )
- {
- for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
- {
- p_ac3dec->coeffs.fbw[i][j] = float_get( p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j] );
+ for (i = 0; !p_ac3dec->audblk.chincpl[i]; i++) {
+ for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
+ p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
}
}
/* 2 */
- for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
- {
- p_ac3dec->coeffs.fbw[i][j] = float_get( p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j] );
+ for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
+ p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
}
- for ( j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++ )
- {
- p_ac3dec->audblk.cplfbw[j] = float_get( p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j] );
+ for (j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++) {
+ p_ac3dec->audblk.cplfbw[j] = float_get (p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j]);
}
- uncouple_channel( p_ac3dec, i );
+ uncouple_channel (p_ac3dec, i);
/* 3 */
- for ( i++; i < p_ac3dec->bsi.nfchans; i++ )
- {
- for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
- {
- p_ac3dec->coeffs.fbw[i][j] = float_get( p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j] );
+ for (i++; i < p_ac3dec->bsi.nfchans; i++) {
+ for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
+ p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
}
- if ( p_ac3dec->audblk.chincpl[i] )
- {
- uncouple_channel( p_ac3dec, i );
+ if (p_ac3dec->audblk.chincpl[i]) {
+ uncouple_channel (p_ac3dec, i);
}
}
- }
- else
- {
- for ( i = 0; i < p_ac3dec->bsi.nfchans; i++ )
- {
- for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
- {
- p_ac3dec->coeffs.fbw[i][j] = float_get( p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j] );
+ } else {
+ for (i = 0; i < p_ac3dec->bsi.nfchans; i++) {
+ for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
+ p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
}
}
}
- if ( p_ac3dec->bsi.lfeon )
- {
+ if (p_ac3dec->bsi.lfeon) {
/* There are always 7 mantissas for lfe, no dither for lfe */
- for ( j = 0; j < 7; j++ )
- {
- p_ac3dec->coeffs.lfe[j] = float_get( p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j] );
+ for (j = 0; j < 7; j++) {
+ p_ac3dec->coeffs.lfe[j] = float_get (p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j]);
}
}
}