FFmpeg
aacps.c
Go to the documentation of this file.
1 /*
2  * MPEG-4 Parametric Stereo decoding functions
3  * Copyright (c) 2010 Alex Converse <alex.converse@gmail.com>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  *
21  * Note: Rounding-to-nearest used unless otherwise stated
22  *
23  */
24 
25 #include <stdint.h>
26 #include "libavutil/common.h"
27 #include "libavutil/mathematics.h"
28 #include "avcodec.h"
29 #include "get_bits.h"
30 #include "aacps.h"
31 #if USE_FIXED
32 #include "aacps_fixed_tablegen.h"
33 #else
34 #include "libavutil/internal.h"
35 #include "aacps_tablegen.h"
36 #endif /* USE_FIXED */
37 #include "aacpsdata.c"
38 
39 #define PS_BASELINE 0 ///< Operate in Baseline PS mode
40  ///< Baseline implies 10 or 20 stereo bands,
41  ///< mixing mode A, and no ipd/opd
42 
43 #define numQMFSlots 32 //numTimeSlots * RATE
44 
45 static const int8_t num_env_tab[2][4] = {
46  { 0, 1, 2, 4, },
47  { 1, 2, 3, 4, },
48 };
49 
50 static const int8_t nr_iidicc_par_tab[] = {
51  10, 20, 34, 10, 20, 34,
52 };
53 
54 static const int8_t nr_iidopd_par_tab[] = {
55  5, 11, 17, 5, 11, 17,
56 };
57 
58 enum {
69 };
70 
71 static const int huff_iid[] = {
76 };
77 
78 static VLC vlc_ps[10];
79 
80 #define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION) \
81 /** \
82  * Read Inter-channel Intensity Difference/Inter-Channel Coherence/ \
83  * Inter-channel Phase Difference/Overall Phase Difference parameters from the \
84  * bitstream. \
85  * \
86  * @param avctx contains the current codec context \
87  * @param gb pointer to the input bitstream \
88  * @param ps pointer to the Parametric Stereo context \
89  * @param PAR pointer to the parameter to be read \
90  * @param e envelope to decode \
91  * @param dt 1: time delta-coded, 0: frequency delta-coded \
92  */ \
93 static int read_ ## PAR ## _data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, \
94  int8_t (*PAR)[PS_MAX_NR_IIDICC], int table_idx, int e, int dt) \
95 { \
96  int b, num = ps->nr_ ## PAR ## _par; \
97  VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table; \
98  if (dt) { \
99  int e_prev = e ? e - 1 : ps->num_env_old - 1; \
100  e_prev = FFMAX(e_prev, 0); \
101  for (b = 0; b < num; b++) { \
102  int val = PAR[e_prev][b] + get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \
103  if (MASK) val &= MASK; \
104  PAR[e][b] = val; \
105  if (ERR_CONDITION) \
106  goto err; \
107  } \
108  } else { \
109  int val = 0; \
110  for (b = 0; b < num; b++) { \
111  val += get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \
112  if (MASK) val &= MASK; \
113  PAR[e][b] = val; \
114  if (ERR_CONDITION) \
115  goto err; \
116  } \
117  } \
118  return 0; \
119 err: \
120  av_log(avctx, AV_LOG_ERROR, "illegal "#PAR"\n"); \
121  return AVERROR_INVALIDDATA; \
122 }
123 
124 READ_PAR_DATA(iid, huff_offset[table_idx], 0, FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant)
125 READ_PAR_DATA(icc, huff_offset[table_idx], 0, ps->icc_par[e][b] > 7U)
126 READ_PAR_DATA(ipdopd, 0, 0x07, 0)
127 
128 static int ps_read_extension_data(GetBitContext *gb, PSContext *ps, int ps_extension_id)
129 {
130  int e;
131  int count = get_bits_count(gb);
132 
133  if (ps_extension_id)
134  return 0;
135 
136  ps->enable_ipdopd = get_bits1(gb);
137  if (ps->enable_ipdopd) {
138  for (e = 0; e < ps->num_env; e++) {
139  int dt = get_bits1(gb);
140  read_ipdopd_data(NULL, gb, ps, ps->ipd_par, dt ? huff_ipd_dt : huff_ipd_df, e, dt);
141  dt = get_bits1(gb);
142  read_ipdopd_data(NULL, gb, ps, ps->opd_par, dt ? huff_opd_dt : huff_opd_df, e, dt);
143  }
144  }
145  skip_bits1(gb); //reserved_ps
146  return get_bits_count(gb) - count;
147 }
148 
149 static void ipdopd_reset(int8_t *ipd_hist, int8_t *opd_hist)
150 {
151  int i;
152  for (i = 0; i < PS_MAX_NR_IPDOPD; i++) {
153  opd_hist[i] = 0;
154  ipd_hist[i] = 0;
155  }
156 }
157 
158 int AAC_RENAME(ff_ps_read_data)(AVCodecContext *avctx, GetBitContext *gb_host, PSContext *ps, int bits_left)
159 {
160  int e;
161  int bit_count_start = get_bits_count(gb_host);
162  int header;
163  int bits_consumed;
164  GetBitContext gbc = *gb_host, *gb = &gbc;
165 
166  header = get_bits1(gb);
167  if (header) { //enable_ps_header
168  ps->enable_iid = get_bits1(gb);
169  if (ps->enable_iid) {
170  int iid_mode = get_bits(gb, 3);
171  if (iid_mode > 5) {
172  av_log(avctx, AV_LOG_ERROR, "iid_mode %d is reserved.\n",
173  iid_mode);
174  goto err;
175  }
176  ps->nr_iid_par = nr_iidicc_par_tab[iid_mode];
177  ps->iid_quant = iid_mode > 2;
178  ps->nr_ipdopd_par = nr_iidopd_par_tab[iid_mode];
179  }
180  ps->enable_icc = get_bits1(gb);
181  if (ps->enable_icc) {
182  ps->icc_mode = get_bits(gb, 3);
183  if (ps->icc_mode > 5) {
184  av_log(avctx, AV_LOG_ERROR, "icc_mode %d is reserved.\n",
185  ps->icc_mode);
186  goto err;
187  }
188  ps->nr_icc_par = nr_iidicc_par_tab[ps->icc_mode];
189  }
190  ps->enable_ext = get_bits1(gb);
191  }
192 
193  ps->frame_class = get_bits1(gb);
194  ps->num_env_old = ps->num_env;
195  ps->num_env = num_env_tab[ps->frame_class][get_bits(gb, 2)];
196 
197  ps->border_position[0] = -1;
198  if (ps->frame_class) {
199  for (e = 1; e <= ps->num_env; e++) {
200  ps->border_position[e] = get_bits(gb, 5);
201  if (ps->border_position[e] < ps->border_position[e-1]) {
202  av_log(avctx, AV_LOG_ERROR, "border_position non monotone.\n");
203  goto err;
204  }
205  }
206  } else
207  for (e = 1; e <= ps->num_env; e++)
208  ps->border_position[e] = (e * numQMFSlots >> ff_log2_tab[ps->num_env]) - 1;
209 
210  if (ps->enable_iid) {
211  for (e = 0; e < ps->num_env; e++) {
212  int dt = get_bits1(gb);
213  if (read_iid_data(avctx, gb, ps, ps->iid_par, huff_iid[2*dt+ps->iid_quant], e, dt))
214  goto err;
215  }
216  } else
217  memset(ps->iid_par, 0, sizeof(ps->iid_par));
218 
219  if (ps->enable_icc)
220  for (e = 0; e < ps->num_env; e++) {
221  int dt = get_bits1(gb);
222  if (read_icc_data(avctx, gb, ps, ps->icc_par, dt ? huff_icc_dt : huff_icc_df, e, dt))
223  goto err;
224  }
225  else
226  memset(ps->icc_par, 0, sizeof(ps->icc_par));
227 
228  if (ps->enable_ext) {
229  int cnt = get_bits(gb, 4);
230  if (cnt == 15) {
231  cnt += get_bits(gb, 8);
232  }
233  cnt *= 8;
234  while (cnt > 7) {
235  int ps_extension_id = get_bits(gb, 2);
236  cnt -= 2 + ps_read_extension_data(gb, ps, ps_extension_id);
237  }
238  if (cnt < 0) {
239  av_log(avctx, AV_LOG_ERROR, "ps extension overflow %d\n", cnt);
240  goto err;
241  }
242  skip_bits(gb, cnt);
243  }
244 
245  ps->enable_ipdopd &= !PS_BASELINE;
246 
247  //Fix up envelopes
248  if (!ps->num_env || ps->border_position[ps->num_env] < numQMFSlots - 1) {
249  //Create a fake envelope
250  int source = ps->num_env ? ps->num_env - 1 : ps->num_env_old - 1;
251  int b;
252  if (source >= 0 && source != ps->num_env) {
253  if (ps->enable_iid) {
254  memcpy(ps->iid_par+ps->num_env, ps->iid_par+source, sizeof(ps->iid_par[0]));
255  }
256  if (ps->enable_icc) {
257  memcpy(ps->icc_par+ps->num_env, ps->icc_par+source, sizeof(ps->icc_par[0]));
258  }
259  if (ps->enable_ipdopd) {
260  memcpy(ps->ipd_par+ps->num_env, ps->ipd_par+source, sizeof(ps->ipd_par[0]));
261  memcpy(ps->opd_par+ps->num_env, ps->opd_par+source, sizeof(ps->opd_par[0]));
262  }
263  }
264  if (ps->enable_iid){
265  for (b = 0; b < ps->nr_iid_par; b++) {
266  if (FFABS(ps->iid_par[ps->num_env][b]) > 7 + 8 * ps->iid_quant) {
267  av_log(avctx, AV_LOG_ERROR, "iid_par invalid\n");
268  goto err;
269  }
270  }
271  }
272  if (ps->enable_icc){
273  for (b = 0; b < ps->nr_iid_par; b++) {
274  if (ps->icc_par[ps->num_env][b] > 7U) {
275  av_log(avctx, AV_LOG_ERROR, "icc_par invalid\n");
276  goto err;
277  }
278  }
279  }
280  ps->num_env++;
281  ps->border_position[ps->num_env] = numQMFSlots - 1;
282  }
283 
284 
285  ps->is34bands_old = ps->is34bands;
286  if (!PS_BASELINE && (ps->enable_iid || ps->enable_icc))
287  ps->is34bands = (ps->enable_iid && ps->nr_iid_par == 34) ||
288  (ps->enable_icc && ps->nr_icc_par == 34);
289 
290  //Baseline
291  if (!ps->enable_ipdopd) {
292  memset(ps->ipd_par, 0, sizeof(ps->ipd_par));
293  memset(ps->opd_par, 0, sizeof(ps->opd_par));
294  }
295 
296  if (header)
297  ps->start = 1;
298 
299  bits_consumed = get_bits_count(gb) - bit_count_start;
300  if (bits_consumed <= bits_left) {
301  skip_bits_long(gb_host, bits_consumed);
302  return bits_consumed;
303  }
304  av_log(avctx, AV_LOG_ERROR, "Expected to read %d PS bits actually read %d.\n", bits_left, bits_consumed);
305 err:
306  ps->start = 0;
307  skip_bits_long(gb_host, bits_left);
308  memset(ps->iid_par, 0, sizeof(ps->iid_par));
309  memset(ps->icc_par, 0, sizeof(ps->icc_par));
310  memset(ps->ipd_par, 0, sizeof(ps->ipd_par));
311  memset(ps->opd_par, 0, sizeof(ps->opd_par));
312  return bits_left;
313 }
314 
315 /** Split one subband into 2 subsubbands with a symmetric real filter.
316  * The filter must have its non-center even coefficients equal to zero. */
317 static void hybrid2_re(INTFLOAT (*in)[2], INTFLOAT (*out)[32][2], const INTFLOAT filter[8], int len, int reverse)
318 {
319  int i, j;
320  for (i = 0; i < len; i++, in++) {
321  INT64FLOAT re_in = AAC_MUL31(filter[6], in[6][0]); //real inphase
322  INT64FLOAT re_op = 0.0f; //real out of phase
323  INT64FLOAT im_in = AAC_MUL31(filter[6], in[6][1]); //imag inphase
324  INT64FLOAT im_op = 0.0f; //imag out of phase
325  for (j = 0; j < 6; j += 2) {
326  re_op += (INT64FLOAT)filter[j+1] * (in[j+1][0] + in[12-j-1][0]);
327  im_op += (INT64FLOAT)filter[j+1] * (in[j+1][1] + in[12-j-1][1]);
328  }
329 
330 #if USE_FIXED
331  re_op = (re_op + 0x40000000) >> 31;
332  im_op = (im_op + 0x40000000) >> 31;
333 #endif /* USE_FIXED */
334 
335  out[ reverse][i][0] = (INTFLOAT)(re_in + re_op);
336  out[ reverse][i][1] = (INTFLOAT)(im_in + im_op);
337  out[!reverse][i][0] = (INTFLOAT)(re_in - re_op);
338  out[!reverse][i][1] = (INTFLOAT)(im_in - im_op);
339  }
340 }
341 
342 /** Split one subband into 6 subsubbands with a complex filter */
343 static void hybrid6_cx(PSDSPContext *dsp, INTFLOAT (*in)[2], INTFLOAT (*out)[32][2],
344  TABLE_CONST INTFLOAT (*filter)[8][2], int len)
345 {
346  int i;
347  int N = 8;
348  LOCAL_ALIGNED_16(INTFLOAT, temp, [8], [2]);
349 
350  for (i = 0; i < len; i++, in++) {
351  dsp->hybrid_analysis(temp, in, (const INTFLOAT (*)[8][2]) filter, 1, N);
352  out[0][i][0] = temp[6][0];
353  out[0][i][1] = temp[6][1];
354  out[1][i][0] = temp[7][0];
355  out[1][i][1] = temp[7][1];
356  out[2][i][0] = temp[0][0];
357  out[2][i][1] = temp[0][1];
358  out[3][i][0] = temp[1][0];
359  out[3][i][1] = temp[1][1];
360  out[4][i][0] = temp[2][0] + temp[5][0];
361  out[4][i][1] = temp[2][1] + temp[5][1];
362  out[5][i][0] = temp[3][0] + temp[4][0];
363  out[5][i][1] = temp[3][1] + temp[4][1];
364  }
365 }
366 
367 static void hybrid4_8_12_cx(PSDSPContext *dsp,
368  INTFLOAT (*in)[2], INTFLOAT (*out)[32][2],
369  TABLE_CONST INTFLOAT (*filter)[8][2], int N, int len)
370 {
371  int i;
372 
373  for (i = 0; i < len; i++, in++) {
374  dsp->hybrid_analysis(out[0] + i, in, (const INTFLOAT (*)[8][2]) filter, 32, N);
375  }
376 }
377 
378 static void hybrid_analysis(PSDSPContext *dsp, INTFLOAT out[91][32][2],
379  INTFLOAT in[5][44][2], INTFLOAT L[2][38][64],
380  int is34, int len)
381 {
382  int i, j;
383  for (i = 0; i < 5; i++) {
384  for (j = 0; j < 38; j++) {
385  in[i][j+6][0] = L[0][j][i];
386  in[i][j+6][1] = L[1][j][i];
387  }
388  }
389  if (is34) {
390  hybrid4_8_12_cx(dsp, in[0], out, f34_0_12, 12, len);
391  hybrid4_8_12_cx(dsp, in[1], out+12, f34_1_8, 8, len);
392  hybrid4_8_12_cx(dsp, in[2], out+20, f34_2_4, 4, len);
393  hybrid4_8_12_cx(dsp, in[3], out+24, f34_2_4, 4, len);
394  hybrid4_8_12_cx(dsp, in[4], out+28, f34_2_4, 4, len);
395  dsp->hybrid_analysis_ileave(out + 27, L, 5, len);
396  } else {
397  hybrid6_cx(dsp, in[0], out, f20_0_8, len);
398  hybrid2_re(in[1], out+6, g1_Q2, len, 1);
399  hybrid2_re(in[2], out+8, g1_Q2, len, 0);
400  dsp->hybrid_analysis_ileave(out + 7, L, 3, len);
401  }
402  //update in_buf
403  for (i = 0; i < 5; i++) {
404  memcpy(in[i], in[i]+32, 6 * sizeof(in[i][0]));
405  }
406 }
407 
408 static void hybrid_synthesis(PSDSPContext *dsp, INTFLOAT out[2][38][64],
409  INTFLOAT in[91][32][2], int is34, int len)
410 {
411  int i, n;
412  if (is34) {
413  for (n = 0; n < len; n++) {
414  memset(out[0][n], 0, 5*sizeof(out[0][n][0]));
415  memset(out[1][n], 0, 5*sizeof(out[1][n][0]));
416  for (i = 0; i < 12; i++) {
417  out[0][n][0] += (UINTFLOAT)in[ i][n][0];
418  out[1][n][0] += (UINTFLOAT)in[ i][n][1];
419  }
420  for (i = 0; i < 8; i++) {
421  out[0][n][1] += (UINTFLOAT)in[12+i][n][0];
422  out[1][n][1] += (UINTFLOAT)in[12+i][n][1];
423  }
424  for (i = 0; i < 4; i++) {
425  out[0][n][2] += (UINTFLOAT)in[20+i][n][0];
426  out[1][n][2] += (UINTFLOAT)in[20+i][n][1];
427  out[0][n][3] += (UINTFLOAT)in[24+i][n][0];
428  out[1][n][3] += (UINTFLOAT)in[24+i][n][1];
429  out[0][n][4] += (UINTFLOAT)in[28+i][n][0];
430  out[1][n][4] += (UINTFLOAT)in[28+i][n][1];
431  }
432  }
433  dsp->hybrid_synthesis_deint(out, in + 27, 5, len);
434  } else {
435  for (n = 0; n < len; n++) {
436  out[0][n][0] = (UINTFLOAT)in[0][n][0] + in[1][n][0] + in[2][n][0] +
437  (UINTFLOAT)in[3][n][0] + in[4][n][0] + in[5][n][0];
438  out[1][n][0] = (UINTFLOAT)in[0][n][1] + in[1][n][1] + in[2][n][1] +
439  (UINTFLOAT)in[3][n][1] + in[4][n][1] + in[5][n][1];
440  out[0][n][1] = (UINTFLOAT)in[6][n][0] + in[7][n][0];
441  out[1][n][1] = (UINTFLOAT)in[6][n][1] + in[7][n][1];
442  out[0][n][2] = (UINTFLOAT)in[8][n][0] + in[9][n][0];
443  out[1][n][2] = (UINTFLOAT)in[8][n][1] + in[9][n][1];
444  }
445  dsp->hybrid_synthesis_deint(out, in + 7, 3, len);
446  }
447 }
448 
449 /// All-pass filter decay slope
450 #define DECAY_SLOPE Q30(0.05f)
451 /// Number of frequency bands that can be addressed by the parameter index, b(k)
452 static const int NR_PAR_BANDS[] = { 20, 34 };
453 static const int NR_IPDOPD_BANDS[] = { 11, 17 };
454 /// Number of frequency bands that can be addressed by the sub subband index, k
455 static const int NR_BANDS[] = { 71, 91 };
456 /// Start frequency band for the all-pass filter decay slope
457 static const int DECAY_CUTOFF[] = { 10, 32 };
458 /// Number of all-pass filer bands
459 static const int NR_ALLPASS_BANDS[] = { 30, 50 };
460 /// First stereo band using the short one sample delay
461 static const int SHORT_DELAY_BAND[] = { 42, 62 };
462 
463 /** Table 8.46 */
464 static void map_idx_10_to_20(int8_t *par_mapped, const int8_t *par, int full)
465 {
466  int b;
467  if (full)
468  b = 9;
469  else {
470  b = 4;
471  par_mapped[10] = 0;
472  }
473  for (; b >= 0; b--) {
474  par_mapped[2*b+1] = par_mapped[2*b] = par[b];
475  }
476 }
477 
478 static void map_idx_34_to_20(int8_t *par_mapped, const int8_t *par, int full)
479 {
480  par_mapped[ 0] = (2*par[ 0] + par[ 1]) / 3;
481  par_mapped[ 1] = ( par[ 1] + 2*par[ 2]) / 3;
482  par_mapped[ 2] = (2*par[ 3] + par[ 4]) / 3;
483  par_mapped[ 3] = ( par[ 4] + 2*par[ 5]) / 3;
484  par_mapped[ 4] = ( par[ 6] + par[ 7]) / 2;
485  par_mapped[ 5] = ( par[ 8] + par[ 9]) / 2;
486  par_mapped[ 6] = par[10];
487  par_mapped[ 7] = par[11];
488  par_mapped[ 8] = ( par[12] + par[13]) / 2;
489  par_mapped[ 9] = ( par[14] + par[15]) / 2;
490  par_mapped[10] = par[16];
491  if (full) {
492  par_mapped[11] = par[17];
493  par_mapped[12] = par[18];
494  par_mapped[13] = par[19];
495  par_mapped[14] = ( par[20] + par[21]) / 2;
496  par_mapped[15] = ( par[22] + par[23]) / 2;
497  par_mapped[16] = ( par[24] + par[25]) / 2;
498  par_mapped[17] = ( par[26] + par[27]) / 2;
499  par_mapped[18] = ( par[28] + par[29] + par[30] + par[31]) / 4;
500  par_mapped[19] = ( par[32] + par[33]) / 2;
501  }
502 }
503 
505 {
506 #if USE_FIXED
507  par[ 0] = (int)(((int64_t)(par[ 0] + (unsigned)(par[ 1]>>1)) * 1431655765 + \
508  0x40000000) >> 31);
509  par[ 1] = (int)(((int64_t)((par[ 1]>>1) + (unsigned)par[ 2]) * 1431655765 + \
510  0x40000000) >> 31);
511  par[ 2] = (int)(((int64_t)(par[ 3] + (unsigned)(par[ 4]>>1)) * 1431655765 + \
512  0x40000000) >> 31);
513  par[ 3] = (int)(((int64_t)((par[ 4]>>1) + (unsigned)par[ 5]) * 1431655765 + \
514  0x40000000) >> 31);
515 #else
516  par[ 0] = (2*par[ 0] + par[ 1]) * 0.33333333f;
517  par[ 1] = ( par[ 1] + 2*par[ 2]) * 0.33333333f;
518  par[ 2] = (2*par[ 3] + par[ 4]) * 0.33333333f;
519  par[ 3] = ( par[ 4] + 2*par[ 5]) * 0.33333333f;
520 #endif /* USE_FIXED */
521  par[ 4] = AAC_HALF_SUM(par[ 6], par[ 7]);
522  par[ 5] = AAC_HALF_SUM(par[ 8], par[ 9]);
523  par[ 6] = par[10];
524  par[ 7] = par[11];
525  par[ 8] = AAC_HALF_SUM(par[12], par[13]);
526  par[ 9] = AAC_HALF_SUM(par[14], par[15]);
527  par[10] = par[16];
528  par[11] = par[17];
529  par[12] = par[18];
530  par[13] = par[19];
531  par[14] = AAC_HALF_SUM(par[20], par[21]);
532  par[15] = AAC_HALF_SUM(par[22], par[23]);
533  par[16] = AAC_HALF_SUM(par[24], par[25]);
534  par[17] = AAC_HALF_SUM(par[26], par[27]);
535 #if USE_FIXED
536  par[18] = (((par[28]+2)>>2) + ((par[29]+2)>>2) + ((par[30]+2)>>2) + ((par[31]+2)>>2));
537 #else
538  par[18] = ( par[28] + par[29] + par[30] + par[31]) * 0.25f;
539 #endif /* USE_FIXED */
540  par[19] = AAC_HALF_SUM(par[32], par[33]);
541 }
542 
543 static void map_idx_10_to_34(int8_t *par_mapped, const int8_t *par, int full)
544 {
545  if (full) {
546  par_mapped[33] = par[9];
547  par_mapped[32] = par[9];
548  par_mapped[31] = par[9];
549  par_mapped[30] = par[9];
550  par_mapped[29] = par[9];
551  par_mapped[28] = par[9];
552  par_mapped[27] = par[8];
553  par_mapped[26] = par[8];
554  par_mapped[25] = par[8];
555  par_mapped[24] = par[8];
556  par_mapped[23] = par[7];
557  par_mapped[22] = par[7];
558  par_mapped[21] = par[7];
559  par_mapped[20] = par[7];
560  par_mapped[19] = par[6];
561  par_mapped[18] = par[6];
562  par_mapped[17] = par[5];
563  par_mapped[16] = par[5];
564  } else {
565  par_mapped[16] = 0;
566  }
567  par_mapped[15] = par[4];
568  par_mapped[14] = par[4];
569  par_mapped[13] = par[4];
570  par_mapped[12] = par[4];
571  par_mapped[11] = par[3];
572  par_mapped[10] = par[3];
573  par_mapped[ 9] = par[2];
574  par_mapped[ 8] = par[2];
575  par_mapped[ 7] = par[2];
576  par_mapped[ 6] = par[2];
577  par_mapped[ 5] = par[1];
578  par_mapped[ 4] = par[1];
579  par_mapped[ 3] = par[1];
580  par_mapped[ 2] = par[0];
581  par_mapped[ 1] = par[0];
582  par_mapped[ 0] = par[0];
583 }
584 
585 static void map_idx_20_to_34(int8_t *par_mapped, const int8_t *par, int full)
586 {
587  if (full) {
588  par_mapped[33] = par[19];
589  par_mapped[32] = par[19];
590  par_mapped[31] = par[18];
591  par_mapped[30] = par[18];
592  par_mapped[29] = par[18];
593  par_mapped[28] = par[18];
594  par_mapped[27] = par[17];
595  par_mapped[26] = par[17];
596  par_mapped[25] = par[16];
597  par_mapped[24] = par[16];
598  par_mapped[23] = par[15];
599  par_mapped[22] = par[15];
600  par_mapped[21] = par[14];
601  par_mapped[20] = par[14];
602  par_mapped[19] = par[13];
603  par_mapped[18] = par[12];
604  par_mapped[17] = par[11];
605  }
606  par_mapped[16] = par[10];
607  par_mapped[15] = par[ 9];
608  par_mapped[14] = par[ 9];
609  par_mapped[13] = par[ 8];
610  par_mapped[12] = par[ 8];
611  par_mapped[11] = par[ 7];
612  par_mapped[10] = par[ 6];
613  par_mapped[ 9] = par[ 5];
614  par_mapped[ 8] = par[ 5];
615  par_mapped[ 7] = par[ 4];
616  par_mapped[ 6] = par[ 4];
617  par_mapped[ 5] = par[ 3];
618  par_mapped[ 4] = (par[ 2] + par[ 3]) / 2;
619  par_mapped[ 3] = par[ 2];
620  par_mapped[ 2] = par[ 1];
621  par_mapped[ 1] = (par[ 0] + par[ 1]) / 2;
622  par_mapped[ 0] = par[ 0];
623 }
624 
626 {
627  par[33] = par[19];
628  par[32] = par[19];
629  par[31] = par[18];
630  par[30] = par[18];
631  par[29] = par[18];
632  par[28] = par[18];
633  par[27] = par[17];
634  par[26] = par[17];
635  par[25] = par[16];
636  par[24] = par[16];
637  par[23] = par[15];
638  par[22] = par[15];
639  par[21] = par[14];
640  par[20] = par[14];
641  par[19] = par[13];
642  par[18] = par[12];
643  par[17] = par[11];
644  par[16] = par[10];
645  par[15] = par[ 9];
646  par[14] = par[ 9];
647  par[13] = par[ 8];
648  par[12] = par[ 8];
649  par[11] = par[ 7];
650  par[10] = par[ 6];
651  par[ 9] = par[ 5];
652  par[ 8] = par[ 5];
653  par[ 7] = par[ 4];
654  par[ 6] = par[ 4];
655  par[ 5] = par[ 3];
656  par[ 4] = AAC_HALF_SUM(par[ 2], par[ 3]);
657  par[ 3] = par[ 2];
658  par[ 2] = par[ 1];
659  par[ 1] = AAC_HALF_SUM(par[ 0], par[ 1]);
660 }
661 
662 static void decorrelation(PSContext *ps, INTFLOAT (*out)[32][2], const INTFLOAT (*s)[32][2], int is34)
663 {
665  LOCAL_ALIGNED_16(INTFLOAT, transient_gain, [34], [PS_QMF_TIME_SLOTS]);
666  INTFLOAT *peak_decay_nrg = ps->peak_decay_nrg;
667  INTFLOAT *power_smooth = ps->power_smooth;
668  INTFLOAT *peak_decay_diff_smooth = ps->peak_decay_diff_smooth;
669  INTFLOAT (*delay)[PS_QMF_TIME_SLOTS + PS_MAX_DELAY][2] = ps->delay;
671 #if !USE_FIXED
672  const float transient_impact = 1.5f;
673  const float a_smooth = 0.25f; ///< Smoothing coefficient
674 #endif /* USE_FIXED */
675  const int8_t *k_to_i = is34 ? k_to_i_34 : k_to_i_20;
676  int i, k, m, n;
677  int n0 = 0, nL = 32;
678  const INTFLOAT peak_decay_factor = Q31(0.76592833836465f);
679 
680  memset(power, 0, 34 * sizeof(*power));
681 
682  if (is34 != ps->is34bands_old) {
683  memset(ps->peak_decay_nrg, 0, sizeof(ps->peak_decay_nrg));
684  memset(ps->power_smooth, 0, sizeof(ps->power_smooth));
685  memset(ps->peak_decay_diff_smooth, 0, sizeof(ps->peak_decay_diff_smooth));
686  memset(ps->delay, 0, sizeof(ps->delay));
687  memset(ps->ap_delay, 0, sizeof(ps->ap_delay));
688  }
689 
690  for (k = 0; k < NR_BANDS[is34]; k++) {
691  int i = k_to_i[k];
692  ps->dsp.add_squares(power[i], s[k], nL - n0);
693  }
694 
695  //Transient detection
696 #if USE_FIXED
697  for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
698  for (n = n0; n < nL; n++) {
699  int decayed_peak;
700  decayed_peak = (int)(((int64_t)peak_decay_factor * \
701  peak_decay_nrg[i] + 0x40000000) >> 31);
702  peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
703  power_smooth[i] += (power[i][n] + 2LL - power_smooth[i]) >> 2;
704  peak_decay_diff_smooth[i] += (peak_decay_nrg[i] + 2LL - power[i][n] - \
705  peak_decay_diff_smooth[i]) >> 2;
706 
707  if (peak_decay_diff_smooth[i]) {
708  transient_gain[i][n] = FFMIN(power_smooth[i]*43691LL / peak_decay_diff_smooth[i], 1<<16);
709  } else
710  transient_gain[i][n] = 1 << 16;
711  }
712  }
713 #else
714  for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
715  for (n = n0; n < nL; n++) {
716  float decayed_peak = peak_decay_factor * peak_decay_nrg[i];
717  float denom;
718  peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
719  power_smooth[i] += a_smooth * (power[i][n] - power_smooth[i]);
720  peak_decay_diff_smooth[i] += a_smooth * (peak_decay_nrg[i] - power[i][n] - peak_decay_diff_smooth[i]);
721  denom = transient_impact * peak_decay_diff_smooth[i];
722  transient_gain[i][n] = (denom > power_smooth[i]) ?
723  power_smooth[i] / denom : 1.0f;
724  }
725  }
726 
727 #endif /* USE_FIXED */
728  //Decorrelation and transient reduction
729  // PS_AP_LINKS - 1
730  // -----
731  // | | Q_fract_allpass[k][m]*z^-link_delay[m] - a[m]*g_decay_slope[k]
732  //H[k][z] = z^-2 * phi_fract[k] * | | ----------------------------------------------------------------
733  // | | 1 - a[m]*g_decay_slope[k]*Q_fract_allpass[k][m]*z^-link_delay[m]
734  // m = 0
735  //d[k][z] (out) = transient_gain_mapped[k][z] * H[k][z] * s[k][z]
736  for (k = 0; k < NR_ALLPASS_BANDS[is34]; k++) {
737  int b = k_to_i[k];
738 #if USE_FIXED
739  int g_decay_slope;
740 
741  if (k - DECAY_CUTOFF[is34] <= 0) {
742  g_decay_slope = 1 << 30;
743  }
744  else if (k - DECAY_CUTOFF[is34] >= 20) {
745  g_decay_slope = 0;
746  }
747  else {
748  g_decay_slope = (1 << 30) - DECAY_SLOPE * (k - DECAY_CUTOFF[is34]);
749  }
750 #else
751  float g_decay_slope = 1.f - DECAY_SLOPE * (k - DECAY_CUTOFF[is34]);
752  g_decay_slope = av_clipf(g_decay_slope, 0.f, 1.f);
753 #endif /* USE_FIXED */
754  memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
755  memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
756  for (m = 0; m < PS_AP_LINKS; m++) {
757  memcpy(ap_delay[k][m], ap_delay[k][m]+numQMFSlots, 5*sizeof(ap_delay[k][m][0]));
758  }
759  ps->dsp.decorrelate(out[k], delay[k] + PS_MAX_DELAY - 2, ap_delay[k],
760  phi_fract[is34][k],
761  (const INTFLOAT (*)[2]) Q_fract_allpass[is34][k],
762  transient_gain[b], g_decay_slope, nL - n0);
763  }
764  for (; k < SHORT_DELAY_BAND[is34]; k++) {
765  int i = k_to_i[k];
766  memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
767  memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
768  //H = delay 14
769  ps->dsp.mul_pair_single(out[k], delay[k] + PS_MAX_DELAY - 14,
770  transient_gain[i], nL - n0);
771  }
772  for (; k < NR_BANDS[is34]; k++) {
773  int i = k_to_i[k];
774  memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
775  memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
776  //H = delay 1
777  ps->dsp.mul_pair_single(out[k], delay[k] + PS_MAX_DELAY - 1,
778  transient_gain[i], nL - n0);
779  }
780 }
781 
782 static void remap34(int8_t (**p_par_mapped)[PS_MAX_NR_IIDICC],
783  int8_t (*par)[PS_MAX_NR_IIDICC],
784  int num_par, int num_env, int full)
785 {
786  int8_t (*par_mapped)[PS_MAX_NR_IIDICC] = *p_par_mapped;
787  int e;
788  if (num_par == 20 || num_par == 11) {
789  for (e = 0; e < num_env; e++) {
790  map_idx_20_to_34(par_mapped[e], par[e], full);
791  }
792  } else if (num_par == 10 || num_par == 5) {
793  for (e = 0; e < num_env; e++) {
794  map_idx_10_to_34(par_mapped[e], par[e], full);
795  }
796  } else {
797  *p_par_mapped = par;
798  }
799 }
800 
801 static void remap20(int8_t (**p_par_mapped)[PS_MAX_NR_IIDICC],
802  int8_t (*par)[PS_MAX_NR_IIDICC],
803  int num_par, int num_env, int full)
804 {
805  int8_t (*par_mapped)[PS_MAX_NR_IIDICC] = *p_par_mapped;
806  int e;
807  if (num_par == 34 || num_par == 17) {
808  for (e = 0; e < num_env; e++) {
809  map_idx_34_to_20(par_mapped[e], par[e], full);
810  }
811  } else if (num_par == 10 || num_par == 5) {
812  for (e = 0; e < num_env; e++) {
813  map_idx_10_to_20(par_mapped[e], par[e], full);
814  }
815  } else {
816  *p_par_mapped = par;
817  }
818 }
819 
820 static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)[32][2], int is34)
821 {
822  int e, b, k;
823 
824  INTFLOAT (*H11)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H11;
825  INTFLOAT (*H12)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H12;
826  INTFLOAT (*H21)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H21;
827  INTFLOAT (*H22)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H22;
828  int8_t *opd_hist = ps->opd_hist;
829  int8_t *ipd_hist = ps->ipd_hist;
830  int8_t iid_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
831  int8_t icc_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
832  int8_t ipd_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
833  int8_t opd_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
834  int8_t (*iid_mapped)[PS_MAX_NR_IIDICC] = iid_mapped_buf;
835  int8_t (*icc_mapped)[PS_MAX_NR_IIDICC] = icc_mapped_buf;
836  int8_t (*ipd_mapped)[PS_MAX_NR_IIDICC] = ipd_mapped_buf;
837  int8_t (*opd_mapped)[PS_MAX_NR_IIDICC] = opd_mapped_buf;
838  const int8_t *k_to_i = is34 ? k_to_i_34 : k_to_i_20;
839  TABLE_CONST INTFLOAT (*H_LUT)[8][4] = (PS_BASELINE || ps->icc_mode < 3) ? HA : HB;
840 
841  //Remapping
842  if (ps->num_env_old) {
843  memcpy(H11[0][0], H11[0][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H11[0][0][0]));
844  memcpy(H11[1][0], H11[1][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H11[1][0][0]));
845  memcpy(H12[0][0], H12[0][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H12[0][0][0]));
846  memcpy(H12[1][0], H12[1][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H12[1][0][0]));
847  memcpy(H21[0][0], H21[0][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H21[0][0][0]));
848  memcpy(H21[1][0], H21[1][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H21[1][0][0]));
849  memcpy(H22[0][0], H22[0][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H22[0][0][0]));
850  memcpy(H22[1][0], H22[1][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H22[1][0][0]));
851  }
852 
853  if (is34) {
854  remap34(&iid_mapped, ps->iid_par, ps->nr_iid_par, ps->num_env, 1);
855  remap34(&icc_mapped, ps->icc_par, ps->nr_icc_par, ps->num_env, 1);
856  if (ps->enable_ipdopd) {
857  remap34(&ipd_mapped, ps->ipd_par, ps->nr_ipdopd_par, ps->num_env, 0);
858  remap34(&opd_mapped, ps->opd_par, ps->nr_ipdopd_par, ps->num_env, 0);
859  }
860  if (!ps->is34bands_old) {
861  map_val_20_to_34(H11[0][0]);
862  map_val_20_to_34(H11[1][0]);
863  map_val_20_to_34(H12[0][0]);
864  map_val_20_to_34(H12[1][0]);
865  map_val_20_to_34(H21[0][0]);
866  map_val_20_to_34(H21[1][0]);
867  map_val_20_to_34(H22[0][0]);
868  map_val_20_to_34(H22[1][0]);
869  ipdopd_reset(ipd_hist, opd_hist);
870  }
871  } else {
872  remap20(&iid_mapped, ps->iid_par, ps->nr_iid_par, ps->num_env, 1);
873  remap20(&icc_mapped, ps->icc_par, ps->nr_icc_par, ps->num_env, 1);
874  if (ps->enable_ipdopd) {
875  remap20(&ipd_mapped, ps->ipd_par, ps->nr_ipdopd_par, ps->num_env, 0);
876  remap20(&opd_mapped, ps->opd_par, ps->nr_ipdopd_par, ps->num_env, 0);
877  }
878  if (ps->is34bands_old) {
879  map_val_34_to_20(H11[0][0]);
880  map_val_34_to_20(H11[1][0]);
881  map_val_34_to_20(H12[0][0]);
882  map_val_34_to_20(H12[1][0]);
883  map_val_34_to_20(H21[0][0]);
884  map_val_34_to_20(H21[1][0]);
885  map_val_34_to_20(H22[0][0]);
886  map_val_34_to_20(H22[1][0]);
887  ipdopd_reset(ipd_hist, opd_hist);
888  }
889  }
890 
891  //Mixing
892  for (e = 0; e < ps->num_env; e++) {
893  for (b = 0; b < NR_PAR_BANDS[is34]; b++) {
894  INTFLOAT h11, h12, h21, h22;
895  h11 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps->iid_quant][icc_mapped[e][b]][0];
896  h12 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps->iid_quant][icc_mapped[e][b]][1];
897  h21 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps->iid_quant][icc_mapped[e][b]][2];
898  h22 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps->iid_quant][icc_mapped[e][b]][3];
899 
900  if (!PS_BASELINE && ps->enable_ipdopd && b < NR_IPDOPD_BANDS[is34]) {
901  //The spec say says to only run this smoother when enable_ipdopd
902  //is set but the reference decoder appears to run it constantly
903  INTFLOAT h11i, h12i, h21i, h22i;
904  INTFLOAT ipd_adj_re, ipd_adj_im;
905  int opd_idx = opd_hist[b] * 8 + opd_mapped[e][b];
906  int ipd_idx = ipd_hist[b] * 8 + ipd_mapped[e][b];
907  INTFLOAT opd_re = pd_re_smooth[opd_idx];
908  INTFLOAT opd_im = pd_im_smooth[opd_idx];
909  INTFLOAT ipd_re = pd_re_smooth[ipd_idx];
910  INTFLOAT ipd_im = pd_im_smooth[ipd_idx];
911  opd_hist[b] = opd_idx & 0x3F;
912  ipd_hist[b] = ipd_idx & 0x3F;
913 
914  ipd_adj_re = AAC_MADD30(opd_re, ipd_re, opd_im, ipd_im);
915  ipd_adj_im = AAC_MSUB30(opd_im, ipd_re, opd_re, ipd_im);
916  h11i = AAC_MUL30(h11, opd_im);
917  h11 = AAC_MUL30(h11, opd_re);
918  h12i = AAC_MUL30(h12, ipd_adj_im);
919  h12 = AAC_MUL30(h12, ipd_adj_re);
920  h21i = AAC_MUL30(h21, opd_im);
921  h21 = AAC_MUL30(h21, opd_re);
922  h22i = AAC_MUL30(h22, ipd_adj_im);
923  h22 = AAC_MUL30(h22, ipd_adj_re);
924  H11[1][e+1][b] = h11i;
925  H12[1][e+1][b] = h12i;
926  H21[1][e+1][b] = h21i;
927  H22[1][e+1][b] = h22i;
928  }
929  H11[0][e+1][b] = h11;
930  H12[0][e+1][b] = h12;
931  H21[0][e+1][b] = h21;
932  H22[0][e+1][b] = h22;
933  }
934  for (k = 0; k < NR_BANDS[is34]; k++) {
935  LOCAL_ALIGNED_16(INTFLOAT, h, [2], [4]);
936  LOCAL_ALIGNED_16(INTFLOAT, h_step, [2], [4]);
937  int start = ps->border_position[e];
938  int stop = ps->border_position[e+1];
939  INTFLOAT width = Q30(1.f) / ((stop - start) ? (stop - start) : 1);
940 #if USE_FIXED
941  width = FFMIN(2U*width, INT_MAX);
942 #endif
943  b = k_to_i[k];
944  h[0][0] = H11[0][e][b];
945  h[0][1] = H12[0][e][b];
946  h[0][2] = H21[0][e][b];
947  h[0][3] = H22[0][e][b];
948  if (!PS_BASELINE && ps->enable_ipdopd) {
949  //Is this necessary? ps_04_new seems unchanged
950  if ((is34 && k <= 13 && k >= 9) || (!is34 && k <= 1)) {
951  h[1][0] = -H11[1][e][b];
952  h[1][1] = -H12[1][e][b];
953  h[1][2] = -H21[1][e][b];
954  h[1][3] = -H22[1][e][b];
955  } else {
956  h[1][0] = H11[1][e][b];
957  h[1][1] = H12[1][e][b];
958  h[1][2] = H21[1][e][b];
959  h[1][3] = H22[1][e][b];
960  }
961  }
962  //Interpolation
963  h_step[0][0] = AAC_MSUB31_V3(H11[0][e+1][b], h[0][0], width);
964  h_step[0][1] = AAC_MSUB31_V3(H12[0][e+1][b], h[0][1], width);
965  h_step[0][2] = AAC_MSUB31_V3(H21[0][e+1][b], h[0][2], width);
966  h_step[0][3] = AAC_MSUB31_V3(H22[0][e+1][b], h[0][3], width);
967  if (!PS_BASELINE && ps->enable_ipdopd) {
968  h_step[1][0] = AAC_MSUB31_V3(H11[1][e+1][b], h[1][0], width);
969  h_step[1][1] = AAC_MSUB31_V3(H12[1][e+1][b], h[1][1], width);
970  h_step[1][2] = AAC_MSUB31_V3(H21[1][e+1][b], h[1][2], width);
971  h_step[1][3] = AAC_MSUB31_V3(H22[1][e+1][b], h[1][3], width);
972  }
973  if (stop - start)
975  l[k] + 1 + start, r[k] + 1 + start,
976  h, h_step, stop - start);
977  }
978  }
979 }
980 
981 int AAC_RENAME(ff_ps_apply)(AVCodecContext *avctx, PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top)
982 {
983  INTFLOAT (*Lbuf)[32][2] = ps->Lbuf;
984  INTFLOAT (*Rbuf)[32][2] = ps->Rbuf;
985  const int len = 32;
986  int is34 = ps->is34bands;
987 
988  top += NR_BANDS[is34] - 64;
989  memset(ps->delay+top, 0, (NR_BANDS[is34] - top)*sizeof(ps->delay[0]));
990  if (top < NR_ALLPASS_BANDS[is34])
991  memset(ps->ap_delay + top, 0, (NR_ALLPASS_BANDS[is34] - top)*sizeof(ps->ap_delay[0]));
992 
993  hybrid_analysis(&ps->dsp, Lbuf, ps->in_buf, L, is34, len);
994  decorrelation(ps, Rbuf, (const INTFLOAT (*)[32][2]) Lbuf, is34);
995  stereo_processing(ps, Lbuf, Rbuf, is34);
996  hybrid_synthesis(&ps->dsp, L, Lbuf, is34, len);
997  hybrid_synthesis(&ps->dsp, R, Rbuf, is34, len);
998 
999  return 0;
1000 }
1001 
1002 #define PS_INIT_VLC_STATIC(num, size) \
1003  INIT_VLC_STATIC(&vlc_ps[num], 9, ps_tmp[num].table_size / ps_tmp[num].elem_size, \
1004  ps_tmp[num].ps_bits, 1, 1, \
1005  ps_tmp[num].ps_codes, ps_tmp[num].elem_size, ps_tmp[num].elem_size, \
1006  size);
1007 
1008 #define PS_VLC_ROW(name) \
1009  { name ## _codes, name ## _bits, sizeof(name ## _codes), sizeof(name ## _codes[0]) }
1010 
1012  // Syntax initialization
1013  static const struct {
1014  const void *ps_codes, *ps_bits;
1015  const unsigned int table_size, elem_size;
1016  } ps_tmp[] = {
1027  };
1028 
1029  PS_INIT_VLC_STATIC(0, 1544);
1030  PS_INIT_VLC_STATIC(1, 832);
1031  PS_INIT_VLC_STATIC(2, 1024);
1032  PS_INIT_VLC_STATIC(3, 1036);
1033  PS_INIT_VLC_STATIC(4, 544);
1034  PS_INIT_VLC_STATIC(5, 544);
1035  PS_INIT_VLC_STATIC(6, 512);
1036  PS_INIT_VLC_STATIC(7, 512);
1037  PS_INIT_VLC_STATIC(8, 512);
1038  PS_INIT_VLC_STATIC(9, 512);
1039 
1040  ps_tableinit();
1041 }
1042 
1044 {
1045  AAC_RENAME(ff_psdsp_init)(&ps->dsp);
1046 }
float UINTFLOAT
Definition: aac_defines.h:87
void AAC_RENAME() ff_psdsp_init(PSDSPContext *s)
void(* mul_pair_single)(INTFLOAT(*dst)[2], INTFLOAT(*src0)[2], INTFLOAT *src1, int n)
Definition: aacpsdsp.h:34
static const INTFLOAT g1_Q2[]
Definition: aacpsdata.c:160
#define NULL
Definition: coverity.c:32
static void map_idx_20_to_34(int8_t *par_mapped, const int8_t *par, int full)
Definition: aacps.c:585
INTFLOAT peak_decay_diff_smooth[34]
Definition: aacps.h:69
int nr_iid_par
Definition: aacps.h:45
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
else temp
Definition: vf_mcdeint.c:256
static int HA[46][8][4]
static TABLE_CONST int Q_fract_allpass[2][50][3][2]
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
static void ipdopd_reset(int8_t *ipd_hist, int8_t *opd_hist)
Definition: aacps.c:149
INTFLOAT peak_decay_nrg[34]
Definition: aacps.h:67
static const int NR_BANDS[]
Number of frequency bands that can be addressed by the sub subband index, k.
Definition: aacps.c:455
int AAC_RENAME() ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb_host, PSContext *ps, int bits_left)
Definition: aacps.c:158
static const int8_t nr_iidopd_par_tab[]
Definition: aacps.c:54
static const int NR_IPDOPD_BANDS[]
Definition: aacps.c:453
static const int8_t huff_offset[]
Definition: aacpsdata.c:136
static void map_idx_10_to_20(int8_t *par_mapped, const int8_t *par, int full)
Table 8.46.
Definition: aacps.c:464
static void map_idx_34_to_20(int8_t *par_mapped, const int8_t *par, int full)
Definition: aacps.c:478
int enable_ipdopd
Definition: aacps.h:54
void(* hybrid_synthesis_deint)(INTFLOAT out[2][38][64], INTFLOAT(*in)[32][2], int i, int len)
Definition: aacpsdsp.h:41
INTFLOAT ap_delay[PS_MAX_AP_BANDS][PS_AP_LINKS][PS_QMF_TIME_SLOTS+PS_MAX_AP_DELAY][2]
Definition: aacps.h:66
#define N
Definition: af_mcompand.c:54
static const int8_t k_to_i_34[]
Table 8.49.
Definition: aacpsdata.c:152
#define PS_INIT_VLC_STATIC(num, size)
Definition: aacps.c:1002
int AAC_RENAME() ff_ps_apply(AVCodecContext *avctx, PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top)
Definition: aacps.c:981
float INTFLOAT
Definition: aac_defines.h:86
#define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION)
Definition: aacps.c:80
static int pd_im_smooth[8 *8 *8]
#define Q30(x)
Definition: aac_defines.h:95
#define av_cold
Definition: attributes.h:82
INTFLOAT H21[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]
Definition: aacps.h:72
INTFLOAT delay[PS_MAX_SSB][PS_QMF_TIME_SLOTS+PS_MAX_DELAY][2]
Definition: aacps.h:65
static uint32_t reverse(uint32_t num, int bits)
Definition: speedhq.c:565
#define f(width, name)
Definition: cbs_vp9.c:255
#define PS_MAX_AP_DELAY
Definition: aacps.h:39
void(* decorrelate)(INTFLOAT(*out)[2], INTFLOAT(*delay)[2], INTFLOAT(*ap_delay)[PS_QMF_TIME_SLOTS+PS_MAX_AP_DELAY][2], const INTFLOAT phi_fract[2], const INTFLOAT(*Q_fract)[2], const INTFLOAT *transient_gain, INTFLOAT g_decay_slope, int len)
Definition: aacpsdsp.h:43
static void hybrid_analysis(PSDSPContext *dsp, INTFLOAT out[91][32][2], INTFLOAT in[5][44][2], INTFLOAT L[2][38][64], int is34, int len)
Definition: aacps.c:378
static void remap34(int8_t(**p_par_mapped)[PS_MAX_NR_IIDICC], int8_t(*par)[PS_MAX_NR_IIDICC], int num_par, int num_env, int full)
Definition: aacps.c:782
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
#define AAC_MUL31(x, y)
Definition: aac_defines.h:102
int num_env_old
Definition: aacps.h:52
void(* add_squares)(INTFLOAT *dst, const INTFLOAT(*src)[2], int n)
Definition: aacpsdsp.h:33
bitstream reader API header.
static int f34_0_12[12][8][2]
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a source
static const uint8_t header[24]
Definition: sdr2.c:67
static void map_idx_10_to_34(int8_t *par_mapped, const int8_t *par, int full)
Definition: aacps.c:543
#define av_log(a,...)
#define DECAY_SLOPE
All-pass filter decay slope.
Definition: aacps.c:450
static void hybrid6_cx(PSDSPContext *dsp, INTFLOAT(*in)[2], INTFLOAT(*out)[32][2], TABLE_CONST INTFLOAT(*filter)[8][2], int len)
Split one subband into 6 subsubbands with a complex filter.
Definition: aacps.c:343
#define TABLE_CONST
#define U(x)
Definition: vp56_arith.h:37
#define AAC_MSUB30(x, y, a, b)
Definition: aac_defines.h:107
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define PS_MAX_NR_IIDICC
Definition: aacps.h:32
static void hybrid2_re(INTFLOAT(*in)[2], INTFLOAT(*out)[32][2], const INTFLOAT filter[8], int len, int reverse)
Split one subband into 2 subsubbands with a symmetric real filter.
Definition: aacps.c:317
#define R
Definition: huffyuvdsp.h:34
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
int8_t icc_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]
Inter-Channel Coherence Parameters.
Definition: aacps.h:57
int iid_quant
Definition: aacps.h:44
#define AAC_HALF_SUM(x, y)
Definition: aac_defines.h:111
static int read_iid_data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, int8_t(*iid)[34], int table_idx, int e, int dt)
\ * Read Inter-channel Intensity Difference/Inter-Channel Coherence/ \ * Inter-channel Phase Differen...
Definition: aacps.c:124
static const int SHORT_DELAY_BAND[]
First stereo band using the short one sample delay.
Definition: aacps.c:461
#define PS_BASELINE
Operate in Baseline PS mode.
Definition: aacps.c:39
INTFLOAT H22[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]
Definition: aacps.h:73
const char * r
Definition: vf_curves.c:114
void(* hybrid_analysis)(INTFLOAT(*out)[2], INTFLOAT(*in)[2], const INTFLOAT(*filter)[8][2], ptrdiff_t stride, int n)
Definition: aacpsdsp.h:36
#define PS_VLC_ROW(name)
Definition: aacps.c:1008
GLsizei count
Definition: opengl_enc.c:108
#define FFMAX(a, b)
Definition: common.h:94
int num_env
Definition: aacps.h:53
static int phi_fract[2][50][2]
Definition: vlc.h:26
int nr_icc_par
Definition: aacps.h:49
static int read_icc_data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, int8_t(*icc)[34], int table_idx, int e, int dt)
\ * Read Inter-channel Intensity Difference/Inter-Channel Coherence/ \ * Inter-channel Phase Differen...
Definition: aacps.c:125
#define AAC_RENAME(x)
Definition: aac_defines.h:84
common internal API header
static int f34_1_8[8][8][2]
void(* stereo_interpolate[2])(INTFLOAT(*l)[2], INTFLOAT(*r)[2], INTFLOAT h[2][4], INTFLOAT h_step[2][4], int len)
Definition: aacpsdsp.h:49
#define PS_MAX_NUM_ENV
Definition: aacps.h:31
#define Q31(x)
Definition: aac_defines.h:96
#define b
Definition: input.c:41
#define FFMIN(a, b)
Definition: common.h:96
static void stereo_processing(PSContext *ps, INTFLOAT(*l)[32][2], INTFLOAT(*r)[32][2], int is34)
Definition: aacps.c:820
#define width
static void map_val_20_to_34(INTFLOAT par[PS_MAX_NR_IIDICC])
Definition: aacps.c:625
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
static void hybrid_synthesis(PSDSPContext *dsp, INTFLOAT out[2][38][64], INTFLOAT in[91][32][2], int is34, int len)
Definition: aacps.c:408
static int read_ipdopd_data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, int8_t(*ipdopd)[34], int table_idx, int e, int dt)
\ * Read Inter-channel Intensity Difference/Inter-Channel Coherence/ \ * Inter-channel Phase Differen...
Definition: aacps.c:126
int8_t ipd_hist[PS_MAX_NR_IIDICC]
Definition: aacps.h:77
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
#define s(width, name)
Definition: cbs_vp9.c:257
static const int huff_iid[]
Definition: aacps.c:71
int n
Definition: avisynth_c.h:760
int8_t ipd_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]
Inter-channel Phase Difference Parameters.
Definition: aacps.h:59
av_cold void AAC_RENAME() ff_ps_init(void)
Definition: aacps.c:1011
static const int8_t nr_iidicc_par_tab[]
Definition: aacps.c:50
#define L(x)
Definition: vp56_arith.h:36
#define INTFLOAT
const uint8_t ff_log2_tab[256]
Definition: log2_tab.c:23
#define PS_MAX_DELAY
Definition: aacps.h:37
PSDSPContext dsp
Definition: aacps.h:78
static int HB[46][8][4]
static const int NR_ALLPASS_BANDS[]
Number of all-pass filer bands.
Definition: aacps.c:459
Libavcodec external API header.
static const int8_t num_env_tab[2][4]
Definition: aacps.c:45
static void hybrid4_8_12_cx(PSDSPContext *dsp, INTFLOAT(*in)[2], INTFLOAT(*out)[32][2], TABLE_CONST INTFLOAT(*filter)[8][2], int N, int len)
Definition: aacps.c:367
main external API structure.
Definition: avcodec.h:1568
static void decorrelation(PSContext *ps, INTFLOAT(*out)[32][2], const INTFLOAT(*s)[32][2], int is34)
Definition: aacps.c:662
static void ps_tableinit(void)
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
int8_t iid_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]
Inter-channel Intensity Difference Parameters.
Definition: aacps.h:56
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:538
static const int NR_PAR_BANDS[]
Number of frequency bands that can be addressed by the parameter index, b(k)
Definition: aacps.c:452
int is34bands_old
Definition: aacps.h:62
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
#define AAC_MUL30(x, y)
Definition: aac_defines.h:101
INTFLOAT power_smooth[34]
Definition: aacps.h:68
av_cold void AAC_RENAME() ff_ps_ctx_init(PSContext *ps)
Definition: aacps.c:1043
int8_t opd_hist[PS_MAX_NR_IIDICC]
Definition: aacps.h:76
int border_position[PS_MAX_NUM_ENV+1]
Definition: aacps.h:55
#define AAC_MADD30(x, y, a, b)
Definition: aac_defines.h:104
static VLC vlc_ps[10]
Definition: aacps.c:78
#define AAC_MSUB31_V3(x, y, z)
Definition: aac_defines.h:110
#define PS_AP_LINKS
Definition: aacps.h:38
int
common internal and external API header
static const int8_t k_to_i_20[]
Table 8.48.
Definition: aacpsdata.c:145
void(* hybrid_analysis_ileave)(INTFLOAT(*out)[32][2], INTFLOAT L[2][38][64], int i, int len)
Definition: aacpsdsp.h:39
#define numQMFSlots
Definition: aacps.c:43
#define PS_QMF_TIME_SLOTS
Definition: aacps.h:36
static void remap20(int8_t(**p_par_mapped)[PS_MAX_NR_IIDICC], int8_t(*par)[PS_MAX_NR_IIDICC], int num_par, int num_env, int full)
Definition: aacps.c:801
int len
static int pd_re_smooth[8 *8 *8]
INTFLOAT H12[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]
Definition: aacps.h:71
static int f34_2_4[4][8][2]
static void map_val_34_to_20(INTFLOAT par[PS_MAX_NR_IIDICC])
Definition: aacps.c:504
INTFLOAT H11[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]
Definition: aacps.h:70
static const int DECAY_CUTOFF[]
Start frequency band for the all-pass filter decay slope.
Definition: aacps.c:457
#define PS_MAX_NR_IPDOPD
Definition: aacps.h:33
FILE * out
Definition: movenc.c:54
static int ps_read_extension_data(GetBitContext *gb, PSContext *ps, int ps_extension_id)
Definition: aacps.c:128
#define LOCAL_ALIGNED_16(t, v,...)
Definition: internal.h:131
void INT64 start
Definition: avisynth_c.h:766
static int f20_0_8[8][8][2]
int nr_ipdopd_par
Definition: aacps.h:46
int8_t opd_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]
Overall Phase Difference Parameters.
Definition: aacps.h:60
float INT64FLOAT
Definition: aac_defines.h:88
int icc_mode
Definition: aacps.h:48