1 /*
2 * E-AC-3 decoder
3 * Copyright (c) 2007 Bartlomiej Wolowiec <bartek.wolowiec@gmail.com>
4 * Copyright (c) 2008 Justin Ruggles
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 /*
24 * There are several features of E-AC-3 that this decoder does not yet support.
25 *
26 * Enhanced Coupling
27 * No known samples exist. If any ever surface, this feature should not be
28 * too difficult to implement.
29 *
30 * Reduced Sample Rates
31 * No known samples exist. The spec also does not give clear information
32 * on how this is to be implemented.
33 *
34 * Transient Pre-noise Processing
35 * This is side information which a decoder should use to reduce artifacts
36 * caused by transients. There are samples which are known to have this
37 * information, but this decoder currently ignores it.
38 */
39
40
47
48 /** gain adaptive quantization mode */
55
57 {
59 uint8_t wrapflag[SPX_MAX_BANDS]={1,0,}, num_copy_sections, copy_sizes[SPX_MAX_BANDS];
60 float rms_energy[SPX_MAX_BANDS];
61
62 /* Set copy index mapping table. Set wrap flags to apply a notch filter at
63 wrap points later on. */
64 bin =
s->spx_dst_start_freq;
65 num_copy_sections = 0;
66 for (bnd = 0; bnd <
s->num_spx_bands; bnd++) {
67 int copysize;
68 int bandsize =
s->spx_band_sizes[bnd];
69 if (bin + bandsize >
s->spx_src_start_freq) {
70 copy_sizes[num_copy_sections++] = bin -
s->spx_dst_start_freq;
71 bin =
s->spx_dst_start_freq;
72 wrapflag[bnd] = 1;
73 }
74 for (
i = 0;
i < bandsize;
i += copysize) {
75 if (bin ==
s->spx_src_start_freq) {
76 copy_sizes[num_copy_sections++] = bin -
s->spx_dst_start_freq;
77 bin =
s->spx_dst_start_freq;
78 }
79 copysize =
FFMIN(bandsize -
i,
s->spx_src_start_freq - bin);
80 bin += copysize;
81 }
82 }
83 copy_sizes[num_copy_sections++] = bin -
s->spx_dst_start_freq;
84
85 for (ch = 1; ch <=
s->fbw_channels; ch++) {
86 if (!
s->channel_uses_spx[ch])
87 continue;
88
89 /* Copy coeffs from normal bands to extension bands */
90 bin =
s->spx_src_start_freq;
91 for (
i = 0;
i < num_copy_sections;
i++) {
92 memcpy(&
s->transform_coeffs[ch][bin],
93 &
s->transform_coeffs[ch][
s->spx_dst_start_freq],
96 }
97
98 /* Calculate RMS energy for each SPX band. */
99 bin =
s->spx_src_start_freq;
100 for (bnd = 0; bnd <
s->num_spx_bands; bnd++) {
101 int bandsize =
s->spx_band_sizes[bnd];
102 float accum = 0.0f;
103 for (
i = 0;
i < bandsize;
i++) {
104 float coeff =
s->transform_coeffs[ch][bin++];
106 }
107 rms_energy[bnd] =
sqrtf(accum / bandsize);
108 }
109
110 /* Apply a notch filter at transitions between normal and extension
111 bands and at all wrap points. */
112 if (
s->spx_atten_code[ch] >= 0) {
114 bin =
s->spx_src_start_freq - 2;
115 for (bnd = 0; bnd <
s->num_spx_bands; bnd++) {
116 if (wrapflag[bnd]) {
117 INTFLOAT *coeffs = &
s->transform_coeffs[ch][bin];
118 coeffs[0] *= atten_tab[0];
119 coeffs[1] *= atten_tab[1];
120 coeffs[2] *= atten_tab[2];
121 coeffs[3] *= atten_tab[1];
122 coeffs[4] *= atten_tab[0];
123 }
124 bin +=
s->spx_band_sizes[bnd];
125 }
126 }
127
128 /* Apply noise-blended coefficient scaling based on previously
129 calculated RMS energy, blending factors, and SPX coordinates for
130 each band. */
131 bin =
s->spx_src_start_freq;
132 for (bnd = 0; bnd <
s->num_spx_bands; bnd++) {
133 float nscale =
s->spx_noise_blend[ch][bnd] * rms_energy[bnd] * (1.0f / INT32_MIN);
134 float sscale =
s->spx_signal_blend[ch][bnd];
135 #if USE_FIXED
136 // spx_noise_blend and spx_signal_blend are both FP.23
137 nscale *= 1.0 / (1<<23);
138 sscale *= 1.0 / (1<<23);
139 if (nscale < -1.0)
140 nscale = -1.0;
141 #endif
142 for (
i = 0;
i <
s->spx_band_sizes[bnd];
i++) {
144 s->transform_coeffs[ch][bin] *= sscale;
145 s->transform_coeffs[ch][bin++] +=
noise;
146 }
147 }
148 }
149 }
150
151
152 /** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<23)) */
153 #define COEFF_0 10273905LL
154
155 /** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<23)) = lrint(M_SQRT2*(1<<23)) */
156 #define COEFF_1 11863283LL
157
158 /** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<23)) */
159 #define COEFF_2 3070444LL
160
161 /**
162 * Calculate 6-point IDCT of the pre-mantissas.
163 * All calculations are 24-bit fixed-point.
164 */
166 {
168 int even0, even1, even2, odd0, odd1, odd2;
169
170 odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5];
171
172 even2 = ( pre_mant[2] *
COEFF_0) >> 23;
174 odd0 = ((pre_mant[1] + pre_mant[5]) *
COEFF_2) >> 23;
175
176 even0 = pre_mant[0] + (
tmp >> 1);
177 even1 = pre_mant[0] -
tmp;
178
182
184 odd0 =
tmp + pre_mant[1] + pre_mant[3];
185 odd2 =
tmp + pre_mant[5] - pre_mant[3];
186
187 pre_mant[0] = even0 + odd0;
188 pre_mant[1] = even1 + odd1;
189 pre_mant[2] = even2 + odd2;
190 pre_mant[3] = even2 - odd2;
191 pre_mant[4] = even1 - odd1;
192 pre_mant[5] = even0 - odd0;
193 }
194
196 {
198 int end_bap, gaq_mode;
201
203 end_bap = (gaq_mode < 2) ? 12 : 17;
204
205 /* if GAQ gain is used, decode gain codes for bins with hebap between
206 8 and end_bap */
207 gs = 0;
209 /* read 1-bit GAQ gain codes */
210 for (bin =
s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
211 if (
s->bap[ch][bin] > 7 &&
s->bap[ch][bin] < end_bap)
212 gaq_gain[gs++] =
get_bits1(gbc) << (gaq_mode-1);
213 }
215 /* read 1.67-bit GAQ gain codes (3 codes in 5 bits) */
216 int gc = 2;
217 for (bin =
s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
218 if (
s->bap[ch][bin] > 7 &&
s->bap[ch][bin] < 17) {
219 if (gc++ == 2) {
221 if (group_code > 26) {
223 group_code = 26;
224 }
228 gc = 0;
229 }
230 }
231 }
232 }
233
234 gs=0;
235 for (bin =
s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
236 int hebap =
s->bap[ch][bin];
238 if (!hebap) {
239 /* zero-mantissa dithering */
241 s->pre_mantissa[ch][bin][
blk] = (
av_lfg_get(&
s->dith_state) & 0x7FFFFF) - 0x400000;
242 }
243 } else if (hebap < 8) {
244 /* Vector Quantization */
248 }
249 } else {
250 /* Gain Adaptive Quantization */
251 int gbits, log_gain;
253 log_gain = gaq_gain[gs++];
254 } else {
255 log_gain = 0;
256 }
257 gbits =
bits - log_gain;
258
261 if (log_gain && mant == -(1 << (gbits-1))) {
262 /* large mantissa */
264 int mbits =
bits - (2 - log_gain);
266 mant = ((unsigned)mant) << (23 - (mbits - 1));
267 /* remap mantissa value to correct for asymmetric quantization */
268 if (mant >= 0)
269 b = 1 << (23 - log_gain);
270 else
273 } else {
274 /* small mantissa, no GAQ, or Gk=1 */
275 mant *= (1 << 24 -
bits);
276 if (!log_gain) {
277 /* remap mantissa value for no GAQ or Gk=1 */
279 }
280 }
281 s->pre_mantissa[ch][bin][
blk] = mant;
282 }
283 }
284 idct6(
s->pre_mantissa[ch][bin]);
285 }
286 }
287
289 {
291 int ac3_exponent_strategy, parse_aht_info, parse_spx_atten_data;
292 int parse_transient_proc_info;
293 int num_cpl_blocks;
295
296 /* An E-AC-3 stream can have multiple independent streams which the
297 application can select from. each independent stream can also contain
298 dependent streams which are used to add or replace channels. */
302 }
303
304 /* The substream id indicates which substream this frame belongs to. each
305 independent stream has its own substream id, and the dependent streams
306 associated to an independent stream have matching substream id's. */
307 if (
s->substreamid) {
308 /* only decode substream with id=0. skip any additional substreams. */
309 if (!
s->eac3_subsbtreamid_found) {
310 s->eac3_subsbtreamid_found = 1;
312 }
314 }
315
317 /* The E-AC-3 specification does not tell how to handle reduced sample
318 rates in bit allocation. The best assumption would be that it is
319 handled like AC-3 DolbyNet, but we cannot be sure until we have a
320 sample which utilizes this feature. */
323 }
324
325 /* volume control params */
326 for (
i = 0;
i < (
s->channel_mode ? 1 : 2);
i++) {
328 if (
s->dialog_normalization[
i] == 0) {
329 s->dialog_normalization[
i] = -31;
330 }
331 if (
s->target_level != 0) {
333 (
float)(
s->target_level -
s->dialog_normalization[
i])/6.0f);
334 }
337 }
338 }
339
341
342 /* mixing metadata */
353
354 /* informational metadata */
356
357 /* additional bitstream info */
359
360 /* audio frame syntax flags, strategy data, and per-frame data */
361
362 if (
s->num_blocks == 6) {
365 } else {
366 /* less than 6 blocks, so use AC-3-style exponent strategy syntax, and
367 do not use AHT */
368 ac3_exponent_strategy = 1;
369 parse_aht_info = 0;
370 }
371
372 s->snr_offset_strategy =
get_bits(gbc, 2);
373 parse_transient_proc_info =
get_bits1(gbc);
374
376 if (!
s->block_switch_syntax)
377 memset(
s->block_switch, 0,
sizeof(
s->block_switch));
378
380 if (!
s->dither_flag_syntax) {
381 for (ch = 1; ch <=
s->fbw_channels; ch++)
382 s->dither_flag[ch] = 1;
383 }
384 s->dither_flag[
CPL_CH] =
s->dither_flag[
s->lfe_ch] = 0;
385
387 if (!
s->bit_allocation_syntax) {
388 /* set default bit allocation parameters */
394 }
395
400
401 /* coupling strategy occurrence and coupling use per block */
402 num_cpl_blocks = 0;
403 if (
s->channel_mode > 1) {
406 if (
s->cpl_strategy_exists[
blk]) {
408 } else {
409 s->cpl_in_use[
blk] =
s->cpl_in_use[
blk-1];
410 }
411 num_cpl_blocks +=
s->cpl_in_use[
blk];
412 }
413 } else {
414 memset(
s->cpl_in_use, 0,
sizeof(
s->cpl_in_use));
415 }
416
417 /* exponent strategy data */
418 if (ac3_exponent_strategy) {
419 /* AC-3-style exponent strategy syntax */
421 for (ch = !
s->cpl_in_use[
blk]; ch <= s->fbw_channels; ch++) {
423 }
424 }
425 } else {
426 /* LUT-based exponent strategy syntax */
427 for (ch = !((
s->channel_mode > 1) && num_cpl_blocks); ch <= s->fbw_channels; ch++) {
431 }
432 }
433 }
434 /* LFE exponent strategy */
438 }
439 }
440 /* original exponent strategies if this stream was converted from AC-3 */
443 skip_bits(gbc, 5 *
s->fbw_channels);
// skip converter channel exponent strategy
444 }
445
446 /* determine which channels use AHT */
447 if (parse_aht_info) {
448 /* For AHT to be used, all non-zero blocks must reuse exponents from
449 the first block. Furthermore, for AHT to be used in the coupling
450 channel, all blocks must use coupling and use the same coupling
451 strategy. */
453 for (ch = (num_cpl_blocks != 6); ch <=
s->channels; ch++) {
454 int use_aht = 1;
457 (!ch &&
s->cpl_strategy_exists[
blk])) {
458 use_aht = 0;
459 break;
460 }
461 }
462 s->channel_uses_aht[ch] = use_aht &&
get_bits1(gbc);
463 }
464 } else {
465 memset(
s->channel_uses_aht, 0,
sizeof(
s->channel_uses_aht));
466 }
467
468 /* per-frame SNR offset */
469 if (!
s->snr_offset_strategy) {
470 int csnroffst = (
get_bits(gbc, 6) - 15) << 4;
471 int snroffst = (csnroffst +
get_bits(gbc, 4)) << 2;
472 for (ch = 0; ch <=
s->channels; ch++)
473 s->snr_offset[ch] = snroffst;
474 }
475
476 /* transient pre-noise processing data */
477 if (parse_transient_proc_info) {
478 for (ch = 1; ch <=
s->fbw_channels; ch++) {
479 if (
get_bits1(gbc)) {
// channel in transient processing
480 skip_bits(gbc, 10);
// skip transient processing location
481 skip_bits(gbc, 8);
// skip transient processing length
482 }
483 }
484 }
485
486 /* spectral extension attenuation data */
487 for (ch = 1; ch <=
s->fbw_channels; ch++) {
488 if (parse_spx_atten_data &&
get_bits1(gbc)) {
489 s->spx_atten_code[ch] =
get_bits(gbc, 5);
490 } else {
491 s->spx_atten_code[ch] = -1;
492 }
493 }
494
495 /* block start information */
497 /* reference: Section E2.3.2.27
498 nblkstrtbits = (numblks - 1) * (4 + ceiling(log2(words_per_frame)))
499 The spec does not say what this data is or what it's used for.
500 It is likely the offset of each block within the frame. */
501 int block_start_bits = (
s->num_blocks-1) * (4 +
av_log2(
s->frame_size-2));
504 }
505
506 /* syntax state initialization */
507 for (ch = 1; ch <=
s->fbw_channels; ch++) {
508 s->first_spx_coords[ch] = 1;
509 s->first_cpl_coords[ch] = 1;
510 }
511 s->first_cpl_leak = 1;
512
513 return 0;
514 }