FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/eac3dec.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 259 309 83.8%
Functions: 4 4 100.0%
Branches: 196 262 74.8%

Line Branch Exec Source
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
41 #include "avcodec.h"
42 #include "ac3.h"
43 #include "ac3_parser_internal.h"
44 #include "ac3dec.h"
45 #include "ac3dec_data.h"
46 #include "eac3_data.h"
47
48 /** gain adaptive quantization mode */
49 typedef enum {
50 EAC3_GAQ_NO =0,
51 EAC3_GAQ_12,
52 EAC3_GAQ_14,
53 EAC3_GAQ_124
54 } EAC3GaqMode;
55
56 #define EAC3_SR_CODE_REDUCED 3
57
58 3252 static void ff_eac3_apply_spectral_extension(AC3DecodeContext *s)
59 {
60 int bin, bnd, ch, i;
61 3252 uint8_t wrapflag[SPX_MAX_BANDS]={1,0,}, num_copy_sections, copy_sizes[SPX_MAX_BANDS];
62 float rms_energy[SPX_MAX_BANDS];
63
64 /* Set copy index mapping table. Set wrap flags to apply a notch filter at
65 wrap points later on. */
66 3252 bin = s->spx_dst_start_freq;
67 3252 num_copy_sections = 0;
68
2/2
✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 3252 times.
10620 for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
69 int copysize;
70 7368 int bandsize = s->spx_band_sizes[bnd];
71
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7368 times.
7368 if (bin + bandsize > s->spx_src_start_freq) {
72 copy_sizes[num_copy_sections++] = bin - s->spx_dst_start_freq;
73 bin = s->spx_dst_start_freq;
74 wrapflag[bnd] = 1;
75 }
76
2/2
✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 7368 times.
14736 for (i = 0; i < bandsize; i += copysize) {
77
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7368 times.
7368 if (bin == s->spx_src_start_freq) {
78 copy_sizes[num_copy_sections++] = bin - s->spx_dst_start_freq;
79 bin = s->spx_dst_start_freq;
80 }
81 7368 copysize = FFMIN(bandsize - i, s->spx_src_start_freq - bin);
82 7368 bin += copysize;
83 }
84 }
85 3252 copy_sizes[num_copy_sections++] = bin - s->spx_dst_start_freq;
86
87
2/2
✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 3252 times.
10620 for (ch = 1; ch <= s->fbw_channels; ch++) {
88
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7368 times.
7368 if (!s->channel_uses_spx[ch])
89 continue;
90
91 /* Copy coeffs from normal bands to extension bands */
92 7368 bin = s->spx_src_start_freq;
93
2/2
✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 7368 times.
14736 for (i = 0; i < num_copy_sections; i++) {
94 7368 memcpy(&s->transform_coeffs[ch][bin],
95 7368 &s->transform_coeffs[ch][s->spx_dst_start_freq],
96 7368 copy_sizes[i]*sizeof(INTFLOAT));
97 7368 bin += copy_sizes[i];
98 }
99
100 /* Calculate RMS energy for each SPX band. */
101 7368 bin = s->spx_src_start_freq;
102
2/2
✓ Branch 0 taken 19056 times.
✓ Branch 1 taken 7368 times.
26424 for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
103 19056 int bandsize = s->spx_band_sizes[bnd];
104 19056 float accum = 0.0f;
105
2/2
✓ Branch 0 taken 245952 times.
✓ Branch 1 taken 19056 times.
265008 for (i = 0; i < bandsize; i++) {
106 245952 float coeff = s->transform_coeffs[ch][bin++];
107 245952 accum += coeff * coeff;
108 }
109 19056 rms_energy[bnd] = sqrtf(accum / bandsize);
110 }
111
112 /* Apply a notch filter at transitions between normal and extension
113 bands and at all wrap points. */
114
2/2
✓ Branch 0 taken 6330 times.
✓ Branch 1 taken 1038 times.
7368 if (s->spx_atten_code[ch] >= 0) {
115 6330 const float *atten_tab = ff_eac3_spx_atten_tab[s->spx_atten_code[ch]];
116 6330 bin = s->spx_src_start_freq - 2;
117
2/2
✓ Branch 0 taken 13866 times.
✓ Branch 1 taken 6330 times.
20196 for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
118
2/2
✓ Branch 0 taken 6330 times.
✓ Branch 1 taken 7536 times.
13866 if (wrapflag[bnd]) {
119 6330 INTFLOAT *coeffs = &s->transform_coeffs[ch][bin];
120 6330 coeffs[0] *= atten_tab[0];
121 6330 coeffs[1] *= atten_tab[1];
122 6330 coeffs[2] *= atten_tab[2];
123 6330 coeffs[3] *= atten_tab[1];
124 6330 coeffs[4] *= atten_tab[0];
125 }
126 13866 bin += s->spx_band_sizes[bnd];
127 }
128 }
129
130 /* Apply noise-blended coefficient scaling based on previously
131 calculated RMS energy, blending factors, and SPX coordinates for
132 each band. */
133 7368 bin = s->spx_src_start_freq;
134
2/2
✓ Branch 0 taken 19056 times.
✓ Branch 1 taken 7368 times.
26424 for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
135 19056 float nscale = s->spx_noise_blend[ch][bnd] * rms_energy[bnd] * (1.0f / INT32_MIN);
136 19056 float sscale = s->spx_signal_blend[ch][bnd];
137 #if USE_FIXED
138 // spx_noise_blend and spx_signal_blend are both FP.23
139 nscale *= 1.0 / (1<<23);
140 sscale *= 1.0 / (1<<23);
141 if (nscale < -1.0)
142 nscale = -1.0;
143 #endif
144
2/2
✓ Branch 0 taken 245952 times.
✓ Branch 1 taken 19056 times.
265008 for (i = 0; i < s->spx_band_sizes[bnd]; i++) {
145 245952 UINTFLOAT noise = (INTFLOAT)(nscale * (int32_t)av_lfg_get(&s->dith_state));
146 245952 s->transform_coeffs[ch][bin] *= sscale;
147 245952 s->transform_coeffs[ch][bin++] += noise;
148 }
149 }
150 }
151 3252 }
152
153
154 /** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<23)) */
155 #define COEFF_0 10273905LL
156
157 /** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<23)) = lrint(M_SQRT2*(1<<23)) */
158 #define COEFF_1 11863283LL
159
160 /** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<23)) */
161 #define COEFF_2 3070444LL
162
163 /**
164 * Calculate 6-point IDCT of the pre-mantissas.
165 * All calculations are 24-bit fixed-point.
166 */
167 99870 static void idct6(int pre_mant[6])
168 {
169 int tmp;
170 int even0, even1, even2, odd0, odd1, odd2;
171
172 99870 odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5];
173
174 99870 even2 = ( pre_mant[2] * COEFF_0) >> 23;
175 99870 tmp = ( pre_mant[4] * COEFF_1) >> 23;
176 99870 odd0 = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 23;
177
178 99870 even0 = pre_mant[0] + (tmp >> 1);
179 99870 even1 = pre_mant[0] - tmp;
180
181 99870 tmp = even0;
182 99870 even0 = tmp + even2;
183 99870 even2 = tmp - even2;
184
185 99870 tmp = odd0;
186 99870 odd0 = tmp + pre_mant[1] + pre_mant[3];
187 99870 odd2 = tmp + pre_mant[5] - pre_mant[3];
188
189 99870 pre_mant[0] = even0 + odd0;
190 99870 pre_mant[1] = even1 + odd1;
191 99870 pre_mant[2] = even2 + odd2;
192 99870 pre_mant[3] = even2 - odd2;
193 99870 pre_mant[4] = even1 - odd1;
194 99870 pre_mant[5] = even0 - odd0;
195 99870 }
196
197 816 static void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
198 {
199 int bin, blk, gs;
200 int end_bap, gaq_mode;
201 816 GetBitContext *gbc = &s->gbc;
202 int gaq_gain[AC3_MAX_COEFS];
203
204 816 gaq_mode = get_bits(gbc, 2);
205
2/2
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 198 times.
816 end_bap = (gaq_mode < 2) ? 12 : 17;
206
207 /* if GAQ gain is used, decode gain codes for bins with hebap between
208 8 and end_bap */
209 816 gs = 0;
210
4/4
✓ Branch 0 taken 259 times.
✓ Branch 1 taken 557 times.
✓ Branch 2 taken 146 times.
✓ Branch 3 taken 113 times.
816 if (gaq_mode == EAC3_GAQ_12 || gaq_mode == EAC3_GAQ_14) {
211 /* read 1-bit GAQ gain codes */
212
2/2
✓ Branch 0 taken 87559 times.
✓ Branch 1 taken 703 times.
88262 for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
213
4/4
✓ Branch 0 taken 32555 times.
✓ Branch 1 taken 55004 times.
✓ Branch 2 taken 31648 times.
✓ Branch 3 taken 907 times.
87559 if (s->bap[ch][bin] > 7 && s->bap[ch][bin] < end_bap)
214 31648 gaq_gain[gs++] = get_bits1(gbc) << (gaq_mode-1);
215 }
216
2/2
✓ Branch 0 taken 52 times.
✓ Branch 1 taken 61 times.
113 } else if (gaq_mode == EAC3_GAQ_124) {
217 /* read 1.67-bit GAQ gain codes (3 codes in 5 bits) */
218 52 int gc = 2;
219
2/2
✓ Branch 0 taken 6508 times.
✓ Branch 1 taken 52 times.
6560 for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
220
3/4
✓ Branch 0 taken 1905 times.
✓ Branch 1 taken 4603 times.
✓ Branch 2 taken 1905 times.
✗ Branch 3 not taken.
6508 if (s->bap[ch][bin] > 7 && s->bap[ch][bin] < 17) {
221
2/2
✓ Branch 0 taken 655 times.
✓ Branch 1 taken 1250 times.
1905 if (gc++ == 2) {
222 655 int group_code = get_bits(gbc, 5);
223
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 655 times.
655 if (group_code > 26) {
224 av_log(s->avctx, AV_LOG_WARNING, "GAQ gain group code out-of-range\n");
225 group_code = 26;
226 }
227 655 gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][0];
228 655 gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][1];
229 655 gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][2];
230 655 gc = 0;
231 }
232 }
233 }
234 }
235
236 816 gs=0;
237
2/2
✓ Branch 0 taken 99870 times.
✓ Branch 1 taken 816 times.
100686 for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
238 99870 int hebap = s->bap[ch][bin];
239 99870 int bits = ff_eac3_bits_vs_hebap[hebap];
240
2/2
✓ Branch 0 taken 32108 times.
✓ Branch 1 taken 67762 times.
99870 if (!hebap) {
241 /* zero-mantissa dithering */
242
2/2
✓ Branch 0 taken 192648 times.
✓ Branch 1 taken 32108 times.
224756 for (blk = 0; blk < 6; blk++) {
243 192648 s->pre_mantissa[ch][bin][blk] = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000;
244 }
245
2/2
✓ Branch 0 taken 31275 times.
✓ Branch 1 taken 36487 times.
67762 } else if (hebap < 8) {
246 /* Vector Quantization */
247 31275 int v = get_bits(gbc, bits);
248
2/2
✓ Branch 0 taken 187650 times.
✓ Branch 1 taken 31275 times.
218925 for (blk = 0; blk < 6; blk++) {
249 187650 s->pre_mantissa[ch][bin][blk] = ff_eac3_mantissa_vq[hebap][v][blk] * (1 << 8);
250 }
251 } else {
252 /* Gain Adaptive Quantization */
253 int gbits, log_gain;
254
4/4
✓ Branch 0 taken 34460 times.
✓ Branch 1 taken 2027 times.
✓ Branch 2 taken 33553 times.
✓ Branch 3 taken 907 times.
36487 if (gaq_mode != EAC3_GAQ_NO && hebap < end_bap) {
255 33553 log_gain = gaq_gain[gs++];
256 } else {
257 2934 log_gain = 0;
258 }
259 36487 gbits = bits - log_gain;
260
261
2/2
✓ Branch 0 taken 218922 times.
✓ Branch 1 taken 36487 times.
255409 for (blk = 0; blk < 6; blk++) {
262 218922 int mant = get_sbits(gbc, gbits);
263
4/4
✓ Branch 0 taken 103134 times.
✓ Branch 1 taken 115788 times.
✓ Branch 2 taken 24721 times.
✓ Branch 3 taken 78413 times.
218922 if (log_gain && mant == -(1 << (gbits-1))) {
264 /* large mantissa */
265 int b;
266 24721 int mbits = bits - (2 - log_gain);
267 24721 mant = get_sbits(gbc, mbits);
268 24721 mant = ((unsigned)mant) << (23 - (mbits - 1));
269 /* remap mantissa value to correct for asymmetric quantization */
270
2/2
✓ Branch 0 taken 12278 times.
✓ Branch 1 taken 12443 times.
24721 if (mant >= 0)
271 12278 b = 1 << (23 - log_gain);
272 else
273 12443 b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1] * (1 << 8);
274 24721 mant += ((ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * (int64_t)mant) >> 15) + b;
275 } else {
276 /* small mantissa, no GAQ, or Gk=1 */
277 194201 mant *= (1 << 24 - bits);
278
2/2
✓ Branch 0 taken 115788 times.
✓ Branch 1 taken 78413 times.
194201 if (!log_gain) {
279 /* remap mantissa value for no GAQ or Gk=1 */
280 115788 mant += (ff_eac3_gaq_remap_1[hebap-8] * (int64_t)mant) >> 15;
281 }
282 }
283 218922 s->pre_mantissa[ch][bin][blk] = mant;
284 }
285 }
286 99870 idct6(s->pre_mantissa[ch][bin]);
287 }
288 816 }
289
290 1204 static int ff_eac3_parse_header(AC3DecodeContext *s)
291 {
292 int i, blk, ch;
293 int ac3_exponent_strategy, parse_aht_info, parse_spx_atten_data;
294 int parse_transient_proc_info;
295 int num_cpl_blocks;
296 1204 GetBitContext *gbc = &s->gbc;
297
298 /* An E-AC-3 stream can have multiple independent streams which the
299 application can select from. each independent stream can also contain
300 dependent streams which are used to add or replace channels. */
301
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->frame_type == EAC3_FRAME_TYPE_RESERVED) {
302 av_log(s->avctx, AV_LOG_ERROR, "Reserved frame type\n");
303 return AC3_PARSE_ERROR_FRAME_TYPE;
304 }
305
306 /* The substream id indicates which substream this frame belongs to. each
307 independent stream has its own substream id, and the dependent streams
308 associated to an independent stream have matching substream id's. */
309
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->substreamid) {
310 /* only decode substream with id=0. skip any additional substreams. */
311 if (!s->eac3_subsbtreamid_found) {
312 s->eac3_subsbtreamid_found = 1;
313 avpriv_request_sample(s->avctx, "Additional substreams");
314 }
315 return AC3_PARSE_ERROR_FRAME_TYPE;
316 }
317
318
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->bit_alloc_params.sr_code == EAC3_SR_CODE_REDUCED) {
319 /* The E-AC-3 specification does not tell how to handle reduced sample
320 rates in bit allocation. The best assumption would be that it is
321 handled like AC-3 DolbyNet, but we cannot be sure until we have a
322 sample which utilizes this feature. */
323 avpriv_request_sample(s->avctx, "Reduced sampling rate");
324 return AVERROR_PATCHWELCOME;
325 }
326 1204 skip_bits(gbc, 5); // skip bitstream id
327
328 /* volume control params */
329
3/4
✓ Branch 0 taken 2408 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1204 times.
✓ Branch 3 taken 1204 times.
2408 for (i = 0; i < (s->channel_mode ? 1 : 2); i++) {
330 1204 s->dialog_normalization[i] = -get_bits(gbc, 5);
331
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->dialog_normalization[i] == 0) {
332 s->dialog_normalization[i] = -31;
333 }
334
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->target_level != 0) {
335 s->level_gain[i] = powf(2.0f,
336 (float)(s->target_level - s->dialog_normalization[i])/6.0f);
337 }
338 1204 s->compression_exists[i] = get_bits1(gbc);
339
2/2
✓ Branch 0 taken 930 times.
✓ Branch 1 taken 274 times.
1204 if (s->compression_exists[i]) {
340 930 s->heavy_dynamic_range[i] = AC3_HEAVY_RANGE(get_bits(gbc, 8));
341 }
342 }
343
344 /* dependent stream channel map */
345
2/2
✓ Branch 0 taken 159 times.
✓ Branch 1 taken 1045 times.
1204 if (s->frame_type == EAC3_FRAME_TYPE_DEPENDENT) {
346
1/2
✓ Branch 1 taken 159 times.
✗ Branch 2 not taken.
159 if (get_bits1(gbc)) {
347 159 int64_t channel_layout = 0;
348 159 int channel_map = get_bits(gbc, 16);
349 159 av_log(s->avctx, AV_LOG_DEBUG, "channel_map: %0X\n", channel_map);
350
351
2/2
✓ Branch 0 taken 2544 times.
✓ Branch 1 taken 159 times.
2703 for (i = 0; i < 16; i++)
352
2/2
✓ Branch 0 taken 477 times.
✓ Branch 1 taken 2067 times.
2544 if (channel_map & (1 << (EAC3_MAX_CHANNELS - i - 1)))
353 477 channel_layout |= ff_eac3_custom_channel_map_locations[i][1];
354
355
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 159 times.
159 if (av_popcount64(channel_layout) > EAC3_MAX_CHANNELS) {
356 return AVERROR_INVALIDDATA;
357 }
358 159 s->channel_map = channel_map;
359 }
360 }
361
362 /* mixing metadata */
363
2/2
✓ Branch 1 taken 640 times.
✓ Branch 2 taken 564 times.
1204 if (get_bits1(gbc)) {
364 /* center and surround mix levels */
365
2/2
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 494 times.
640 if (s->channel_mode > AC3_CHMODE_STEREO) {
366 146 s->preferred_downmix = get_bits(gbc, 2);
367
1/2
✓ Branch 0 taken 146 times.
✗ Branch 1 not taken.
146 if (s->channel_mode & 1) {
368 /* if three front channels exist */
369 146 s->center_mix_level_ltrt = get_bits(gbc, 3);
370 146 s->center_mix_level = get_bits(gbc, 3);
371 }
372
1/2
✓ Branch 0 taken 146 times.
✗ Branch 1 not taken.
146 if (s->channel_mode & 4) {
373 /* if a surround channel exists */
374 146 s->surround_mix_level_ltrt = av_clip(get_bits(gbc, 3), 3, 7);
375 146 s->surround_mix_level = av_clip(get_bits(gbc, 3), 3, 7);
376 }
377 }
378
379 /* lfe mix level */
380
3/4
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 494 times.
✓ Branch 3 taken 146 times.
✗ Branch 4 not taken.
640 if (s->lfe_on && (s->lfe_mix_level_exists = get_bits1(gbc))) {
381 146 s->lfe_mix_level = get_bits(gbc, 5);
382 }
383
384 /* info for mixing with other streams and substreams */
385
1/2
✓ Branch 0 taken 640 times.
✗ Branch 1 not taken.
640 if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT) {
386
3/4
✓ Branch 0 taken 1280 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 640 times.
✓ Branch 3 taken 640 times.
1280 for (i = 0; i < (s->channel_mode ? 1 : 2); i++) {
387 // TODO: apply program scale factor
388
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 640 times.
640 if (get_bits1(gbc)) {
389 skip_bits(gbc, 6); // skip program scale factor
390 }
391 }
392
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 640 times.
640 if (get_bits1(gbc)) {
393 skip_bits(gbc, 6); // skip external program scale factor
394 }
395 /* skip mixing parameter data */
396
1/4
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 640 times.
640 switch(get_bits(gbc, 2)) {
397 case 1: skip_bits(gbc, 5); break;
398 case 2: skip_bits(gbc, 12); break;
399 case 3: {
400 int mix_data_size = (get_bits(gbc, 5) + 2) << 3;
401 skip_bits_long(gbc, mix_data_size);
402 break;
403 }
404 }
405 /* skip pan information for mono or dual mono source */
406
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 640 times.
640 if (s->channel_mode < AC3_CHMODE_STEREO) {
407 for (i = 0; i < (s->channel_mode ? 1 : 2); i++) {
408 if (get_bits1(gbc)) {
409 /* note: this is not in the ATSC A/52B specification
410 reference: ETSI TS 102 366 V1.1.1
411 section: E.1.3.1.25 */
412 skip_bits(gbc, 8); // skip pan mean direction index
413 skip_bits(gbc, 6); // skip reserved paninfo bits
414 }
415 }
416 }
417 /* skip mixing configuration information */
418
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 640 times.
640 if (get_bits1(gbc)) {
419 for (blk = 0; blk < s->num_blocks; blk++) {
420 if (s->num_blocks == 1 || get_bits1(gbc)) {
421 skip_bits(gbc, 5);
422 }
423 }
424 }
425 }
426 }
427
428 /* informational metadata */
429
2/2
✓ Branch 1 taken 771 times.
✓ Branch 2 taken 433 times.
1204 if (get_bits1(gbc)) {
430 771 s->bitstream_mode = get_bits(gbc, 3);
431 771 skip_bits(gbc, 2); // skip copyright bit and original bitstream bit
432
2/2
✓ Branch 0 taken 625 times.
✓ Branch 1 taken 146 times.
771 if (s->channel_mode == AC3_CHMODE_STEREO) {
433 625 s->dolby_surround_mode = get_bits(gbc, 2);
434 625 s->dolby_headphone_mode = get_bits(gbc, 2);
435 }
436
2/2
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 625 times.
771 if (s->channel_mode >= AC3_CHMODE_2F2R) {
437 146 s->dolby_surround_ex_mode = get_bits(gbc, 2);
438 }
439
3/4
✓ Branch 0 taken 1542 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 771 times.
✓ Branch 3 taken 771 times.
1542 for (i = 0; i < (s->channel_mode ? 1 : 2); i++) {
440
1/2
✓ Branch 1 taken 771 times.
✗ Branch 2 not taken.
771 if (get_bits1(gbc)) {
441 771 skip_bits(gbc, 8); // skip mix level, room type, and A/D converter type
442 }
443 }
444
1/2
✓ Branch 0 taken 771 times.
✗ Branch 1 not taken.
771 if (s->bit_alloc_params.sr_code != EAC3_SR_CODE_REDUCED) {
445 771 skip_bits1(gbc); // skip source sample rate code
446 }
447 }
448
449 /* converter synchronization flag
450 If frames are less than six blocks, this bit should be turned on
451 once every 6 blocks to indicate the start of a frame set.
452 reference: RFC 4598, Section 2.1.3 Frame Sets */
453
4/4
✓ Branch 0 taken 1045 times.
✓ Branch 1 taken 159 times.
✓ Branch 2 taken 98 times.
✓ Branch 3 taken 947 times.
1204 if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT && s->num_blocks != 6) {
454 98 skip_bits1(gbc); // skip converter synchronization flag
455 }
456
457 /* original frame size code if this stream was converted from AC-3 */
458
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->frame_type == EAC3_FRAME_TYPE_AC3_CONVERT &&
459 (s->num_blocks == 6 || get_bits1(gbc))) {
460 skip_bits(gbc, 6); // skip frame size code
461 }
462
463 /* additional bitstream info */
464
2/2
✓ Branch 1 taken 159 times.
✓ Branch 2 taken 1045 times.
1204 if (get_bits1(gbc)) {
465 159 int addbsil = get_bits(gbc, 6);
466
2/2
✓ Branch 0 taken 318 times.
✓ Branch 1 taken 159 times.
477 for (i = 0; i < addbsil + 1; i++) {
467
2/2
✓ Branch 0 taken 159 times.
✓ Branch 1 taken 159 times.
318 if (i == 0) {
468 /* In this 8 bit chunk, the LSB is equal to flag_ec3_extension_type_a
469 which can be used to detect Atmos presence */
470 159 skip_bits(gbc, 7);
471
1/2
✓ Branch 1 taken 159 times.
✗ Branch 2 not taken.
159 if (get_bits1(gbc)) {
472 159 s->eac3_extension_type_a = 1;
473 }
474 } else {
475 159 skip_bits(gbc, 8); // skip additional bit stream info
476 }
477 }
478 }
479
480 /* audio frame syntax flags, strategy data, and per-frame data */
481
482
2/2
✓ Branch 0 taken 1106 times.
✓ Branch 1 taken 98 times.
1204 if (s->num_blocks == 6) {
483 1106 ac3_exponent_strategy = get_bits1(gbc);
484 1106 parse_aht_info = get_bits1(gbc);
485 } else {
486 /* less than 6 blocks, so use AC-3-style exponent strategy syntax, and
487 do not use AHT */
488 98 ac3_exponent_strategy = 1;
489 98 parse_aht_info = 0;
490 }
491
492 1204 s->snr_offset_strategy = get_bits(gbc, 2);
493 1204 parse_transient_proc_info = get_bits1(gbc);
494
495 1204 s->block_switch_syntax = get_bits1(gbc);
496
1/2
✓ Branch 0 taken 1204 times.
✗ Branch 1 not taken.
1204 if (!s->block_switch_syntax)
497 1204 memset(s->block_switch, 0, sizeof(s->block_switch));
498
499 1204 s->dither_flag_syntax = get_bits1(gbc);
500
1/2
✓ Branch 0 taken 1204 times.
✗ Branch 1 not taken.
1204 if (!s->dither_flag_syntax) {
501
2/2
✓ Branch 0 taken 3164 times.
✓ Branch 1 taken 1204 times.
4368 for (ch = 1; ch <= s->fbw_channels; ch++)
502 3164 s->dither_flag[ch] = 1;
503 }
504 1204 s->dither_flag[CPL_CH] = s->dither_flag[s->lfe_ch] = 0;
505
506 1204 s->bit_allocation_syntax = get_bits1(gbc);
507
2/2
✓ Branch 0 taken 918 times.
✓ Branch 1 taken 286 times.
1204 if (!s->bit_allocation_syntax) {
508 /* set default bit allocation parameters */
509 918 s->bit_alloc_params.slow_decay = ff_ac3_slow_decay_tab[2];
510 918 s->bit_alloc_params.fast_decay = ff_ac3_fast_decay_tab[1];
511 918 s->bit_alloc_params.slow_gain = ff_ac3_slow_gain_tab [1];
512 918 s->bit_alloc_params.db_per_bit = ff_ac3_db_per_bit_tab[2];
513 918 s->bit_alloc_params.floor = ff_ac3_floor_tab [7];
514 }
515
516 1204 s->fast_gain_syntax = get_bits1(gbc);
517 1204 s->dba_syntax = get_bits1(gbc);
518 1204 s->skip_syntax = get_bits1(gbc);
519 1204 parse_spx_atten_data = get_bits1(gbc);
520
521 /* coupling strategy occurrence and coupling use per block */
522 1204 num_cpl_blocks = 0;
523
1/2
✓ Branch 0 taken 1204 times.
✗ Branch 1 not taken.
1204 if (s->channel_mode > 1) {
524
2/2
✓ Branch 0 taken 6734 times.
✓ Branch 1 taken 1204 times.
7938 for (blk = 0; blk < s->num_blocks; blk++) {
525
3/4
✓ Branch 0 taken 5530 times.
✓ Branch 1 taken 1204 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5530 times.
6734 s->cpl_strategy_exists[blk] = (!blk || get_bits1(gbc));
526
2/2
✓ Branch 0 taken 1204 times.
✓ Branch 1 taken 5530 times.
6734 if (s->cpl_strategy_exists[blk]) {
527 1204 s->cpl_in_use[blk] = get_bits1(gbc);
528 } else {
529 5530 s->cpl_in_use[blk] = s->cpl_in_use[blk-1];
530 }
531 6734 num_cpl_blocks += s->cpl_in_use[blk];
532 }
533 } else {
534 memset(s->cpl_in_use, 0, sizeof(s->cpl_in_use));
535 }
536
537 /* exponent strategy data */
538
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 1106 times.
1204 if (ac3_exponent_strategy) {
539 /* AC-3-style exponent strategy syntax */
540
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 98 times.
196 for (blk = 0; blk < s->num_blocks; blk++) {
541
2/2
✓ Branch 0 taken 490 times.
✓ Branch 1 taken 98 times.
588 for (ch = !s->cpl_in_use[blk]; ch <= s->fbw_channels; ch++) {
542 490 s->exp_strategy[blk][ch] = get_bits(gbc, 2);
543 }
544 }
545 } else {
546 /* LUT-based exponent strategy syntax */
547
5/6
✓ Branch 0 taken 1106 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 701 times.
✓ Branch 3 taken 405 times.
✓ Branch 4 taken 3079 times.
✓ Branch 5 taken 1106 times.
4185 for (ch = !((s->channel_mode > 1) && num_cpl_blocks); ch <= s->fbw_channels; ch++) {
548 3079 int frmchexpstr = get_bits(gbc, 5);
549
2/2
✓ Branch 0 taken 18474 times.
✓ Branch 1 taken 3079 times.
21553 for (blk = 0; blk < 6; blk++) {
550 18474 s->exp_strategy[blk][ch] = ff_eac3_frm_expstr[frmchexpstr][blk];
551 }
552 }
553 }
554 /* LFE exponent strategy */
555
2/2
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 1058 times.
1204 if (s->lfe_on) {
556
2/2
✓ Branch 0 taken 386 times.
✓ Branch 1 taken 146 times.
532 for (blk = 0; blk < s->num_blocks; blk++) {
557 386 s->exp_strategy[blk][s->lfe_ch] = get_bits1(gbc);
558 }
559 }
560 /* original exponent strategies if this stream was converted from AC-3 */
561
2/2
✓ Branch 0 taken 1045 times.
✓ Branch 1 taken 159 times.
1204 if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT &&
562
4/4
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 947 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 82 times.
1045 (s->num_blocks == 6 || get_bits1(gbc))) {
563 963 skip_bits(gbc, 5 * s->fbw_channels); // skip converter channel exponent strategy
564 }
565
566 /* determine which channels use AHT */
567
2/2
✓ Branch 0 taken 448 times.
✓ Branch 1 taken 756 times.
1204 if (parse_aht_info) {
568 /* For AHT to be used, all non-zero blocks must reuse exponents from
569 the first block. Furthermore, for AHT to be used in the coupling
570 channel, all blocks must use coupling and use the same coupling
571 strategy. */
572 448 s->channel_uses_aht[CPL_CH]=0;
573
2/2
✓ Branch 0 taken 1088 times.
✓ Branch 1 taken 448 times.
1536 for (ch = (num_cpl_blocks != 6); ch <= s->channels; ch++) {
574 1088 int use_aht = 1;
575
2/2
✓ Branch 0 taken 4734 times.
✓ Branch 1 taken 816 times.
5550 for (blk = 1; blk < 6; blk++) {
576
3/4
✓ Branch 0 taken 4462 times.
✓ Branch 1 taken 272 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4462 times.
4734 if ((s->exp_strategy[blk][ch] != EXP_REUSE) ||
577 (!ch && s->cpl_strategy_exists[blk])) {
578 272 use_aht = 0;
579 272 break;
580 }
581 }
582
3/4
✓ Branch 0 taken 816 times.
✓ Branch 1 taken 272 times.
✓ Branch 3 taken 816 times.
✗ Branch 4 not taken.
1088 s->channel_uses_aht[ch] = use_aht && get_bits1(gbc);
583 }
584 } else {
585 756 memset(s->channel_uses_aht, 0, sizeof(s->channel_uses_aht));
586 }
587
588 /* per-frame SNR offset */
589
1/2
✓ Branch 0 taken 1204 times.
✗ Branch 1 not taken.
1204 if (!s->snr_offset_strategy) {
590 1204 int csnroffst = (get_bits(gbc, 6) - 15) << 4;
591 1204 int snroffst = (csnroffst + get_bits(gbc, 4)) << 2;
592
2/2
✓ Branch 0 taken 4514 times.
✓ Branch 1 taken 1204 times.
5718 for (ch = 0; ch <= s->channels; ch++)
593 4514 s->snr_offset[ch] = snroffst;
594 }
595
596 /* transient pre-noise processing data */
597
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (parse_transient_proc_info) {
598 for (ch = 1; ch <= s->fbw_channels; ch++) {
599 if (get_bits1(gbc)) { // channel in transient processing
600 skip_bits(gbc, 10); // skip transient processing location
601 skip_bits(gbc, 8); // skip transient processing length
602 }
603 }
604 }
605
606 /* spectral extension attenuation data */
607
2/2
✓ Branch 0 taken 3164 times.
✓ Branch 1 taken 1204 times.
4368 for (ch = 1; ch <= s->fbw_channels; ch++) {
608
4/4
✓ Branch 0 taken 1228 times.
✓ Branch 1 taken 1936 times.
✓ Branch 3 taken 1055 times.
✓ Branch 4 taken 173 times.
3164 if (parse_spx_atten_data && get_bits1(gbc)) {
609 1055 s->spx_atten_code[ch] = get_bits(gbc, 5);
610 } else {
611 2109 s->spx_atten_code[ch] = -1;
612 }
613 }
614
615 /* block start information */
616
3/4
✓ Branch 0 taken 1106 times.
✓ Branch 1 taken 98 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1106 times.
1204 if (s->num_blocks > 1 && get_bits1(gbc)) {
617 /* reference: Section E2.3.2.27
618 nblkstrtbits = (numblks - 1) * (4 + ceiling(log2(words_per_frame)))
619 The spec does not say what this data is or what it's used for.
620 It is likely the offset of each block within the frame. */
621 int block_start_bits = (s->num_blocks-1) * (4 + av_log2(s->frame_size-2));
622 skip_bits_long(gbc, block_start_bits);
623 avpriv_request_sample(s->avctx, "Block start info");
624 }
625
626 /* syntax state initialization */
627
2/2
✓ Branch 0 taken 3164 times.
✓ Branch 1 taken 1204 times.
4368 for (ch = 1; ch <= s->fbw_channels; ch++) {
628 3164 s->first_spx_coords[ch] = 1;
629 3164 s->first_cpl_coords[ch] = 1;
630 }
631 1204 s->first_cpl_leak = 1;
632
633 1204 return 0;
634 }
635