/proc/self/cwd/libfaad/output.c
Line | Count | Source |
1 | | /* |
2 | | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
4 | | ** |
5 | | ** This program is free software; you can redistribute it and/or modify |
6 | | ** it under the terms of the GNU General Public License as published by |
7 | | ** the Free Software Foundation; either version 2 of the License, or |
8 | | ** (at your option) any later version. |
9 | | ** |
10 | | ** This program is distributed in the hope that it will be useful, |
11 | | ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | | ** GNU General Public License for more details. |
14 | | ** |
15 | | ** You should have received a copy of the GNU General Public License |
16 | | ** along with this program; if not, write to the Free Software |
17 | | ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 | | ** |
19 | | ** Any non-GPL usage of this software or parts of this software is strictly |
20 | | ** forbidden. |
21 | | ** |
22 | | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | | ** |
25 | | ** Commercial non-GPL licensing of this software is possible. |
26 | | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | | ** |
28 | | ** $Id: output.c,v 1.47 2009/01/26 23:51:15 menno Exp $ |
29 | | **/ |
30 | | |
31 | | #include "common.h" |
32 | | #include "structs.h" |
33 | | |
34 | | #include "output.h" |
35 | | |
36 | | #ifndef FIXED_POINT |
37 | | |
38 | | |
39 | 13.7M | #define FLOAT_SCALE (1.0f/(1<<15)) |
40 | | |
41 | 2.52M | #define DM_MUL REAL_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) |
42 | 5.05M | #define RSQRT2 REAL_CONST(0.7071067811865475244) // 1/sqrt(2) |
43 | | |
44 | | |
45 | | static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, |
46 | | uint8_t down_matrix, uint8_t *internal_channel) |
47 | 44.1M | { |
48 | 44.1M | if (!down_matrix) |
49 | 41.6M | return input[internal_channel[channel]][sample]; |
50 | | |
51 | 2.52M | if (channel == 0) |
52 | 1.25M | { |
53 | 1.25M | return DM_MUL * (input[internal_channel[1]][sample] + |
54 | 1.25M | input[internal_channel[0]][sample] * RSQRT2 + |
55 | 1.25M | input[internal_channel[3]][sample] * RSQRT2); |
56 | 1.27M | } else { |
57 | 1.27M | return DM_MUL * (input[internal_channel[2]][sample] + |
58 | 1.27M | input[internal_channel[0]][sample] * RSQRT2 + |
59 | 1.27M | input[internal_channel[4]][sample] * RSQRT2); |
60 | 1.27M | } |
61 | 2.52M | } |
62 | | |
63 | | #ifndef HAS_LRINTF |
64 | 38.1M | #define CLIP(sample, max, min) \ |
65 | 38.1M | if (sample >= 0.0f) \ |
66 | 32.7M | { \ |
67 | 32.7M | sample += 0.5f; \ |
68 | 32.7M | if (sample >= max) \ |
69 | 32.7M | sample = max; \ |
70 | 32.7M | } else { \ |
71 | 5.32M | sample += -0.5f; \ |
72 | 5.32M | if (sample <= min) \ |
73 | 5.32M | sample = min; \ |
74 | 5.32M | } |
75 | | #else |
76 | | #define CLIP(sample, max, min) \ |
77 | | if (sample >= 0.0f) \ |
78 | | { \ |
79 | | if (sample >= max) \ |
80 | | sample = max; \ |
81 | | } else { \ |
82 | | if (sample <= min) \ |
83 | | sample = min; \ |
84 | | } |
85 | | #endif |
86 | | |
87 | 8.33k | #define CONV(a,b) ((a<<1)|(b&0x1)) |
88 | | |
89 | | static void to_PCM_16bit(NeAACDecStruct *hDecoder, real_t **input, |
90 | | uint8_t channels, uint16_t frame_len, |
91 | | int16_t **sample_buffer) |
92 | 1.95k | { |
93 | 1.95k | uint8_t ch, ch1; |
94 | 1.95k | uint16_t i; |
95 | | |
96 | 1.95k | switch (CONV(channels,hDecoder->downMatrix)) |
97 | 1.95k | { |
98 | 0 | case CONV(1,0): |
99 | 0 | case CONV(1,1): |
100 | 0 | for(i = 0; i < frame_len; i++) |
101 | 0 | { |
102 | 0 | real_t inp = input[hDecoder->internal_channel[0]][i]; |
103 | |
|
104 | 0 | CLIP(inp, 32767.0f, -32768.0f); |
105 | |
|
106 | 0 | (*sample_buffer)[i] = (int16_t)lrintf(inp); |
107 | 0 | } |
108 | 0 | break; |
109 | 969 | case CONV(2,0): |
110 | 969 | if (hDecoder->upMatrix) |
111 | 68 | { |
112 | 68 | ch = hDecoder->internal_channel[0]; |
113 | 115k | for(i = 0; i < frame_len; i++) |
114 | 115k | { |
115 | 115k | real_t inp0 = input[ch][i]; |
116 | | |
117 | 115k | CLIP(inp0, 32767.0f, -32768.0f); |
118 | | |
119 | 115k | (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); |
120 | 115k | (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp0); |
121 | 115k | } |
122 | 901 | } else { |
123 | 901 | ch = hDecoder->internal_channel[0]; |
124 | 901 | ch1 = hDecoder->internal_channel[1]; |
125 | 1.43M | for(i = 0; i < frame_len; i++) |
126 | 1.43M | { |
127 | 1.43M | real_t inp0 = input[ch ][i]; |
128 | 1.43M | real_t inp1 = input[ch1][i]; |
129 | | |
130 | 1.43M | CLIP(inp0, 32767.0f, -32768.0f); |
131 | 1.43M | CLIP(inp1, 32767.0f, -32768.0f); |
132 | | |
133 | 1.43M | (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); |
134 | 1.43M | (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp1); |
135 | 1.43M | } |
136 | 901 | } |
137 | 969 | break; |
138 | 982 | default: |
139 | 10.8k | for (ch = 0; ch < channels; ch++) |
140 | 9.90k | { |
141 | 14.5M | for(i = 0; i < frame_len; i++) |
142 | 14.4M | { |
143 | 14.4M | real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); |
144 | | |
145 | 14.4M | CLIP(inp, 32767.0f, -32768.0f); |
146 | | |
147 | 14.4M | (*sample_buffer)[(i*channels)+ch] = (int16_t)lrintf(inp); |
148 | 14.4M | } |
149 | 9.90k | } |
150 | 982 | break; |
151 | 1.95k | } |
152 | 1.95k | } |
153 | | |
154 | | static void to_PCM_24bit(NeAACDecStruct *hDecoder, real_t **input, |
155 | | uint8_t channels, uint16_t frame_len, |
156 | | int32_t **sample_buffer) |
157 | 1.28k | { |
158 | 1.28k | uint8_t ch, ch1; |
159 | 1.28k | uint16_t i; |
160 | | |
161 | 1.28k | switch (CONV(channels,hDecoder->downMatrix)) |
162 | 1.28k | { |
163 | 0 | case CONV(1,0): |
164 | 0 | case CONV(1,1): |
165 | 0 | for(i = 0; i < frame_len; i++) |
166 | 0 | { |
167 | 0 | real_t inp = input[hDecoder->internal_channel[0]][i]; |
168 | |
|
169 | 0 | inp *= 256.0f; |
170 | 0 | CLIP(inp, 8388607.0f, -8388608.0f); |
171 | |
|
172 | 0 | (*sample_buffer)[i] = (int32_t)lrintf(inp); |
173 | 0 | } |
174 | 0 | break; |
175 | 590 | case CONV(2,0): |
176 | 590 | if (hDecoder->upMatrix) |
177 | 36 | { |
178 | 36 | ch = hDecoder->internal_channel[0]; |
179 | 52.1k | for(i = 0; i < frame_len; i++) |
180 | 52.0k | { |
181 | 52.0k | real_t inp0 = input[ch][i]; |
182 | | |
183 | 52.0k | inp0 *= 256.0f; |
184 | 52.0k | CLIP(inp0, 8388607.0f, -8388608.0f); |
185 | | |
186 | 52.0k | (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); |
187 | 52.0k | (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); |
188 | 52.0k | } |
189 | 554 | } else { |
190 | 554 | ch = hDecoder->internal_channel[0]; |
191 | 554 | ch1 = hDecoder->internal_channel[1]; |
192 | 816k | for(i = 0; i < frame_len; i++) |
193 | 816k | { |
194 | 816k | real_t inp0 = input[ch ][i]; |
195 | 816k | real_t inp1 = input[ch1][i]; |
196 | | |
197 | 816k | inp0 *= 256.0f; |
198 | 816k | inp1 *= 256.0f; |
199 | 816k | CLIP(inp0, 8388607.0f, -8388608.0f); |
200 | 816k | CLIP(inp1, 8388607.0f, -8388608.0f); |
201 | | |
202 | 816k | (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); |
203 | 816k | (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); |
204 | 816k | } |
205 | 554 | } |
206 | 590 | break; |
207 | 693 | default: |
208 | 6.97k | for (ch = 0; ch < channels; ch++) |
209 | 6.28k | { |
210 | 9.42M | for(i = 0; i < frame_len; i++) |
211 | 9.41M | { |
212 | 9.41M | real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); |
213 | | |
214 | 9.41M | inp *= 256.0f; |
215 | 9.41M | CLIP(inp, 8388607.0f, -8388608.0f); |
216 | | |
217 | 9.41M | (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); |
218 | 9.41M | } |
219 | 6.28k | } |
220 | 693 | break; |
221 | 1.28k | } |
222 | 1.28k | } |
223 | | |
224 | | static void to_PCM_32bit(NeAACDecStruct *hDecoder, real_t **input, |
225 | | uint8_t channels, uint16_t frame_len, |
226 | | int32_t **sample_buffer) |
227 | 1.26k | { |
228 | 1.26k | uint8_t ch, ch1; |
229 | 1.26k | uint16_t i; |
230 | | |
231 | 1.26k | switch (CONV(channels,hDecoder->downMatrix)) |
232 | 1.26k | { |
233 | 0 | case CONV(1,0): |
234 | 0 | case CONV(1,1): |
235 | 0 | for(i = 0; i < frame_len; i++) |
236 | 0 | { |
237 | 0 | real_t inp = input[hDecoder->internal_channel[0]][i]; |
238 | |
|
239 | 0 | inp *= 65536.0f; |
240 | 0 | CLIP(inp, 2147483647.0f, -2147483648.0f); |
241 | |
|
242 | 0 | (*sample_buffer)[i] = (int32_t)lrintf(inp); |
243 | 0 | } |
244 | 0 | break; |
245 | 684 | case CONV(2,0): |
246 | 684 | if (hDecoder->upMatrix) |
247 | 36 | { |
248 | 36 | ch = hDecoder->internal_channel[0]; |
249 | 57.2k | for(i = 0; i < frame_len; i++) |
250 | 57.2k | { |
251 | 57.2k | real_t inp0 = input[ch][i]; |
252 | | |
253 | 57.2k | inp0 *= 65536.0f; |
254 | 57.2k | CLIP(inp0, 2147483647.0f, -2147483648.0f); |
255 | | |
256 | 57.2k | (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); |
257 | 57.2k | (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); |
258 | 57.2k | } |
259 | 648 | } else { |
260 | 648 | ch = hDecoder->internal_channel[0]; |
261 | 648 | ch1 = hDecoder->internal_channel[1]; |
262 | 1.00M | for(i = 0; i < frame_len; i++) |
263 | 1.00M | { |
264 | 1.00M | real_t inp0 = input[ch ][i]; |
265 | 1.00M | real_t inp1 = input[ch1][i]; |
266 | | |
267 | 1.00M | inp0 *= 65536.0f; |
268 | 1.00M | inp1 *= 65536.0f; |
269 | 1.00M | CLIP(inp0, 2147483647.0f, -2147483648.0f); |
270 | 1.00M | CLIP(inp1, 2147483647.0f, -2147483648.0f); |
271 | | |
272 | 1.00M | (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); |
273 | 1.00M | (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); |
274 | 1.00M | } |
275 | 648 | } |
276 | 684 | break; |
277 | 581 | default: |
278 | 5.58k | for (ch = 0; ch < channels; ch++) |
279 | 5.00k | { |
280 | 7.49M | for(i = 0; i < frame_len; i++) |
281 | 7.49M | { |
282 | 7.49M | real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); |
283 | | |
284 | 7.49M | inp *= 65536.0f; |
285 | 7.49M | CLIP(inp, 2147483647.0f, -2147483648.0f); |
286 | | |
287 | 7.49M | (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); |
288 | 7.49M | } |
289 | 5.00k | } |
290 | 581 | break; |
291 | 1.26k | } |
292 | 1.26k | } |
293 | | |
294 | | static void to_PCM_float(NeAACDecStruct *hDecoder, real_t **input, |
295 | | uint8_t channels, uint16_t frame_len, |
296 | | float32_t **sample_buffer) |
297 | 710 | { |
298 | 710 | uint8_t ch, ch1; |
299 | 710 | uint16_t i; |
300 | | |
301 | 710 | switch (CONV(channels,hDecoder->downMatrix)) |
302 | 710 | { |
303 | 0 | case CONV(1,0): |
304 | 0 | case CONV(1,1): |
305 | 0 | for(i = 0; i < frame_len; i++) |
306 | 0 | { |
307 | 0 | real_t inp = input[hDecoder->internal_channel[0]][i]; |
308 | 0 | (*sample_buffer)[i] = inp*FLOAT_SCALE; |
309 | 0 | } |
310 | 0 | break; |
311 | 174 | case CONV(2,0): |
312 | 174 | if (hDecoder->upMatrix) |
313 | 19 | { |
314 | 19 | ch = hDecoder->internal_channel[0]; |
315 | 31.5k | for(i = 0; i < frame_len; i++) |
316 | 31.4k | { |
317 | 31.4k | real_t inp0 = input[ch][i]; |
318 | 31.4k | (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; |
319 | 31.4k | (*sample_buffer)[(i*2)+1] = inp0*FLOAT_SCALE; |
320 | 31.4k | } |
321 | 155 | } else { |
322 | 155 | ch = hDecoder->internal_channel[0]; |
323 | 155 | ch1 = hDecoder->internal_channel[1]; |
324 | 255k | for(i = 0; i < frame_len; i++) |
325 | 255k | { |
326 | 255k | real_t inp0 = input[ch ][i]; |
327 | 255k | real_t inp1 = input[ch1][i]; |
328 | 255k | (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; |
329 | 255k | (*sample_buffer)[(i*2)+1] = inp1*FLOAT_SCALE; |
330 | 255k | } |
331 | 155 | } |
332 | 174 | break; |
333 | 536 | default: |
334 | 5.14k | for (ch = 0; ch < channels; ch++) |
335 | 4.60k | { |
336 | 6.83M | for(i = 0; i < frame_len; i++) |
337 | 6.83M | { |
338 | 6.83M | real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); |
339 | 6.83M | (*sample_buffer)[(i*channels)+ch] = inp*FLOAT_SCALE; |
340 | 6.83M | } |
341 | 4.60k | } |
342 | 536 | break; |
343 | 710 | } |
344 | 710 | } |
345 | | |
346 | | static void to_PCM_double(NeAACDecStruct *hDecoder, real_t **input, |
347 | | uint8_t channels, uint16_t frame_len, |
348 | | double **sample_buffer) |
349 | 532 | { |
350 | 532 | uint8_t ch, ch1; |
351 | 532 | uint16_t i; |
352 | | |
353 | 532 | switch (CONV(channels,hDecoder->downMatrix)) |
354 | 532 | { |
355 | 0 | case CONV(1,0): |
356 | 0 | case CONV(1,1): |
357 | 0 | for(i = 0; i < frame_len; i++) |
358 | 0 | { |
359 | 0 | real_t inp = input[hDecoder->internal_channel[0]][i]; |
360 | 0 | (*sample_buffer)[i] = (double)inp*FLOAT_SCALE; |
361 | 0 | } |
362 | 0 | break; |
363 | 172 | case CONV(2,0): |
364 | 172 | if (hDecoder->upMatrix) |
365 | 32 | { |
366 | 32 | ch = hDecoder->internal_channel[0]; |
367 | 44.8k | for(i = 0; i < frame_len; i++) |
368 | 44.8k | { |
369 | 44.8k | real_t inp0 = input[ch][i]; |
370 | 44.8k | (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; |
371 | 44.8k | (*sample_buffer)[(i*2)+1] = (double)inp0*FLOAT_SCALE; |
372 | 44.8k | } |
373 | 140 | } else { |
374 | 140 | ch = hDecoder->internal_channel[0]; |
375 | 140 | ch1 = hDecoder->internal_channel[1]; |
376 | 170k | for(i = 0; i < frame_len; i++) |
377 | 170k | { |
378 | 170k | real_t inp0 = input[ch ][i]; |
379 | 170k | real_t inp1 = input[ch1][i]; |
380 | 170k | (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; |
381 | 170k | (*sample_buffer)[(i*2)+1] = (double)inp1*FLOAT_SCALE; |
382 | 170k | } |
383 | 140 | } |
384 | 172 | break; |
385 | 360 | default: |
386 | 4.22k | for (ch = 0; ch < channels; ch++) |
387 | 3.86k | { |
388 | 5.91M | for(i = 0; i < frame_len; i++) |
389 | 5.91M | { |
390 | 5.91M | real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); |
391 | 5.91M | (*sample_buffer)[(i*channels)+ch] = (double)inp*FLOAT_SCALE; |
392 | 5.91M | } |
393 | 3.86k | } |
394 | 360 | break; |
395 | 532 | } |
396 | 532 | } |
397 | | |
398 | | void *output_to_PCM(NeAACDecStruct *hDecoder, |
399 | | real_t **input, void *sample_buffer, uint8_t channels, |
400 | | uint16_t frame_len, uint8_t format) |
401 | 11.4k | { |
402 | 11.4k | int16_t *short_sample_buffer = (int16_t*)sample_buffer; |
403 | 11.4k | int32_t *int_sample_buffer = (int32_t*)sample_buffer; |
404 | 11.4k | float32_t *float_sample_buffer = (float32_t*)sample_buffer; |
405 | 11.4k | double *double_sample_buffer = (double*)sample_buffer; |
406 | | |
407 | | #ifdef PROFILE |
408 | | int64_t count = faad_get_ts(); |
409 | | #endif |
410 | | |
411 | | /* Copy output to a standard PCM buffer */ |
412 | 11.4k | switch (format) |
413 | 11.4k | { |
414 | 3.90k | case FAAD_FMT_16BIT: |
415 | 3.90k | to_PCM_16bit(hDecoder, input, channels, frame_len, &short_sample_buffer); |
416 | 3.90k | break; |
417 | 2.56k | case FAAD_FMT_24BIT: |
418 | 2.56k | to_PCM_24bit(hDecoder, input, channels, frame_len, &int_sample_buffer); |
419 | 2.56k | break; |
420 | 2.53k | case FAAD_FMT_32BIT: |
421 | 2.53k | to_PCM_32bit(hDecoder, input, channels, frame_len, &int_sample_buffer); |
422 | 2.53k | break; |
423 | 1.42k | case FAAD_FMT_FLOAT: |
424 | 1.42k | to_PCM_float(hDecoder, input, channels, frame_len, &float_sample_buffer); |
425 | 1.42k | break; |
426 | 1.06k | case FAAD_FMT_DOUBLE: |
427 | 1.06k | to_PCM_double(hDecoder, input, channels, frame_len, &double_sample_buffer); |
428 | 1.06k | break; |
429 | 11.4k | } |
430 | | |
431 | | #ifdef PROFILE |
432 | | count = faad_get_ts() - count; |
433 | | hDecoder->output_cycles += count; |
434 | | #endif |
435 | | |
436 | 11.4k | return sample_buffer; |
437 | 11.4k | } Line | Count | Source | 401 | 5.74k | { | 402 | 5.74k | int16_t *short_sample_buffer = (int16_t*)sample_buffer; | 403 | 5.74k | int32_t *int_sample_buffer = (int32_t*)sample_buffer; | 404 | 5.74k | float32_t *float_sample_buffer = (float32_t*)sample_buffer; | 405 | 5.74k | double *double_sample_buffer = (double*)sample_buffer; | 406 | | | 407 | | #ifdef PROFILE | 408 | | int64_t count = faad_get_ts(); | 409 | | #endif | 410 | | | 411 | | /* Copy output to a standard PCM buffer */ | 412 | 5.74k | switch (format) | 413 | 5.74k | { | 414 | 1.95k | case FAAD_FMT_16BIT: | 415 | 1.95k | to_PCM_16bit(hDecoder, input, channels, frame_len, &short_sample_buffer); | 416 | 1.95k | break; | 417 | 1.28k | case FAAD_FMT_24BIT: | 418 | 1.28k | to_PCM_24bit(hDecoder, input, channels, frame_len, &int_sample_buffer); | 419 | 1.28k | break; | 420 | 1.26k | case FAAD_FMT_32BIT: | 421 | 1.26k | to_PCM_32bit(hDecoder, input, channels, frame_len, &int_sample_buffer); | 422 | 1.26k | break; | 423 | 710 | case FAAD_FMT_FLOAT: | 424 | 710 | to_PCM_float(hDecoder, input, channels, frame_len, &float_sample_buffer); | 425 | 710 | break; | 426 | 532 | case FAAD_FMT_DOUBLE: | 427 | 532 | to_PCM_double(hDecoder, input, channels, frame_len, &double_sample_buffer); | 428 | 532 | break; | 429 | 5.74k | } | 430 | | | 431 | | #ifdef PROFILE | 432 | | count = faad_get_ts() - count; | 433 | | hDecoder->output_cycles += count; | 434 | | #endif | 435 | | | 436 | 5.74k | return sample_buffer; | 437 | 5.74k | } |
Line | Count | Source | 401 | 5.74k | { | 402 | 5.74k | int16_t *short_sample_buffer = (int16_t*)sample_buffer; | 403 | 5.74k | int32_t *int_sample_buffer = (int32_t*)sample_buffer; | 404 | 5.74k | float32_t *float_sample_buffer = (float32_t*)sample_buffer; | 405 | 5.74k | double *double_sample_buffer = (double*)sample_buffer; | 406 | | | 407 | | #ifdef PROFILE | 408 | | int64_t count = faad_get_ts(); | 409 | | #endif | 410 | | | 411 | | /* Copy output to a standard PCM buffer */ | 412 | 5.74k | switch (format) | 413 | 5.74k | { | 414 | 1.95k | case FAAD_FMT_16BIT: | 415 | 1.95k | to_PCM_16bit(hDecoder, input, channels, frame_len, &short_sample_buffer); | 416 | 1.95k | break; | 417 | 1.28k | case FAAD_FMT_24BIT: | 418 | 1.28k | to_PCM_24bit(hDecoder, input, channels, frame_len, &int_sample_buffer); | 419 | 1.28k | break; | 420 | 1.26k | case FAAD_FMT_32BIT: | 421 | 1.26k | to_PCM_32bit(hDecoder, input, channels, frame_len, &int_sample_buffer); | 422 | 1.26k | break; | 423 | 710 | case FAAD_FMT_FLOAT: | 424 | 710 | to_PCM_float(hDecoder, input, channels, frame_len, &float_sample_buffer); | 425 | 710 | break; | 426 | 532 | case FAAD_FMT_DOUBLE: | 427 | 532 | to_PCM_double(hDecoder, input, channels, frame_len, &double_sample_buffer); | 428 | 532 | break; | 429 | 5.74k | } | 430 | | | 431 | | #ifdef PROFILE | 432 | | count = faad_get_ts() - count; | 433 | | hDecoder->output_cycles += count; | 434 | | #endif | 435 | | | 436 | 5.74k | return sample_buffer; | 437 | 5.74k | } |
|
438 | | |
439 | | #else |
440 | | |
441 | | #define DM_MUL FRAC_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) |
442 | | #define RSQRT2 FRAC_CONST(0.7071067811865475244) // 1/sqrt(2) |
443 | | #define BOTH FRAC_CONST(0.2265409196609864215998) // 1/(sqrt(2) + 2 + 1) |
444 | | |
445 | | static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, |
446 | | uint8_t down_matrix, uint8_t up_matrix, |
447 | | uint8_t *internal_channel) |
448 | 30.1M | { |
449 | 30.1M | real_t C; |
450 | 30.1M | if (up_matrix == 1) |
451 | 286k | return input[internal_channel[0]][sample]; |
452 | | |
453 | 29.8M | if (!down_matrix) |
454 | 29.0M | return input[internal_channel[channel]][sample]; |
455 | | |
456 | 779k | C = MUL_F(input[internal_channel[0]][sample], BOTH); |
457 | 779k | if (channel == 0) |
458 | 380k | { |
459 | 380k | real_t L_S = MUL_F(input[internal_channel[3]][sample], BOTH); |
460 | 380k | real_t core = MUL_F(input[internal_channel[1]][sample], DM_MUL); |
461 | 380k | return core + C + L_S; |
462 | 399k | } else { |
463 | 399k | real_t R_S = MUL_F(input[internal_channel[4]][sample], BOTH); |
464 | 399k | real_t core = MUL_F(input[internal_channel[2]][sample], DM_MUL); |
465 | 399k | return core + C + R_S; |
466 | 399k | } |
467 | 779k | } |
468 | | |
469 | | void* output_to_PCM(NeAACDecStruct *hDecoder, |
470 | | real_t **input, void *sample_buffer, uint8_t channels, |
471 | | uint16_t frame_len, uint8_t format) |
472 | 6.62k | { |
473 | 6.62k | uint8_t ch; |
474 | 6.62k | uint16_t i; |
475 | 6.62k | int16_t *short_sample_buffer = (int16_t*)sample_buffer; |
476 | 6.62k | int32_t *int_sample_buffer = (int32_t*)sample_buffer; |
477 | 6.62k | int32_t exp, half, sat_shift_mask; |
478 | | |
479 | | /* Copy output to a standard PCM buffer */ |
480 | 47.5k | for (ch = 0; ch < channels; ch++) |
481 | 40.9k | { |
482 | 40.9k | switch (format) |
483 | 40.9k | { |
484 | 11.5k | case FAAD_FMT_16BIT: |
485 | 17.0M | for(i = 0; i < frame_len; i++) |
486 | 17.0M | { |
487 | 17.0M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, |
488 | 17.0M | hDecoder->internal_channel); |
489 | 17.0M | if (tmp >= 0) |
490 | 16.0M | { |
491 | 16.0M | tmp += (1 << (REAL_BITS-1)); |
492 | 16.0M | if (tmp >= REAL_CONST(32767)) |
493 | 36.1k | { |
494 | 36.1k | tmp = REAL_CONST(32767); |
495 | 36.1k | } |
496 | 16.0M | } else { |
497 | 1.01M | tmp += -(1 << (REAL_BITS-1)); |
498 | 1.01M | if (tmp <= REAL_CONST(-32768)) |
499 | 33.8k | { |
500 | 33.8k | tmp = REAL_CONST(-32768); |
501 | 33.8k | } |
502 | 1.01M | } |
503 | 17.0M | tmp >>= REAL_BITS; |
504 | 17.0M | short_sample_buffer[(i*channels)+ch] = (int16_t)tmp; |
505 | 17.0M | } |
506 | 11.5k | break; |
507 | 12.7k | case FAAD_FMT_24BIT: |
508 | 18.9M | for(i = 0; i < frame_len; i++) |
509 | 18.9M | { |
510 | 18.9M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, |
511 | 18.9M | hDecoder->internal_channel); |
512 | 18.9M | if (tmp >= 0) |
513 | 17.4M | { |
514 | 17.4M | tmp += (1 << (REAL_BITS-9)); |
515 | 17.4M | tmp >>= (REAL_BITS-8); |
516 | 17.4M | if (tmp >= 8388607) |
517 | 27.8k | { |
518 | 27.8k | tmp = 8388607; |
519 | 27.8k | } |
520 | 17.4M | } else { |
521 | 1.47M | tmp += -(1 << (REAL_BITS-9)); |
522 | 1.47M | tmp >>= (REAL_BITS-8); |
523 | 1.47M | if (tmp <= -8388608) |
524 | 26.6k | { |
525 | 26.6k | tmp = -8388608; |
526 | 26.6k | } |
527 | 1.47M | } |
528 | 18.9M | int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; |
529 | 18.9M | } |
530 | 12.7k | break; |
531 | 9.59k | case FAAD_FMT_32BIT: |
532 | 9.59k | exp = 16 - REAL_BITS; |
533 | 9.59k | half = 1 << (exp - 1); |
534 | 9.59k | sat_shift_mask = SAT_SHIFT_MASK(exp); |
535 | 14.0M | for(i = 0; i < frame_len; i++) |
536 | 14.0M | { |
537 | 14.0M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, |
538 | 14.0M | hDecoder->internal_channel); |
539 | 14.0M | if (tmp >= 0) |
540 | 12.6M | { |
541 | 12.6M | tmp += half; |
542 | 12.6M | } else { |
543 | 1.41M | tmp += -half; |
544 | 1.41M | } |
545 | 14.0M | tmp = SAT_SHIFT(tmp, exp, sat_shift_mask); |
546 | 14.0M | int_sample_buffer[(i*channels)+ch] = tmp; |
547 | 14.0M | } |
548 | 9.59k | break; |
549 | 7.03k | case FAAD_FMT_FIXED: |
550 | 10.3M | for(i = 0; i < frame_len; i++) |
551 | 10.2M | { |
552 | 10.2M | real_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, |
553 | 10.2M | hDecoder->internal_channel); |
554 | 10.2M | int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; |
555 | 10.2M | } |
556 | 7.03k | break; |
557 | 40.9k | } |
558 | 40.9k | } |
559 | | |
560 | 6.62k | return sample_buffer; |
561 | 6.62k | } Line | Count | Source | 472 | 3.31k | { | 473 | 3.31k | uint8_t ch; | 474 | 3.31k | uint16_t i; | 475 | 3.31k | int16_t *short_sample_buffer = (int16_t*)sample_buffer; | 476 | 3.31k | int32_t *int_sample_buffer = (int32_t*)sample_buffer; | 477 | 3.31k | int32_t exp, half, sat_shift_mask; | 478 | | | 479 | | /* Copy output to a standard PCM buffer */ | 480 | 23.7k | for (ch = 0; ch < channels; ch++) | 481 | 20.4k | { | 482 | 20.4k | switch (format) | 483 | 20.4k | { | 484 | 5.79k | case FAAD_FMT_16BIT: | 485 | 8.51M | for(i = 0; i < frame_len; i++) | 486 | 8.51M | { | 487 | 8.51M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, | 488 | 8.51M | hDecoder->internal_channel); | 489 | 8.51M | if (tmp >= 0) | 490 | 8.00M | { | 491 | 8.00M | tmp += (1 << (REAL_BITS-1)); | 492 | 8.00M | if (tmp >= REAL_CONST(32767)) | 493 | 18.0k | { | 494 | 18.0k | tmp = REAL_CONST(32767); | 495 | 18.0k | } | 496 | 8.00M | } else { | 497 | 505k | tmp += -(1 << (REAL_BITS-1)); | 498 | 505k | if (tmp <= REAL_CONST(-32768)) | 499 | 16.9k | { | 500 | 16.9k | tmp = REAL_CONST(-32768); | 501 | 16.9k | } | 502 | 505k | } | 503 | 8.51M | tmp >>= REAL_BITS; | 504 | 8.51M | short_sample_buffer[(i*channels)+ch] = (int16_t)tmp; | 505 | 8.51M | } | 506 | 5.79k | break; | 507 | 6.35k | case FAAD_FMT_24BIT: | 508 | 9.46M | for(i = 0; i < frame_len; i++) | 509 | 9.45M | { | 510 | 9.45M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, | 511 | 9.45M | hDecoder->internal_channel); | 512 | 9.45M | if (tmp >= 0) | 513 | 8.72M | { | 514 | 8.72M | tmp += (1 << (REAL_BITS-9)); | 515 | 8.72M | tmp >>= (REAL_BITS-8); | 516 | 8.72M | if (tmp >= 8388607) | 517 | 13.9k | { | 518 | 13.9k | tmp = 8388607; | 519 | 13.9k | } | 520 | 8.72M | } else { | 521 | 737k | tmp += -(1 << (REAL_BITS-9)); | 522 | 737k | tmp >>= (REAL_BITS-8); | 523 | 737k | if (tmp <= -8388608) | 524 | 13.3k | { | 525 | 13.3k | tmp = -8388608; | 526 | 13.3k | } | 527 | 737k | } | 528 | 9.45M | int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; | 529 | 9.45M | } | 530 | 6.35k | break; | 531 | 4.79k | case FAAD_FMT_32BIT: | 532 | 4.79k | exp = 16 - REAL_BITS; | 533 | 4.79k | half = 1 << (exp - 1); | 534 | 4.79k | sat_shift_mask = SAT_SHIFT_MASK(exp); | 535 | 7.04M | for(i = 0; i < frame_len; i++) | 536 | 7.03M | { | 537 | 7.03M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, | 538 | 7.03M | hDecoder->internal_channel); | 539 | 7.03M | if (tmp >= 0) | 540 | 6.33M | { | 541 | 6.33M | tmp += half; | 542 | 6.33M | } else { | 543 | 705k | tmp += -half; | 544 | 705k | } | 545 | 7.03M | tmp = SAT_SHIFT(tmp, exp, sat_shift_mask); | 546 | 7.03M | int_sample_buffer[(i*channels)+ch] = tmp; | 547 | 7.03M | } | 548 | 4.79k | break; | 549 | 3.51k | case FAAD_FMT_FIXED: | 550 | 5.15M | for(i = 0; i < frame_len; i++) | 551 | 5.14M | { | 552 | 5.14M | real_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, | 553 | 5.14M | hDecoder->internal_channel); | 554 | 5.14M | int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; | 555 | 5.14M | } | 556 | 3.51k | break; | 557 | 20.4k | } | 558 | 20.4k | } | 559 | | | 560 | 3.31k | return sample_buffer; | 561 | 3.31k | } |
Line | Count | Source | 472 | 3.31k | { | 473 | 3.31k | uint8_t ch; | 474 | 3.31k | uint16_t i; | 475 | 3.31k | int16_t *short_sample_buffer = (int16_t*)sample_buffer; | 476 | 3.31k | int32_t *int_sample_buffer = (int32_t*)sample_buffer; | 477 | 3.31k | int32_t exp, half, sat_shift_mask; | 478 | | | 479 | | /* Copy output to a standard PCM buffer */ | 480 | 23.7k | for (ch = 0; ch < channels; ch++) | 481 | 20.4k | { | 482 | 20.4k | switch (format) | 483 | 20.4k | { | 484 | 5.79k | case FAAD_FMT_16BIT: | 485 | 8.51M | for(i = 0; i < frame_len; i++) | 486 | 8.51M | { | 487 | 8.51M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, | 488 | 8.51M | hDecoder->internal_channel); | 489 | 8.51M | if (tmp >= 0) | 490 | 8.00M | { | 491 | 8.00M | tmp += (1 << (REAL_BITS-1)); | 492 | 8.00M | if (tmp >= REAL_CONST(32767)) | 493 | 18.0k | { | 494 | 18.0k | tmp = REAL_CONST(32767); | 495 | 18.0k | } | 496 | 8.00M | } else { | 497 | 505k | tmp += -(1 << (REAL_BITS-1)); | 498 | 505k | if (tmp <= REAL_CONST(-32768)) | 499 | 16.9k | { | 500 | 16.9k | tmp = REAL_CONST(-32768); | 501 | 16.9k | } | 502 | 505k | } | 503 | 8.51M | tmp >>= REAL_BITS; | 504 | 8.51M | short_sample_buffer[(i*channels)+ch] = (int16_t)tmp; | 505 | 8.51M | } | 506 | 5.79k | break; | 507 | 6.35k | case FAAD_FMT_24BIT: | 508 | 9.46M | for(i = 0; i < frame_len; i++) | 509 | 9.45M | { | 510 | 9.45M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, | 511 | 9.45M | hDecoder->internal_channel); | 512 | 9.45M | if (tmp >= 0) | 513 | 8.72M | { | 514 | 8.72M | tmp += (1 << (REAL_BITS-9)); | 515 | 8.72M | tmp >>= (REAL_BITS-8); | 516 | 8.72M | if (tmp >= 8388607) | 517 | 13.9k | { | 518 | 13.9k | tmp = 8388607; | 519 | 13.9k | } | 520 | 8.72M | } else { | 521 | 737k | tmp += -(1 << (REAL_BITS-9)); | 522 | 737k | tmp >>= (REAL_BITS-8); | 523 | 737k | if (tmp <= -8388608) | 524 | 13.3k | { | 525 | 13.3k | tmp = -8388608; | 526 | 13.3k | } | 527 | 737k | } | 528 | 9.45M | int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; | 529 | 9.45M | } | 530 | 6.35k | break; | 531 | 4.79k | case FAAD_FMT_32BIT: | 532 | 4.79k | exp = 16 - REAL_BITS; | 533 | 4.79k | half = 1 << (exp - 1); | 534 | 4.79k | sat_shift_mask = SAT_SHIFT_MASK(exp); | 535 | 7.04M | for(i = 0; i < frame_len; i++) | 536 | 7.03M | { | 537 | 7.03M | int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, | 538 | 7.03M | hDecoder->internal_channel); | 539 | 7.03M | if (tmp >= 0) | 540 | 6.33M | { | 541 | 6.33M | tmp += half; | 542 | 6.33M | } else { | 543 | 705k | tmp += -half; | 544 | 705k | } | 545 | 7.03M | tmp = SAT_SHIFT(tmp, exp, sat_shift_mask); | 546 | 7.03M | int_sample_buffer[(i*channels)+ch] = tmp; | 547 | 7.03M | } | 548 | 4.79k | break; | 549 | 3.51k | case FAAD_FMT_FIXED: | 550 | 5.15M | for(i = 0; i < frame_len; i++) | 551 | 5.14M | { | 552 | 5.14M | real_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, | 553 | 5.14M | hDecoder->internal_channel); | 554 | 5.14M | int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; | 555 | 5.14M | } | 556 | 3.51k | break; | 557 | 20.4k | } | 558 | 20.4k | } | 559 | | | 560 | 3.31k | return sample_buffer; | 561 | 3.31k | } |
|
562 | | |
563 | | #endif |