]> git.sesse.net Git - vlc/blobdiff - src/ac3_decoder/ac3_mantissa.c
Created a small&clean public interface for the ac3 decoder (see ac3_decoder.h)
[vlc] / src / ac3_decoder / ac3_mantissa.c
index 344bc0ddf80428819b5bc2796dfb3b163e4d3658..58e844ca835d8f3e9158a512d2f8166a7f7cc761 100644 (file)
@@ -2,12 +2,12 @@
 
 #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,
@@ -24,11 +24,11 @@ static float q_1_2[ 32 ] = { Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, 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,
@@ -56,17 +56,17 @@ static float q_2_2[ 128 ] =
 #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,
@@ -105,15 +105,16 @@ static float q_4_1[ 128 ] = { Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
 
 /* 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];
@@ -157,112 +158,103 @@ static float exp_lut[ 25 ] =
 };
 
 /* 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;
@@ -270,12 +262,10 @@ static __inline__ void uncouple_channel( ac3dec_t * p_ac3dec, u32 ch )
     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;
@@ -284,15 +274,14 @@ static __inline__ void uncouple_channel( ac3dec_t * p_ac3dec, u32 ch )
         }
         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;
 
@@ -300,58 +289,44 @@ void mantissa_unpack( ac3dec_t * p_ac3dec )
     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]);
         }
     }
 }