diff options
author | Sean Bartell <wingedtachikoma@gmail.com> | 2011-06-25 21:32:25 -0400 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2012-04-25 22:13:20 +0200 |
commit | f40bfc9267b13b54e6379dfe7539447662879d24 (patch) | |
tree | 9b20069d5e62809ff434061ad730096836f916f2 /lib/rbcodec/codecs/liba52/bit_allocate.c | |
parent | a0009907de7a0107d49040d8a180f140e2eff299 (diff) | |
download | rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.gz rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.zip |
Add codecs to librbcodec.
Change-Id: Id7f4717d51ed02d67cb9f9cb3c0ada4a81843f97
Reviewed-on: http://gerrit.rockbox.org/137
Reviewed-by: Nils Wallménius <nils@rockbox.org>
Tested-by: Nils Wallménius <nils@rockbox.org>
Diffstat (limited to 'lib/rbcodec/codecs/liba52/bit_allocate.c')
-rw-r--r-- | lib/rbcodec/codecs/liba52/bit_allocate.c | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/liba52/bit_allocate.c b/lib/rbcodec/codecs/liba52/bit_allocate.c new file mode 100644 index 0000000000..aaac245913 --- /dev/null +++ b/lib/rbcodec/codecs/liba52/bit_allocate.c | |||
@@ -0,0 +1,265 @@ | |||
1 | /* | ||
2 | * bit_allocate.c | ||
3 | * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> | ||
4 | * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> | ||
5 | * | ||
6 | * This file is part of a52dec, a free ATSC A-52 stream decoder. | ||
7 | * See http://liba52.sourceforge.net/ for updates. | ||
8 | * | ||
9 | * a52dec is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * a52dec is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
22 | */ | ||
23 | |||
24 | #include "config-a52.h" | ||
25 | |||
26 | #include <inttypes.h> | ||
27 | |||
28 | #include "a52.h" | ||
29 | #include "a52_internal.h" | ||
30 | |||
31 | static int hthtab[3][50] IDATA_ATTR = { | ||
32 | {0x730, 0x730, 0x7c0, 0x800, 0x820, 0x840, 0x850, 0x850, 0x860, 0x860, | ||
33 | 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x890, 0x890, | ||
34 | 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, | ||
35 | 0x910, 0x910, 0x910, 0x910, 0x900, 0x8f0, 0x8c0, 0x870, 0x820, 0x7e0, | ||
36 | 0x7a0, 0x770, 0x760, 0x7a0, 0x7c0, 0x7c0, 0x6e0, 0x400, 0x3c0, 0x3c0}, | ||
37 | {0x710, 0x710, 0x7a0, 0x7f0, 0x820, 0x830, 0x840, 0x850, 0x850, 0x860, | ||
38 | 0x860, 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, | ||
39 | 0x890, 0x890, 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8e0, 0x8f0, | ||
40 | 0x900, 0x910, 0x910, 0x910, 0x910, 0x900, 0x8e0, 0x8b0, 0x870, 0x820, | ||
41 | 0x7e0, 0x7b0, 0x760, 0x770, 0x7a0, 0x7c0, 0x780, 0x5d0, 0x3c0, 0x3c0}, | ||
42 | {0x680, 0x680, 0x750, 0x7b0, 0x7e0, 0x810, 0x820, 0x830, 0x840, 0x850, | ||
43 | 0x850, 0x850, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, | ||
44 | 0x870, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, 0x890, 0x8a0, 0x8b0, | ||
45 | 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, 0x910, 0x910, 0x910, 0x900, 0x8f0, | ||
46 | 0x8d0, 0x8b0, 0x840, 0x7f0, 0x790, 0x760, 0x7a0, 0x7c0, 0x7b0, 0x720} | ||
47 | }; | ||
48 | |||
49 | static int8_t baptab[305] IDATA_ATTR = { | ||
50 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, | ||
51 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, | ||
52 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, | ||
53 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, | ||
54 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, | ||
55 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, /* 93 padding elems */ | ||
56 | |||
57 | 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, | ||
58 | 14, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, | ||
59 | 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, | ||
60 | 5, 4, 4, -3, -3, 3, 3, 3, -2, -2, -1, -1, -1, -1, -1, 0, | ||
61 | |||
62 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
63 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
64 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
65 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
66 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
67 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
68 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
69 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
70 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
71 | 0, 0, 0, 0 /* 148 padding elems */ | ||
72 | }; | ||
73 | |||
74 | static int bndtab[30] IDATA_ATTR = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34, | ||
75 | 37, 40, 43, 46, 49, 55, 61, 67, 73, 79, | ||
76 | 85, 97, 109, 121, 133, 157, 181, 205, 229, 253}; | ||
77 | |||
78 | static int8_t latab[256] IDATA_ATTR = { | ||
79 | -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53, | ||
80 | -52, -52, -51, -50, -49, -48, -47, -47, -46, -45, -44, -44, | ||
81 | -43, -42, -41, -41, -40, -39, -38, -38, -37, -36, -36, -35, | ||
82 | -35, -34, -33, -33, -32, -32, -31, -30, -30, -29, -29, -28, | ||
83 | -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -22, | ||
84 | -22, -21, -21, -21, -20, -20, -19, -19, -19, -18, -18, -18, | ||
85 | -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, | ||
86 | -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -11, -11, | ||
87 | -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, | ||
88 | -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -6, -6, | ||
89 | -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, | ||
90 | -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, | ||
91 | -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, | ||
92 | -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, | ||
93 | -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, | ||
94 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | ||
95 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | ||
96 | -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, | ||
97 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
98 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
99 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
100 | 0, 0, 0, 0 | ||
101 | }; | ||
102 | |||
103 | #define UPDATE_LEAK() \ | ||
104 | do { \ | ||
105 | fastleak += fdecay; \ | ||
106 | if (fastleak > psd + fgain) \ | ||
107 | fastleak = psd + fgain; \ | ||
108 | slowleak += sdecay; \ | ||
109 | if (slowleak > psd + sgain) \ | ||
110 | slowleak = psd + sgain; \ | ||
111 | } while (0) | ||
112 | |||
113 | #define COMPUTE_MASK() \ | ||
114 | do { \ | ||
115 | if (psd > dbknee) \ | ||
116 | mask -= (psd - dbknee) >> 2; \ | ||
117 | if (mask > hth [i >> halfrate]) \ | ||
118 | mask = hth [i >> halfrate]; \ | ||
119 | mask -= snroffset + 128 * deltba[i]; \ | ||
120 | mask = (mask > 0) ? 0 : ((-mask) >> 5); \ | ||
121 | mask -= floor; \ | ||
122 | } while (0) | ||
123 | |||
124 | void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, | ||
125 | int start, int end, int fastleak, int slowleak, | ||
126 | expbap_t * expbap) | ||
127 | { | ||
128 | static int slowgain[4] = {0x540, 0x4d8, 0x478, 0x410}; | ||
129 | static int dbpbtab[4] = {0xc00, 0x500, 0x300, 0x100}; | ||
130 | static int floortab[8] = {0x910, 0x950, 0x990, 0x9d0, | ||
131 | 0xa10, 0xa90, 0xb10, 0x1400}; | ||
132 | |||
133 | int i, j; | ||
134 | uint8_t * exp; | ||
135 | int8_t * bap; | ||
136 | int fdecay, fgain, sdecay, sgain, dbknee, floor, snroffset; | ||
137 | int psd, mask; | ||
138 | int8_t * deltba; | ||
139 | int * hth; | ||
140 | int halfrate; | ||
141 | |||
142 | halfrate = state->halfrate; | ||
143 | fdecay = (63 + 20 * ((state->bai >> 7) & 3)) >> halfrate; /* fdcycod */ | ||
144 | fgain = 128 + 128 * (ba->bai & 7); /* fgaincod */ | ||
145 | sdecay = (15 + 2 * (state->bai >> 9)) >> halfrate; /* sdcycod */ | ||
146 | sgain = slowgain[(state->bai >> 5) & 3]; /* sgaincod */ | ||
147 | dbknee = dbpbtab[(state->bai >> 3) & 3]; /* dbpbcod */ | ||
148 | hth = hthtab[state->fscod]; | ||
149 | /* | ||
150 | * if there is no delta bit allocation, make deltba point to an area | ||
151 | * known to contain zeroes. baptab+156 here. | ||
152 | */ | ||
153 | deltba = (ba->deltbae == DELTA_BIT_NONE) ? baptab + 156 : ba->deltba; | ||
154 | floor = floortab[state->bai & 7]; /* floorcod */ | ||
155 | snroffset = 960 - 64 * state->csnroffst - 4 * (ba->bai >> 3) + floor; | ||
156 | floor >>= 5; | ||
157 | |||
158 | exp = expbap->exp; | ||
159 | bap = expbap->bap; | ||
160 | |||
161 | i = bndstart; | ||
162 | j = start; | ||
163 | if (start == 0) { /* not the coupling channel */ | ||
164 | int lowcomp; | ||
165 | |||
166 | lowcomp = 0; | ||
167 | j = end - 1; | ||
168 | do { | ||
169 | if (i < j) { | ||
170 | if (exp[i+1] == exp[i] - 2) | ||
171 | lowcomp = 384; | ||
172 | else if (lowcomp && (exp[i+1] > exp[i])) | ||
173 | lowcomp -= 64; | ||
174 | } | ||
175 | psd = 128 * exp[i]; | ||
176 | mask = psd + fgain + lowcomp; | ||
177 | COMPUTE_MASK (); | ||
178 | bap[i] = (baptab+156)[mask + 4 * exp[i]]; | ||
179 | i++; | ||
180 | } while ((i < 3) || ((i < 7) && (exp[i] > exp[i-1]))); | ||
181 | fastleak = psd + fgain; | ||
182 | slowleak = psd + sgain; | ||
183 | |||
184 | while (i < 7) { | ||
185 | if (i < j) { | ||
186 | if (exp[i+1] == exp[i] - 2) | ||
187 | lowcomp = 384; | ||
188 | else if (lowcomp && (exp[i+1] > exp[i])) | ||
189 | lowcomp -= 64; | ||
190 | } | ||
191 | psd = 128 * exp[i]; | ||
192 | UPDATE_LEAK (); | ||
193 | mask = ((fastleak + lowcomp < slowleak) ? | ||
194 | fastleak + lowcomp : slowleak); | ||
195 | COMPUTE_MASK (); | ||
196 | bap[i] = (baptab+156)[mask + 4 * exp[i]]; | ||
197 | i++; | ||
198 | } | ||
199 | |||
200 | if (end == 7) /* lfe channel */ | ||
201 | return; | ||
202 | |||
203 | do { | ||
204 | if (exp[i+1] == exp[i] - 2) | ||
205 | lowcomp = 320; | ||
206 | else if (lowcomp && (exp[i+1] > exp[i])) | ||
207 | lowcomp -= 64; | ||
208 | psd = 128 * exp[i]; | ||
209 | UPDATE_LEAK (); | ||
210 | mask = ((fastleak + lowcomp < slowleak) ? | ||
211 | fastleak + lowcomp : slowleak); | ||
212 | COMPUTE_MASK (); | ||
213 | bap[i] = (baptab+156)[mask + 4 * exp[i]]; | ||
214 | i++; | ||
215 | } while (i < 20); | ||
216 | |||
217 | while (lowcomp > 128) { /* two iterations maximum */ | ||
218 | lowcomp -= 128; | ||
219 | psd = 128 * exp[i]; | ||
220 | UPDATE_LEAK (); | ||
221 | mask = ((fastleak + lowcomp < slowleak) ? | ||
222 | fastleak + lowcomp : slowleak); | ||
223 | COMPUTE_MASK (); | ||
224 | bap[i] = (baptab+156)[mask + 4 * exp[i]]; | ||
225 | i++; | ||
226 | } | ||
227 | j = i; | ||
228 | } | ||
229 | |||
230 | do { | ||
231 | int startband, endband; | ||
232 | |||
233 | startband = j; | ||
234 | endband = (bndtab[i-20] < end) ? bndtab[i-20] : end; | ||
235 | psd = 128 * exp[j++]; | ||
236 | while (j < endband) { | ||
237 | int next, delta; | ||
238 | |||
239 | next = 128 * exp[j++]; | ||
240 | delta = next - psd; | ||
241 | switch (delta >> 9) { | ||
242 | case -6: case -5: case -4: case -3: case -2: | ||
243 | psd = next; | ||
244 | break; | ||
245 | case -1: | ||
246 | psd = next + latab[(-delta) >> 1]; | ||
247 | break; | ||
248 | case 0: | ||
249 | psd += latab[delta >> 1]; | ||
250 | break; | ||
251 | } | ||
252 | } | ||
253 | /* minpsd = -289 */ | ||
254 | UPDATE_LEAK (); | ||
255 | mask = (fastleak < slowleak) ? fastleak : slowleak; | ||
256 | COMPUTE_MASK (); | ||
257 | i++; | ||
258 | j = startband; | ||
259 | do { | ||
260 | /* max(mask+4*exp)=147=-(minpsd+fgain-deltba-snroffset)>>5+4*exp */ | ||
261 | /* min(mask+4*exp)=-156=-(sgain-deltba-snroffset)>>5 */ | ||
262 | bap[j] = (baptab+156)[mask + 4 * exp[j]]; | ||
263 | } while (++j < endband); | ||
264 | } while (j < end); | ||
265 | } | ||