Libav
ac3.c
Go to the documentation of this file.
1 /*
2  * Common code between the AC-3 encoder and decoder
3  * Copyright (c) 2000 Fabrice Bellard
4  *
5  * This file is part of Libav.
6  *
7  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
27 #include "libavutil/common.h"
28 
29 #include "avcodec.h"
30 #include "ac3.h"
31 
36  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
37  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
38  20, 21, 22, 23, 24, 25, 26, 27, 28, 31,
39  34, 37, 40, 43, 46, 49, 55, 61, 67, 73,
40  79, 85, 97, 109, 121, 133, 157, 181, 205, 229, 253
41 };
42 
43 #if CONFIG_HARDCODED_TABLES
44 
48 const uint8_t ff_ac3_bin_to_band_tab[253] = {
49  0,
50  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
51  13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
52  25, 26, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30,
53  31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34,
54  35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36,
55  37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38,
56  39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40,
57  41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
58  42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
59  43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
60  44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
61  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
62  45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
63  46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
64  46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
65  47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
66  47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
67  48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
68  48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
69  49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
70  49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49
71 };
72 
73 #else /* CONFIG_HARDCODED_TABLES */
75 #endif
76 
77 static inline int calc_lowcomp1(int a, int b0, int b1, int c)
78 {
79  if ((b0 + 256) == b1) {
80  a = c;
81  } else if (b0 > b1) {
82  a = FFMAX(a - 64, 0);
83  }
84  return a;
85 }
86 
87 static inline int calc_lowcomp(int a, int b0, int b1, int bin)
88 {
89  if (bin < 7) {
90  return calc_lowcomp1(a, b0, b1, 384);
91  } else if (bin < 20) {
92  return calc_lowcomp1(a, b0, b1, 320);
93  } else {
94  return FFMAX(a - 128, 0);
95  }
96 }
97 
98 void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd,
99  int16_t *band_psd)
100 {
101  int bin, band;
102 
103  /* exponent mapping to PSD */
104  for (bin = start; bin < end; bin++) {
105  psd[bin]=(3072 - (exp[bin] << 7));
106  }
107 
108  /* PSD integration */
109  bin = start;
110  band = ff_ac3_bin_to_band_tab[start];
111  do {
112  int v = psd[bin++];
113  int band_end = FFMIN(ff_ac3_band_start_tab[band+1], end);
114  for (; bin < band_end; bin++) {
115  int max = FFMAX(v, psd[bin]);
116  /* logadd */
117  int adr = FFMIN(max - ((v + psd[bin] + 1) >> 1), 255);
118  v = max + ff_ac3_log_add_tab[adr];
119  }
120  band_psd[band++] = v;
121  } while (end > ff_ac3_band_start_tab[band]);
122 }
123 
125  int start, int end, int fast_gain, int is_lfe,
126  int dba_mode, int dba_nsegs, uint8_t *dba_offsets,
127  uint8_t *dba_lengths, uint8_t *dba_values,
128  int16_t *mask)
129 {
130  int16_t excite[AC3_CRITICAL_BANDS]; /* excitation */
131  int band;
132  int band_start, band_end, begin, end1;
133  int lowcomp, fastleak, slowleak;
134 
135  /* excitation function */
136  band_start = ff_ac3_bin_to_band_tab[start];
137  band_end = ff_ac3_bin_to_band_tab[end-1] + 1;
138 
139  if (band_start == 0) {
140  lowcomp = 0;
141  lowcomp = calc_lowcomp1(lowcomp, band_psd[0], band_psd[1], 384);
142  excite[0] = band_psd[0] - fast_gain - lowcomp;
143  lowcomp = calc_lowcomp1(lowcomp, band_psd[1], band_psd[2], 384);
144  excite[1] = band_psd[1] - fast_gain - lowcomp;
145  begin = 7;
146  for (band = 2; band < 7; band++) {
147  if (!(is_lfe && band == 6))
148  lowcomp = calc_lowcomp1(lowcomp, band_psd[band], band_psd[band+1], 384);
149  fastleak = band_psd[band] - fast_gain;
150  slowleak = band_psd[band] - s->slow_gain;
151  excite[band] = fastleak - lowcomp;
152  if (!(is_lfe && band == 6)) {
153  if (band_psd[band] <= band_psd[band+1]) {
154  begin = band + 1;
155  break;
156  }
157  }
158  }
159 
160  end1 = FFMIN(band_end, 22);
161  for (band = begin; band < end1; band++) {
162  if (!(is_lfe && band == 6))
163  lowcomp = calc_lowcomp(lowcomp, band_psd[band], band_psd[band+1], band);
164  fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
165  slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
166  excite[band] = FFMAX(fastleak - lowcomp, slowleak);
167  }
168  begin = 22;
169  } else {
170  /* coupling channel */
171  begin = band_start;
172  fastleak = (s->cpl_fast_leak << 8) + 768;
173  slowleak = (s->cpl_slow_leak << 8) + 768;
174  }
175 
176  for (band = begin; band < band_end; band++) {
177  fastleak = FFMAX(fastleak - s->fast_decay, band_psd[band] - fast_gain);
178  slowleak = FFMAX(slowleak - s->slow_decay, band_psd[band] - s->slow_gain);
179  excite[band] = FFMAX(fastleak, slowleak);
180  }
181 
182  /* compute masking curve */
183 
184  for (band = band_start; band < band_end; band++) {
185  int tmp = s->db_per_bit - band_psd[band];
186  if (tmp > 0) {
187  excite[band] += tmp >> 2;
188  }
189  mask[band] = FFMAX(ff_ac3_hearing_threshold_tab[band >> s->sr_shift][s->sr_code], excite[band]);
190  }
191 
192  /* delta bit allocation */
193 
194  if (dba_mode == DBA_REUSE || dba_mode == DBA_NEW) {
195  int i, seg, delta;
196  if (dba_nsegs > 8)
197  return -1;
198  band = band_start;
199  for (seg = 0; seg < dba_nsegs; seg++) {
200  band += dba_offsets[seg];
201  if (band >= AC3_CRITICAL_BANDS || dba_lengths[seg] > AC3_CRITICAL_BANDS-band)
202  return -1;
203  if (dba_values[seg] >= 4) {
204  delta = (dba_values[seg] - 3) << 7;
205  } else {
206  delta = (dba_values[seg] - 4) << 7;
207  }
208  for (i = 0; i < dba_lengths[seg]; i++) {
209  mask[band++] += delta;
210  }
211  }
212  }
213  return 0;
214 }
215 
222 {
223 #if !CONFIG_HARDCODED_TABLES
224  /* compute ff_ac3_bin_to_band_tab from ff_ac3_band_start_tab */
225  int bin = 0, band;
226  for (band = 0; band < AC3_CRITICAL_BANDS; band++) {
227  int band_end = ff_ac3_band_start_tab[band+1];
228  while (bin < band_end)
229  ff_ac3_bin_to_band_tab[bin++] = band;
230  }
231 #endif /* !CONFIG_HARDCODED_TABLES */
232 }
uint8_t ff_ac3_bin_to_band_tab[253]
Definition: ac3.c:74
av_cold void ff_ac3_common_init(void)
Initialize some tables.
Definition: ac3.c:221
Definition: ac3.h:65
uint8_t
#define av_cold
Definition: attributes.h:66
float delta
const uint16_t ff_ac3_hearing_threshold_tab[AC3_CRITICAL_BANDS][3]
Definition: ac3tab.c:217
static const uint16_t mask[17]
Definition: lzw.c:38
int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, int start, int end, int fast_gain, int is_lfe, int dba_mode, int dba_nsegs, uint8_t *dba_offsets, uint8_t *dba_lengths, uint8_t *dba_values, int16_t *mask)
Calculate the masking curve.
Definition: ac3.c:124
const uint8_t ff_ac3_band_start_tab[AC3_CRITICAL_BANDS+1]
Starting frequency coefficient bin for each critical band.
Definition: ac3.c:35
Definition: ac3.h:66
#define FFMAX(a, b)
Definition: common.h:64
static int calc_lowcomp(int a, int b0, int b1, int bin)
Definition: ac3.c:87
#define FFMIN(a, b)
Definition: common.h:66
static int calc_lowcomp1(int a, int b0, int b1, int c)
Definition: ac3.c:77
Libavcodec external API header.
const uint8_t ff_ac3_log_add_tab[260]
Definition: ac3tab.c:188
#define AC3_CRITICAL_BANDS
Definition: ac3.h:39
common internal and external API header
void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd, int16_t *band_psd)
Calculate the log power-spectral density of the input signal.
Definition: ac3.c:98
static uint8_t tmp[8]
Definition: des.c:38
Common code between the AC-3 encoder and decoder.