1 /*
2 * Copyright (c) 2013
3 * MIPS Technologies, Inc., California.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * AAC Spectral Band Replication decoding functions (fixed-point)
30 * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl )
31 * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com>
32 *
33 * This file is part of FFmpeg.
34 *
35 * FFmpeg is free software; you can redistribute it and/or
36 * modify it under the terms of the GNU Lesser General Public
37 * License as published by the Free Software Foundation; either
38 * version 2.1 of the License, or (at your option) any later version.
39 *
40 * FFmpeg is distributed in the hope that it will be useful,
41 * but WITHOUT ANY WARRANTY; without even the implied warranty of
42 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
43 * Lesser General Public License for more details.
44 *
45 * You should have received a copy of the GNU Lesser General Public
46 * License along with FFmpeg; if not, write to the Free Software
47 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
48 */
49
50 /**
51 * @file
52 * AAC Spectral Band Replication decoding functions (fixed-point)
53 * Note: Rounding-to-nearest used unless otherwise stated
54 * @author Robert Swain ( rob opendot cl )
55 * @author Stanislav Ocovaj ( stanislav.ocovaj imgtec com )
56 */
58
69
70 #include <stdint.h>
72 #include <math.h>
73
79
81 {
84 };
85
87 {
89
91 xpow = x;
92 for (
i=0;
i<10;
i+=2){
93 xpow = (
int)(((int64_t)xpow * x + 0x40000000) >> 31);
96
97 xpow = (
int)(((int64_t)xpow * x + 0x40000000) >> 31);
100 }
101
103 }
104
106 {
108 Q31(1.0/720),
Q31(1.0/5040),
Q31(1.0/40320)
109 };
110
112 {
114
116 xpow = x;
118 xpow = (
int)(((int64_t)xpow * x + 0x400000) >> 23);
121 }
122
124 }
125
127 {
128 int k, previous, present;
129 int base, prod, nz = 0;
130
131 base = (stop << 23) / start;
132 while (
base < 0x40000000){
134 nz++;
135 }
139
140 previous = start;
141 prod = start << 23;
142
143 for (k = 0; k < num_bands-1; k++) {
144 prod = (
int)(((int64_t)prod *
base + 0x400000) >> 23);
145 present = (prod + 0x400000) >> 23;
146 bands[k] = present - previous;
147 previous = present;
148 }
149 bands[num_bands-1] = stop - previous;
150 }
151
152 /// Dequantization and stereo decoding (14496-3 sp04 p203)
154 {
155 int k, e;
156 int ch;
157
164
167 temp1.
mant = 759250125;
168 else
169 temp1.
mant = 0x20000000;
170 temp1.
exp = (temp1.
exp >> 1) + 1;
171 if (temp1.
exp > 66) {
// temp1 > 1E20
174 }
175
178 temp2.
mant = 759250125;
179 else
180 temp2.
mant = 0x20000000;
181 temp2.
exp = (temp2.
exp >> 1) + 1;
185 }
186 }
188 for (k = 0; k < sbr->
n_q; k++) {
190
192 sbr->data[0].noise_facs_q[e][k] + 2;
193 temp1.
mant = 0x20000000;
196 temp2.
mant = 0x20000000;
200 }
201 }
202 } else { // SCE or one non-coupled CPE
203 for (ch = 0; ch < (id_aac ==
TYPE_CPE) + 1; ch++) {
208
211 temp1.
mant = 759250125;
212 else
213 temp1.
mant = 0x20000000;
214 temp1.
exp = (temp1.
exp >> 1) + 1;
215 if (temp1.
exp > 66) {
// temp1 > 1E20
218 }
220 }
222 for (k = 0; k < sbr->
n_q; k++){
224 sbr->data[ch].noise_facs_q[e][k] + 1;
226 }
227 }
228 }
229 }
230
231 /** High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering
232 * (14496-3 sp04 p214)
233 * Warning: This routine does not seem numerically stable.
234 */
236 int (*alpha0)[2], int (*alpha1)[2],
237 const int X_low[32][40][2], int k0)
238 {
239 int k;
241
242 for (k = 0; k < k0; k++) {
246
248
252
256 } else {
264
267 }
268
269 if (!phi[1][0][0].mant) {
272 } else {
280
283 a00 =
av_div_sf(temp_real, phi[1][0][0]);
285 }
286
289 alpha0[k][0] = 0x7fffffff;
290 else if (
shift <= -30)
291 alpha0[k][0] = 0;
292 else {
296 else {
299 }
300 }
301
304 alpha0[k][1] = 0x7fffffff;
305 else if (
shift <= -30)
306 alpha0[k][1] = 0;
307 else {
311 else {
314 }
315 }
318 alpha1[k][0] = 0x7fffffff;
319 else if (
shift <= -30)
320 alpha1[k][0] = 0;
321 else {
325 else {
328 }
329 }
330
333 alpha1[k][1] = 0x7fffffff;
334 else if (
shift <= -30)
335 alpha1[k][1] = 0;
336 else {
340 else {
343 }
344 }
345
346 shift = (
int)(((int64_t)(alpha1[k][0]>>1) * (alpha1[k][0]>>1) + \
347 (int64_t)(alpha1[k][1]>>1) * (alpha1[k][1]>>1) + \
348 0x40000000) >> 31);
349 if (
shift >= 0x20000000){
350 alpha1[k][0] = 0;
351 alpha1[k][1] = 0;
352 alpha0[k][0] = 0;
353 alpha0[k][1] = 0;
354 }
355
356 shift = (
int)(((int64_t)(alpha0[k][0]>>1) * (alpha0[k][0]>>1) + \
357 (int64_t)(alpha0[k][1]>>1) * (alpha0[k][1]>>1) + \
358 0x40000000) >> 31);
359 if (
shift >= 0x20000000){
360 alpha1[k][0] = 0;
361 alpha1[k][1] = 0;
362 alpha0[k][0] = 0;
363 alpha0[k][1] = 0;
364 }
365 }
366 }
367
368 /// Chirp Factors (14496-3 sp04 p214)
370 {
372 int new_bw;
373 static const int bw_tab[] = { 0, 1610612736, 1932735283, 2104533975 };
374 int64_t accu;
375
376 for (
i = 0;
i < sbr->
n_q;
i++) {
378 new_bw = 1288490189;
379 else
381
382 if (new_bw < ch_data->bw_array[
i]){
383 accu = (int64_t)new_bw * 1610612736;
384 accu += (int64_t)ch_data->
bw_array[
i] * 0x20000000;
385 new_bw = (int)((accu + 0x40000000) >> 31);
386 } else {
387 accu = (int64_t)new_bw * 1946157056;
388 accu += (int64_t)ch_data->
bw_array[
i] * 201326592;
389 new_bw = (int)((accu + 0x40000000) >> 31);
390 }
391 ch_data->
bw_array[
i] = new_bw < 0x2000000 ? 0 : new_bw;
392 }
393 }
394
395 /**
396 * Calculation of levels of additional HF signal components (14496-3 sp04 p219)
397 * and Calculation of gain (14496-3 sp04 p219)
398 */
400 SBRData *ch_data,
const int e_a[2])
401 {
402 int e, k, m;
403 // max gain limits : -3dB, 0dB, 3dB, inf dB (limiter off)
404 static const SoftFloat limgain[4] = { { 760155524, 0 }, { 0x20000000, 1 },
405 { 758351638, 1 }, { 625000000, 34 } };
406
408 int delta = !((e == e_a[1]) || (e == e_a[0]));
409 for (k = 0; k < sbr->
n_lim; k++) {
413 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
423 } else {
426 }
427 } else {
434 }
436 }
437 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
440 }
448 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
453 sbr->
q_m[e][m] = q_m_max;
455 sbr->
gain[e][m] = gain_max;
456 }
458 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
470 }
477
478 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
482 }
483 }
484 }
485 }
486
487 /// Assembling HF Signals (14496-3 sp04 p220)
489 const int X_high[64][40][2],
491 const int e_a[2])
492 {
495 const int kx = sbr->
kx[1];
496 const int m_max = sbr->
m[1];
498 { 715827883, -1 },
499 { 647472402, -1 },
500 { 937030863, -2 },
501 { 989249804, -3 },
502 { 546843842, -4 },
503 };
507
509 for (
i = 0;
i < h_SL;
i++) {
510 memcpy(g_temp[
i + 2*ch_data->
t_env[0]], sbr->
gain[0], m_max *
sizeof(sbr->
gain[0][0]));
511 memcpy(q_temp[
i + 2*ch_data->
t_env[0]], sbr->
q_m[0], m_max *
sizeof(sbr->
q_m[0][0]));
512 }
513 } else if (h_SL) {
514 for (
i = 0;
i < 4;
i++) {
515 memcpy(g_temp[
i + 2 * ch_data->
t_env[0]],
517 sizeof(g_temp[0]));
518 memcpy(q_temp[
i + 2 * ch_data->
t_env[0]],
520 sizeof(q_temp[0]));
521 }
522 }
523
525 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
526 memcpy(g_temp[h_SL +
i], sbr->
gain[e], m_max *
sizeof(sbr->
gain[0][0]));
527 memcpy(q_temp[h_SL +
i], sbr->
q_m[e], m_max *
sizeof(sbr->
q_m[0][0]));
528 }
529 }
530
532 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
536
537 if (h_SL && e != e_a[0] && e != e_a[1]) {
538 g_filt = g_filt_tab;
539 q_filt = q_filt_tab;
540 for (m = 0; m < m_max; m++) {
541 const int idx1 =
i + h_SL;
542 g_filt[m].
mant = g_filt[m].
exp = 0;
543 q_filt[m].
mant = q_filt[m].
exp = 0;
544 for (j = 0; j <= h_SL; j++) {
547 h_smooth[j]));
550 h_smooth[j]));
551 }
552 }
553 } else {
554 g_filt = g_temp[
i + h_SL];
556 }
557
560
561 if (e != e_a[0] && e != e_a[1]) {
563 q_filt, indexnoise,
564 kx, m_max);
565 } else {
566 int idx = indexsine&1;
567 int A = (1-((indexsine+(kx & 1))&2));
568 int B = (
A^(-idx)) + idx;
569 unsigned *
out = &Y1[
i][kx][idx];
572
574 for (m = 0; m+1 < m_max; m+=2) {
580 return;
581 }
585 }
586
590 }
591 }
592 if(m_max&1)
593 {
597 return;
598 }
else if (
shift < 32) {
601 }
602 }
603 }
604 indexnoise = (indexnoise + m_max) & 0x1ff;
605 indexsine = (indexsine + 1) & 3;
606 }
607 }
610 }
611