Mercurial > mplayer.hg
annotate liba52/bit_allocate.c @ 29130:33956c5f5005
Reemit the ID_AID_x_LANG for the track. This allows the identification of the
audio track by language code (en or es) rather than by ID (128 or 129).
patch by Kevin DeKorte, kdekorte gmail com
author | diego |
---|---|
date | Sat, 11 Apr 2009 13:51:02 +0000 |
parents | 722ac20fac5f |
children |
rev | line source |
---|---|
3394 | 1 /* |
2 * bit_allocate.c | |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
3 * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> |
3394 | 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.h" | |
25 | |
26 #include <inttypes.h> | |
27 | |
28 #include "a52.h" | |
29 #include "a52_internal.h" | |
30 | |
31 static int hthtab[3][50] = { | |
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] = { | |
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] = {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] = { | |
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 | |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
124 void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, |
18721
722ac20fac5f
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
18720
diff
changeset
|
125 int start, int end, int fastleak, int slowleak, |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
126 expbap_t * expbap) |
3394 | 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; | |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
134 uint8_t * exp; |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
135 int8_t * bap; |
3394 | 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; | |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
143 fdecay = (63 + 20 * ((state->bai >> 7) & 3)) >> halfrate; /* fdcycod */ |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
144 fgain = 128 + 128 * (ba->bai & 7); /* fgaincod */ |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
145 sdecay = (15 + 2 * (state->bai >> 9)) >> halfrate; /* sdcycod */ |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
146 sgain = slowgain[(state->bai >> 5) & 3]; /* sgaincod */ |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
147 dbknee = dbpbtab[(state->bai >> 3) & 3]; /* dbpbcod */ |
3394 | 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; | |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
154 floor = floortab[state->bai & 7]; /* floorcod */ |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
155 snroffset = 960 - 64 * state->csnroffst - 4 * (ba->bai >> 3) + floor; |
3394 | 156 floor >>= 5; |
157 | |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
158 exp = expbap->exp; |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
159 bap = expbap->bap; |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
3394
diff
changeset
|
160 |
3394 | 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-20)[i] < end) ? (bndtab-20)[i] : 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 } |