5825f9326a533b6864815da502a736e4a696afcb
[ffmpeg.git] / libavcodec / libac3 / tables.h
1 /* 
2  *    parse.c
3  *
4  *      Copyright (C) Aaron Holtzman - May 1999
5  *
6  *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
7  *      
8  *  ac3dec is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2, or (at your option)
11  *  any later version.
12  *   
13  *  ac3dec is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *   
18  *  You should have received a copy of the GNU General Public License
19  *  along with GNU Make; see the file COPYING.  If not, write to
20  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
21  *
22  *
23  */
24
25 static int8_t exp_1[128] = {
26     -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,
27     -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,
28      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,
29      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,
30      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,
31     25,25,25
32 };
33 static int8_t exp_2[128] = {
34     -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,
35     -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,
36     -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,
37     -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,
38     -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,
39     25,25,25
40 };
41 static int8_t exp_3[128] = {
42     -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,
43     -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,
44     -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,
45     -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,
46     -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,
47     25,25,25
48 };
49
50 #define Q0 ((-2 << 15) / 3.0)
51 #define Q1 (0)
52 #define Q2 ((2 << 15) / 3.0)
53
54 static const float q_1_0[ 32 ] = {
55     Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,
56     Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,
57     Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,
58     0,0,0,0,0
59 };
60
61 static const float q_1_1[ 32 ] = {
62     Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
63     Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
64     Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
65     0,0,0,0,0
66 };
67
68 static const float q_1_2[ 32 ] = {
69     Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
70     Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
71     Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
72     0,0,0,0,0
73 };
74
75 #undef Q0
76 #undef Q1
77 #undef Q2
78
79 #define Q0 ((-4 << 15) / 5.0)
80 #define Q1 ((-2 << 15) / 5.0)
81 #define Q2 (0)
82 #define Q3 ((2 << 15) / 5.0)
83 #define Q4 ((4 << 15) / 5.0)
84
85 static const float q_2_0[ 128 ] = {
86     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,
87     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,
88     Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,
89     Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,
90     Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,
91     0,0,0
92 };
93
94 static const float q_2_1[ 128 ] = {
95     Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
96     Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
97     Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
98     Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
99     Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
100     0,0,0
101 };
102
103 static const float q_2_2[ 128 ] = {
104     Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
105     Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
106     Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
107     Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
108     Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
109     0,0,0
110 };
111
112 #undef Q0
113 #undef Q1
114 #undef Q2
115 #undef Q3
116 #undef Q4
117
118 static const float q_3[8] = {
119     (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0, 0,
120     ( 2 << 15)/7.0, ( 4 << 15)/7.0, ( 6 << 15)/7.0, 0
121 };
122
123 #define Q0 ((-10 << 15) / 11.0)
124 #define Q1 ((-8 << 15) / 11.0)
125 #define Q2 ((-6 << 15) / 11.0)
126 #define Q3 ((-4 << 15) / 11.0)
127 #define Q4 ((-2 << 15) / 11.0)
128 #define Q5 (0)
129 #define Q6 ((2 << 15) / 11.0)
130 #define Q7 ((4 << 15) / 11.0)
131 #define Q8 ((6 << 15) / 11.0)
132 #define Q9 ((8 << 15) / 11.0)
133 #define QA ((10 << 15) / 11.0)
134
135 static const float q_4_0[ 128 ] = {
136     Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
137     Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
138     Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
139     Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
140     Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
141     Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
142     Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
143     Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
144     Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
145     Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
146     QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
147     0,  0,  0,  0,  0,  0,  0
148 };
149
150 static const float q_4_1[ 128 ] = {
151     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
152     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
153     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
154     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
155     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
156     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
157     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
158     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
159     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
160     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
161     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
162     0,  0,  0,  0,  0,  0,  0
163 };
164
165 #undef Q0
166 #undef Q1
167 #undef Q2
168 #undef Q3
169 #undef Q4
170 #undef Q5
171 #undef Q6
172 #undef Q7
173 #undef Q8
174 #undef Q9
175 #undef QA
176
177 static const float q_5[16] = {
178     (-14 << 15)/15.0,(-12 << 15)/15.0,(-10 << 15)/15.0,
179     ( -8 << 15)/15.0,( -6 << 15)/15.0,( -4 << 15)/15.0,
180     ( -2 << 15)/15.0,   0            ,(  2 << 15)/15.0,
181     (  4 << 15)/15.0,(  6 << 15)/15.0,(  8 << 15)/15.0,
182     ( 10 << 15)/15.0,( 12 << 15)/15.0,( 14 << 15)/15.0,
183     0
184 };
185
186 static const uint32_t u32_scale_factors[25] = 
187 {
188         0x38000000, //2 ^ -(0 + 15)
189         0x37800000, //2 ^ -(1 + 15)
190         0x37000000, //2 ^ -(2 + 15)
191         0x36800000, //2 ^ -(3 + 15)
192         0x36000000, //2 ^ -(4 + 15)
193         0x35800000, //2 ^ -(5 + 15)
194         0x35000000, //2 ^ -(6 + 15)
195         0x34800000, //2 ^ -(7 + 15)
196         0x34000000, //2 ^ -(8 + 15)
197         0x33800000, //2 ^ -(9 + 15)
198         0x33000000, //2 ^ -(10 + 15)
199         0x32800000, //2 ^ -(11 + 15)
200         0x32000000, //2 ^ -(12 + 15)
201         0x31800000, //2 ^ -(13 + 15)
202         0x31000000, //2 ^ -(14 + 15)
203         0x30800000, //2 ^ -(15 + 15)
204         0x30000000, //2 ^ -(16 + 15)
205         0x2f800000, //2 ^ -(17 + 15)
206         0x2f000000, //2 ^ -(18 + 15)
207         0x2e800000, //2 ^ -(19 + 15)
208         0x2e000000, //2 ^ -(20 + 15)
209         0x2d800000, //2 ^ -(21 + 15)
210         0x2d000000, //2 ^ -(22 + 15)
211         0x2c800000, //2 ^ -(23 + 15)
212         0x2c000000  //2 ^ -(24 + 15)
213 };
214
215 static float * scale_factor = (float *) u32_scale_factors;
216
217 static const uint16_t dither_lut[256] = {
218     0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,
219     0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb,
220     0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198,
221     0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176,
222     0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf,
223     0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321,
224     0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202,
225     0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec,
226     0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761,
227     0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f,
228     0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac,
229     0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642,
230     0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb,
231     0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415,
232     0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536,
233     0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8,
234     0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c,
235     0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2,
236     0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1,
237     0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f,
238     0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6,
239     0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58,
240     0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b,
241     0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95,
242     0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918,
243     0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6,
244     0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5,
245     0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b,
246     0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82,
247     0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c,
248     0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f,
249     0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1
250 };