Mercurial > libavcodec.hg
comparison liba52/downmix.c @ 1072:68d0a38bd802 libavcodec
* sync with main liba52 sources
author | kabi |
---|---|
date | Tue, 18 Feb 2003 11:48:57 +0000 |
parents | dd4f4c3d7171 |
children | e101d1cffec6 |
comparison
equal
deleted
inserted
replaced
1071:0a48dd404167 | 1072:68d0a38bd802 |
---|---|
1 /* | 1 /* |
2 * downmix.c | 2 * downmix.c |
3 * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> | 3 * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> |
4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> | 4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> |
5 * | 5 * |
6 * This file is part of a52dec, a free ATSC A-52 stream decoder. | 6 * This file is part of a52dec, a free ATSC A-52 stream decoder. |
7 * See http://liba52.sourceforge.net/ for updates. | 7 * See http://liba52.sourceforge.net/ for updates. |
8 * | 8 * |
19 * You should have received a copy of the GNU General Public License | 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 | 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 | 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 */ | 22 */ |
23 | 23 |
24 #include "config.h" | |
25 | |
26 #include <string.h> | |
27 #include <inttypes.h> | |
28 | |
24 #include "a52.h" | 29 #include "a52.h" |
25 #include "a52_internal.h" | 30 #include "a52_internal.h" |
26 | 31 |
27 #define CONVERT(acmod,output) (((output) << 3) + (acmod)) | 32 #define CONVERT(acmod,output) (((output) << 3) + (acmod)) |
28 | 33 |
29 int a52_downmix_init (int input, int flags, sample_t * level, | 34 int a52_downmix_init (int input, int flags, level_t * level, |
30 sample_t clev, sample_t slev) | 35 level_t clev, level_t slev) |
31 { | 36 { |
32 static uint8_t table[11][8] = { | 37 static uint8_t table[11][8] = { |
33 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, | 38 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, |
34 A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO}, | 39 A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO}, |
35 {A52_MONO, A52_MONO, A52_MONO, A52_MONO, | 40 {A52_MONO, A52_MONO, A52_MONO, A52_MONO, |
59 if (output > A52_DOLBY) | 64 if (output > A52_DOLBY) |
60 return -1; | 65 return -1; |
61 | 66 |
62 output = table[output][input & 7]; | 67 output = table[output][input & 7]; |
63 | 68 |
64 if ((output == A52_STEREO) && | 69 if (output == A52_STEREO && |
65 ((input == A52_DOLBY) || ((input == A52_3F) && (clev == LEVEL_3DB)))) | 70 (input == A52_DOLBY || (input == A52_3F && clev == LEVEL (LEVEL_3DB)))) |
66 output = A52_DOLBY; | 71 output = A52_DOLBY; |
67 | 72 |
68 if (flags & A52_ADJUST_LEVEL) | 73 if (flags & A52_ADJUST_LEVEL) { |
74 level_t adjust; | |
75 | |
69 switch (CONVERT (input & 7, output)) { | 76 switch (CONVERT (input & 7, output)) { |
70 | 77 |
71 case CONVERT (A52_3F, A52_MONO): | 78 case CONVERT (A52_3F, A52_MONO): |
72 *level *= LEVEL_3DB / (1 + clev); | 79 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev); |
73 break; | 80 break; |
74 | 81 |
75 case CONVERT (A52_STEREO, A52_MONO): | 82 case CONVERT (A52_STEREO, A52_MONO): |
76 case CONVERT (A52_2F2R, A52_2F1R): | 83 case CONVERT (A52_2F2R, A52_2F1R): |
77 case CONVERT (A52_3F2R, A52_3F1R): | 84 case CONVERT (A52_3F2R, A52_3F1R): |
78 level_3db: | 85 level_3db: |
79 *level *= LEVEL_3DB; | 86 adjust = LEVEL (LEVEL_3DB); |
80 break; | 87 break; |
81 | 88 |
82 case CONVERT (A52_3F2R, A52_2F1R): | 89 case CONVERT (A52_3F2R, A52_2F1R): |
83 if (clev < LEVEL_PLUS3DB - 1) | 90 if (clev < LEVEL (LEVEL_PLUS3DB - 1)) |
84 goto level_3db; | 91 goto level_3db; |
85 /* break thru */ | 92 /* break thru */ |
86 case CONVERT (A52_3F, A52_STEREO): | 93 case CONVERT (A52_3F, A52_STEREO): |
87 case CONVERT (A52_3F1R, A52_2F1R): | 94 case CONVERT (A52_3F1R, A52_2F1R): |
88 case CONVERT (A52_3F1R, A52_2F2R): | 95 case CONVERT (A52_3F1R, A52_2F2R): |
89 case CONVERT (A52_3F2R, A52_2F2R): | 96 case CONVERT (A52_3F2R, A52_2F2R): |
90 *level /= 1 + clev; | 97 adjust = DIV (1, LEVEL (1) + clev); |
91 break; | 98 break; |
92 | 99 |
93 case CONVERT (A52_2F1R, A52_MONO): | 100 case CONVERT (A52_2F1R, A52_MONO): |
94 *level *= LEVEL_PLUS3DB / (2 + slev); | 101 adjust = DIV (LEVEL_PLUS3DB, LEVEL (2) + slev); |
95 break; | 102 break; |
96 | 103 |
97 case CONVERT (A52_2F1R, A52_STEREO): | 104 case CONVERT (A52_2F1R, A52_STEREO): |
98 case CONVERT (A52_3F1R, A52_3F): | 105 case CONVERT (A52_3F1R, A52_3F): |
99 *level /= 1 + slev * LEVEL_3DB; | 106 adjust = DIV (1, LEVEL (1) + MUL_C (slev, LEVEL_3DB)); |
100 break; | 107 break; |
101 | 108 |
102 case CONVERT (A52_3F1R, A52_MONO): | 109 case CONVERT (A52_3F1R, A52_MONO): |
103 *level *= LEVEL_3DB / (1 + clev + 0.5 * slev); | 110 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + MUL_C (slev, 0.5)); |
104 break; | 111 break; |
105 | 112 |
106 case CONVERT (A52_3F1R, A52_STEREO): | 113 case CONVERT (A52_3F1R, A52_STEREO): |
107 *level /= 1 + clev + slev * LEVEL_3DB; | 114 adjust = DIV (1, LEVEL (1) + clev + MUL_C (slev, LEVEL_3DB)); |
108 break; | 115 break; |
109 | 116 |
110 case CONVERT (A52_2F2R, A52_MONO): | 117 case CONVERT (A52_2F2R, A52_MONO): |
111 *level *= LEVEL_3DB / (1 + slev); | 118 adjust = DIV (LEVEL_3DB, LEVEL (1) + slev); |
112 break; | 119 break; |
113 | 120 |
114 case CONVERT (A52_2F2R, A52_STEREO): | 121 case CONVERT (A52_2F2R, A52_STEREO): |
115 case CONVERT (A52_3F2R, A52_3F): | 122 case CONVERT (A52_3F2R, A52_3F): |
116 *level /= 1 + slev; | 123 adjust = DIV (1, LEVEL (1) + slev); |
117 break; | 124 break; |
118 | 125 |
119 case CONVERT (A52_3F2R, A52_MONO): | 126 case CONVERT (A52_3F2R, A52_MONO): |
120 *level *= LEVEL_3DB / (1 + clev + slev); | 127 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + slev); |
121 break; | 128 break; |
122 | 129 |
123 case CONVERT (A52_3F2R, A52_STEREO): | 130 case CONVERT (A52_3F2R, A52_STEREO): |
124 *level /= 1 + clev + slev; | 131 adjust = DIV (1, LEVEL (1) + clev + slev); |
125 break; | 132 break; |
126 | 133 |
127 case CONVERT (A52_MONO, A52_DOLBY): | 134 case CONVERT (A52_MONO, A52_DOLBY): |
128 *level *= LEVEL_PLUS3DB; | 135 adjust = LEVEL (LEVEL_PLUS3DB); |
129 break; | 136 break; |
130 | 137 |
131 case CONVERT (A52_3F, A52_DOLBY): | 138 case CONVERT (A52_3F, A52_DOLBY): |
132 case CONVERT (A52_2F1R, A52_DOLBY): | 139 case CONVERT (A52_2F1R, A52_DOLBY): |
133 *level *= 1 / (1 + LEVEL_3DB); | 140 adjust = LEVEL (1 / (1 + LEVEL_3DB)); |
134 break; | 141 break; |
135 | 142 |
136 case CONVERT (A52_3F1R, A52_DOLBY): | 143 case CONVERT (A52_3F1R, A52_DOLBY): |
137 case CONVERT (A52_2F2R, A52_DOLBY): | 144 case CONVERT (A52_2F2R, A52_DOLBY): |
138 *level *= 1 / (1 + 2 * LEVEL_3DB); | 145 adjust = LEVEL (1 / (1 + 2 * LEVEL_3DB)); |
139 break; | 146 break; |
140 | 147 |
141 case CONVERT (A52_3F2R, A52_DOLBY): | 148 case CONVERT (A52_3F2R, A52_DOLBY): |
142 *level *= 1 / (1 + 3 * LEVEL_3DB); | 149 adjust = LEVEL (1 / (1 + 3 * LEVEL_3DB)); |
143 break; | 150 break; |
151 | |
152 default: | |
153 return output; | |
144 } | 154 } |
145 | 155 |
156 *level = MUL_L (*level, adjust); | |
157 } | |
158 | |
146 return output; | 159 return output; |
147 } | 160 } |
148 | 161 |
149 int a52_downmix_coeff (sample_t * coeff, int acmod, int output, sample_t level, | 162 int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level, |
150 sample_t clev, sample_t slev) | 163 level_t clev, level_t slev) |
151 { | 164 { |
165 level_t level_3db; | |
166 | |
167 level_3db = MUL_C (level, LEVEL_3DB); | |
168 | |
152 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { | 169 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { |
153 | 170 |
154 case CONVERT (A52_CHANNEL, A52_CHANNEL): | 171 case CONVERT (A52_CHANNEL, A52_CHANNEL): |
155 case CONVERT (A52_MONO, A52_MONO): | 172 case CONVERT (A52_MONO, A52_MONO): |
156 case CONVERT (A52_STEREO, A52_STEREO): | 173 case CONVERT (A52_STEREO, A52_STEREO): |
162 case CONVERT (A52_STEREO, A52_DOLBY): | 179 case CONVERT (A52_STEREO, A52_DOLBY): |
163 coeff[0] = coeff[1] = coeff[2] = coeff[3] = coeff[4] = level; | 180 coeff[0] = coeff[1] = coeff[2] = coeff[3] = coeff[4] = level; |
164 return 0; | 181 return 0; |
165 | 182 |
166 case CONVERT (A52_CHANNEL, A52_MONO): | 183 case CONVERT (A52_CHANNEL, A52_MONO): |
167 coeff[0] = coeff[1] = level * LEVEL_6DB; | 184 coeff[0] = coeff[1] = MUL_C (level, LEVEL_6DB); |
168 return 3; | 185 return 3; |
169 | 186 |
170 case CONVERT (A52_STEREO, A52_MONO): | 187 case CONVERT (A52_STEREO, A52_MONO): |
171 coeff[0] = coeff[1] = level * LEVEL_3DB; | 188 coeff[0] = coeff[1] = level_3db; |
172 return 3; | 189 return 3; |
173 | 190 |
174 case CONVERT (A52_3F, A52_MONO): | 191 case CONVERT (A52_3F, A52_MONO): |
175 coeff[0] = coeff[2] = level * LEVEL_3DB; | 192 coeff[0] = coeff[2] = level_3db; |
176 coeff[1] = level * clev * LEVEL_PLUS3DB; | 193 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB); |
177 return 7; | 194 return 7; |
178 | 195 |
179 case CONVERT (A52_2F1R, A52_MONO): | 196 case CONVERT (A52_2F1R, A52_MONO): |
180 coeff[0] = coeff[1] = level * LEVEL_3DB; | 197 coeff[0] = coeff[1] = level_3db; |
181 coeff[2] = level * slev * LEVEL_3DB; | 198 coeff[2] = MUL_L (level_3db, slev); |
182 return 7; | 199 return 7; |
183 | 200 |
184 case CONVERT (A52_2F2R, A52_MONO): | 201 case CONVERT (A52_2F2R, A52_MONO): |
185 coeff[0] = coeff[1] = level * LEVEL_3DB; | 202 coeff[0] = coeff[1] = level_3db; |
186 coeff[2] = coeff[3] = level * slev * LEVEL_3DB; | 203 coeff[2] = coeff[3] = MUL_L (level_3db, slev); |
187 return 15; | 204 return 15; |
188 | 205 |
189 case CONVERT (A52_3F1R, A52_MONO): | 206 case CONVERT (A52_3F1R, A52_MONO): |
190 coeff[0] = coeff[2] = level * LEVEL_3DB; | 207 coeff[0] = coeff[2] = level_3db; |
191 coeff[1] = level * clev * LEVEL_PLUS3DB; | 208 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB); |
192 coeff[3] = level * slev * LEVEL_3DB; | 209 coeff[3] = MUL_L (level_3db, slev); |
193 return 15; | 210 return 15; |
194 | 211 |
195 case CONVERT (A52_3F2R, A52_MONO): | 212 case CONVERT (A52_3F2R, A52_MONO): |
196 coeff[0] = coeff[2] = level * LEVEL_3DB; | 213 coeff[0] = coeff[2] = level_3db; |
197 coeff[1] = level * clev * LEVEL_PLUS3DB; | 214 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB); |
198 coeff[3] = coeff[4] = level * slev * LEVEL_3DB; | 215 coeff[3] = coeff[4] = MUL_L (level_3db, slev); |
199 return 31; | 216 return 31; |
200 | 217 |
201 case CONVERT (A52_MONO, A52_DOLBY): | 218 case CONVERT (A52_MONO, A52_DOLBY): |
202 coeff[0] = level * LEVEL_3DB; | 219 coeff[0] = level_3db; |
203 return 0; | 220 return 0; |
204 | 221 |
205 case CONVERT (A52_3F, A52_DOLBY): | 222 case CONVERT (A52_3F, A52_DOLBY): |
206 clev = LEVEL_3DB; | 223 coeff[0] = coeff[2] = coeff[3] = coeff[4] = level; |
224 coeff[1] = level_3db; | |
225 return 7; | |
226 | |
207 case CONVERT (A52_3F, A52_STEREO): | 227 case CONVERT (A52_3F, A52_STEREO): |
208 case CONVERT (A52_3F1R, A52_2F1R): | 228 case CONVERT (A52_3F1R, A52_2F1R): |
209 case CONVERT (A52_3F2R, A52_2F2R): | 229 case CONVERT (A52_3F2R, A52_2F2R): |
210 coeff[0] = coeff[2] = coeff[3] = coeff[4] = level; | 230 coeff[0] = coeff[2] = coeff[3] = coeff[4] = level; |
211 coeff[1] = level * clev; | 231 coeff[1] = MUL_L (level, clev); |
212 return 7; | 232 return 7; |
213 | 233 |
214 case CONVERT (A52_2F1R, A52_DOLBY): | 234 case CONVERT (A52_2F1R, A52_DOLBY): |
215 slev = 1; | 235 coeff[0] = coeff[1] = level; |
236 coeff[2] = level_3db; | |
237 return 7; | |
238 | |
216 case CONVERT (A52_2F1R, A52_STEREO): | 239 case CONVERT (A52_2F1R, A52_STEREO): |
217 coeff[0] = coeff[1] = level; | 240 coeff[0] = coeff[1] = level; |
218 coeff[2] = level * slev * LEVEL_3DB; | 241 coeff[2] = MUL_L (level_3db, slev); |
219 return 7; | 242 return 7; |
220 | 243 |
221 case CONVERT (A52_3F1R, A52_DOLBY): | 244 case CONVERT (A52_3F1R, A52_DOLBY): |
222 clev = LEVEL_3DB; | 245 coeff[0] = coeff[2] = level; |
223 slev = 1; | 246 coeff[1] = coeff[3] = level_3db; |
247 return 15; | |
248 | |
224 case CONVERT (A52_3F1R, A52_STEREO): | 249 case CONVERT (A52_3F1R, A52_STEREO): |
225 coeff[0] = coeff[2] = level; | 250 coeff[0] = coeff[2] = level; |
226 coeff[1] = level * clev; | 251 coeff[1] = MUL_L (level, clev); |
227 coeff[3] = level * slev * LEVEL_3DB; | 252 coeff[3] = MUL_L (level_3db, slev); |
228 return 15; | 253 return 15; |
229 | 254 |
230 case CONVERT (A52_2F2R, A52_DOLBY): | 255 case CONVERT (A52_2F2R, A52_DOLBY): |
231 slev = LEVEL_3DB; | 256 coeff[0] = coeff[1] = level; |
257 coeff[2] = coeff[3] = level_3db; | |
258 return 15; | |
259 | |
232 case CONVERT (A52_2F2R, A52_STEREO): | 260 case CONVERT (A52_2F2R, A52_STEREO): |
233 coeff[0] = coeff[1] = level; | 261 coeff[0] = coeff[1] = level; |
234 coeff[2] = coeff[3] = level * slev; | 262 coeff[2] = coeff[3] = MUL_L (level, slev); |
235 return 15; | 263 return 15; |
236 | 264 |
237 case CONVERT (A52_3F2R, A52_DOLBY): | 265 case CONVERT (A52_3F2R, A52_DOLBY): |
238 clev = LEVEL_3DB; | 266 coeff[0] = coeff[2] = level; |
267 coeff[1] = coeff[3] = coeff[4] = level_3db; | |
268 return 31; | |
269 | |
239 case CONVERT (A52_3F2R, A52_2F1R): | 270 case CONVERT (A52_3F2R, A52_2F1R): |
240 slev = LEVEL_3DB; | 271 coeff[0] = coeff[2] = level; |
272 coeff[1] = MUL_L (level, clev); | |
273 coeff[3] = coeff[4] = level_3db; | |
274 return 31; | |
275 | |
241 case CONVERT (A52_3F2R, A52_STEREO): | 276 case CONVERT (A52_3F2R, A52_STEREO): |
242 coeff[0] = coeff[2] = level; | 277 coeff[0] = coeff[2] = level; |
243 coeff[1] = level * clev; | 278 coeff[1] = MUL_L (level, clev); |
244 coeff[3] = coeff[4] = level * slev; | 279 coeff[3] = coeff[4] = MUL_L (level, slev); |
245 return 31; | 280 return 31; |
246 | 281 |
247 case CONVERT (A52_3F1R, A52_3F): | 282 case CONVERT (A52_3F1R, A52_3F): |
248 coeff[0] = coeff[1] = coeff[2] = level; | 283 coeff[0] = coeff[1] = coeff[2] = level; |
249 coeff[3] = level * slev * LEVEL_3DB; | 284 coeff[3] = MUL_L (level_3db, slev); |
250 return 13; | 285 return 13; |
251 | 286 |
252 case CONVERT (A52_3F2R, A52_3F): | 287 case CONVERT (A52_3F2R, A52_3F): |
253 coeff[0] = coeff[1] = coeff[2] = level; | 288 coeff[0] = coeff[1] = coeff[2] = level; |
254 coeff[3] = coeff[4] = level * slev; | 289 coeff[3] = coeff[4] = MUL_L (level, slev); |
255 return 29; | 290 return 29; |
256 | 291 |
257 case CONVERT (A52_2F2R, A52_2F1R): | 292 case CONVERT (A52_2F2R, A52_2F1R): |
258 coeff[0] = coeff[1] = level; | 293 coeff[0] = coeff[1] = level; |
259 coeff[2] = coeff[3] = level * LEVEL_3DB; | 294 coeff[2] = coeff[3] = level_3db; |
260 return 12; | 295 return 12; |
261 | 296 |
262 case CONVERT (A52_3F2R, A52_3F1R): | 297 case CONVERT (A52_3F2R, A52_3F1R): |
263 coeff[0] = coeff[1] = coeff[2] = level; | 298 coeff[0] = coeff[1] = coeff[2] = level; |
264 coeff[3] = coeff[4] = level * LEVEL_3DB; | 299 coeff[3] = coeff[4] = level_3db; |
265 return 24; | 300 return 24; |
266 | 301 |
267 case CONVERT (A52_2F1R, A52_2F2R): | 302 case CONVERT (A52_2F1R, A52_2F2R): |
268 coeff[0] = coeff[1] = level; | 303 coeff[0] = coeff[1] = level; |
269 coeff[2] = level * LEVEL_3DB; | 304 coeff[2] = level_3db; |
270 return 0; | 305 return 0; |
271 | 306 |
272 case CONVERT (A52_3F1R, A52_2F2R): | 307 case CONVERT (A52_3F1R, A52_2F2R): |
273 coeff[0] = coeff[2] = level; | 308 coeff[0] = coeff[2] = level; |
274 coeff[1] = level * clev; | 309 coeff[1] = MUL_L (level, clev); |
275 coeff[3] = level * LEVEL_3DB; | 310 coeff[3] = level_3db; |
276 return 7; | 311 return 7; |
277 | 312 |
278 case CONVERT (A52_3F1R, A52_3F2R): | 313 case CONVERT (A52_3F1R, A52_3F2R): |
279 coeff[0] = coeff[1] = coeff[2] = level; | 314 coeff[0] = coeff[1] = coeff[2] = level; |
280 coeff[3] = level * LEVEL_3DB; | 315 coeff[3] = level_3db; |
281 return 0; | 316 return 0; |
282 | 317 |
283 case CONVERT (A52_CHANNEL, A52_CHANNEL1): | 318 case CONVERT (A52_CHANNEL, A52_CHANNEL1): |
284 coeff[0] = level; | 319 coeff[0] = level; |
285 coeff[1] = 0; | 320 coeff[1] = 0; |
297 static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias) | 332 static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias) |
298 { | 333 { |
299 int i; | 334 int i; |
300 | 335 |
301 for (i = 0; i < 256; i++) | 336 for (i = 0; i < 256; i++) |
302 dest[i] += src[i] + bias; | 337 dest[i] += BIAS (src[i]); |
303 } | 338 } |
304 | 339 |
305 static void mix3to1 (sample_t * samples, sample_t bias) | 340 static void mix3to1 (sample_t * samples, sample_t bias) |
306 { | 341 { |
307 int i; | 342 int i; |
308 | 343 |
309 for (i = 0; i < 256; i++) | 344 for (i = 0; i < 256; i++) |
310 samples[i] += samples[i + 256] + samples[i + 512] + bias; | 345 samples[i] += BIAS (samples[i + 256] + samples[i + 512]); |
311 } | 346 } |
312 | 347 |
313 static void mix4to1 (sample_t * samples, sample_t bias) | 348 static void mix4to1 (sample_t * samples, sample_t bias) |
314 { | 349 { |
315 int i; | 350 int i; |
316 | 351 |
317 for (i = 0; i < 256; i++) | 352 for (i = 0; i < 256; i++) |
318 samples[i] += (samples[i + 256] + samples[i + 512] + | 353 samples[i] += BIAS (samples[i + 256] + samples[i + 512] + |
319 samples[i + 768] + bias); | 354 samples[i + 768]); |
320 } | 355 } |
321 | 356 |
322 static void mix5to1 (sample_t * samples, sample_t bias) | 357 static void mix5to1 (sample_t * samples, sample_t bias) |
323 { | 358 { |
324 int i; | 359 int i; |
325 | 360 |
326 for (i = 0; i < 256; i++) | 361 for (i = 0; i < 256; i++) |
327 samples[i] += (samples[i + 256] + samples[i + 512] + | 362 samples[i] += BIAS (samples[i + 256] + samples[i + 512] + |
328 samples[i + 768] + samples[i + 1024] + bias); | 363 samples[i + 768] + samples[i + 1024]); |
329 } | 364 } |
330 | 365 |
331 static void mix3to2 (sample_t * samples, sample_t bias) | 366 static void mix3to2 (sample_t * samples, sample_t bias) |
332 { | 367 { |
333 int i; | 368 int i; |
334 sample_t common; | 369 sample_t common; |
335 | 370 |
336 for (i = 0; i < 256; i++) { | 371 for (i = 0; i < 256; i++) { |
337 common = samples[i + 256] + bias; | 372 common = BIAS (samples[i + 256]); |
338 samples[i] += common; | 373 samples[i] += common; |
339 samples[i + 256] = samples[i + 512] + common; | 374 samples[i + 256] = samples[i + 512] + common; |
340 } | 375 } |
341 } | 376 } |
342 | 377 |
344 { | 379 { |
345 int i; | 380 int i; |
346 sample_t common; | 381 sample_t common; |
347 | 382 |
348 for (i = 0; i < 256; i++) { | 383 for (i = 0; i < 256; i++) { |
349 common = right[i + 256] + bias; | 384 common = BIAS (right[i + 256]); |
350 left[i] += common; | 385 left[i] += common; |
351 right[i] += common; | 386 right[i] += common; |
352 } | 387 } |
353 } | 388 } |
354 | 389 |
357 int i; | 392 int i; |
358 sample_t surround; | 393 sample_t surround; |
359 | 394 |
360 for (i = 0; i < 256; i++) { | 395 for (i = 0; i < 256; i++) { |
361 surround = samples[i + 512]; | 396 surround = samples[i + 512]; |
362 samples[i] += bias - surround; | 397 samples[i] += BIAS (-surround); |
363 samples[i + 256] += bias + surround; | 398 samples[i + 256] += BIAS (surround); |
364 } | 399 } |
365 } | 400 } |
366 | 401 |
367 static void mix31to2 (sample_t * samples, sample_t bias) | 402 static void mix31to2 (sample_t * samples, sample_t bias) |
368 { | 403 { |
369 int i; | 404 int i; |
370 sample_t common; | 405 sample_t common; |
371 | 406 |
372 for (i = 0; i < 256; i++) { | 407 for (i = 0; i < 256; i++) { |
373 common = samples[i + 256] + samples[i + 768] + bias; | 408 common = BIAS (samples[i + 256] + samples[i + 768]); |
374 samples[i] += common; | 409 samples[i] += common; |
375 samples[i + 256] = samples[i + 512] + common; | 410 samples[i + 256] = samples[i + 512] + common; |
376 } | 411 } |
377 } | 412 } |
378 | 413 |
380 { | 415 { |
381 int i; | 416 int i; |
382 sample_t common, surround; | 417 sample_t common, surround; |
383 | 418 |
384 for (i = 0; i < 256; i++) { | 419 for (i = 0; i < 256; i++) { |
385 common = samples[i + 256] + bias; | 420 common = BIAS (samples[i + 256]); |
386 surround = samples[i + 768]; | 421 surround = samples[i + 768]; |
387 samples[i] += common - surround; | 422 samples[i] += common - surround; |
388 samples[i + 256] = samples[i + 512] + common + surround; | 423 samples[i + 256] = samples[i + 512] + common + surround; |
389 } | 424 } |
390 } | 425 } |
394 int i; | 429 int i; |
395 sample_t surround; | 430 sample_t surround; |
396 | 431 |
397 for (i = 0; i < 256; i++) { | 432 for (i = 0; i < 256; i++) { |
398 surround = samples[i + 512] + samples[i + 768]; | 433 surround = samples[i + 512] + samples[i + 768]; |
399 samples[i] += bias - surround; | 434 samples[i] += BIAS (-surround); |
400 samples[i + 256] += bias + surround; | 435 samples[i + 256] += BIAS (surround); |
401 } | 436 } |
402 } | 437 } |
403 | 438 |
404 static void mix32to2 (sample_t * samples, sample_t bias) | 439 static void mix32to2 (sample_t * samples, sample_t bias) |
405 { | 440 { |
406 int i; | 441 int i; |
407 sample_t common; | 442 sample_t common; |
408 | 443 |
409 for (i = 0; i < 256; i++) { | 444 for (i = 0; i < 256; i++) { |
410 common = samples[i + 256] + bias; | 445 common = BIAS (samples[i + 256]); |
411 samples[i] += common + samples[i + 768]; | 446 samples[i] += common + samples[i + 768]; |
412 samples[i + 256] = common + samples[i + 512] + samples[i + 1024]; | 447 samples[i + 256] = common + samples[i + 512] + samples[i + 1024]; |
413 } | 448 } |
414 } | 449 } |
415 | 450 |
417 { | 452 { |
418 int i; | 453 int i; |
419 sample_t common, surround; | 454 sample_t common, surround; |
420 | 455 |
421 for (i = 0; i < 256; i++) { | 456 for (i = 0; i < 256; i++) { |
422 common = samples[i + 256] + bias; | 457 common = BIAS (samples[i + 256]); |
423 surround = samples[i + 768] + samples[i + 1024]; | 458 surround = samples[i + 768] + samples[i + 1024]; |
424 samples[i] += common - surround; | 459 samples[i] += common - surround; |
425 samples[i + 256] = samples[i + 512] + common + surround; | 460 samples[i + 256] = samples[i + 512] + common + surround; |
426 } | 461 } |
427 } | 462 } |
429 static void move2to1 (sample_t * src, sample_t * dest, sample_t bias) | 464 static void move2to1 (sample_t * src, sample_t * dest, sample_t bias) |
430 { | 465 { |
431 int i; | 466 int i; |
432 | 467 |
433 for (i = 0; i < 256; i++) | 468 for (i = 0; i < 256; i++) |
434 dest[i] = src[i] + src[i + 256] + bias; | 469 dest[i] = BIAS (src[i] + src[i + 256]); |
435 } | 470 } |
436 | 471 |
437 static void zero (sample_t * samples) | 472 static void zero (sample_t * samples) |
438 { | 473 { |
439 int i; | 474 int i; |
441 for (i = 0; i < 256; i++) | 476 for (i = 0; i < 256; i++) |
442 samples[i] = 0; | 477 samples[i] = 0; |
443 } | 478 } |
444 | 479 |
445 void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, | 480 void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, |
446 sample_t clev, sample_t slev) | 481 level_t clev, level_t slev) |
447 { | 482 { |
448 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { | 483 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { |
449 | 484 |
450 case CONVERT (A52_CHANNEL, A52_CHANNEL2): | 485 case CONVERT (A52_CHANNEL, A52_CHANNEL2): |
451 memcpy (samples, samples + 256, 256 * sizeof (sample_t)); | 486 memcpy (samples, samples + 256, 256 * sizeof (sample_t)); |
576 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); | 611 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); |
577 memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t)); | 612 memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t)); |
578 break; | 613 break; |
579 | 614 |
580 case CONVERT (A52_3F1R, A52_3F2R): | 615 case CONVERT (A52_3F1R, A52_3F2R): |
581 memcpy (samples + 1027, samples + 768, 256 * sizeof (sample_t)); | 616 memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t)); |
582 break; | 617 break; |
583 } | 618 } |
584 } | 619 } |
585 | 620 |
586 void a52_upmix (sample_t * samples, int acmod, int output) | 621 void a52_upmix (sample_t * samples, int acmod, int output) |