FFmpeg  4.0
ac3dsp.c
Go to the documentation of this file.
1 /*
2  * AC-3 DSP functions
3  * Copyright (c) 2011 Justin Ruggles
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 
22 #include "avcodec.h"
23 #include "ac3.h"
24 #include "ac3dsp.h"
25 #include "mathops.h"
26 
27 static void ac3_exponent_min_c(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
28 {
29  int blk, i;
30 
31  if (!num_reuse_blocks)
32  return;
33 
34  for (i = 0; i < nb_coefs; i++) {
35  uint8_t min_exp = *exp;
36  uint8_t *exp1 = exp + 256;
37  for (blk = 0; blk < num_reuse_blocks; blk++) {
38  uint8_t next_exp = *exp1;
39  if (next_exp < min_exp)
40  min_exp = next_exp;
41  exp1 += 256;
42  }
43  *exp++ = min_exp;
44  }
45 }
46 
47 static int ac3_max_msb_abs_int16_c(const int16_t *src, int len)
48 {
49  int i, v = 0;
50  for (i = 0; i < len; i++)
51  v |= abs(src[i]);
52  return v;
53 }
54 
55 static void ac3_lshift_int16_c(int16_t *src, unsigned int len,
56  unsigned int shift)
57 {
58  uint32_t *src32 = (uint32_t *)src;
59  const uint32_t mask = ~(((1 << shift) - 1) << 16);
60  int i;
61  len >>= 1;
62  for (i = 0; i < len; i += 8) {
63  src32[i ] = (src32[i ] << shift) & mask;
64  src32[i+1] = (src32[i+1] << shift) & mask;
65  src32[i+2] = (src32[i+2] << shift) & mask;
66  src32[i+3] = (src32[i+3] << shift) & mask;
67  src32[i+4] = (src32[i+4] << shift) & mask;
68  src32[i+5] = (src32[i+5] << shift) & mask;
69  src32[i+6] = (src32[i+6] << shift) & mask;
70  src32[i+7] = (src32[i+7] << shift) & mask;
71  }
72 }
73 
74 static void ac3_rshift_int32_c(int32_t *src, unsigned int len,
75  unsigned int shift)
76 {
77  do {
78  *src++ >>= shift;
79  *src++ >>= shift;
80  *src++ >>= shift;
81  *src++ >>= shift;
82  *src++ >>= shift;
83  *src++ >>= shift;
84  *src++ >>= shift;
85  *src++ >>= shift;
86  len -= 8;
87  } while (len > 0);
88 }
89 
90 static void float_to_fixed24_c(int32_t *dst, const float *src, unsigned int len)
91 {
92  const float scale = 1 << 24;
93  do {
94  *dst++ = lrintf(*src++ * scale);
95  *dst++ = lrintf(*src++ * scale);
96  *dst++ = lrintf(*src++ * scale);
97  *dst++ = lrintf(*src++ * scale);
98  *dst++ = lrintf(*src++ * scale);
99  *dst++ = lrintf(*src++ * scale);
100  *dst++ = lrintf(*src++ * scale);
101  *dst++ = lrintf(*src++ * scale);
102  len -= 8;
103  } while (len > 0);
104 }
105 
106 static void ac3_bit_alloc_calc_bap_c(int16_t *mask, int16_t *psd,
107  int start, int end,
108  int snr_offset, int floor,
109  const uint8_t *bap_tab, uint8_t *bap)
110 {
111  int bin, band, band_end;
112 
113  /* special case, if snr offset is -960, set all bap's to zero */
114  if (snr_offset == -960) {
115  memset(bap, 0, AC3_MAX_COEFS);
116  return;
117  }
118 
119  bin = start;
121  do {
122  int m = (FFMAX(mask[band] - snr_offset - floor, 0) & 0x1FE0) + floor;
123  band_end = ff_ac3_band_start_tab[++band];
124  band_end = FFMIN(band_end, end);
125 
126  for (; bin < band_end; bin++) {
127  int address = av_clip_uintp2((psd[bin] - m) >> 5, 6);
128  bap[bin] = bap_tab[address];
129  }
130  } while (end > band_end);
131 }
132 
133 static void ac3_update_bap_counts_c(uint16_t mant_cnt[16], uint8_t *bap,
134  int len)
135 {
136  while (len-- > 0)
137  mant_cnt[bap[len]]++;
138 }
139 
140 DECLARE_ALIGNED(16, const uint16_t, ff_ac3_bap_bits)[16] = {
141  0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
142 };
143 
144 static int ac3_compute_mantissa_size_c(uint16_t mant_cnt[6][16])
145 {
146  int blk, bap;
147  int bits = 0;
148 
149  for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
150  // bap=1 : 3 mantissas in 5 bits
151  bits += (mant_cnt[blk][1] / 3) * 5;
152  // bap=2 : 3 mantissas in 7 bits
153  // bap=4 : 2 mantissas in 7 bits
154  bits += ((mant_cnt[blk][2] / 3) + (mant_cnt[blk][4] >> 1)) * 7;
155  // bap=3 : 1 mantissa in 3 bits
156  bits += mant_cnt[blk][3] * 3;
157  // bap=5 to 15 : get bits per mantissa from table
158  for (bap = 5; bap < 16; bap++)
159  bits += mant_cnt[blk][bap] * ff_ac3_bap_bits[bap];
160  }
161  return bits;
162 }
163 
164 static void ac3_extract_exponents_c(uint8_t *exp, int32_t *coef, int nb_coefs)
165 {
166  int i;
167 
168  for (i = 0; i < nb_coefs; i++) {
169  int v = abs(coef[i]);
170  exp[i] = v ? 23 - av_log2(v) : 24;
171  }
172 }
173 
174 static void ac3_sum_square_butterfly_int32_c(int64_t sum[4],
175  const int32_t *coef0,
176  const int32_t *coef1,
177  int len)
178 {
179  int i;
180 
181  sum[0] = sum[1] = sum[2] = sum[3] = 0;
182 
183  for (i = 0; i < len; i++) {
184  int lt = coef0[i];
185  int rt = coef1[i];
186  int md = lt + rt;
187  int sd = lt - rt;
188  MAC64(sum[0], lt, lt);
189  MAC64(sum[1], rt, rt);
190  MAC64(sum[2], md, md);
191  MAC64(sum[3], sd, sd);
192  }
193 }
194 
195 static void ac3_sum_square_butterfly_float_c(float sum[4],
196  const float *coef0,
197  const float *coef1,
198  int len)
199 {
200  int i;
201 
202  sum[0] = sum[1] = sum[2] = sum[3] = 0;
203 
204  for (i = 0; i < len; i++) {
205  float lt = coef0[i];
206  float rt = coef1[i];
207  float md = lt + rt;
208  float sd = lt - rt;
209  sum[0] += lt * lt;
210  sum[1] += rt * rt;
211  sum[2] += md * md;
212  sum[3] += sd * sd;
213  }
214 }
215 
216 static void ac3_downmix_5_to_2_symmetric_c(float **samples, float **matrix,
217  int len)
218 {
219  int i;
220  float v0, v1;
221  float front_mix = matrix[0][0];
222  float center_mix = matrix[0][1];
223  float surround_mix = matrix[0][3];
224 
225  for (i = 0; i < len; i++) {
226  v0 = samples[0][i] * front_mix +
227  samples[1][i] * center_mix +
228  samples[3][i] * surround_mix;
229 
230  v1 = samples[1][i] * center_mix +
231  samples[2][i] * front_mix +
232  samples[4][i] * surround_mix;
233 
234  samples[0][i] = v0;
235  samples[1][i] = v1;
236  }
237 }
238 
239 static void ac3_downmix_5_to_1_symmetric_c(float **samples, float **matrix,
240  int len)
241 {
242  int i;
243  float front_mix = matrix[0][0];
244  float center_mix = matrix[0][1];
245  float surround_mix = matrix[0][3];
246 
247  for (i = 0; i < len; i++) {
248  samples[0][i] = samples[0][i] * front_mix +
249  samples[1][i] * center_mix +
250  samples[2][i] * front_mix +
251  samples[3][i] * surround_mix +
252  samples[4][i] * surround_mix;
253  }
254 }
255 
256 static void ac3_downmix_c(float **samples, float **matrix,
257  int out_ch, int in_ch, int len)
258 {
259  int i, j;
260  float v0, v1;
261 
262  if (out_ch == 2) {
263  for (i = 0; i < len; i++) {
264  v0 = v1 = 0.0f;
265  for (j = 0; j < in_ch; j++) {
266  v0 += samples[j][i] * matrix[0][j];
267  v1 += samples[j][i] * matrix[1][j];
268  }
269  samples[0][i] = v0;
270  samples[1][i] = v1;
271  }
272  } else if (out_ch == 1) {
273  for (i = 0; i < len; i++) {
274  v0 = 0.0f;
275  for (j = 0; j < in_ch; j++)
276  v0 += samples[j][i] * matrix[0][j];
277  samples[0][i] = v0;
278  }
279  }
280 }
281 
282 static void ac3_downmix_5_to_2_symmetric_c_fixed(int32_t **samples, int16_t **matrix,
283  int len)
284 {
285  int i;
286  int64_t v0, v1;
287  int16_t front_mix = matrix[0][0];
288  int16_t center_mix = matrix[0][1];
289  int16_t surround_mix = matrix[0][3];
290 
291  for (i = 0; i < len; i++) {
292  v0 = (int64_t)samples[0][i] * front_mix +
293  (int64_t)samples[1][i] * center_mix +
294  (int64_t)samples[3][i] * surround_mix;
295 
296  v1 = (int64_t)samples[1][i] * center_mix +
297  (int64_t)samples[2][i] * front_mix +
298  (int64_t)samples[4][i] * surround_mix;
299 
300  samples[0][i] = (v0+2048)>>12;
301  samples[1][i] = (v1+2048)>>12;
302  }
303 }
304 
305 static void ac3_downmix_5_to_1_symmetric_c_fixed(int32_t **samples, int16_t **matrix,
306  int len)
307 {
308  int i;
309  int64_t v0;
310  int16_t front_mix = matrix[0][0];
311  int16_t center_mix = matrix[0][1];
312  int16_t surround_mix = matrix[0][3];
313 
314  for (i = 0; i < len; i++) {
315  v0 = (int64_t)samples[0][i] * front_mix +
316  (int64_t)samples[1][i] * center_mix +
317  (int64_t)samples[2][i] * front_mix +
318  (int64_t)samples[3][i] * surround_mix +
319  (int64_t)samples[4][i] * surround_mix;
320 
321  samples[0][i] = (v0+2048)>>12;
322  }
323 }
324 
325 static void ac3_downmix_c_fixed(int32_t **samples, int16_t **matrix,
326  int out_ch, int in_ch, int len)
327 {
328  int i, j;
329  int64_t v0, v1;
330  if (out_ch == 2) {
331  for (i = 0; i < len; i++) {
332  v0 = v1 = 0;
333  for (j = 0; j < in_ch; j++) {
334  v0 += (int64_t)samples[j][i] * matrix[0][j];
335  v1 += (int64_t)samples[j][i] * matrix[1][j];
336  }
337  samples[0][i] = (v0+2048)>>12;
338  samples[1][i] = (v1+2048)>>12;
339  }
340  } else if (out_ch == 1) {
341  for (i = 0; i < len; i++) {
342  v0 = 0;
343  for (j = 0; j < in_ch; j++)
344  v0 += (int64_t)samples[j][i] * matrix[0][j];
345  samples[0][i] = (v0+2048)>>12;
346  }
347  }
348 }
349 
350 void ff_ac3dsp_downmix_fixed(AC3DSPContext *c, int32_t **samples, int16_t **matrix,
351  int out_ch, int in_ch, int len)
352 {
353  if (c->in_channels != in_ch || c->out_channels != out_ch) {
354  c->in_channels = in_ch;
355  c->out_channels = out_ch;
356  c->downmix_fixed = NULL;
357 
358  if (in_ch == 5 && out_ch == 2 &&
359  !(matrix[1][0] | matrix[0][2] |
360  matrix[1][3] | matrix[0][4] |
361  (matrix[0][1] ^ matrix[1][1]) |
362  (matrix[0][0] ^ matrix[1][2]))) {
364  } else if (in_ch == 5 && out_ch == 1 &&
365  matrix[0][0] == matrix[0][2] &&
366  matrix[0][3] == matrix[0][4]) {
368  }
369  }
370 
371  if (c->downmix_fixed)
372  c->downmix_fixed(samples, matrix, len);
373  else
374  ac3_downmix_c_fixed(samples, matrix, out_ch, in_ch, len);
375 }
376 
377 static void apply_window_int16_c(int16_t *output, const int16_t *input,
378  const int16_t *window, unsigned int len)
379 {
380  int i;
381  int len2 = len >> 1;
382 
383  for (i = 0; i < len2; i++) {
384  int16_t w = window[i];
385  output[i] = (MUL16(input[i], w) + (1 << 14)) >> 15;
386  output[len-i-1] = (MUL16(input[len-i-1], w) + (1 << 14)) >> 15;
387  }
388 }
389 
390 void ff_ac3dsp_downmix(AC3DSPContext *c, float **samples, float **matrix,
391  int out_ch, int in_ch, int len)
392 {
393  if (c->in_channels != in_ch || c->out_channels != out_ch) {
394  int **matrix_cmp = (int **)matrix;
395 
396  c->in_channels = in_ch;
397  c->out_channels = out_ch;
398  c->downmix = NULL;
399 
400  if (in_ch == 5 && out_ch == 2 &&
401  !(matrix_cmp[1][0] | matrix_cmp[0][2] |
402  matrix_cmp[1][3] | matrix_cmp[0][4] |
403  (matrix_cmp[0][1] ^ matrix_cmp[1][1]) |
404  (matrix_cmp[0][0] ^ matrix_cmp[1][2]))) {
406  } else if (in_ch == 5 && out_ch == 1 &&
407  matrix_cmp[0][0] == matrix_cmp[0][2] &&
408  matrix_cmp[0][3] == matrix_cmp[0][4]) {
410  }
411 
412  if (ARCH_X86)
414  }
415 
416  if (c->downmix)
417  c->downmix(samples, matrix, len);
418  else
419  ac3_downmix_c(samples, matrix, out_ch, in_ch, len);
420 }
421 
422 av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
423 {
435  c->in_channels = 0;
436  c->out_channels = 0;
437  c->downmix = NULL;
438  c->downmix_fixed = NULL;
440 
441  if (ARCH_ARM)
442  ff_ac3dsp_init_arm(c, bit_exact);
443  if (ARCH_X86)
444  ff_ac3dsp_init_x86(c, bit_exact);
445  if (ARCH_MIPS)
446  ff_ac3dsp_init_mips(c, bit_exact);
447 }
#define NULL
Definition: coverity.c:32
void ff_ac3dsp_downmix(AC3DSPContext *c, float **samples, float **matrix, int out_ch, int in_ch, int len)
Definition: ac3dsp.c:390
static int shift(int a, int b)
Definition: sonic.c:82
static void ac3_downmix_5_to_2_symmetric_c_fixed(int32_t **samples, int16_t **matrix, int len)
Definition: ac3dsp.c:282
void(* update_bap_counts)(uint16_t mant_cnt[16], uint8_t *bap, int len)
Update bap counts using the supplied array of bap.
Definition: ac3dsp.h:117
void ff_ac3dsp_set_downmix_x86(AC3DSPContext *c)
Definition: ac3dsp_init.c:139
void(* downmix)(float **samples, float **matrix, int len)
Definition: ac3dsp.h:137
#define AC3_MAX_COEFS
Definition: ac3.h:35
void ff_ac3dsp_init_mips(AC3DSPContext *c, int bit_exact)
Definition: ac3dsp_mips.c:403
static const uint8_t bap_tab[64]
Definition: dolby_e.h:632
#define blk(i)
Definition: sha.c:185
#define src
Definition: vp8dsp.c:254
void(* extract_exponents)(uint8_t *exp, int32_t *coef, int nb_coefs)
Definition: ac3dsp.h:127
void(* apply_window_int16)(int16_t *output, const int16_t *input, const int16_t *window, unsigned int len)
Apply symmetric window in 16-bit fixed-point.
Definition: ac3dsp.h:151
const uint8_t ff_ac3_bin_to_band_tab[253]
Map each frequency coefficient bin to the critical band that contains it.
Definition: ac3.c:46
uint8_t
#define av_cold
Definition: attributes.h:82
static int ac3_max_msb_abs_int16_c(const int16_t *src, int len)
Definition: ac3dsp.c:47
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
int out_channels
Definition: ac3dsp.h:135
static void ac3_downmix_5_to_2_symmetric_c(float **samples, float **matrix, int len)
Definition: ac3dsp.c:216
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:112
void(* bit_alloc_calc_bap)(int16_t *mask, int16_t *psd, int start, int end, int snr_offset, int floor, const uint8_t *bap_tab, uint8_t *bap)
Calculate bit allocation pointers.
Definition: ac3dsp.h:106
static void ac3_downmix_c_fixed(int32_t **samples, int16_t **matrix, int out_ch, int in_ch, int len)
Definition: ac3dsp.c:325
#define lrintf(x)
Definition: libm_mips.h:70
int in_channels
Definition: ac3dsp.h:136
void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact)
Definition: ac3dsp_init.c:66
void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact)
static const uint16_t mask[17]
Definition: lzw.c:38
#define ARCH_X86
Definition: config.h:38
static void ac3_sum_square_butterfly_int32_c(int64_t sum[4], const int32_t *coef0, const int32_t *coef1, int len)
Definition: ac3dsp.c:174
const uint8_t ff_ac3_band_start_tab[AC3_CRITICAL_BANDS+1]
Starting frequency coefficient bin for each critical band.
Definition: ac3.c:35
static int ac3_compute_mantissa_size_c(uint16_t mant_cnt[6][16])
Definition: ac3dsp.c:144
int(* ac3_max_msb_abs_int16)(const int16_t *src, int len)
Calculate the maximum MSB of the absolute value of each element in an array of int16_t.
Definition: ac3dsp.h:54
void(* ac3_lshift_int16)(int16_t *src, unsigned int len, unsigned int shift)
Left-shift each value in an array of int16_t by a specified amount.
Definition: ac3dsp.h:65
#define FFMAX(a, b)
Definition: common.h:94
#define MUL16(ra, rb)
Definition: mathops.h:88
int8_t exp
Definition: eval.c:72
void(* ac3_rshift_int32)(int32_t *src, unsigned int len, unsigned int shift)
Right-shift each value in an array of int32_t by a specified amount.
Definition: ac3dsp.h:76
static SDL_Window * window
Definition: ffplay.c:362
#define md
#define FFMIN(a, b)
Definition: common.h:96
#define ARCH_ARM
Definition: config.h:19
av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
Definition: ac3dsp.c:422
uint8_t w
Definition: llviddspenc.c:38
int32_t
static void apply_window_int16_c(int16_t *output, const int16_t *input, const int16_t *window, unsigned int len)
Definition: ac3dsp.c:377
void ff_ac3dsp_downmix_fixed(AC3DSPContext *c, int32_t **samples, int16_t **matrix, int out_ch, int in_ch, int len)
Definition: ac3dsp.c:350
#define av_log2
Definition: intmath.h:83
void(* sum_square_butterfly_int32)(int64_t sum[4], const int32_t *coef0, const int32_t *coef1, int len)
Definition: ac3dsp.h:129
void(* downmix_fixed)(int32_t **samples, int16_t **matrix, int len)
Definition: ac3dsp.h:138
Libavcodec external API header.
static void ac3_update_bap_counts_c(uint16_t mant_cnt[16], uint8_t *bap, int len)
Definition: ac3dsp.c:133
static void ac3_downmix_5_to_1_symmetric_c(float **samples, float **matrix, int len)
Definition: ac3dsp.c:239
static void ac3_exponent_min_c(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
Definition: ac3dsp.c:27
int(* compute_mantissa_size)(uint16_t mant_cnt[6][16])
Calculate the number of bits needed to encode a set of mantissas.
Definition: ac3dsp.h:125
#define AC3_MAX_BLOCKS
Definition: ac3.h:37
#define ARCH_MIPS
Definition: config.h:26
static void ac3_rshift_int32_c(int32_t *src, unsigned int len, unsigned int shift)
Definition: ac3dsp.c:74
static void ac3_extract_exponents_c(uint8_t *exp, int32_t *coef, int nb_coefs)
Definition: ac3dsp.c:164
void(* ac3_exponent_min)(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
Set each encoded exponent in a block to the minimum of itself and the exponents in the same frequency...
Definition: ac3dsp.h:43
#define v0
Definition: regdef.h:26
static void ac3_downmix_5_to_1_symmetric_c_fixed(int32_t **samples, int16_t **matrix, int len)
Definition: ac3dsp.c:305
static double c[64]
const uint16_t ff_ac3_bap_bits[16]
Number of mantissa bits written for each bap value.
Definition: ac3dsp.c:140
static void float_to_fixed24_c(int32_t *dst, const float *src, unsigned int len)
Definition: ac3dsp.c:90
int len
static void ac3_bit_alloc_calc_bap_c(int16_t *mask, int16_t *psd, int start, int end, int snr_offset, int floor, const uint8_t *bap_tab, uint8_t *bap)
Definition: ac3dsp.c:106
#define MAC64(d, a, b)
Definition: mathops.h:74
void(* sum_square_butterfly_float)(float sum[4], const float *coef0, const float *coef1, int len)
Definition: ac3dsp.h:132
static void ac3_downmix_c(float **samples, float **matrix, int out_ch, int in_ch, int len)
Definition: ac3dsp.c:256
void INT64 start
Definition: avisynth_c.h:690
static void ac3_lshift_int16_c(int16_t *src, unsigned int len, unsigned int shift)
Definition: ac3dsp.c:55
static void ac3_sum_square_butterfly_float_c(float sum[4], const float *coef0, const float *coef1, int len)
Definition: ac3dsp.c:195
Common code between the AC-3 encoder and decoder.
void(* float_to_fixed24)(int32_t *dst, const float *src, unsigned int len)
Convert an array of float in range [-1.0,1.0] to int32_t with range [-(1<<24),(1<<24)].
Definition: ac3dsp.h:89