FFmpeg
aacsbr_template.c
Go to the documentation of this file.
1 /*
2  * AAC Spectral Band Replication decoding functions
3  * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl )
4  * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com>
5  *
6  * Fixed point code
7  * Copyright (c) 2013
8  * MIPS Technologies, Inc., California.
9  *
10  * This file is part of FFmpeg.
11  *
12  * FFmpeg is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Lesser General Public
14  * License as published by the Free Software Foundation; either
15  * version 2.1 of the License, or (at your option) any later version.
16  *
17  * FFmpeg is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  * Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public
23  * License along with FFmpeg; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25  */
26 
27 /**
28  * @file
29  * AAC Spectral Band Replication decoding functions
30  * @author Robert Swain ( rob opendot cl )
31  * @author Stanislav Ocovaj ( stanislav.ocovaj@imgtec.com )
32  * @author Zoran Basaric ( zoran.basaric@imgtec.com )
33  */
34 
35 #include "aacdectab.h"
36 #include "libavutil/qsort.h"
37 
38 static av_cold void aacsbr_tableinit(void)
39 {
40  int n;
41 
42  for (n = 0; n < 320; n++)
44 }
45 
47 {
49 
51 }
52 
53 /** Places SBR in pure upsampling mode. */
55  sbr->start = 0;
56  sbr->ready_for_dequant = 0;
57  // Init defults used in pure upsampling mode
58  sbr->kx[1] = 32; //Typo in spec, kx' inits to 32
59  sbr->m[1] = 0;
60  // Reset values for first SBR header
61  sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1;
62  memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters));
63 }
64 
66 {
67  int ret;
68  float scale;
69 
70  if (sbr->mdct)
71  return 0;
72 
73  sbr->kx[0] = sbr->kx[1];
74  sbr->id_aac = id_aac;
75  sbr_turnoff(sbr);
76  sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
77  sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
78  /* SBR requires samples to be scaled to +/-32768.0 to work correctly.
79  * mdct scale factors are adjusted to scale up from +/-1.0 at analysis
80  * and scale back down at synthesis. */
81 
82  scale = USE_FIXED ? 1 : 1.0 / (64 * 32768);
83  ret = av_tx_init(&sbr->mdct, &sbr->mdct_fn,
85  1, 64, &scale, 0);
86  if (ret < 0)
87  return ret;
88 
89  scale = USE_FIXED ? -1.0 : -2.0 * 32768;
90  ret = av_tx_init(&sbr->mdct_ana, &sbr->mdct_ana_fn,
92  1, 64, &scale, 0);
93  if (ret < 0)
94  return ret;
95 
96  AAC_RENAME(ff_ps_ctx_init)(&sbr->ps);
97  AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp);
98  aacsbr_func_ptr_init(&sbr->c);
99 
100  return 0;
101 }
102 
104 {
105  av_tx_uninit(&sbr->mdct);
106  av_tx_uninit(&sbr->mdct_ana);
107 }
108 
109 static int qsort_comparison_function_int16(const void *a, const void *b)
110 {
111  return *(const int16_t *)a - *(const int16_t *)b;
112 }
113 
114 static inline int in_table_int16(const int16_t *table, int last_el, int16_t needle)
115 {
116  int i;
117  for (i = 0; i <= last_el; i++)
118  if (table[i] == needle)
119  return 1;
120  return 0;
121 }
122 
123 /// Limiter Frequency Band Table (14496-3 sp04 p198)
125 {
126  int k;
127  if (sbr->bs_limiter_bands > 0) {
128  static const INTFLOAT bands_warped[3] = { Q23(1.32715174233856803909f), //2^(0.49/1.2)
129  Q23(1.18509277094158210129f), //2^(0.49/2)
130  Q23(1.11987160404675912501f) }; //2^(0.49/3)
131  const INTFLOAT lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1];
132  int16_t patch_borders[7];
133  uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim;
134 
135  patch_borders[0] = sbr->kx[1];
136  for (k = 1; k <= sbr->num_patches; k++)
137  patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1];
138 
139  memcpy(sbr->f_tablelim, sbr->f_tablelow,
140  (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0]));
141  if (sbr->num_patches > 1)
142  memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1,
143  (sbr->num_patches - 1) * sizeof(patch_borders[0]));
144 
145  AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0],
146  uint16_t,
148 
149  sbr->n_lim = sbr->n[0] + sbr->num_patches - 1;
150  while (out < sbr->f_tablelim + sbr->n_lim) {
151 #if USE_FIXED
152  if ((*in << 23) >= *out * lim_bands_per_octave_warped) {
153 #else
154  if (*in >= *out * lim_bands_per_octave_warped) {
155 #endif /* USE_FIXED */
156  *++out = *in++;
157  } else if (*in == *out ||
158  !in_table_int16(patch_borders, sbr->num_patches, *in)) {
159  in++;
160  sbr->n_lim--;
161  } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) {
162  *out = *in++;
163  sbr->n_lim--;
164  } else {
165  *++out = *in++;
166  }
167  }
168  } else {
169  sbr->f_tablelim[0] = sbr->f_tablelow[0];
170  sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]];
171  sbr->n_lim = 1;
172  }
173 }
174 
176 {
177  unsigned int cnt = get_bits_count(gb);
178  uint8_t bs_header_extra_1;
179  uint8_t bs_header_extra_2;
180  int old_bs_limiter_bands = sbr->bs_limiter_bands;
181  SpectrumParameters old_spectrum_params;
182 
183  sbr->start = 1;
184  sbr->ready_for_dequant = 0;
185 
186  // Save last spectrum parameters variables to compare to new ones
187  memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters));
188 
189  sbr->bs_amp_res_header = get_bits1(gb);
190  sbr->spectrum_params.bs_start_freq = get_bits(gb, 4);
191  sbr->spectrum_params.bs_stop_freq = get_bits(gb, 4);
192  sbr->spectrum_params.bs_xover_band = get_bits(gb, 3);
193  skip_bits(gb, 2); // bs_reserved
194 
195  bs_header_extra_1 = get_bits1(gb);
196  bs_header_extra_2 = get_bits1(gb);
197 
198  if (bs_header_extra_1) {
199  sbr->spectrum_params.bs_freq_scale = get_bits(gb, 2);
202  } else {
206  }
207 
208  // Check if spectrum parameters changed
209  if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)))
210  sbr->reset = 1;
211 
212  if (bs_header_extra_2) {
213  sbr->bs_limiter_bands = get_bits(gb, 2);
214  sbr->bs_limiter_gains = get_bits(gb, 2);
215  sbr->bs_interpol_freq = get_bits1(gb);
216  sbr->bs_smoothing_mode = get_bits1(gb);
217  } else {
218  sbr->bs_limiter_bands = 2;
219  sbr->bs_limiter_gains = 2;
220  sbr->bs_interpol_freq = 1;
221  sbr->bs_smoothing_mode = 1;
222  }
223 
224  if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset)
225  sbr_make_f_tablelim(sbr);
226 
227  return get_bits_count(gb) - cnt;
228 }
229 
230 static int array_min_int16(const int16_t *array, int nel)
231 {
232  int i, min = array[0];
233  for (i = 1; i < nel; i++)
234  min = FFMIN(array[i], min);
235  return min;
236 }
237 
238 static int check_n_master(AVCodecContext *avctx, int n_master, int bs_xover_band)
239 {
240  // Requirements (14496-3 sp04 p205)
241  if (n_master <= 0) {
242  av_log(avctx, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master);
243  return -1;
244  }
245  if (bs_xover_band >= n_master) {
246  av_log(avctx, AV_LOG_ERROR,
247  "Invalid bitstream, crossover band index beyond array bounds: %d\n",
248  bs_xover_band);
249  return -1;
250  }
251  return 0;
252 }
253 
254 /// Master Frequency Band Table (14496-3 sp04 p194)
256  SpectrumParameters *spectrum)
257 {
258  unsigned int temp, max_qmf_subbands = 0;
259  unsigned int start_min, stop_min;
260  int k;
261  const int8_t *sbr_offset_ptr;
262  int16_t stop_dk[13];
263 
264  switch (sbr->sample_rate) {
265  case 16000:
266  sbr_offset_ptr = sbr_offset[0];
267  break;
268  case 22050:
269  sbr_offset_ptr = sbr_offset[1];
270  break;
271  case 24000:
272  sbr_offset_ptr = sbr_offset[2];
273  break;
274  case 32000:
275  sbr_offset_ptr = sbr_offset[3];
276  break;
277  case 44100: case 48000: case 64000:
278  sbr_offset_ptr = sbr_offset[4];
279  break;
280  case 88200: case 96000: case 128000: case 176400: case 192000:
281  sbr_offset_ptr = sbr_offset[5];
282  break;
283  default:
285  "Unsupported sample rate for SBR: %d\n", sbr->sample_rate);
286  return -1;
287  }
288 
289  if (sbr->sample_rate < 32000) {
290  temp = 3000;
291  } else if (sbr->sample_rate < 64000) {
292  temp = 4000;
293  } else
294  temp = 5000;
295 
296  start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
297  stop_min = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
298 
299  sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq];
300 
301  if (spectrum->bs_stop_freq < 14) {
302  sbr->k[2] = stop_min;
303  make_bands(stop_dk, stop_min, 64, 13);
304  AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16);
305  for (k = 0; k < spectrum->bs_stop_freq; k++)
306  sbr->k[2] += stop_dk[k];
307  } else if (spectrum->bs_stop_freq == 14) {
308  sbr->k[2] = 2*sbr->k[0];
309  } else if (spectrum->bs_stop_freq == 15) {
310  sbr->k[2] = 3*sbr->k[0];
311  } else {
313  "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq);
314  return -1;
315  }
316  sbr->k[2] = FFMIN(64, sbr->k[2]);
317 
318  // Requirements (14496-3 sp04 p205)
319  if (sbr->sample_rate <= 32000) {
320  max_qmf_subbands = 48;
321  } else if (sbr->sample_rate == 44100) {
322  max_qmf_subbands = 35;
323  } else if (sbr->sample_rate >= 48000)
324  max_qmf_subbands = 32;
325  else
326  av_assert0(0);
327 
328  if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) {
330  "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]);
331  return -1;
332  }
333 
334  if (!spectrum->bs_freq_scale) {
335  int dk, k2diff;
336 
337  dk = spectrum->bs_alter_scale + 1;
338  sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1;
340  return -1;
341 
342  for (k = 1; k <= sbr->n_master; k++)
343  sbr->f_master[k] = dk;
344 
345  k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk;
346  if (k2diff < 0) {
347  sbr->f_master[1]--;
348  sbr->f_master[2]-= (k2diff < -1);
349  } else if (k2diff) {
350  sbr->f_master[sbr->n_master]++;
351  }
352 
353  sbr->f_master[0] = sbr->k[0];
354  for (k = 1; k <= sbr->n_master; k++)
355  sbr->f_master[k] += sbr->f_master[k - 1];
356 
357  } else {
358  int half_bands = 7 - spectrum->bs_freq_scale; // bs_freq_scale = {1,2,3}
359  int two_regions, num_bands_0;
360  int vdk0_max, vdk1_min;
361  int16_t vk0[49];
362 #if USE_FIXED
363  int tmp, nz = 0;
364 #endif /* USE_FIXED */
365 
366  if (49 * sbr->k[2] > 110 * sbr->k[0]) {
367  two_regions = 1;
368  sbr->k[1] = 2 * sbr->k[0];
369  } else {
370  two_regions = 0;
371  sbr->k[1] = sbr->k[2];
372  }
373 
374 #if USE_FIXED
375  tmp = (sbr->k[1] << 23) / sbr->k[0];
376  while (tmp < 0x40000000) {
377  tmp <<= 1;
378  nz++;
379  }
380  tmp = fixed_log(tmp - 0x80000000);
381  tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30);
382  tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands;
383  num_bands_0 = ((tmp + 0x400000) >> 23) * 2;
384 #else
385  num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2;
386 #endif /* USE_FIXED */
387 
388  if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205)
389  av_log(ac->avctx, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0);
390  return -1;
391  }
392 
393  vk0[0] = 0;
394 
395  make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0);
396 
397  AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16);
398  vdk0_max = vk0[num_bands_0];
399 
400  vk0[0] = sbr->k[0];
401  for (k = 1; k <= num_bands_0; k++) {
402  if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205)
403  av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]);
404  return -1;
405  }
406  vk0[k] += vk0[k-1];
407  }
408 
409  if (two_regions) {
410  int16_t vk1[49];
411 #if USE_FIXED
412  int num_bands_1;
413 
414  tmp = (sbr->k[2] << 23) / sbr->k[1];
415  nz = 0;
416  while (tmp < 0x40000000) {
417  tmp <<= 1;
418  nz++;
419  }
420  tmp = fixed_log(tmp - 0x80000000);
421  tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30);
422  tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands;
423  if (spectrum->bs_alter_scale)
424  tmp = (int)(((int64_t)tmp * CONST_076923 + 0x40000000) >> 31);
425  num_bands_1 = ((tmp + 0x400000) >> 23) * 2;
426 #else
427  float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f
428  : 1.0f; // bs_alter_scale = {0,1}
429  int num_bands_1 = lrintf(half_bands * invwarp *
430  log2f(sbr->k[2] / (float)sbr->k[1])) * 2;
431 #endif /* USE_FIXED */
432  make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1);
433 
434  vdk1_min = array_min_int16(vk1 + 1, num_bands_1);
435 
436  if (vdk1_min < vdk0_max) {
437  int change;
438  AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
439  change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1);
440  vk1[1] += change;
441  vk1[num_bands_1] -= change;
442  }
443 
444  AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
445 
446  vk1[0] = sbr->k[1];
447  for (k = 1; k <= num_bands_1; k++) {
448  if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205)
449  av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]);
450  return -1;
451  }
452  vk1[k] += vk1[k-1];
453  }
454 
455  sbr->n_master = num_bands_0 + num_bands_1;
457  return -1;
458  memcpy(&sbr->f_master[0], vk0,
459  (num_bands_0 + 1) * sizeof(sbr->f_master[0]));
460  memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1,
461  num_bands_1 * sizeof(sbr->f_master[0]));
462 
463  } else {
464  sbr->n_master = num_bands_0;
466  return -1;
467  memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0]));
468  }
469  }
470 
471  return 0;
472 }
473 
474 /// High Frequency Generation - Patch Construction (14496-3 sp04 p216 fig. 4.46)
476 {
477  int i, k, last_k = -1, last_msb = -1, sb = 0;
478  int msb = sbr->k[0];
479  int usb = sbr->kx[1];
480  int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate;
481 
482  sbr->num_patches = 0;
483 
484  if (goal_sb < sbr->kx[1] + sbr->m[1]) {
485  for (k = 0; sbr->f_master[k] < goal_sb; k++) ;
486  } else
487  k = sbr->n_master;
488 
489  do {
490  int odd = 0;
491  if (k == last_k && msb == last_msb) {
492  av_log(ac->avctx, AV_LOG_ERROR, "patch construction failed\n");
493  return AVERROR_INVALIDDATA;
494  }
495  last_k = k;
496  last_msb = msb;
497  for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) {
498  sb = sbr->f_master[i];
499  odd = (sb + sbr->k[0]) & 1;
500  }
501 
502  // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5.
503  // After this check the final number of patches can still be six which is
504  // illegal however the Coding Technologies decoder check stream has a final
505  // count of 6 patches
506  if (sbr->num_patches > 5) {
507  av_log(ac->avctx, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches);
508  return -1;
509  }
510 
511  sbr->patch_num_subbands[sbr->num_patches] = FFMAX(sb - usb, 0);
512  sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches];
513 
514  if (sbr->patch_num_subbands[sbr->num_patches] > 0) {
515  usb = sb;
516  msb = sb;
517  sbr->num_patches++;
518  } else
519  msb = sbr->kx[1];
520 
521  if (sbr->f_master[k] - sb < 3)
522  k = sbr->n_master;
523  } while (sb != sbr->kx[1] + sbr->m[1]);
524 
525  if (sbr->num_patches > 1 &&
526  sbr->patch_num_subbands[sbr->num_patches - 1] < 3)
527  sbr->num_patches--;
528 
529  return 0;
530 }
531 
532 /// Derived Frequency Band Tables (14496-3 sp04 p197)
534 {
535  int k, temp;
536 #if USE_FIXED
537  int nz = 0;
538 #endif /* USE_FIXED */
539 
540  sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band;
541  sbr->n[0] = (sbr->n[1] + 1) >> 1;
542 
543  memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band],
544  (sbr->n[1] + 1) * sizeof(sbr->f_master[0]));
545  sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0];
546  sbr->kx[1] = sbr->f_tablehigh[0];
547 
548  // Requirements (14496-3 sp04 p205)
549  if (sbr->kx[1] + sbr->m[1] > 64) {
551  "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]);
552  return -1;
553  }
554  if (sbr->kx[1] > 32) {
555  av_log(ac->avctx, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]);
556  return -1;
557  }
558 
559  sbr->f_tablelow[0] = sbr->f_tablehigh[0];
560  temp = sbr->n[1] & 1;
561  for (k = 1; k <= sbr->n[0]; k++)
562  sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp];
563 #if USE_FIXED
564  temp = (sbr->k[2] << 23) / sbr->kx[1];
565  while (temp < 0x40000000) {
566  temp <<= 1;
567  nz++;
568  }
569  temp = fixed_log(temp - 0x80000000);
570  temp = (int)(((int64_t)temp * CONST_RECIP_LN2 + 0x20000000) >> 30);
571  temp = (((temp + 0x80) >> 8) + ((8 - nz) << 23)) * sbr->spectrum_params.bs_noise_bands;
572 
573  sbr->n_q = (temp + 0x400000) >> 23;
574  if (sbr->n_q < 1)
575  sbr->n_q = 1;
576 #else
578  log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3
579 #endif /* USE_FIXED */
580 
581  if (sbr->n_q > 5) {
582  av_log(ac->avctx, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q);
583  return -1;
584  }
585 
586  sbr->f_tablenoise[0] = sbr->f_tablelow[0];
587  temp = 0;
588  for (k = 1; k <= sbr->n_q; k++) {
589  temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k);
590  sbr->f_tablenoise[k] = sbr->f_tablelow[temp];
591  }
592 
593  if (sbr_hf_calc_npatches(ac, sbr) < 0)
594  return -1;
595 
596  sbr_make_f_tablelim(sbr);
597 
598  sbr->data[0].f_indexnoise = 0;
599  sbr->data[1].f_indexnoise = 0;
600 
601  return 0;
602 }
603 
604 static av_always_inline void get_bits1_vector(GetBitContext *gb, uint8_t *vec,
605  int elements)
606 {
607  int i;
608  for (i = 0; i < elements; i++) {
609  vec[i] = get_bits1(gb);
610  }
611 }
612 
613 /** ceil(log2(index+1)) */
614 static const int8_t ceil_log2[] = {
615  0, 1, 2, 2, 3, 3,
616 };
617 
619  GetBitContext *gb, SBRData *ch_data)
620 {
621  int i;
622  int bs_pointer = 0;
623  // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots
624  int abs_bord_trail = 16;
625  int num_rel_lead, num_rel_trail;
626  unsigned bs_num_env_old = ch_data->bs_num_env;
627  int bs_frame_class, bs_num_env;
628 
629  ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env];
630  ch_data->bs_amp_res = sbr->bs_amp_res_header;
631  ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old];
632 
633  switch (bs_frame_class = get_bits(gb, 2)) {
634  case FIXFIX:
635  bs_num_env = 1 << get_bits(gb, 2);
636  if (bs_num_env > 4) {
638  "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n",
639  bs_num_env);
640  return -1;
641  }
642  ch_data->bs_num_env = bs_num_env;
643  num_rel_lead = ch_data->bs_num_env - 1;
644  if (ch_data->bs_num_env == 1)
645  ch_data->bs_amp_res = 0;
646 
647 
648  ch_data->t_env[0] = 0;
649  ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
650 
651  abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) /
652  ch_data->bs_num_env;
653  for (i = 0; i < num_rel_lead; i++)
654  ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail;
655 
656  ch_data->bs_freq_res[1] = get_bits1(gb);
657  for (i = 1; i < ch_data->bs_num_env; i++)
658  ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1];
659  break;
660  case FIXVAR:
661  abs_bord_trail += get_bits(gb, 2);
662  num_rel_trail = get_bits(gb, 2);
663  ch_data->bs_num_env = num_rel_trail + 1;
664  ch_data->t_env[0] = 0;
665  ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
666 
667  for (i = 0; i < num_rel_trail; i++)
668  ch_data->t_env[ch_data->bs_num_env - 1 - i] =
669  ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
670 
671  bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
672 
673  for (i = 0; i < ch_data->bs_num_env; i++)
674  ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb);
675  break;
676  case VARFIX:
677  ch_data->t_env[0] = get_bits(gb, 2);
678  num_rel_lead = get_bits(gb, 2);
679  ch_data->bs_num_env = num_rel_lead + 1;
680  ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
681 
682  for (i = 0; i < num_rel_lead; i++)
683  ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
684 
685  bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
686 
687  get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
688  break;
689  case VARVAR:
690  ch_data->t_env[0] = get_bits(gb, 2);
691  abs_bord_trail += get_bits(gb, 2);
692  num_rel_lead = get_bits(gb, 2);
693  num_rel_trail = get_bits(gb, 2);
694  bs_num_env = num_rel_lead + num_rel_trail + 1;
695 
696  if (bs_num_env > 5) {
698  "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n",
699  bs_num_env);
700  return -1;
701  }
702  ch_data->bs_num_env = bs_num_env;
703 
704  ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail;
705 
706  for (i = 0; i < num_rel_lead; i++)
707  ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2;
708  for (i = 0; i < num_rel_trail; i++)
709  ch_data->t_env[ch_data->bs_num_env - 1 - i] =
710  ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2;
711 
712  bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]);
713 
714  get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env);
715  break;
716  }
717  ch_data->bs_frame_class = bs_frame_class;
718 
719  av_assert0(bs_pointer >= 0);
720  if (bs_pointer > ch_data->bs_num_env + 1) {
722  "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n",
723  bs_pointer);
724  return -1;
725  }
726 
727  for (i = 1; i <= ch_data->bs_num_env; i++) {
728  if (ch_data->t_env[i-1] >= ch_data->t_env[i]) {
729  av_log(ac->avctx, AV_LOG_ERROR, "Not strictly monotone time borders\n");
730  return -1;
731  }
732  }
733 
734  ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1;
735 
736  ch_data->t_q[0] = ch_data->t_env[0];
737  ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env];
738  if (ch_data->bs_num_noise > 1) {
739  int idx;
740  if (ch_data->bs_frame_class == FIXFIX) {
741  idx = ch_data->bs_num_env >> 1;
742  } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR
743  idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1);
744  } else { // VARFIX
745  if (!bs_pointer)
746  idx = 1;
747  else if (bs_pointer == 1)
748  idx = ch_data->bs_num_env - 1;
749  else // bs_pointer > 1
750  idx = bs_pointer - 1;
751  }
752  ch_data->t_q[1] = ch_data->t_env[idx];
753  }
754 
755  ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev
756  ch_data->e_a[1] = -1;
757  if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0
758  ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer;
759  } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1
760  ch_data->e_a[1] = bs_pointer - 1;
761 
762  return 0;
763 }
764 
765 static void copy_sbr_grid(SBRData *dst, const SBRData *src) {
766  //These variables are saved from the previous frame rather than copied
767  dst->bs_freq_res[0] = dst->bs_freq_res[dst->bs_num_env];
768  dst->t_env_num_env_old = dst->t_env[dst->bs_num_env];
769  dst->e_a[0] = -(dst->e_a[1] != dst->bs_num_env);
770 
771  //These variables are read from the bitstream and therefore copied
772  memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res));
773  memcpy(dst->t_env, src->t_env, sizeof(dst->t_env));
774  memcpy(dst->t_q, src->t_q, sizeof(dst->t_q));
775  dst->bs_num_env = src->bs_num_env;
776  dst->bs_amp_res = src->bs_amp_res;
777  dst->bs_num_noise = src->bs_num_noise;
778  dst->bs_frame_class = src->bs_frame_class;
779  dst->e_a[1] = src->e_a[1];
780 }
781 
782 /// Read how the envelope and noise floor data is delta coded
784  SBRData *ch_data)
785 {
786  get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env);
787  get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise);
788 }
789 
790 /// Read inverse filtering data
792  SBRData *ch_data)
793 {
794  int i;
795 
796  memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t));
797  for (i = 0; i < sbr->n_q; i++)
798  ch_data->bs_invf_mode[0][i] = get_bits(gb, 2);
799 }
800 
802  SBRData *ch_data, int ch)
803 {
804  int bits;
805  int i, j, k;
806  const VLCElem *t_huff, *f_huff;
807  const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
808  const int odd = sbr->n[1] & 1;
809 
810  if (sbr->bs_coupling && ch) {
811  if (ch_data->bs_amp_res) {
812  bits = 5;
815  } else {
816  bits = 6;
819  }
820  } else {
821  if (ch_data->bs_amp_res) {
822  bits = 6;
825  } else {
826  bits = 7;
829  }
830  }
831 
832  for (i = 0; i < ch_data->bs_num_env; i++) {
833  if (ch_data->bs_df_env[i]) {
834  // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame
835  if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) {
836  for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
837  ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 3);
838  if (ch_data->env_facs_q[i + 1][j] > 127U) {
839  av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
840  return AVERROR_INVALIDDATA;
841  }
842  }
843  } else if (ch_data->bs_freq_res[i + 1]) {
844  for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
845  k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1]
846  ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3);
847  if (ch_data->env_facs_q[i + 1][j] > 127U) {
848  av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
849  return AVERROR_INVALIDDATA;
850  }
851  }
852  } else {
853  for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
854  k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j]
855  ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * get_vlc2(gb, t_huff, 9, 3);
856  if (ch_data->env_facs_q[i + 1][j] > 127U) {
857  av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
858  return AVERROR_INVALIDDATA;
859  }
860  }
861  }
862  } else {
863  ch_data->env_facs_q[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance
864  for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) {
865  ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i + 1][j - 1] + delta * get_vlc2(gb, f_huff, 9, 3);
866  if (ch_data->env_facs_q[i + 1][j] > 127U) {
867  av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]);
868  return AVERROR_INVALIDDATA;
869  }
870  }
871  }
872  }
873 
874  //assign 0th elements of env_facs_q from last elements
875  memcpy(ch_data->env_facs_q[0], ch_data->env_facs_q[ch_data->bs_num_env],
876  sizeof(ch_data->env_facs_q[0]));
877 
878  return 0;
879 }
880 
882  SBRData *ch_data, int ch)
883 {
884  int i, j;
885  const VLCElem *t_huff, *f_huff;
886  int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
887 
888  if (sbr->bs_coupling && ch) {
891  } else {
894  }
895 
896  for (i = 0; i < ch_data->bs_num_noise; i++) {
897  if (ch_data->bs_df_noise[i]) {
898  for (j = 0; j < sbr->n_q; j++) {
899  ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i][j] + delta * get_vlc2(gb, t_huff, 9, 2);
900  if (ch_data->noise_facs_q[i + 1][j] > 30U) {
901  av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]);
902  return AVERROR_INVALIDDATA;
903  }
904  }
905  } else {
906  ch_data->noise_facs_q[i + 1][0] = delta * get_bits(gb, 5); // bs_noise_start_value_balance or bs_noise_start_value_level
907  for (j = 1; j < sbr->n_q; j++) {
908  ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i + 1][j - 1] + delta * get_vlc2(gb, f_huff, 9, 3);
909  if (ch_data->noise_facs_q[i + 1][j] > 30U) {
910  av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]);
911  return AVERROR_INVALIDDATA;
912  }
913  }
914  }
915  }
916 
917  //assign 0th elements of noise_facs_q from last elements
918  memcpy(ch_data->noise_facs_q[0], ch_data->noise_facs_q[ch_data->bs_num_noise],
919  sizeof(ch_data->noise_facs_q[0]));
920  return 0;
921 }
922 
924  GetBitContext *gb,
925  int bs_extension_id, int *num_bits_left)
926 {
927  switch (bs_extension_id) {
928  case EXTENSION_ID_PS:
929  if (!ac->oc[1].m4ac.ps) {
930  av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n");
931  skip_bits_long(gb, *num_bits_left); // bs_fill_bits
932  *num_bits_left = 0;
933  } else {
934  *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left);
936  // ensure the warning is not printed if PS extension is present
937  ac->warned_he_aac_mono = 1;
938  }
939  break;
940  default:
941  // some files contain 0-padding
942  if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, *num_bits_left))
943  avpriv_request_sample(ac->avctx, "Reserved SBR extensions");
944  skip_bits_long(gb, *num_bits_left); // bs_fill_bits
945  *num_bits_left = 0;
946  break;
947  }
948 }
949 
952  GetBitContext *gb)
953 {
954  int ret;
955 
956  if (get_bits1(gb)) // bs_data_extra
957  skip_bits(gb, 4); // bs_reserved
958 
959  if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]))
960  return -1;
961  read_sbr_dtdf(sbr, gb, &sbr->data[0]);
962  read_sbr_invf(sbr, gb, &sbr->data[0]);
963  if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
964  return ret;
965  if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
966  return ret;
967 
968  if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
969  get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
970 
971  return 0;
972 }
973 
976  GetBitContext *gb)
977 {
978  int ret;
979 
980  if (get_bits1(gb)) // bs_data_extra
981  skip_bits(gb, 8); // bs_reserved
982 
983  if ((sbr->bs_coupling = get_bits1(gb))) {
984  if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]))
985  return -1;
986  copy_sbr_grid(&sbr->data[1], &sbr->data[0]);
987  read_sbr_dtdf(sbr, gb, &sbr->data[0]);
988  read_sbr_dtdf(sbr, gb, &sbr->data[1]);
989  read_sbr_invf(sbr, gb, &sbr->data[0]);
990  memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
991  memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
992  if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
993  return ret;
994  if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
995  return ret;
996  if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
997  return ret;
998  if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
999  return ret;
1000  } else {
1001  if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]) ||
1002  read_sbr_grid(ac, sbr, gb, &sbr->data[1]))
1003  return -1;
1004  read_sbr_dtdf(sbr, gb, &sbr->data[0]);
1005  read_sbr_dtdf(sbr, gb, &sbr->data[1]);
1006  read_sbr_invf(sbr, gb, &sbr->data[0]);
1007  read_sbr_invf(sbr, gb, &sbr->data[1]);
1008  if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1009  return ret;
1010  if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1011  return ret;
1012  if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0)
1013  return ret;
1014  if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0)
1015  return ret;
1016  }
1017 
1018  if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
1019  get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
1020  if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb)))
1021  get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]);
1022 
1023  return 0;
1024 }
1025 
1026 static unsigned int read_sbr_data(AACContext *ac, SpectralBandReplication *sbr,
1027  GetBitContext *gb, int id_aac)
1028 {
1029  unsigned int cnt = get_bits_count(gb);
1030 
1031  sbr->id_aac = id_aac;
1032  sbr->ready_for_dequant = 1;
1033 
1034  if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) {
1035  if (read_sbr_single_channel_element(ac, sbr, gb)) {
1036  sbr_turnoff(sbr);
1037  return get_bits_count(gb) - cnt;
1038  }
1039  } else if (id_aac == TYPE_CPE) {
1040  if (read_sbr_channel_pair_element(ac, sbr, gb)) {
1041  sbr_turnoff(sbr);
1042  return get_bits_count(gb) - cnt;
1043  }
1044  } else {
1045  av_log(ac->avctx, AV_LOG_ERROR,
1046  "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac);
1047  sbr_turnoff(sbr);
1048  return get_bits_count(gb) - cnt;
1049  }
1050  if (get_bits1(gb)) { // bs_extended_data
1051  int num_bits_left = get_bits(gb, 4); // bs_extension_size
1052  if (num_bits_left == 15)
1053  num_bits_left += get_bits(gb, 8); // bs_esc_count
1054 
1055  num_bits_left <<= 3;
1056  while (num_bits_left > 7) {
1057  num_bits_left -= 2;
1058  read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id
1059  }
1060  if (num_bits_left < 0) {
1061  av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n");
1062  }
1063  if (num_bits_left > 0)
1064  skip_bits(gb, num_bits_left);
1065  }
1066 
1067  return get_bits_count(gb) - cnt;
1068 }
1069 
1071 {
1072  int err;
1073  err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params);
1074  if (err >= 0)
1075  err = sbr_make_f_derived(ac, sbr);
1076  if (err < 0) {
1077  av_log(ac->avctx, AV_LOG_ERROR,
1078  "SBR reset failed. Switching SBR to pure upsampling mode.\n");
1079  sbr_turnoff(sbr);
1080  }
1081 }
1082 
1083 /**
1084  * Decode Spectral Band Replication extension data; reference: table 4.55.
1085  *
1086  * @param crc flag indicating the presence of CRC checksum
1087  * @param cnt length of TYPE_FIL syntactic element in bytes
1088  *
1089  * @return Returns number of bytes consumed from the TYPE_FIL element.
1090  */
1092  GetBitContext *gb_host, int crc, int cnt, int id_aac)
1093 {
1094  unsigned int num_sbr_bits = 0, num_align_bits;
1095  unsigned bytes_read;
1096  GetBitContext gbc = *gb_host, *gb = &gbc;
1097  skip_bits_long(gb_host, cnt*8 - 4);
1098 
1099  sbr->reset = 0;
1100 
1101  if (!sbr->sample_rate)
1102  sbr->sample_rate = 2 * ac->oc[1].m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support
1103  if (!ac->oc[1].m4ac.ext_sample_rate)
1104  ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate;
1105 
1106  if (crc) {
1107  skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check
1108  num_sbr_bits += 10;
1109  }
1110 
1111  //Save some state from the previous frame.
1112  sbr->kx[0] = sbr->kx[1];
1113  sbr->m[0] = sbr->m[1];
1114  sbr->kx_and_m_pushed = 1;
1115 
1116  num_sbr_bits++;
1117  if (get_bits1(gb)) // bs_header_flag
1118  num_sbr_bits += read_sbr_header(sbr, gb);
1119 
1120  if (sbr->reset)
1121  sbr_reset(ac, sbr);
1122 
1123  if (sbr->start)
1124  num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac);
1125 
1126  num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7;
1127  bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3);
1128 
1129  if (bytes_read > cnt) {
1130  av_log(ac->avctx, AV_LOG_ERROR,
1131  "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read);
1132  sbr_turnoff(sbr);
1133  }
1134  return cnt;
1135 }
1136 
1137 /**
1138  * Analysis QMF Bank (14496-3 sp04 p206)
1139  *
1140  * @param x pointer to the beginning of the first sample window
1141  * @param W array of complex-valued samples split into subbands
1142  */
1143 #ifndef sbr_qmf_analysis
1144 #if USE_FIXED
1145 static void sbr_qmf_analysis(AVFixedDSPContext *dsp, AVTXContext *mdct,
1146  av_tx_fn mdct_fn,
1147 #else
1149  av_tx_fn mdct_fn,
1150 #endif /* USE_FIXED */
1151  SBRDSPContext *sbrdsp, const INTFLOAT *in, INTFLOAT *x,
1152  INTFLOAT z[320], INTFLOAT W[2][32][32][2], int buf_idx)
1153 {
1154  int i;
1155 #if USE_FIXED
1156  int j;
1157 #endif
1158  memcpy(x , x+1024, (320-32)*sizeof(x[0]));
1159  memcpy(x+288, in, 1024*sizeof(x[0]));
1160  for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames
1161  // are not supported
1162  dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320);
1163  sbrdsp->sum64x5(z);
1164  sbrdsp->qmf_pre_shuffle(z);
1165 #if USE_FIXED
1166  for (j = 64; j < 128; j++) {
1167  if (z[j] > 1<<24) {
1169  "sbr_qmf_analysis: value %09d too large, setting to %09d\n",
1170  z[j], 1<<24);
1171  z[j] = 1<<24;
1172  } else if (z[j] < -(1<<24)) {
1174  "sbr_qmf_analysis: value %09d too small, setting to %09d\n",
1175  z[j], -(1<<24));
1176  z[j] = -(1<<24);
1177  }
1178  }
1179 #endif
1180  mdct_fn(mdct, z, z + 64, sizeof(INTFLOAT));
1181  sbrdsp->qmf_post_shuffle(W[buf_idx][i], z);
1182  x += 32;
1183  }
1184 }
1185 #endif
1186 
1187 /**
1188  * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank
1189  * (14496-3 sp04 p206)
1190  */
1191 #ifndef sbr_qmf_synthesis
1192 static void sbr_qmf_synthesis(AVTXContext *mdct, av_tx_fn mdct_fn,
1193 #if USE_FIXED
1194  SBRDSPContext *sbrdsp, AVFixedDSPContext *dsp,
1195 #else
1196  SBRDSPContext *sbrdsp, AVFloatDSPContext *dsp,
1197 #endif /* USE_FIXED */
1198  INTFLOAT *out, INTFLOAT X[2][38][64],
1199  INTFLOAT mdct_buf[2][64],
1200  INTFLOAT *v0, int *v_off, const unsigned int div)
1201 {
1202  int i, n;
1203  const INTFLOAT *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us;
1204  const int step = 128 >> div;
1205  INTFLOAT *v;
1206  for (i = 0; i < 32; i++) {
1207  if (*v_off < step) {
1208  int saved_samples = (1280 - 128) >> div;
1209  memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(INTFLOAT));
1210  *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step;
1211  } else {
1212  *v_off -= step;
1213  }
1214  v = v0 + *v_off;
1215  if (div) {
1216  for (n = 0; n < 32; n++) {
1217  X[0][i][ n] = -X[0][i][n];
1218  X[0][i][32+n] = X[1][i][31-n];
1219  }
1220  mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT));
1221  sbrdsp->qmf_deint_neg(v, mdct_buf[0]);
1222  } else {
1223  sbrdsp->neg_odd_64(X[1][i]);
1224  mdct_fn(mdct, mdct_buf[0], X[0][i], sizeof(INTFLOAT));
1225  mdct_fn(mdct, mdct_buf[1], X[1][i], sizeof(INTFLOAT));
1226  sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]);
1227  }
1228  dsp->vector_fmul (out, v , sbr_qmf_window , 64 >> div);
1229  dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out , 64 >> div);
1230  dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out , 64 >> div);
1231  dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out , 64 >> div);
1232  dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out , 64 >> div);
1233  dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out , 64 >> div);
1234  dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out , 64 >> div);
1235  dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out , 64 >> div);
1236  dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out , 64 >> div);
1237  dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out , 64 >> div);
1238  out += 64 >> div;
1239  }
1240 }
1241 #endif
1242 
1243 /// Generate the subband filtered lowband
1245  INTFLOAT X_low[32][40][2], const INTFLOAT W[2][32][32][2],
1246  int buf_idx)
1247 {
1248  int i, k;
1249  const int t_HFGen = 8;
1250  const int i_f = 32;
1251  memset(X_low, 0, 32*sizeof(*X_low));
1252  for (k = 0; k < sbr->kx[1]; k++) {
1253  for (i = t_HFGen; i < i_f + t_HFGen; i++) {
1254  X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0];
1255  X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1];
1256  }
1257  }
1258  buf_idx = 1-buf_idx;
1259  for (k = 0; k < sbr->kx[0]; k++) {
1260  for (i = 0; i < t_HFGen; i++) {
1261  X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0];
1262  X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1];
1263  }
1264  }
1265  return 0;
1266 }
1267 
1268 /// High Frequency Generator (14496-3 sp04 p215)
1270  INTFLOAT X_high[64][40][2], const INTFLOAT X_low[32][40][2],
1271  const INTFLOAT (*alpha0)[2], const INTFLOAT (*alpha1)[2],
1272  const INTFLOAT bw_array[5], const uint8_t *t_env,
1273  int bs_num_env)
1274 {
1275  int j, x;
1276  int g = 0;
1277  int k = sbr->kx[1];
1278  for (j = 0; j < sbr->num_patches; j++) {
1279  for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) {
1280  const int p = sbr->patch_start_subband[j] + x;
1281  while (g <= sbr->n_q && k >= sbr->f_tablenoise[g])
1282  g++;
1283  g--;
1284 
1285  if (g < 0) {
1286  av_log(ac->avctx, AV_LOG_ERROR,
1287  "ERROR : no subband found for frequency %d\n", k);
1288  return -1;
1289  }
1290 
1291  sbr->dsp.hf_gen(X_high[k] + ENVELOPE_ADJUSTMENT_OFFSET,
1292  X_low[p] + ENVELOPE_ADJUSTMENT_OFFSET,
1293  alpha0[p], alpha1[p], bw_array[g],
1294  2 * t_env[0], 2 * t_env[bs_num_env]);
1295  }
1296  }
1297  if (k < sbr->m[1] + sbr->kx[1])
1298  memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high));
1299 
1300  return 0;
1301 }
1302 
1303 /// Generate the subband filtered lowband
1304 static int sbr_x_gen(SpectralBandReplication *sbr, INTFLOAT X[2][38][64],
1305  const INTFLOAT Y0[38][64][2], const INTFLOAT Y1[38][64][2],
1306  const INTFLOAT X_low[32][40][2], int ch)
1307 {
1308  int k, i;
1309  const int i_f = 32;
1310  const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0);
1311  memset(X, 0, 2*sizeof(*X));
1312  for (k = 0; k < sbr->kx[0]; k++) {
1313  for (i = 0; i < i_Temp; i++) {
1314  X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1315  X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1316  }
1317  }
1318  for (; k < sbr->kx[0] + sbr->m[0]; k++) {
1319  for (i = 0; i < i_Temp; i++) {
1320  X[0][i][k] = Y0[i + i_f][k][0];
1321  X[1][i][k] = Y0[i + i_f][k][1];
1322  }
1323  }
1324 
1325  for (k = 0; k < sbr->kx[1]; k++) {
1326  for (i = i_Temp; i < 38; i++) {
1327  X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1328  X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1329  }
1330  }
1331  for (; k < sbr->kx[1] + sbr->m[1]; k++) {
1332  for (i = i_Temp; i < i_f; i++) {
1333  X[0][i][k] = Y1[i][k][0];
1334  X[1][i][k] = Y1[i][k][1];
1335  }
1336  }
1337  return 0;
1338 }
1339 
1340 /** High Frequency Adjustment (14496-3 sp04 p217) and Mapping
1341  * (14496-3 sp04 p217)
1342  */
1344  SBRData *ch_data, int e_a[2])
1345 {
1346  int e, i, m;
1347 
1348  memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1]));
1349  for (e = 0; e < ch_data->bs_num_env; e++) {
1350  const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]];
1351  uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow;
1352  int k;
1353 
1354  if (sbr->kx[1] != table[0]) {
1355  av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. "
1356  "Derived frequency tables were not regenerated.\n");
1357  sbr_turnoff(sbr);
1358  return AVERROR_BUG;
1359  }
1360  for (i = 0; i < ilim; i++)
1361  for (m = table[i]; m < table[i + 1]; m++)
1362  sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i];
1363 
1364  // ch_data->bs_num_noise > 1 => 2 noise floors
1365  k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]);
1366  for (i = 0; i < sbr->n_q; i++)
1367  for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++)
1368  sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i];
1369 
1370  for (i = 0; i < sbr->n[1]; i++) {
1371  if (ch_data->bs_add_harmonic_flag) {
1372  const unsigned int m_midpoint =
1373  (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1;
1374 
1375  ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] *
1376  (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1));
1377  }
1378  }
1379 
1380  for (i = 0; i < ilim; i++) {
1381  int additional_sinusoid_present = 0;
1382  for (m = table[i]; m < table[i + 1]; m++) {
1383  if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) {
1384  additional_sinusoid_present = 1;
1385  break;
1386  }
1387  }
1388  memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present,
1389  (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0]));
1390  }
1391  }
1392 
1393  memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0]));
1394  return 0;
1395 }
1396 
1397 /// Estimation of current envelope (14496-3 sp04 p218)
1398 static void sbr_env_estimate(AAC_FLOAT (*e_curr)[48], INTFLOAT X_high[64][40][2],
1399  SpectralBandReplication *sbr, SBRData *ch_data)
1400 {
1401  int e, m;
1402  int kx1 = sbr->kx[1];
1403 
1404  if (sbr->bs_interpol_freq) {
1405  for (e = 0; e < ch_data->bs_num_env; e++) {
1406 #if USE_FIXED
1407  const SoftFloat recip_env_size = av_int2sf(0x20000000 / (ch_data->t_env[e + 1] - ch_data->t_env[e]), 30);
1408 #else
1409  const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]);
1410 #endif /* USE_FIXED */
1411  int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1412  int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1413 
1414  for (m = 0; m < sbr->m[1]; m++) {
1415  AAC_FLOAT sum = sbr->dsp.sum_square(X_high[m+kx1] + ilb, iub - ilb);
1416 #if USE_FIXED
1417  e_curr[e][m] = av_mul_sf(sum, recip_env_size);
1418 #else
1419  e_curr[e][m] = sum * recip_env_size;
1420 #endif /* USE_FIXED */
1421  }
1422  }
1423  } else {
1424  int k, p;
1425 
1426  for (e = 0; e < ch_data->bs_num_env; e++) {
1427  const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]);
1428  int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1429  int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET;
1430  const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow;
1431 
1432  for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) {
1433 #if USE_FIXED
1434  SoftFloat sum = FLOAT_0;
1435  const SoftFloat den = av_int2sf(0x20000000 / (env_size * (table[p + 1] - table[p])), 29);
1436  for (k = table[p]; k < table[p + 1]; k++) {
1437  sum = av_add_sf(sum, sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb));
1438  }
1439  sum = av_mul_sf(sum, den);
1440 #else
1441  float sum = 0.0f;
1442  const int den = env_size * (table[p + 1] - table[p]);
1443 
1444  for (k = table[p]; k < table[p + 1]; k++) {
1445  sum += sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb);
1446  }
1447  sum /= den;
1448 #endif /* USE_FIXED */
1449  for (k = table[p]; k < table[p + 1]; k++) {
1450  e_curr[e][k - kx1] = sum;
1451  }
1452  }
1453  }
1454  }
1455 }
1456 
1458  INTFLOAT* L, INTFLOAT* R)
1459 {
1460  int downsampled = ac->oc[1].m4ac.ext_sample_rate < sbr->sample_rate;
1461  int ch;
1462  int nch = (id_aac == TYPE_CPE) ? 2 : 1;
1463  int err;
1464 
1465  if (id_aac != sbr->id_aac) {
1466  av_log(ac->avctx, id_aac == TYPE_LFE ? AV_LOG_VERBOSE : AV_LOG_WARNING,
1467  "element type mismatch %d != %d\n", id_aac, sbr->id_aac);
1468  sbr_turnoff(sbr);
1469  }
1470 
1471  if (sbr->start && !sbr->ready_for_dequant) {
1472  av_log(ac->avctx, AV_LOG_ERROR,
1473  "No quantized data read for sbr_dequant.\n");
1474  sbr_turnoff(sbr);
1475  }
1476 
1477  if (!sbr->kx_and_m_pushed) {
1478  sbr->kx[0] = sbr->kx[1];
1479  sbr->m[0] = sbr->m[1];
1480  } else {
1481  sbr->kx_and_m_pushed = 0;
1482  }
1483 
1484  if (sbr->start) {
1485  sbr_dequant(sbr, id_aac);
1486  sbr->ready_for_dequant = 0;
1487  }
1488  for (ch = 0; ch < nch; ch++) {
1489  /* decode channel */
1490  sbr_qmf_analysis(ac->fdsp, sbr->mdct_ana, sbr->mdct_ana_fn, &sbr->dsp,
1491  ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
1492  (INTFLOAT*)sbr->qmf_filter_scratch,
1493  sbr->data[ch].W, sbr->data[ch].Ypos);
1494  sbr->c.sbr_lf_gen(ac, sbr, sbr->X_low,
1495  (const INTFLOAT (*)[32][32][2]) sbr->data[ch].W,
1496  sbr->data[ch].Ypos);
1497  sbr->data[ch].Ypos ^= 1;
1498  if (sbr->start) {
1499  sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1,
1500  (const INTFLOAT (*)[40][2]) sbr->X_low, sbr->k[0]);
1501  sbr_chirp(sbr, &sbr->data[ch]);
1502  av_assert0(sbr->data[ch].bs_num_env > 0);
1503  sbr_hf_gen(ac, sbr, sbr->X_high,
1504  (const INTFLOAT (*)[40][2]) sbr->X_low,
1505  (const INTFLOAT (*)[2]) sbr->alpha0,
1506  (const INTFLOAT (*)[2]) sbr->alpha1,
1507  sbr->data[ch].bw_array, sbr->data[ch].t_env,
1508  sbr->data[ch].bs_num_env);
1509 
1510  // hf_adj
1511  err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a);
1512  if (!err) {
1513  sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]);
1514  sbr_gain_calc(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a);
1515  sbr->c.sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos],
1516  (const INTFLOAT (*)[40][2]) sbr->X_high,
1517  sbr, &sbr->data[ch],
1518  sbr->data[ch].e_a);
1519  }
1520  }
1521 
1522  /* synthesis */
1523  sbr->c.sbr_x_gen(sbr, sbr->X[ch],
1524  (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[1-sbr->data[ch].Ypos],
1525  (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[ sbr->data[ch].Ypos],
1526  (const INTFLOAT (*)[40][2]) sbr->X_low, ch);
1527  }
1528 
1529  if (ac->oc[1].m4ac.ps == 1) {
1530  if (sbr->ps.common.start) {
1531  AAC_RENAME(ff_ps_apply)(&sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]);
1532  } else {
1533  memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0]));
1534  }
1535  nch = 2;
1536  }
1537 
1538  sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp,
1539  L, sbr->X[0], sbr->qmf_filter_scratch,
1540  sbr->data[0].synthesis_filterbank_samples,
1541  &sbr->data[0].synthesis_filterbank_samples_offset,
1542  downsampled);
1543  if (nch == 2)
1544  sbr_qmf_synthesis(sbr->mdct, sbr->mdct_fn, &sbr->dsp, ac->fdsp,
1545  R, sbr->X[1], sbr->qmf_filter_scratch,
1546  sbr->data[1].synthesis_filterbank_samples,
1547  &sbr->data[1].synthesis_filterbank_samples_offset,
1548  downsampled);
1549 }
1550 
1552 {
1553  c->sbr_lf_gen = sbr_lf_gen;
1554  c->sbr_hf_assemble = sbr_hf_assemble;
1555  c->sbr_x_gen = sbr_x_gen;
1556  c->sbr_hf_inverse_filter = sbr_hf_inverse_filter;
1557 
1558 #if !USE_FIXED
1559 #if ARCH_MIPS
1561 #endif
1562 #endif
1563 }
SBRDSPContext::hf_gen
void(* hf_gen)(INTFLOAT(*X_high)[2], const INTFLOAT(*X_low)[2], const INTFLOAT alpha0[2], const INTFLOAT alpha1[2], INTFLOAT bw, int start, int end)
Definition: sbrdsp.h:36
sbr_reset
static void sbr_reset(AACContext *ac, SpectralBandReplication *sbr)
Definition: aacsbr_template.c:1070
SpectralBandReplication::bs_coupling
unsigned bs_coupling
Definition: sbr.h:159
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:278
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
T_HUFFMAN_ENV_BAL_1_5DB
@ T_HUFFMAN_ENV_BAL_1_5DB
Definition: aacsbr.h:45
ff_aac_sbr_init
av_cold void AAC_RENAME() ff_aac_sbr_init(void)
Initialize SBR.
Definition: aacsbr_template.c:46
SpectralBandReplication::data
SBRData data[2]
Definition: sbr.h:169
SpectralBandReplication::bs_limiter_gains
unsigned bs_limiter_gains
Definition: sbr.h:155
Q23
#define Q23(x)
Definition: aac_defines.h:90
SBRDSPContext
Definition: sbrdsp.h:27
out
FILE * out
Definition: movenc.c:54
elements
static const ElemCat * elements[ELEMENT_COUNT]
Definition: signature.h:566
SpectralBandReplication::e_origmapped
AAC_FLOAT e_origmapped[7][48]
Dequantized envelope scalefactors, remapped.
Definition: sbr.h:201
log2f
#define log2f(x)
Definition: libm.h:409
SBRData::env_facs
AAC_FLOAT env_facs[6][48]
Definition: sbr.h:103
sbr_chirp
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data)
Chirp Factors (14496-3 sp04 p214)
Definition: aacsbr.c:193
AVTXContext
Definition: tx_priv.h:235
sbr_hf_calc_npatches
static int sbr_hf_calc_npatches(AACContext *ac, SpectralBandReplication *sbr)
High Frequency Generation - Patch Construction (14496-3 sp04 p216 fig. 4.46)
Definition: aacsbr_template.c:475
ff_aac_sbr_ctx_close
av_cold void AAC_RENAME() ff_aac_sbr_ctx_close(SpectralBandReplication *sbr)
Close one SBR context.
Definition: aacsbr_template.c:103
AVFloatDSPContext::vector_fmul_reverse
void(* vector_fmul_reverse)(float *dst, const float *src0, const float *src1, int len)
Calculate the entry wise product of two vectors of floats, and store the result in a vector of floats...
Definition: float_dsp.h:154
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:266
ff_ps_apply
int AAC_RENAME() ff_ps_apply(PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top)
Definition: aacps.c:719
sbr_hf_inverse_filter
static void sbr_hf_inverse_filter(SBRDSPContext *dsp, float(*alpha0)[2], float(*alpha1)[2], const float 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.c:138
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
ff_ps_read_data
int ff_ps_read_data(void *logctx, GetBitContext *gb, PSCommonContext *ps, int bits_left)
Definition: aacps_common.c:122
SpectralBandReplication::m
AAC_SIGNE m[2]
M' and M respectively, M is the number of QMF subbands that use SBR.
Definition: sbr.h:165
aacdectab.h
b
#define b
Definition: input.c:41
table
static const uint16_t table[]
Definition: prosumer.c:205
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
SpectrumParameters::bs_alter_scale
uint8_t bs_alter_scale
Definition: sbr.h:55
R
#define R
Definition: huffyuv.h:44
VARVAR
@ VARVAR
Definition: aacsbr.h:62
copy_sbr_grid
static void copy_sbr_grid(SBRData *dst, const SBRData *src)
Definition: aacsbr_template.c:765
SpectrumParameters::bs_start_freq
uint8_t bs_start_freq
Definition: sbr.h:46
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
ff_ps_init
av_cold void AAC_RENAME() ff_ps_init(void)
Definition: aacps.c:740
AVFixedDSPContext
Definition: fixed_dsp.h:56
SBRData::t_env
uint8_t t_env[8]
Envelope time borders.
Definition: sbr.h:108
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
qsort_comparison_function_int16
static int qsort_comparison_function_int16(const void *a, const void *b)
Definition: aacsbr_template.c:109
read_sbr_envelope
static int read_sbr_envelope(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, SBRData *ch_data, int ch)
Definition: aacsbr_template.c:801
AACContext::warned_he_aac_mono
int warned_he_aac_mono
Definition: aac.h:374
W
@ W
Definition: vf_addroi.c:27
av_tx_init
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
Definition: tx.c:901
sbr_qmf_analysis
static void sbr_qmf_analysis(AVFloatDSPContext *dsp, AVTXContext *mdct, av_tx_fn mdct_fn, SBRDSPContext *sbrdsp, const INTFLOAT *in, INTFLOAT *x, INTFLOAT z[320], INTFLOAT W[2][32][32][2], int buf_idx)
Analysis QMF Bank (14496-3 sp04 p206)
Definition: aacsbr_template.c:1148
SpectralBandReplication::ready_for_dequant
int ready_for_dequant
Definition: sbr.h:145
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:381
SBRData::e_a
int e_a[2]
l_APrev and l_A
Definition: sbr.h:90
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
SpectralBandReplication::bs_interpol_freq
unsigned bs_interpol_freq
Definition: sbr.h:156
v0
#define v0
Definition: regdef.h:26
SpectralBandReplication::n_master
AAC_SIGNE n_master
The number of frequency bands in f_master.
Definition: sbr.h:168
TYPE_CPE
@ TYPE_CPE
Definition: aac.h:56
GetBitContext
Definition: get_bits.h:108
SBRData::bs_add_harmonic_flag
unsigned bs_add_harmonic_flag
Definition: sbr.h:71
SpectralBandReplication::reset
int reset
Definition: sbr.h:147
read_sbr_channel_pair_element
static int read_sbr_channel_pair_element(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb)
Definition: aacsbr_template.c:974
scale
static av_always_inline float scale(float x, float s)
Definition: vf_v360.c:1389
PSContext::common
PSCommonContext common
Definition: aacps.h:72
SBRData::noise_facs
AAC_FLOAT noise_facs[3][5]
Definition: sbr.h:106
sbr_hf_assemble
static void sbr_hf_assemble(float Y1[38][64][2], const float X_high[64][40][2], SpectralBandReplication *sbr, SBRData *ch_data, const int e_a[2])
Assembling HF Signals (14496-3 sp04 p220)
Definition: aacsbr.c:274
sbr_qmf_window_ds
static INTFLOAT sbr_qmf_window_ds[320]
Definition: aacsbrdata.h:45
USE_FIXED
#define USE_FIXED
Definition: aac_defines.h:25
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
SpectrumParameters::bs_stop_freq
uint8_t bs_stop_freq
Definition: sbr.h:47
av_cold
#define av_cold
Definition: attributes.h:90
av_tx_fn
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition: tx.h:151
AV_TX_FLOAT_MDCT
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respecively.
Definition: tx.h:68
SBRData::bs_df_noise
uint8_t bs_df_noise[2]
Definition: sbr.h:76
AV_TX_INT32_MDCT
@ AV_TX_INT32_MDCT
Definition: tx.h:70
g
const char * g
Definition: vf_curves.c:127
T_HUFFMAN_ENV_3_0DB
@ T_HUFFMAN_ENV_3_0DB
Definition: aacsbr.h:47
SBRData::bs_num_noise
AAC_SIGNE bs_num_noise
Definition: sbr.h:74
bits
uint8_t bits
Definition: vp3data.h:128
read_sbr_header
static unsigned int read_sbr_header(SpectralBandReplication *sbr, GetBitContext *gb)
Definition: aacsbr_template.c:175
sbr_make_f_derived
static int sbr_make_f_derived(AACContext *ac, SpectralBandReplication *sbr)
Derived Frequency Band Tables (14496-3 sp04 p197)
Definition: aacsbr_template.c:533
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
sbr_offset
static const int8_t sbr_offset[6][16]
window coefficients for analysis/synthesis QMF banks
Definition: aacsbrdata.h:35
SpectrumParameters::bs_xover_band
uint8_t bs_xover_band
Definition: sbr.h:48
SpectralBandReplication::f_tablenoise
uint16_t f_tablenoise[6]
Frequency borders for noise floors.
Definition: sbr.h:184
if
if(ret)
Definition: filter_design.txt:179
ff_sbr_apply
void AAC_RENAME() ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac, INTFLOAT *L, INTFLOAT *R)
Apply one SBR element to one AAC element.
Definition: aacsbr_template.c:1457
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
T_HUFFMAN_NOISE_3_0DB
@ T_HUFFMAN_NOISE_3_0DB
Definition: aacsbr.h:51
SpectralBandReplication::f_tablelow
uint16_t f_tablelow[25]
Frequency borders for low resolution SBR.
Definition: sbr.h:180
FLOAT_0
static const SoftFloat FLOAT_0
0.0
Definition: softfloat.h:39
SBRData::f_indexnoise
unsigned f_indexnoise
Definition: sbr.h:113
SBRData::bs_df_env
uint8_t bs_df_env[5]
Definition: sbr.h:75
read_sbr_single_channel_element
static int read_sbr_single_channel_element(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb)
Definition: aacsbr_template.c:950
check_n_master
static int check_n_master(AVCodecContext *avctx, int n_master, int bs_xover_band)
Definition: aacsbr_template.c:238
SpectrumParameters::bs_freq_scale
uint8_t bs_freq_scale
Definition: sbr.h:54
SpectralBandReplication::f_tablelim
uint16_t f_tablelim[30]
Frequency borders for the limiter.
Definition: sbr.h:186
sbr_make_f_master
static int sbr_make_f_master(AACContext *ac, SpectralBandReplication *sbr, SpectrumParameters *spectrum)
Master Frequency Band Table (14496-3 sp04 p194)
Definition: aacsbr_template.c:255
SBRData::bs_add_harmonic
uint8_t bs_add_harmonic[48]
Definition: sbr.h:78
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:388
AACSBRContext
aacsbr functions pointers
Definition: sbr.h:123
fixed_log
static int fixed_log(int x)
Definition: aacsbr_fixed.c:84
sbr_mapping
static int sbr_mapping(AACContext *ac, SpectralBandReplication *sbr, SBRData *ch_data, int e_a[2])
High Frequency Adjustment (14496-3 sp04 p217) and Mapping (14496-3 sp04 p217)
Definition: aacsbr_template.c:1343
SBR_SYNTHESIS_BUF_SIZE
#define SBR_SYNTHESIS_BUF_SIZE
Definition: sbr.h:60
ff_decode_sbr_extension
int AAC_RENAME() ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb_host, int crc, int cnt, int id_aac)
Decode Spectral Band Replication extension data; reference: table 4.55.
Definition: aacsbr_template.c:1091
ff_aac_sbr_ctx_init
av_cold int AAC_RENAME() ff_aac_sbr_ctx_init(AACContext *ac, SpectralBandReplication *sbr, int id_aac)
Initialize one SBR context.
Definition: aacsbr_template.c:65
make_bands
static void make_bands(int16_t *bands, int start, int stop, int num_bands)
Definition: aacsbr.c:52
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
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:652
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
read_sbr_dtdf
static void read_sbr_dtdf(SpectralBandReplication *sbr, GetBitContext *gb, SBRData *ch_data)
Read how the envelope and noise floor data is delta coded.
Definition: aacsbr_template.c:783
SpectralBandReplication::bs_smoothing_mode
unsigned bs_smoothing_mode
Definition: sbr.h:157
sbr_x_gen
static int sbr_x_gen(SpectralBandReplication *sbr, INTFLOAT X[2][38][64], const INTFLOAT Y0[38][64][2], const INTFLOAT Y1[38][64][2], const INTFLOAT X_low[32][40][2], int ch)
Generate the subband filtered lowband.
Definition: aacsbr_template.c:1304
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
SpectrumParameters
Spectral Band Replication header - spectrum parameters that invoke a reset if they differ from the pr...
Definition: sbr.h:45
sbr_qmf_synthesis
static void sbr_qmf_synthesis(AVTXContext *mdct, av_tx_fn mdct_fn, SBRDSPContext *sbrdsp, AVFloatDSPContext *dsp, INTFLOAT *out, INTFLOAT X[2][38][64], INTFLOAT mdct_buf[2][64], INTFLOAT *v0, int *v_off, const unsigned int div)
Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank (14496-3 sp04 p206)
Definition: aacsbr_template.c:1192
SpectralBandReplication::f_master
uint16_t f_master[49]
The master QMF frequency grouping.
Definition: sbr.h:178
qsort.h
f
f
Definition: af_crystalizer.c:121
AACContext::avctx
AVCodecContext * avctx
Definition: aac.h:298
AVFloatDSPContext::vector_fmul
void(* vector_fmul)(float *dst, const float *src0, const float *src1, int len)
Calculate the entry wise product of two vectors of floats and store the result in a vector of floats.
Definition: float_dsp.h:38
SpectralBandReplication::sample_rate
int sample_rate
Definition: sbr.h:143
VLCElem
Definition: vlc.h:32
sbr_turnoff
static void sbr_turnoff(SpectralBandReplication *sbr)
Places SBR in pure upsampling mode.
Definition: aacsbr_template.c:54
SpectralBandReplication
Spectral Band Replication.
Definition: sbr.h:142
FIXVAR
@ FIXVAR
Definition: aacsbr.h:60
AVFloatDSPContext
Definition: float_dsp.h:24
SpectralBandReplication::bs_amp_res_header
int bs_amp_res_header
Definition: sbr.h:149
SBRData::bs_invf_mode
uint8_t bs_invf_mode[2][5]
Definition: sbr.h:77
ff_ps_ctx_init
av_cold void AAC_RENAME() ff_ps_ctx_init(PSContext *ps)
Definition: aacps.c:744
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
ff_aacsbr_func_ptr_init_mips
void ff_aacsbr_func_ptr_init_mips(AACSBRContext *c)
Definition: aacsbr_mips.c:612
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
SpectralBandReplication::patch_start_subband
uint8_t patch_start_subband[6]
Definition: sbr.h:189
FIXFIX
@ FIXFIX
Definition: aacsbr.h:59
CONST_076923
static const int CONST_076923
Definition: aacsbr_fixed.c:76
read_sbr_extension
static void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, int bs_extension_id, int *num_bits_left)
Definition: aacsbr_template.c:923
av_tx_uninit
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
Definition: tx.c:294
ff_sbrdsp_init
void AAC_RENAME() ff_sbrdsp_init(SBRDSPContext *s)
Definition: sbrdsp_template.c:78
aacsbr_func_ptr_init
static void aacsbr_func_ptr_init(AACSBRContext *c)
Definition: aacsbr_template.c:1551
SpectralBandReplication::id_aac
int id_aac
Definition: sbr.h:146
SoftFloat
Definition: softfloat.h:34
CONST_RECIP_LN2
static const int CONST_RECIP_LN2
Definition: aacsbr_fixed.c:75
lrintf
#define lrintf(x)
Definition: libm_mips.h:72
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:245
ceil_log2
static const int8_t ceil_log2[]
ceil(log2(index+1))
Definition: aacsbr_template.c:614
AV_QSORT
#define AV_QSORT(p, num, type, cmp)
Quicksort This sort is fast, and fully inplace but not stable and it is possible to construct input t...
Definition: qsort.h:33
show_bits
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:371
SBRData
Spectral Band Replication per channel data.
Definition: sbr.h:65
read_sbr_noise
static int read_sbr_noise(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, SBRData *ch_data, int ch)
Definition: aacsbr_template.c:881
SpectralBandReplication::k
AAC_SIGNE k[5]
k0, k1, k2
Definition: sbr.h:160
AVFloatDSPContext::vector_fmul_add
void(* vector_fmul_add)(float *dst, const float *src0, const float *src1, const float *src2, int len)
Calculate the entry wise product of two vectors of floats, add a third vector of floats and store the...
Definition: float_dsp.h:137
delta
float delta
Definition: vorbis_enc_data.h:430
in_table_int16
static int in_table_int16(const int16_t *table, int last_el, int16_t needle)
Definition: aacsbr_template.c:114
av_always_inline
#define av_always_inline
Definition: attributes.h:49
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
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
TYPE_LFE
@ TYPE_LFE
Definition: aac.h:58
T_HUFFMAN_NOISE_BAL_3_0DB
@ T_HUFFMAN_NOISE_BAL_3_0DB
Definition: aacsbr.h:52
SBRData::bs_frame_class
unsigned bs_frame_class
Definition: sbr.h:70
AAC_RENAME
#define AAC_RENAME(x)
Definition: aac_defines.h:79
sbr_make_f_tablelim
static void sbr_make_f_tablelim(SpectralBandReplication *sbr)
Limiter Frequency Band Table (14496-3 sp04 p198)
Definition: aacsbr_template.c:124
EXTENSION_ID_PS
@ EXTENSION_ID_PS
Definition: aacsbr.h:66
T_HUFFMAN_ENV_BAL_3_0DB
@ T_HUFFMAN_ENV_BAL_3_0DB
Definition: aacsbr.h:49
TYPE_SCE
@ TYPE_SCE
Definition: aac.h:55
AACContext::oc
OutputConfiguration oc[2]
Definition: aac.h:369
F_HUFFMAN_ENV_BAL_3_0DB
@ F_HUFFMAN_ENV_BAL_3_0DB
Definition: aacsbr.h:50
VARFIX
@ VARFIX
Definition: aacsbr.h:61
read_sbr_invf
static void read_sbr_invf(SpectralBandReplication *sbr, GetBitContext *gb, SBRData *ch_data)
Read inverse filtering data.
Definition: aacsbr_template.c:791
array
static int array[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:111
ret
ret
Definition: filter_design.txt:187
sbr_dequant
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
Dequantization and stereo decoding (14496-3 sp04 p203)
Definition: aacsbr.c:71
array_min_int16
static int array_min_int16(const int16_t *array, int nel)
Definition: aacsbr_template.c:230
U
#define U(x)
Definition: vpx_arith.h:37
aacsbr_tableinit
static av_cold void aacsbr_tableinit(void)
Definition: aacsbr_template.c:38
AVCodecContext
main external API structure.
Definition: avcodec.h:441
AV_PROFILE_AAC_HE_V2
#define AV_PROFILE_AAC_HE_V2
Definition: defs.h:73
read_sbr_data
static unsigned int read_sbr_data(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, int id_aac)
Definition: aacsbr_template.c:1026
MPEG4AudioConfig::ps
int ps
-1 implicit, 1 presence
Definition: mpeg4audio.h:40
sbr_env_estimate
static void sbr_env_estimate(AAC_FLOAT(*e_curr)[48], INTFLOAT X_high[64][40][2], SpectralBandReplication *sbr, SBRData *ch_data)
Estimation of current envelope (14496-3 sp04 p218)
Definition: aacsbr_template.c:1398
SBRData::t_q
uint8_t t_q[3]
Noise time borders.
Definition: sbr.h:112
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1596
SpectralBandReplication::spectrum_params
SpectrumParameters spectrum_params
Definition: sbr.h:148
av_add_sf
static av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:162
sbr_lf_gen
static int sbr_lf_gen(AACContext *ac, SpectralBandReplication *sbr, INTFLOAT X_low[32][40][2], const INTFLOAT W[2][32][32][2], int buf_idx)
Generate the subband filtered lowband.
Definition: aacsbr_template.c:1244
temp
else temp
Definition: vf_mcdeint.c:263
sbr_qmf_window_us
static const INTFLOAT sbr_qmf_window_us[640]
Definition: aacsbrdata.h:48
L
#define L(x)
Definition: vpx_arith.h:36
SpectralBandReplication::f_tablehigh
uint16_t f_tablehigh[49]
Frequency borders for high resolution SBR.
Definition: sbr.h:182
SBRData::noise_facs_q
uint8_t noise_facs_q[3][5]
Noise scalefactors.
Definition: sbr.h:105
sbr_hf_gen
static int sbr_hf_gen(AACContext *ac, SpectralBandReplication *sbr, INTFLOAT X_high[64][40][2], const INTFLOAT X_low[32][40][2], const INTFLOAT(*alpha0)[2], const INTFLOAT(*alpha1)[2], const INTFLOAT bw_array[5], const uint8_t *t_env, int bs_num_env)
High Frequency Generator (14496-3 sp04 p215)
Definition: aacsbr_template.c:1269
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.c:217
SpectralBandReplication::bs_limiter_bands
unsigned bs_limiter_bands
Definition: sbr.h:154
SpectralBandReplication::patch_num_subbands
uint8_t patch_num_subbands[6]
Definition: sbr.h:188
OutputConfiguration::m4ac
MPEG4AudioConfig m4ac
Definition: aac.h:123
TYPE_CCE
@ TYPE_CCE
Definition: aac.h:57
SpectralBandReplication::start
int start
Definition: sbr.h:144
T_HUFFMAN_ENV_1_5DB
@ T_HUFFMAN_ENV_1_5DB
Definition: aacsbr.h:43
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:36
SBRDSPContext::sum_square
AAC_FLOAT(* sum_square)(INTFLOAT(*x)[2], int n)
Definition: sbrdsp.h:29
ENVELOPE_ADJUSTMENT_OFFSET
#define ENVELOPE_ADJUSTMENT_OFFSET
Definition: aacsbr.h:36
ff_aac_sbr_vlc
const VLCElem * ff_aac_sbr_vlc[10]
Definition: aacdec_common.c:277
AAC_FLOAT
float AAC_FLOAT
Definition: aac_defines.h:86
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
SpectrumParameters::bs_noise_bands
uint8_t bs_noise_bands
Definition: sbr.h:56
AACContext
main AAC context
Definition: aac.h:296
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
X
@ X
Definition: vf_addroi.c:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
F_HUFFMAN_ENV_BAL_1_5DB
@ F_HUFFMAN_ENV_BAL_1_5DB
Definition: aacsbr.h:46
SpectralBandReplication::q_mapped
AAC_FLOAT q_mapped[7][48]
Dequantized noise scalefactors, remapped.
Definition: sbr.h:203
get_bits1_vector
static av_always_inline void get_bits1_vector(GetBitContext *gb, uint8_t *vec, int elements)
Definition: aacsbr_template.c:604
int
int
Definition: ffmpeg_filter.c:368
F_HUFFMAN_ENV_3_0DB
@ F_HUFFMAN_ENV_3_0DB
Definition: aacsbr.h:48
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
INTFLOAT
float INTFLOAT
Definition: aac_defines.h:82
F_HUFFMAN_ENV_1_5DB
@ F_HUFFMAN_ENV_1_5DB
Definition: aacsbr.h:44
SpectralBandReplication::s_mapped
uint8_t s_mapped[7][48]
Sinusoidal presence, remapped.
Definition: sbr.h:205
read_sbr_grid
static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, SBRData *ch_data)
Definition: aacsbr_template.c:618
SpectralBandReplication::ps
PSContext ps
Definition: sbr.h:170
min
float min
Definition: vorbis_enc_data.h:429
SpectralBandReplication::num_patches
AAC_SIGNE num_patches
Definition: sbr.h:187
SpectralBandReplication::dsp
SBRDSPContext dsp
Definition: sbr.h:218