FFmpeg
aacsbr_fixed.c
Go to the documentation of this file.
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  */
57 #define USE_FIXED 1
58 
59 #include "aac.h"
60 #include "sbr.h"
61 #include "aacsbr.h"
62 #include "aacsbrdata.h"
63 #include "aacps.h"
64 #include "sbrdsp.h"
65 #include "libavutil/internal.h"
66 #include "libavutil/libm.h"
67 #include "libavutil/avassert.h"
68 
69 #include <stdint.h>
70 #include <float.h>
71 #include <math.h>
72 
73 static VLC vlc_sbr[10];
75 static const int CONST_LN2 = Q31(0.6931471806/256); // ln(2)/256
76 static const int CONST_RECIP_LN2 = Q31(0.7213475204); // 0.5/ln(2)
77 static const int CONST_076923 = Q31(0.76923076923076923077f);
78 
79 static const int fixed_log_table[10] =
80 {
81  Q31(1.0/2), Q31(1.0/3), Q31(1.0/4), Q31(1.0/5), Q31(1.0/6),
82  Q31(1.0/7), Q31(1.0/8), Q31(1.0/9), Q31(1.0/10), Q31(1.0/11)
83 };
84 
85 static int fixed_log(int x)
86 {
87  int i, ret, xpow, tmp;
88 
89  ret = x;
90  xpow = x;
91  for (i=0; i<10; i+=2){
92  xpow = (int)(((int64_t)xpow * x + 0x40000000) >> 31);
93  tmp = (int)(((int64_t)xpow * fixed_log_table[i] + 0x40000000) >> 31);
94  ret -= tmp;
95 
96  xpow = (int)(((int64_t)xpow * x + 0x40000000) >> 31);
97  tmp = (int)(((int64_t)xpow * fixed_log_table[i+1] + 0x40000000) >> 31);
98  ret += tmp;
99  }
100 
101  return ret;
102 }
103 
104 static const int fixed_exp_table[7] =
105 {
106  Q31(1.0/2), Q31(1.0/6), Q31(1.0/24), Q31(1.0/120),
107  Q31(1.0/720), Q31(1.0/5040), Q31(1.0/40320)
108 };
109 
110 static int fixed_exp(int x)
111 {
112  int i, ret, xpow, tmp;
113 
114  ret = 0x800000 + x;
115  xpow = x;
116  for (i=0; i<7; i++){
117  xpow = (int)(((int64_t)xpow * x + 0x400000) >> 23);
118  tmp = (int)(((int64_t)xpow * fixed_exp_table[i] + 0x40000000) >> 31);
119  ret += tmp;
120  }
121 
122  return ret;
123 }
124 
125 static void make_bands(int16_t* bands, int start, int stop, int num_bands)
126 {
127  int k, previous, present;
128  int base, prod, nz = 0;
129 
130  base = (stop << 23) / start;
131  while (base < 0x40000000){
132  base <<= 1;
133  nz++;
134  }
135  base = fixed_log(base - 0x80000000);
136  base = (((base + 0x80) >> 8) + (8-nz)*CONST_LN2) / num_bands;
137  base = fixed_exp(base);
138 
139  previous = start;
140  prod = start << 23;
141 
142  for (k = 0; k < num_bands-1; k++) {
143  prod = (int)(((int64_t)prod * base + 0x400000) >> 23);
144  present = (prod + 0x400000) >> 23;
145  bands[k] = present - previous;
146  previous = present;
147  }
148  bands[num_bands-1] = stop - previous;
149 }
150 
151 /// Dequantization and stereo decoding (14496-3 sp04 p203)
152 static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
153 {
154  int k, e;
155  int ch;
156 
157  if (id_aac == TYPE_CPE && sbr->bs_coupling) {
158  int alpha = sbr->data[0].bs_amp_res ? 2 : 1;
159  int pan_offset = sbr->data[0].bs_amp_res ? 12 : 24;
160  for (e = 1; e <= sbr->data[0].bs_num_env; e++) {
161  for (k = 0; k < sbr->n[sbr->data[0].bs_freq_res[e]]; k++) {
162  SoftFloat temp1, temp2, fac;
163 
164  temp1.exp = sbr->data[0].env_facs_q[e][k] * alpha + 14;
165  if (temp1.exp & 1)
166  temp1.mant = 759250125;
167  else
168  temp1.mant = 0x20000000;
169  temp1.exp = (temp1.exp >> 1) + 1;
170  if (temp1.exp > 66) { // temp1 > 1E20
171  av_log(NULL, AV_LOG_ERROR, "envelope scalefactor overflow in dequant\n");
172  temp1 = FLOAT_1;
173  }
174 
175  temp2.exp = (pan_offset - sbr->data[1].env_facs_q[e][k]) * alpha;
176  if (temp2.exp & 1)
177  temp2.mant = 759250125;
178  else
179  temp2.mant = 0x20000000;
180  temp2.exp = (temp2.exp >> 1) + 1;
181  fac = av_div_sf(temp1, av_add_sf(FLOAT_1, temp2));
182  sbr->data[0].env_facs[e][k] = fac;
183  sbr->data[1].env_facs[e][k] = av_mul_sf(fac, temp2);
184  }
185  }
186  for (e = 1; e <= sbr->data[0].bs_num_noise; e++) {
187  for (k = 0; k < sbr->n_q; k++) {
188  SoftFloat temp1, temp2, fac;
189 
190  temp1.exp = NOISE_FLOOR_OFFSET - \
191  sbr->data[0].noise_facs_q[e][k] + 2;
192  temp1.mant = 0x20000000;
193  av_assert0(temp1.exp <= 66);
194  temp2.exp = 12 - sbr->data[1].noise_facs_q[e][k] + 1;
195  temp2.mant = 0x20000000;
196  fac = av_div_sf(temp1, av_add_sf(FLOAT_1, temp2));
197  sbr->data[0].noise_facs[e][k] = fac;
198  sbr->data[1].noise_facs[e][k] = av_mul_sf(fac, temp2);
199  }
200  }
201  } else { // SCE or one non-coupled CPE
202  for (ch = 0; ch < (id_aac == TYPE_CPE) + 1; ch++) {
203  int alpha = sbr->data[ch].bs_amp_res ? 2 : 1;
204  for (e = 1; e <= sbr->data[ch].bs_num_env; e++)
205  for (k = 0; k < sbr->n[sbr->data[ch].bs_freq_res[e]]; k++){
206  SoftFloat temp1;
207 
208  temp1.exp = alpha * sbr->data[ch].env_facs_q[e][k] + 12;
209  if (temp1.exp & 1)
210  temp1.mant = 759250125;
211  else
212  temp1.mant = 0x20000000;
213  temp1.exp = (temp1.exp >> 1) + 1;
214  if (temp1.exp > 66) { // temp1 > 1E20
215  av_log(NULL, AV_LOG_ERROR, "envelope scalefactor overflow in dequant\n");
216  temp1 = FLOAT_1;
217  }
218  sbr->data[ch].env_facs[e][k] = temp1;
219  }
220  for (e = 1; e <= sbr->data[ch].bs_num_noise; e++)
221  for (k = 0; k < sbr->n_q; k++){
222  sbr->data[ch].noise_facs[e][k].exp = NOISE_FLOOR_OFFSET - \
223  sbr->data[ch].noise_facs_q[e][k] + 1;
224  sbr->data[ch].noise_facs[e][k].mant = 0x20000000;
225  }
226  }
227  }
228 }
229 
230 /** High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering
231  * (14496-3 sp04 p214)
232  * Warning: This routine does not seem numerically stable.
233  */
235  int (*alpha0)[2], int (*alpha1)[2],
236  const int X_low[32][40][2], int k0)
237 {
238  int k;
239  int shift, round;
240 
241  for (k = 0; k < k0; k++) {
242  SoftFloat phi[3][2][2];
243  SoftFloat a00, a01, a10, a11;
244  SoftFloat dk;
245 
246  dsp->autocorrelate(X_low[k], phi);
247 
248  dk = av_sub_sf(av_mul_sf(phi[2][1][0], phi[1][0][0]),
249  av_mul_sf(av_add_sf(av_mul_sf(phi[1][1][0], phi[1][1][0]),
250  av_mul_sf(phi[1][1][1], phi[1][1][1])), FLOAT_0999999));
251 
252  if (!dk.mant) {
253  a10 = FLOAT_0;
254  a11 = FLOAT_0;
255  } else {
256  SoftFloat temp_real, temp_im;
257  temp_real = av_sub_sf(av_sub_sf(av_mul_sf(phi[0][0][0], phi[1][1][0]),
258  av_mul_sf(phi[0][0][1], phi[1][1][1])),
259  av_mul_sf(phi[0][1][0], phi[1][0][0]));
260  temp_im = av_sub_sf(av_add_sf(av_mul_sf(phi[0][0][0], phi[1][1][1]),
261  av_mul_sf(phi[0][0][1], phi[1][1][0])),
262  av_mul_sf(phi[0][1][1], phi[1][0][0]));
263 
264  a10 = av_div_sf(temp_real, dk);
265  a11 = av_div_sf(temp_im, dk);
266  }
267 
268  if (!phi[1][0][0].mant) {
269  a00 = FLOAT_0;
270  a01 = FLOAT_0;
271  } else {
272  SoftFloat temp_real, temp_im;
273  temp_real = av_add_sf(phi[0][0][0],
274  av_add_sf(av_mul_sf(a10, phi[1][1][0]),
275  av_mul_sf(a11, phi[1][1][1])));
276  temp_im = av_add_sf(phi[0][0][1],
277  av_sub_sf(av_mul_sf(a11, phi[1][1][0]),
278  av_mul_sf(a10, phi[1][1][1])));
279 
280  temp_real.mant = -temp_real.mant;
281  temp_im.mant = -temp_im.mant;
282  a00 = av_div_sf(temp_real, phi[1][0][0]);
283  a01 = av_div_sf(temp_im, phi[1][0][0]);
284  }
285 
286  shift = a00.exp;
287  if (shift >= 3)
288  alpha0[k][0] = 0x7fffffff;
289  else if (shift <= -30)
290  alpha0[k][0] = 0;
291  else {
292  shift = 1-shift;
293  if (shift <= 0)
294  alpha0[k][0] = a00.mant * (1<<-shift);
295  else {
296  round = 1 << (shift-1);
297  alpha0[k][0] = (a00.mant + round) >> shift;
298  }
299  }
300 
301  shift = a01.exp;
302  if (shift >= 3)
303  alpha0[k][1] = 0x7fffffff;
304  else if (shift <= -30)
305  alpha0[k][1] = 0;
306  else {
307  shift = 1-shift;
308  if (shift <= 0)
309  alpha0[k][1] = a01.mant * (1<<-shift);
310  else {
311  round = 1 << (shift-1);
312  alpha0[k][1] = (a01.mant + round) >> shift;
313  }
314  }
315  shift = a10.exp;
316  if (shift >= 3)
317  alpha1[k][0] = 0x7fffffff;
318  else if (shift <= -30)
319  alpha1[k][0] = 0;
320  else {
321  shift = 1-shift;
322  if (shift <= 0)
323  alpha1[k][0] = a10.mant * (1<<-shift);
324  else {
325  round = 1 << (shift-1);
326  alpha1[k][0] = (a10.mant + round) >> shift;
327  }
328  }
329 
330  shift = a11.exp;
331  if (shift >= 3)
332  alpha1[k][1] = 0x7fffffff;
333  else if (shift <= -30)
334  alpha1[k][1] = 0;
335  else {
336  shift = 1-shift;
337  if (shift <= 0)
338  alpha1[k][1] = a11.mant * (1<<-shift);
339  else {
340  round = 1 << (shift-1);
341  alpha1[k][1] = (a11.mant + round) >> shift;
342  }
343  }
344 
345  shift = (int)(((int64_t)(alpha1[k][0]>>1) * (alpha1[k][0]>>1) + \
346  (int64_t)(alpha1[k][1]>>1) * (alpha1[k][1]>>1) + \
347  0x40000000) >> 31);
348  if (shift >= 0x20000000){
349  alpha1[k][0] = 0;
350  alpha1[k][1] = 0;
351  alpha0[k][0] = 0;
352  alpha0[k][1] = 0;
353  }
354 
355  shift = (int)(((int64_t)(alpha0[k][0]>>1) * (alpha0[k][0]>>1) + \
356  (int64_t)(alpha0[k][1]>>1) * (alpha0[k][1]>>1) + \
357  0x40000000) >> 31);
358  if (shift >= 0x20000000){
359  alpha1[k][0] = 0;
360  alpha1[k][1] = 0;
361  alpha0[k][0] = 0;
362  alpha0[k][1] = 0;
363  }
364  }
365 }
366 
367 /// Chirp Factors (14496-3 sp04 p214)
368 static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data)
369 {
370  int i;
371  int new_bw;
372  static const int bw_tab[] = { 0, 1610612736, 1932735283, 2104533975 };
373  int64_t accu;
374 
375  for (i = 0; i < sbr->n_q; i++) {
376  if (ch_data->bs_invf_mode[0][i] + ch_data->bs_invf_mode[1][i] == 1)
377  new_bw = 1288490189;
378  else
379  new_bw = bw_tab[ch_data->bs_invf_mode[0][i]];
380 
381  if (new_bw < ch_data->bw_array[i]){
382  accu = (int64_t)new_bw * 1610612736;
383  accu += (int64_t)ch_data->bw_array[i] * 0x20000000;
384  new_bw = (int)((accu + 0x40000000) >> 31);
385  } else {
386  accu = (int64_t)new_bw * 1946157056;
387  accu += (int64_t)ch_data->bw_array[i] * 201326592;
388  new_bw = (int)((accu + 0x40000000) >> 31);
389  }
390  ch_data->bw_array[i] = new_bw < 0x2000000 ? 0 : new_bw;
391  }
392 }
393 
394 /**
395  * Calculation of levels of additional HF signal components (14496-3 sp04 p219)
396  * and Calculation of gain (14496-3 sp04 p219)
397  */
399  SBRData *ch_data, const int e_a[2])
400 {
401  int e, k, m;
402  // max gain limits : -3dB, 0dB, 3dB, inf dB (limiter off)
403  static const SoftFloat limgain[4] = { { 760155524, 0 }, { 0x20000000, 1 },
404  { 758351638, 1 }, { 625000000, 34 } };
405 
406  for (e = 0; e < ch_data->bs_num_env; e++) {
407  int delta = !((e == e_a[1]) || (e == e_a[0]));
408  for (k = 0; k < sbr->n_lim; k++) {
409  SoftFloat gain_boost, gain_max;
410  SoftFloat sum[2];
411  sum[0] = sum[1] = FLOAT_0;
412  for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) {
413  const SoftFloat temp = av_div_sf(sbr->e_origmapped[e][m],
414  av_add_sf(FLOAT_1, sbr->q_mapped[e][m]));
415  sbr->q_m[e][m] = av_sqrt_sf(av_mul_sf(temp, sbr->q_mapped[e][m]));
416  sbr->s_m[e][m] = av_sqrt_sf(av_mul_sf(temp, av_int2sf(ch_data->s_indexmapped[e + 1][m], 0)));
417  if (!sbr->s_mapped[e][m]) {
418  if (delta) {
419  sbr->gain[e][m] = av_sqrt_sf(av_div_sf(sbr->e_origmapped[e][m],
420  av_mul_sf(av_add_sf(FLOAT_1, sbr->e_curr[e][m]),
421  av_add_sf(FLOAT_1, sbr->q_mapped[e][m]))));
422  } else {
423  sbr->gain[e][m] = av_sqrt_sf(av_div_sf(sbr->e_origmapped[e][m],
424  av_add_sf(FLOAT_1, sbr->e_curr[e][m])));
425  }
426  } else {
427  sbr->gain[e][m] = av_sqrt_sf(
428  av_div_sf(
429  av_mul_sf(sbr->e_origmapped[e][m], sbr->q_mapped[e][m]),
430  av_mul_sf(
431  av_add_sf(FLOAT_1, sbr->e_curr[e][m]),
432  av_add_sf(FLOAT_1, sbr->q_mapped[e][m]))));
433  }
434  sbr->gain[e][m] = av_add_sf(sbr->gain[e][m], FLOAT_MIN);
435  }
436  for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) {
437  sum[0] = av_add_sf(sum[0], sbr->e_origmapped[e][m]);
438  sum[1] = av_add_sf(sum[1], sbr->e_curr[e][m]);
439  }
440  gain_max = av_mul_sf(limgain[sbr->bs_limiter_gains],
441  av_sqrt_sf(
442  av_div_sf(
443  av_add_sf(FLOAT_EPSILON, sum[0]),
444  av_add_sf(FLOAT_EPSILON, sum[1]))));
445  if (av_gt_sf(gain_max, FLOAT_100000))
446  gain_max = FLOAT_100000;
447  for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) {
448  SoftFloat q_m_max = av_div_sf(
449  av_mul_sf(sbr->q_m[e][m], gain_max),
450  sbr->gain[e][m]);
451  if (av_gt_sf(sbr->q_m[e][m], q_m_max))
452  sbr->q_m[e][m] = q_m_max;
453  if (av_gt_sf(sbr->gain[e][m], gain_max))
454  sbr->gain[e][m] = gain_max;
455  }
456  sum[0] = sum[1] = FLOAT_0;
457  for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) {
458  sum[0] = av_add_sf(sum[0], sbr->e_origmapped[e][m]);
459  sum[1] = av_add_sf(sum[1],
460  av_mul_sf(
461  av_mul_sf(sbr->e_curr[e][m],
462  sbr->gain[e][m]),
463  sbr->gain[e][m]));
464  sum[1] = av_add_sf(sum[1],
465  av_mul_sf(sbr->s_m[e][m], sbr->s_m[e][m]));
466  if (delta && !sbr->s_m[e][m].mant)
467  sum[1] = av_add_sf(sum[1],
468  av_mul_sf(sbr->q_m[e][m], sbr->q_m[e][m]));
469  }
470  gain_boost = av_sqrt_sf(
471  av_div_sf(
472  av_add_sf(FLOAT_EPSILON, sum[0]),
473  av_add_sf(FLOAT_EPSILON, sum[1])));
474  if (av_gt_sf(gain_boost, FLOAT_1584893192))
475  gain_boost = FLOAT_1584893192;
476 
477  for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) {
478  sbr->gain[e][m] = av_mul_sf(sbr->gain[e][m], gain_boost);
479  sbr->q_m[e][m] = av_mul_sf(sbr->q_m[e][m], gain_boost);
480  sbr->s_m[e][m] = av_mul_sf(sbr->s_m[e][m], gain_boost);
481  }
482  }
483  }
484 }
485 
486 /// Assembling HF Signals (14496-3 sp04 p220)
487 static void sbr_hf_assemble(int Y1[38][64][2],
488  const int X_high[64][40][2],
489  SpectralBandReplication *sbr, SBRData *ch_data,
490  const int e_a[2])
491 {
492  int e, i, j, m;
493  const int h_SL = 4 * !sbr->bs_smoothing_mode;
494  const int kx = sbr->kx[1];
495  const int m_max = sbr->m[1];
496  static const SoftFloat h_smooth[5] = {
497  { 715827883, -1 },
498  { 647472402, -1 },
499  { 937030863, -2 },
500  { 989249804, -3 },
501  { 546843842, -4 },
502  };
503  SoftFloat (*g_temp)[48] = ch_data->g_temp, (*q_temp)[48] = ch_data->q_temp;
504  int indexnoise = ch_data->f_indexnoise;
505  int indexsine = ch_data->f_indexsine;
506 
507  if (sbr->reset) {
508  for (i = 0; i < h_SL; i++) {
509  memcpy(g_temp[i + 2*ch_data->t_env[0]], sbr->gain[0], m_max * sizeof(sbr->gain[0][0]));
510  memcpy(q_temp[i + 2*ch_data->t_env[0]], sbr->q_m[0], m_max * sizeof(sbr->q_m[0][0]));
511  }
512  } else if (h_SL) {
513  for (i = 0; i < 4; i++) {
514  memcpy(g_temp[i + 2 * ch_data->t_env[0]],
515  g_temp[i + 2 * ch_data->t_env_num_env_old],
516  sizeof(g_temp[0]));
517  memcpy(q_temp[i + 2 * ch_data->t_env[0]],
518  q_temp[i + 2 * ch_data->t_env_num_env_old],
519  sizeof(q_temp[0]));
520  }
521  }
522 
523  for (e = 0; e < ch_data->bs_num_env; e++) {
524  for (i = 2 * ch_data->t_env[e]; i < 2 * ch_data->t_env[e + 1]; i++) {
525  memcpy(g_temp[h_SL + i], sbr->gain[e], m_max * sizeof(sbr->gain[0][0]));
526  memcpy(q_temp[h_SL + i], sbr->q_m[e], m_max * sizeof(sbr->q_m[0][0]));
527  }
528  }
529 
530  for (e = 0; e < ch_data->bs_num_env; e++) {
531  for (i = 2 * ch_data->t_env[e]; i < 2 * ch_data->t_env[e + 1]; i++) {
532  SoftFloat g_filt_tab[48];
533  SoftFloat q_filt_tab[48];
534  SoftFloat *g_filt, *q_filt;
535 
536  if (h_SL && e != e_a[0] && e != e_a[1]) {
537  g_filt = g_filt_tab;
538  q_filt = q_filt_tab;
539  for (m = 0; m < m_max; m++) {
540  const int idx1 = i + h_SL;
541  g_filt[m].mant = g_filt[m].exp = 0;
542  q_filt[m].mant = q_filt[m].exp = 0;
543  for (j = 0; j <= h_SL; j++) {
544  g_filt[m] = av_add_sf(g_filt[m],
545  av_mul_sf(g_temp[idx1 - j][m],
546  h_smooth[j]));
547  q_filt[m] = av_add_sf(q_filt[m],
548  av_mul_sf(q_temp[idx1 - j][m],
549  h_smooth[j]));
550  }
551  }
552  } else {
553  g_filt = g_temp[i + h_SL];
554  q_filt = q_temp[i];
555  }
556 
557  sbr->dsp.hf_g_filt(Y1[i] + kx, X_high + kx, g_filt, m_max,
559 
560  if (e != e_a[0] && e != e_a[1]) {
561  sbr->dsp.hf_apply_noise[indexsine](Y1[i] + kx, sbr->s_m[e],
562  q_filt, indexnoise,
563  kx, m_max);
564  } else {
565  int idx = indexsine&1;
566  int A = (1-((indexsine+(kx & 1))&2));
567  int B = (A^(-idx)) + idx;
568  unsigned *out = &Y1[i][kx][idx];
569  int shift;
570  unsigned round;
571 
572  SoftFloat *in = sbr->s_m[e];
573  for (m = 0; m+1 < m_max; m+=2) {
574  int shift2;
575  shift = 22 - in[m ].exp;
576  shift2= 22 - in[m+1].exp;
577  if (shift < 1 || shift2 < 1) {
578  av_log(NULL, AV_LOG_ERROR, "Overflow in sbr_hf_assemble, shift=%d,%d\n", shift, shift2);
579  return;
580  }
581  if (shift < 32) {
582  round = 1 << (shift-1);
583  out[2*m ] += (int)(in[m ].mant * A + round) >> shift;
584  }
585 
586  if (shift2 < 32) {
587  round = 1 << (shift2-1);
588  out[2*m+2] += (int)(in[m+1].mant * B + round) >> shift2;
589  }
590  }
591  if(m_max&1)
592  {
593  shift = 22 - in[m ].exp;
594  if (shift < 1) {
595  av_log(NULL, AV_LOG_ERROR, "Overflow in sbr_hf_assemble, shift=%d\n", shift);
596  return;
597  } else if (shift < 32) {
598  round = 1 << (shift-1);
599  out[2*m ] += (int)(in[m ].mant * A + round) >> shift;
600  }
601  }
602  }
603  indexnoise = (indexnoise + m_max) & 0x1ff;
604  indexsine = (indexsine + 1) & 3;
605  }
606  }
607  ch_data->f_indexnoise = indexnoise;
608  ch_data->f_indexsine = indexsine;
609 }
610 
611 #include "aacsbr_template.c"
A
#define A(x)
Definition: vpx_arith.h:28
SpectralBandReplication::bs_coupling
unsigned bs_coupling
Definition: sbr.h:159
SpectralBandReplication::data
SBRData data[2]
Definition: sbr.h:169
SpectralBandReplication::bs_limiter_gains
unsigned bs_limiter_gains
Definition: sbr.h:155
libm.h
SBRDSPContext
Definition: sbrdsp.h:27
out
FILE * out
Definition: movenc.c:54
SpectralBandReplication::e_origmapped
AAC_FLOAT e_origmapped[7][48]
Dequantized envelope scalefactors, remapped.
Definition: sbr.h:201
FLOAT_EPSILON
static const SoftFloat FLOAT_EPSILON
A small value.
Definition: softfloat.h:42
SBRData::env_facs
AAC_FLOAT env_facs[6][48]
Definition: sbr.h:103
aacsbr_func_ptr_init
static void aacsbr_func_ptr_init(AACSBRContext *c)
aacsbr.h
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
SpectralBandReplication::m
AAC_SIGNE m[2]
M' and M respectively, M is the number of QMF subbands that use SBR.
Definition: sbr.h:165
av_sub_sf
static av_const SoftFloat av_sub_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:173
SpectralBandReplication::q_m
AAC_FLOAT q_m[7][48]
Amplitude adjusted noise scalefactors.
Definition: sbr.h:209
SBRData::t_env_num_env_old
uint8_t t_env_num_env_old
Envelope time border of the last envelope of the previous frame.
Definition: sbr.h:110
SoftFloat::mant
int32_t mant
Definition: softfloat.h:35
base
uint8_t base
Definition: vp3data.h:128
float.h
SBRData::t_env
uint8_t t_env[8]
Envelope time borders.
Definition: sbr.h:108
sbr_chirp
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data)
Chirp Factors (14496-3 sp04 p214)
Definition: aacsbr_fixed.c:368
FLOAT_1
static const SoftFloat FLOAT_1
1.0
Definition: softfloat.h:41
sbr.h
av_gt_sf
static av_const int av_gt_sf(SoftFloat a, SoftFloat b)
Compares two SoftFloats.
Definition: softfloat.h:150
aacps.h
av_sqrt_sf
static av_always_inline SoftFloat av_sqrt_sf(SoftFloat val)
Rounding-to-nearest used.
Definition: softfloat.h:207
av_div_sf
static av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b)
b has to be normalized and not zero.
Definition: softfloat.h:116
sbr_hf_assemble
static void sbr_hf_assemble(int Y1[38][64][2], const int X_high[64][40][2], SpectralBandReplication *sbr, SBRData *ch_data, const int e_a[2])
Assembling HF Signals (14496-3 sp04 p220)
Definition: aacsbr_fixed.c:487
TYPE_CPE
@ TYPE_CPE
Definition: aac.h:56
SpectralBandReplication::reset
int reset
Definition: sbr.h:147
SBRData::noise_facs
AAC_FLOAT noise_facs[3][5]
Definition: sbr.h:106
sbr_hf_inverse_filter
static void sbr_hf_inverse_filter(SBRDSPContext *dsp, int(*alpha0)[2], int(*alpha1)[2], const int X_low[32][40][2], int k0)
High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering (14496-3 sp04 p214) Warning: Thi...
Definition: aacsbr_fixed.c:234
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FLOAT_MIN
static const SoftFloat FLOAT_MIN
Definition: softfloat.h:46
SBRData::bs_num_noise
AAC_SIGNE bs_num_noise
Definition: sbr.h:74
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
B
#define B
Definition: huffyuv.h:42
NOISE_FLOOR_OFFSET
#define NOISE_FLOOR_OFFSET
Definition: aacsbr.h:37
SBRData::g_temp
AAC_FLOAT g_temp[42][48]
Definition: sbr.h:98
SBRDSPContext::autocorrelate
void(* autocorrelate)(const INTFLOAT x[40][2], AAC_FLOAT phi[3][2][2])
Definition: sbrdsp.h:35
vlc_sbr
static VLC vlc_sbr[10]
Definition: aacsbr_fixed.c:73
bands
static const float bands[]
Definition: af_superequalizer.c:56
SpectralBandReplication::s_m
AAC_FLOAT s_m[7][48]
Sinusoidal levels.
Definition: sbr.h:211
SpectralBandReplication::n_lim
AAC_SIGNE n_lim
Number of limiter bands.
Definition: sbr.h:176
SBRData::env_facs_q
uint8_t env_facs_q[6][48]
Envelope scalefactors.
Definition: sbr.h:102
NULL
#define NULL
Definition: coverity.c:32
FLOAT_0
static const SoftFloat FLOAT_0
0.0
Definition: softfloat.h:39
SBRData::f_indexnoise
unsigned f_indexnoise
Definition: sbr.h:113
SpectralBandReplication::f_tablelim
uint16_t f_tablelim[30]
Frequency borders for the limiter.
Definition: sbr.h:186
AACSBRContext
aacsbr functions pointers
Definition: sbr.h:123
fixed_log
static int fixed_log(int x)
Definition: aacsbr_fixed.c:85
aac.h
SBRDSPContext::hf_g_filt
void(* hf_g_filt)(INTFLOAT(*Y)[2], const INTFLOAT(*X_high)[40][2], const AAC_FLOAT *g_filt, int m_max, intptr_t ixh)
Definition: sbrdsp.h:39
SoftFloat::exp
int32_t exp
Definition: softfloat.h:36
SpectralBandReplication::n
AAC_SIGNE n[2]
N_Low and N_High respectively, the number of frequency bands for low and high resolution.
Definition: sbr.h:172
SBRData::bs_num_env
AAC_SIGNE bs_num_env
Definition: sbr.h:72
SBRData::bs_amp_res
unsigned bs_amp_res
Definition: sbr.h:79
SBRData::s_indexmapped
uint8_t s_indexmapped[8][48]
Definition: sbr.h:100
SpectralBandReplication::bs_smoothing_mode
unsigned bs_smoothing_mode
Definition: sbr.h:157
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
f
f
Definition: af_crystalizer.c:122
FLOAT_0999999
static const SoftFloat FLOAT_0999999
0.999999
Definition: softfloat.h:45
shift
static int shift(int a, int b)
Definition: bonk.c:257
FLOAT_1584893192
static const SoftFloat FLOAT_1584893192
1.584893192 (10^.2)
Definition: softfloat.h:43
FLOAT_100000
static const SoftFloat FLOAT_100000
100000
Definition: softfloat.h:44
sbrdsp.h
SpectralBandReplication::gain
AAC_FLOAT gain[7][48]
Definition: sbr.h:212
SpectralBandReplication
Spectral Band Replication.
Definition: sbr.h:142
SBRData::bs_invf_mode
uint8_t bs_invf_mode[2][5]
Definition: sbr.h:77
SBRDSPContext::hf_apply_noise
void(* hf_apply_noise[4])(INTFLOAT(*Y)[2], const AAC_FLOAT *s_m, const AAC_FLOAT *q_filt, int noise, int kx, int m_max)
Definition: sbrdsp.h:41
SBRData::bs_freq_res
uint8_t bs_freq_res[7]
Definition: sbr.h:73
SpectralBandReplication::n_q
AAC_SIGNE n_q
Number of noise floor bands.
Definition: sbr.h:174
fixed_exp
static int fixed_exp(int x)
Definition: aacsbr_fixed.c:110
CONST_076923
static const int CONST_076923
Definition: aacsbr_fixed.c:77
shift2
static const int shift2[6]
Definition: dxa.c:49
SpectralBandReplication::e_curr
AAC_FLOAT e_curr[7][48]
Estimated envelope.
Definition: sbr.h:207
SoftFloat
Definition: softfloat.h:34
CONST_RECIP_LN2
static const int CONST_RECIP_LN2
Definition: aacsbr_fixed.c:76
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
round
static av_always_inline av_const double round(double x)
Definition: libm.h:444
internal.h
SBRData
Spectral Band Replication per channel data.
Definition: sbr.h:65
SBRData::bw_array
INTFLOAT bw_array[5]
Chirp factors.
Definition: sbr.h:92
delta
float delta
Definition: vorbis_enc_data.h:430
av_int2sf
static av_const SoftFloat av_int2sf(int v, int frac_bits)
Converts a mantisse and exponent to a SoftFloat.
Definition: softfloat.h:185
SBRData::f_indexsine
unsigned f_indexsine
Definition: sbr.h:114
aacsbr_template.c
sbr_gain_calc
static void sbr_gain_calc(AACContext *ac, SpectralBandReplication *sbr, SBRData *ch_data, const int e_a[2])
Calculation of levels of additional HF signal components (14496-3 sp04 p219) and Calculation of gain ...
Definition: aacsbr_fixed.c:398
ret
ret
Definition: filter_design.txt:187
SBRData::q_temp
AAC_FLOAT q_temp[42][48]
Definition: sbr.h:99
VLC
Definition: vlc.h:31
av_add_sf
static av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:162
fixed_exp_table
static const int fixed_exp_table[7]
Definition: aacsbr_fixed.c:104
temp
else temp
Definition: vf_mcdeint.c:248
make_bands
static void make_bands(int16_t *bands, int start, int stop, int num_bands)
Definition: aacsbr_fixed.c:125
SBRData::noise_facs_q
uint8_t noise_facs_q[3][5]
Noise scalefactors.
Definition: sbr.h:105
Q31
#define Q31(x)
Definition: aac_defines.h:92
sbr_dequant
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
Dequantization and stereo decoding (14496-3 sp04 p203)
Definition: aacsbr_fixed.c:152
aacsbrdata.h
CONST_LN2
static const int CONST_LN2
Definition: aacsbr_fixed.c:75
ENVELOPE_ADJUSTMENT_OFFSET
#define ENVELOPE_ADJUSTMENT_OFFSET
Definition: aacsbr.h:36
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AACContext
main AAC context
Definition: aac.h:296
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
fixed_log_table
static const int fixed_log_table[10]
Definition: aacsbr_fixed.c:79
SpectralBandReplication::q_mapped
AAC_FLOAT q_mapped[7][48]
Dequantized noise scalefactors, remapped.
Definition: sbr.h:203
int
int
Definition: ffmpeg_filter.c:156
SpectralBandReplication::kx
AAC_SIGNE kx[2]
kx', and kx respectively, kx is the first QMF subband where SBR is used.
Definition: sbr.h:163
av_mul_sf
static av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:102
SpectralBandReplication::s_mapped
uint8_t s_mapped[7][48]
Sinusoidal presence, remapped.
Definition: sbr.h:205
SpectralBandReplication::dsp
SBRDSPContext dsp
Definition: sbr.h:218