1 #include <unistd.h> /* getpid() */
3 #include <stdio.h> /* "intf_msg.h" */
4 #include <stdlib.h> /* malloc(), free() */
5 #include <sys/soundcard.h> /* "audio_output.h" */
7 #include <sys/uio.h> /* "input.h" */
12 #include "vlc_thread.h"
13 #include "debug.h" /* "input_netlist.h" */
15 #include "intf_msg.h" /* intf_DbgMsg(), intf_ErrMsg() */
17 #include "input.h" /* pes_packet_t */
18 #include "input_netlist.h" /* input_NetlistFreePES() */
19 #include "decoder_fifo.h" /* DECODER_FIFO_(ISEMPTY|START|INCSTART)() */
21 #include "audio_output.h"
23 #include "ac3_decoder.h"
24 #include "ac3_mantissa.h"
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 };
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 };
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 };
37 //Lookup tables of 0.16 two's complement quantization values
40 s32 q_1[3] = {( -2 << 15)/3, 0 ,( 2 << 15)/3 };
42 s32 q_2[5] = {( -4 << 15)/5,( -2 << 15)/5, 0 ,
43 ( 2 << 15)/5,( 4 << 15)/5};
46 static float q_3[7] = {( -6 << 15)/7,( -4 << 15)/7,( -2 << 15)/7,
47 0 ,( 2 << 15)/7,( 4 << 15)/7,
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};
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};
62 //These store the persistent state of the packed mantissas
66 static s32 q_1_pointer;
67 static s32 q_2_pointer;
68 static s32 q_4_pointer;
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};
74 static float exp_lut[ 25 ] =
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,
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 )
108 //If the bap is 0-5 then we have special cases to take care of
115 if ( q_1_pointer >= 0 )
117 return( q_1[q_1_pointer--] * exp_lut[exp] );
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;
124 if ( group_code > 26 )
126 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
127 p_ac3dec->b_invalid = 1;
130 q_1[ 1 ] = q_1_1[ group_code ];
131 q_1[ 0 ] = q_1_2[ group_code ];
135 return( q_1_0[group_code] * exp_lut[exp] );
138 if ( q_2_pointer >= 0 )
140 return( q_2[q_2_pointer--] * exp_lut[exp] );
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;
147 if ( group_code > 124 )
149 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
150 p_ac3dec->b_invalid = 1;
153 q_2[ 1 ] = q_2_1[ group_code ];
154 q_2[ 0 ] = q_2_2[ group_code ];
158 return( q_2_0[ group_code ] * exp_lut[exp] );
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;
166 if ( group_code > 6 )
168 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
169 p_ac3dec->b_invalid = 1;
172 return( q_3[group_code] * exp_lut[exp] );
175 if ( q_4_pointer >= 0 )
177 return( q_4[q_4_pointer--] * exp_lut[exp] );
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;
184 if ( group_code > 120 )
186 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
187 p_ac3dec->b_invalid = 1;
190 q_4[ 0 ] = q_4_1[ group_code ];
194 return( q_4_0[ group_code ] * exp_lut[exp] );
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;
202 if ( group_code > 14 )
204 fprintf( stderr, "ac3dec debug: invalid mantissa\n" );
205 p_ac3dec->b_invalid = 1;
208 return( q_5[group_code] * exp_lut[exp] );
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];
216 return( ((s32)group_code) * exp_lut[exp] );
220 static __inline__ void uncouple_channel( ac3dec_thread_t * p_ac3dec, u32 ch )
228 for(i=p_ac3dec->audblk.cplstrtmant;i<p_ac3dec->audblk.cplendmant;)
230 if(!p_ac3dec->audblk.cplbndstrc[bnd])
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;
236 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
238 cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp];
244 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * p_ac3dec->audblk.cplfbw[i];
250 void mantissa_unpack( ac3dec_thread_t * p_ac3dec )
258 if ( p_ac3dec->audblk.cplinu )
261 for ( i = 0; !p_ac3dec->audblk.chincpl[i]; i++ )
263 for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
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] );
270 for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
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] );
274 for ( j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++ )
276 p_ac3dec->audblk.cplfbw[j] = float_get( p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j] );
278 uncouple_channel( p_ac3dec, i );
281 for ( i++; i < p_ac3dec->bsi.nfchans; i++ )
283 for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
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] );
287 if ( p_ac3dec->audblk.chincpl[i] )
289 uncouple_channel( p_ac3dec, i );
295 for ( i = 0; i < p_ac3dec->bsi.nfchans; i++ )
297 for ( j = 0; j < p_ac3dec->audblk.endmant[i]; j++ )
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] );
304 if ( p_ac3dec->bsi.lfeon )
306 /* There are always 7 mantissas for lfe, no dither for lfe */
307 for ( j = 0; j < 7; j++ )
309 p_ac3dec->coeffs.lfe[j] = float_get( p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j] );