]> git.sesse.net Git - vlc/blob - src/ac3_decoder/ac3_mantissa.c
* ac3_decoder/ac3_decoder.c :
[vlc] / src / ac3_decoder / ac3_mantissa.c
1 #include <unistd.h>                                              /* getpid() */
2
3 #include <stdio.h>                                           /* "intf_msg.h" */
4 #include <stdlib.h>                                      /* malloc(), free() */
5 #include <sys/soundcard.h>                               /* "audio_output.h" */
6 #include <sys/types.h>
7 #include <sys/uio.h>                                            /* "input.h" */
8
9 #include "common.h"
10 #include "config.h"
11 #include "mtime.h"
12 #include "vlc_thread.h"
13 #include "debug.h"                                      /* "input_netlist.h" */
14
15 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
16
17 #include "input.h"                                           /* pes_packet_t */
18 #include "input_netlist.h"                         /* input_NetlistFreePES() */
19 #include "decoder_fifo.h"         /* DECODER_FIFO_(ISEMPTY|START|INCSTART)() */
20
21 #include "audio_output.h"
22
23 #include "ac3_decoder.h"
24 #include "ac3_mantissa.h"
25
26 static float q_1_0[ 32 ] = { (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, 0, 0, 0, 0, 0 };
27 static float q_1_1[ 32 ] = { (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, 0, 0, 0, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, 0, 0, 0, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, (-2 << 15) / 3, 0, 0, 0, (2 << 15) / 3, (2 << 15) / 3, (2 << 15) / 3, 0, 0, 0, 0, 0 };
28 static float q_1_2[ 32 ] = { (-2 << 15) / 3, 0, (2 << 15) / 3, (-2 << 15) / 3, 0, (2 << 15) / 3, (-2 << 15) / 3, 0, (2 << 15) / 3, (-2 << 15) / 3, 0, (2 << 15) / 3, (-2 << 15) / 3, 0, (2 << 15) / 3, (-2 << 15) / 3, 0, (2 << 15) / 3, (-2 << 15) / 3, 0, (2 << 15) / 3, (-2 << 15) / 3, 0, (2 << 15) / 3, (-2 << 15) / 3, 0, (2 << 15) / 3, 0, 0, 0, 0, 0 };
29
30 static float q_2_0[ 128 ] = { (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, 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, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, 0, 0, 0 };
31 static float q_2_1[ 128 ] = { (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, 0, 0, 0, 0, 0, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, 0, 0, 0, 0, 0, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, 0, 0, 0, 0, 0, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, 0, 0, 0, 0, 0, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, (-2 << 15) / 5, 0, 0, 0, 0, 0, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (2 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, (4 << 15) / 5, 0, 0, 0 };
32 static float q_2_2[ 128 ] = { (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, (-4 << 15) / 5, (-2 << 15) / 5, 0, (2 << 15) / 5, (4 << 15) / 5, 0, 0, 0 };
33
34 static float q_4_0[ 128 ] = { (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, (-2 << 15) / 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (2 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, (10 << 15) / 11, 0, 0, 0, 0, 0, 0, 0 };
35 static float q_4_1[ 128 ] = { (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, (-10 << 15) / 11, (-8 << 15) / 11, (-6 << 15) / 11, (-4 << 15) / 11, (-2 << 15) / 11, 0, (2 << 15) / 11, (4 << 15) / 11, (6 << 15) / 11, (8 << 15) / 11, (10 << 15) / 11, 0, 0, 0, 0, 0, 0, 0 };
36
37 //Lookup tables of 0.16 two's complement quantization values
38
39 /*
40 s32 q_1[3] = {( -2 << 15)/3, 0           ,(  2 << 15)/3 };
41
42 s32 q_2[5] = {( -4 << 15)/5,( -2 << 15)/5,   0         ,
43                         (  2 << 15)/5,(  4 << 15)/5};
44 */
45
46 static float q_3[7] = {( -6 << 15)/7,( -4 << 15)/7,( -2 << 15)/7,
47                            0         ,(  2 << 15)/7,(  4 << 15)/7,
48                                                                         (  6 << 15)/7};
49
50 /*
51 s32 q_4[11] = {(-10 << 15)/11,(-8 << 15)/11,(-6 << 15)/11,
52                         ( -4 << 15)/11,(-2 << 15)/11,  0          ,
53                                                                         (  2 << 15)/11,( 4 << 15)/11,( 6 << 15)/11,
54                                                                         (  8 << 15)/11,(10 << 15)/11};
55 */
56 static float q_5[15] = {(-14 << 15)/15,(-12 << 15)/15,(-10 << 15)/15,
57                    ( -8 << 15)/15,( -6 << 15)/15,( -4 << 15)/15,
58                                                                          ( -2 << 15)/15,   0          ,(  2 << 15)/15,
59                                                                          (  4 << 15)/15,(  6 << 15)/15,(  8 << 15)/15,
60                                                                          ( 10 << 15)/15,( 12 << 15)/15,( 14 << 15)/15};
61
62 //These store the persistent state of the packed mantissas
63 static float q_1[2];
64 static float q_2[2];
65 static float q_4[1];
66 static s32 q_1_pointer;
67 static s32 q_2_pointer;
68 static s32 q_4_pointer;
69
70 //Conversion from bap to number of bits in the mantissas
71 //zeros account for cases 0,1,2,4 which are special cased
72 static u16 qnttztab[16] = { 0, 0, 0, 3, 0 , 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16};
73
74 static float exp_lut[ 25 ] =
75 {
76         6.10351562500000000000000000e-05,
77         3.05175781250000000000000000e-05,
78         1.52587890625000000000000000e-05,
79         7.62939453125000000000000000e-06,
80         3.81469726562500000000000000e-06,
81         1.90734863281250000000000000e-06,
82         9.53674316406250000000000000e-07,
83         4.76837158203125000000000000e-07,
84         2.38418579101562500000000000e-07,
85         1.19209289550781250000000000e-07,
86         5.96046447753906250000000000e-08,
87         2.98023223876953125000000000e-08,
88         1.49011611938476562500000000e-08,
89         7.45058059692382812500000000e-09,
90         3.72529029846191406250000000e-09,
91         1.86264514923095703125000000e-09,
92         9.31322574615478515625000000e-10,
93         4.65661287307739257812500000e-10,
94         2.32830643653869628906250000e-10,
95         1.16415321826934814453125000e-10,
96         5.82076609134674072265625000e-11,
97         2.91038304567337036132812500e-11,
98         1.45519152283668518066406250e-11,
99         7.27595761418342590332031250e-12,
100         3.63797880709171295166015625e-12,
101 };
102
103 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
104 static __inline__ float float_get( ac3dec_thread_t * p_ac3dec, u16 bap, u16 exp )
105 {
106         u32 group_code;
107
108         //If the bap is 0-5 then we have special cases to take care of
109         switch ( bap )
110         {
111                 case 0:
112                         return( 0 );
113
114                 case 1:
115                         if ( q_1_pointer >= 0 )
116                         {
117                                 return( q_1[q_1_pointer--] * exp_lut[exp] );
118                         }
119                         NeedBits( &(p_ac3dec->bit_stream), 5 );
120                         group_code = p_ac3dec->bit_stream.fifo.buffer >> (32 - 5);
121                         DumpBits( &(p_ac3dec->bit_stream), 5 );
122                         p_ac3dec->total_bits_read += 5;
123
124                         if ( group_code > 26 )
125                         {
126                                 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
127                                 p_ac3dec->b_invalid = 1;
128                         }
129
130                         q_1[ 1 ] = q_1_1[ group_code ];
131                         q_1[ 0 ] = q_1_2[ group_code ];
132
133                         q_1_pointer = 1;
134
135                         return( q_1_0[group_code] * exp_lut[exp] );
136
137                 case 2:
138                         if ( q_2_pointer >= 0 )
139                         {
140                                 return( q_2[q_2_pointer--] * exp_lut[exp] );
141                         }
142                         NeedBits( &(p_ac3dec->bit_stream), 7 );
143                         group_code = p_ac3dec->bit_stream.fifo.buffer >> (32 - 7);
144                         DumpBits( &(p_ac3dec->bit_stream), 7 );
145                         p_ac3dec->total_bits_read += 7;
146
147                         if ( group_code > 124 )
148                         {
149                                 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
150                                 p_ac3dec->b_invalid = 1;
151                         }
152
153                         q_2[ 1 ] = q_2_1[ group_code ];
154                         q_2[ 0 ] = q_2_2[ group_code ];
155
156                         q_2_pointer = 1;
157
158                         return( q_2_0[ group_code ] * exp_lut[exp] );
159
160                 case 3:
161                         NeedBits( &(p_ac3dec->bit_stream), 3 );
162                         group_code = p_ac3dec->bit_stream.fifo.buffer >> (32 - 3);
163                         DumpBits( &(p_ac3dec->bit_stream), 3 );
164                         p_ac3dec->total_bits_read += 3;
165
166                         if ( group_code > 6 )
167                         {
168                                 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
169                                 p_ac3dec->b_invalid = 1;
170                         }
171
172                         return( q_3[group_code] * exp_lut[exp] );
173
174                 case 4:
175                         if ( q_4_pointer >= 0 )
176                         {
177                                 return( q_4[q_4_pointer--] * exp_lut[exp] );
178                         }
179                         NeedBits( &(p_ac3dec->bit_stream), 7 );
180                         group_code = p_ac3dec->bit_stream.fifo.buffer >> (32 - 7);
181                         DumpBits( &(p_ac3dec->bit_stream), 7 );
182                         p_ac3dec->total_bits_read += 7;
183
184                         if ( group_code > 120 )
185                         {
186                                 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
187                                 p_ac3dec->b_invalid = 1;
188                         }
189
190                         q_4[ 0 ] = q_4_1[ group_code ];
191
192                         q_4_pointer = 0;
193
194                         return( q_4_0[ group_code ] * exp_lut[exp] );
195
196                 case 5:
197                         NeedBits( &(p_ac3dec->bit_stream), 4 );
198                         group_code = p_ac3dec->bit_stream.fifo.buffer >> (32 - 4);
199                         DumpBits( &(p_ac3dec->bit_stream), 4 );
200                         p_ac3dec->total_bits_read += 4;
201
202                         if ( group_code > 14 )
203                         {
204                                 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
205                                 p_ac3dec->b_invalid = 1;
206                         }
207
208                         return( q_5[group_code] * exp_lut[exp] );
209
210                 default:
211                         NeedBits( &(p_ac3dec->bit_stream), qnttztab[bap] );
212                         group_code = (((s32)(p_ac3dec->bit_stream.fifo.buffer)) >> (32 - qnttztab[bap])) << (16 - qnttztab[bap]);
213                         DumpBits( &(p_ac3dec->bit_stream), qnttztab[bap] );
214                         p_ac3dec->total_bits_read += qnttztab[bap];
215
216                         return( ((s32)group_code) * exp_lut[exp] );
217         }
218 }
219
220 static __inline__ void uncouple_channel( ac3dec_thread_t * p_ac3dec, u32 ch )
221 {
222         u32 bnd = 0;
223         u32 i,j;
224         float cpl_coord = 0;
225         u32 cpl_exp_tmp;
226         u32 cpl_mant_tmp;
227
228         for(i=p_ac3dec->audblk.cplstrtmant;i<p_ac3dec->audblk.cplendmant;)
229         {
230                 if(!p_ac3dec->audblk.cplbndstrc[bnd])
231                 {
232                         cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
233                         if(p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
234                                 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 12;
235                         else
236                                 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
237
238                         cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp];
239                 }
240                 bnd++;
241
242                 for(j=0;j < 12; j++)
243                 {
244                         p_ac3dec->coeffs.fbw[ch][i]  = cpl_coord * p_ac3dec->audblk.cplfbw[i];
245                         i++;
246                 }
247         }
248 }
249
250 void mantissa_unpack( ac3dec_thread_t * p_ac3dec )
251 {
252         int i, j;
253
254         q_1_pointer = -1;
255         q_2_pointer = -1;
256         q_4_pointer = -1;
257
258         if ( p_ac3dec->audblk.cplinu )
259         {
260                 /* 1 */
261                 for ( i = 0; !p_ac3dec->audblk.chincpl[i]; i++ )
262                 {
263                         for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
264                         {
265                                 p_ac3dec->coeffs.fbw[i][j] = float_get( p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j] );
266                         }
267                 }
268
269                 /* 2 */
270                 for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
271                 {
272                         p_ac3dec->coeffs.fbw[i][j] = float_get( p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j] );
273                 }
274                 for ( j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++ )
275                 {
276                         p_ac3dec->audblk.cplfbw[j] = float_get( p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j] );
277                 }
278                 uncouple_channel( p_ac3dec, i );
279
280                 /* 3 */
281                 for ( i++; i < p_ac3dec->bsi.nfchans; i++ )
282                 {
283                         for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
284                         {
285                                 p_ac3dec->coeffs.fbw[i][j] = float_get( p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j] );
286                         }
287                         if ( p_ac3dec->audblk.chincpl[i] )
288                         {
289                                 uncouple_channel( p_ac3dec, i );
290                         }
291                 }
292         }
293         else
294         {
295                 for ( i = 0; i < p_ac3dec->bsi.nfchans; i++ )
296                 {
297                         for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
298                         {
299                                 p_ac3dec->coeffs.fbw[i][j] = float_get( p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j] );
300                         }
301                 }
302         }
303
304         if ( p_ac3dec->bsi.lfeon )
305         {
306                 /* There are always 7 mantissas for lfe, no dither for lfe */
307                 for ( j = 0; j < 7; j++ )
308                 {
309                         p_ac3dec->coeffs.lfe[j] = float_get( p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j] );
310                 }
311         }
312 }