FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/eac3dec.c
Date: 2025-06-23 20:06:14
Exec Total Coverage
Lines: 218 250 87.2%
Functions: 4 4 100.0%
Branches: 147 178 82.6%

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 3252 static void ff_eac3_apply_spectral_extension(AC3DecodeContext *s)
57 {
58 int bin, bnd, ch, i;
59 3252 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 3252 bin = s->spx_dst_start_freq;
65 3252 num_copy_sections = 0;
66
2/2
✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 3252 times.
10620 for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
67 int copysize;
68 7368 int bandsize = s->spx_band_sizes[bnd];
69
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7368 times.
7368 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
2/2
✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 7368 times.
14736 for (i = 0; i < bandsize; i += copysize) {
75
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7368 times.
7368 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 7368 copysize = FFMIN(bandsize - i, s->spx_src_start_freq - bin);
80 7368 bin += copysize;
81 }
82 }
83 3252 copy_sizes[num_copy_sections++] = bin - s->spx_dst_start_freq;
84
85
2/2
✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 3252 times.
10620 for (ch = 1; ch <= s->fbw_channels; ch++) {
86
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7368 times.
7368 if (!s->channel_uses_spx[ch])
87 continue;
88
89 /* Copy coeffs from normal bands to extension bands */
90 7368 bin = s->spx_src_start_freq;
91
2/2
✓ Branch 0 taken 7368 times.
✓ Branch 1 taken 7368 times.
14736 for (i = 0; i < num_copy_sections; i++) {
92 7368 memcpy(&s->transform_coeffs[ch][bin],
93 7368 &s->transform_coeffs[ch][s->spx_dst_start_freq],
94 7368 copy_sizes[i]*sizeof(INTFLOAT));
95 7368 bin += copy_sizes[i];
96 }
97
98 /* Calculate RMS energy for each SPX band. */
99 7368 bin = s->spx_src_start_freq;
100
2/2
✓ Branch 0 taken 19056 times.
✓ Branch 1 taken 7368 times.
26424 for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
101 19056 int bandsize = s->spx_band_sizes[bnd];
102 19056 float accum = 0.0f;
103
2/2
✓ Branch 0 taken 245952 times.
✓ Branch 1 taken 19056 times.
265008 for (i = 0; i < bandsize; i++) {
104 245952 float coeff = s->transform_coeffs[ch][bin++];
105 245952 accum += coeff * coeff;
106 }
107 19056 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
2/2
✓ Branch 0 taken 6330 times.
✓ Branch 1 taken 1038 times.
7368 if (s->spx_atten_code[ch] >= 0) {
113 6330 const float *atten_tab = ff_eac3_spx_atten_tab[s->spx_atten_code[ch]];
114 6330 bin = s->spx_src_start_freq - 2;
115
2/2
✓ Branch 0 taken 13866 times.
✓ Branch 1 taken 6330 times.
20196 for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
116
2/2
✓ Branch 0 taken 6330 times.
✓ Branch 1 taken 7536 times.
13866 if (wrapflag[bnd]) {
117 6330 INTFLOAT *coeffs = &s->transform_coeffs[ch][bin];
118 6330 coeffs[0] *= atten_tab[0];
119 6330 coeffs[1] *= atten_tab[1];
120 6330 coeffs[2] *= atten_tab[2];
121 6330 coeffs[3] *= atten_tab[1];
122 6330 coeffs[4] *= atten_tab[0];
123 }
124 13866 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 7368 bin = s->spx_src_start_freq;
132
2/2
✓ Branch 0 taken 19056 times.
✓ Branch 1 taken 7368 times.
26424 for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
133 19056 float nscale = s->spx_noise_blend[ch][bnd] * rms_energy[bnd] * (1.0f / INT32_MIN);
134 19056 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
2/2
✓ Branch 0 taken 245952 times.
✓ Branch 1 taken 19056 times.
265008 for (i = 0; i < s->spx_band_sizes[bnd]; i++) {
143 245952 UINTFLOAT noise = (INTFLOAT)(nscale * (int32_t)av_lfg_get(&s->dith_state));
144 245952 s->transform_coeffs[ch][bin] *= sscale;
145 245952 s->transform_coeffs[ch][bin++] += noise;
146 }
147 }
148 }
149 3252 }
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 */
165 99870 static void idct6(int pre_mant[6])
166 {
167 int tmp;
168 int even0, even1, even2, odd0, odd1, odd2;
169
170 99870 odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5];
171
172 99870 even2 = ( pre_mant[2] * COEFF_0) >> 23;
173 99870 tmp = ( pre_mant[4] * COEFF_1) >> 23;
174 99870 odd0 = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 23;
175
176 99870 even0 = pre_mant[0] + (tmp >> 1);
177 99870 even1 = pre_mant[0] - tmp;
178
179 99870 tmp = even0;
180 99870 even0 = tmp + even2;
181 99870 even2 = tmp - even2;
182
183 99870 tmp = odd0;
184 99870 odd0 = tmp + pre_mant[1] + pre_mant[3];
185 99870 odd2 = tmp + pre_mant[5] - pre_mant[3];
186
187 99870 pre_mant[0] = even0 + odd0;
188 99870 pre_mant[1] = even1 + odd1;
189 99870 pre_mant[2] = even2 + odd2;
190 99870 pre_mant[3] = even2 - odd2;
191 99870 pre_mant[4] = even1 - odd1;
192 99870 pre_mant[5] = even0 - odd0;
193 99870 }
194
195 816 static void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
196 {
197 int bin, blk, gs;
198 int end_bap, gaq_mode;
199 816 GetBitContext *gbc = &s->gbc;
200 int gaq_gain[AC3_MAX_COEFS];
201
202 816 gaq_mode = get_bits(gbc, 2);
203
2/2
✓ Branch 0 taken 618 times.
✓ Branch 1 taken 198 times.
816 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 816 gs = 0;
208
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) {
209 /* read 1-bit GAQ gain codes */
210
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++) {
211
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)
212 31648 gaq_gain[gs++] = get_bits1(gbc) << (gaq_mode-1);
213 }
214
2/2
✓ Branch 0 taken 52 times.
✓ Branch 1 taken 61 times.
113 } else if (gaq_mode == EAC3_GAQ_124) {
215 /* read 1.67-bit GAQ gain codes (3 codes in 5 bits) */
216 52 int gc = 2;
217
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++) {
218
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) {
219
2/2
✓ Branch 0 taken 655 times.
✓ Branch 1 taken 1250 times.
1905 if (gc++ == 2) {
220 655 int group_code = get_bits(gbc, 5);
221
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 655 times.
655 if (group_code > 26) {
222 av_log(s->avctx, AV_LOG_WARNING, "GAQ gain group code out-of-range\n");
223 group_code = 26;
224 }
225 655 gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][0];
226 655 gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][1];
227 655 gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][2];
228 655 gc = 0;
229 }
230 }
231 }
232 }
233
234 816 gs=0;
235
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++) {
236 99870 int hebap = s->bap[ch][bin];
237 99870 int bits = ff_eac3_bits_vs_hebap[hebap];
238
2/2
✓ Branch 0 taken 32108 times.
✓ Branch 1 taken 67762 times.
99870 if (!hebap) {
239 /* zero-mantissa dithering */
240
2/2
✓ Branch 0 taken 192648 times.
✓ Branch 1 taken 32108 times.
224756 for (blk = 0; blk < 6; blk++) {
241 192648 s->pre_mantissa[ch][bin][blk] = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000;
242 }
243
2/2
✓ Branch 0 taken 31275 times.
✓ Branch 1 taken 36487 times.
67762 } else if (hebap < 8) {
244 /* Vector Quantization */
245 31275 int v = get_bits(gbc, bits);
246
2/2
✓ Branch 0 taken 187650 times.
✓ Branch 1 taken 31275 times.
218925 for (blk = 0; blk < 6; blk++) {
247 187650 s->pre_mantissa[ch][bin][blk] = ff_eac3_mantissa_vq[hebap][v][blk] * (1 << 8);
248 }
249 } else {
250 /* Gain Adaptive Quantization */
251 int gbits, log_gain;
252
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) {
253 33553 log_gain = gaq_gain[gs++];
254 } else {
255 2934 log_gain = 0;
256 }
257 36487 gbits = bits - log_gain;
258
259
2/2
✓ Branch 0 taken 218922 times.
✓ Branch 1 taken 36487 times.
255409 for (blk = 0; blk < 6; blk++) {
260 218922 int mant = get_sbits(gbc, gbits);
261
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))) {
262 /* large mantissa */
263 int b;
264 24721 int mbits = bits - (2 - log_gain);
265 24721 mant = get_sbits(gbc, mbits);
266 24721 mant = ((unsigned)mant) << (23 - (mbits - 1));
267 /* remap mantissa value to correct for asymmetric quantization */
268
2/2
✓ Branch 0 taken 12278 times.
✓ Branch 1 taken 12443 times.
24721 if (mant >= 0)
269 12278 b = 1 << (23 - log_gain);
270 else
271 12443 b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1] * (1 << 8);
272 24721 mant += ((ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * (int64_t)mant) >> 15) + b;
273 } else {
274 /* small mantissa, no GAQ, or Gk=1 */
275 194201 mant *= (1 << 24 - bits);
276
2/2
✓ Branch 0 taken 115788 times.
✓ Branch 1 taken 78413 times.
194201 if (!log_gain) {
277 /* remap mantissa value for no GAQ or Gk=1 */
278 115788 mant += (ff_eac3_gaq_remap_1[hebap-8] * (int64_t)mant) >> 15;
279 }
280 }
281 218922 s->pre_mantissa[ch][bin][blk] = mant;
282 }
283 }
284 99870 idct6(s->pre_mantissa[ch][bin]);
285 }
286 816 }
287
288 1204 static int ff_eac3_parse_header(AC3DecodeContext *s, const AC3HeaderInfo *hdr)
289 {
290 int i, blk, ch;
291 int ac3_exponent_strategy, parse_aht_info, parse_spx_atten_data;
292 int parse_transient_proc_info;
293 int num_cpl_blocks;
294 1204 GetBitContext *gbc = &s->gbc;
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. */
299
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->frame_type == EAC3_FRAME_TYPE_RESERVED) {
300 av_log(s->avctx, AV_LOG_ERROR, "Reserved frame type\n");
301 return AC3_PARSE_ERROR_FRAME_TYPE;
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
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 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;
311 avpriv_request_sample(s->avctx, "Additional substreams");
312 }
313 return AC3_PARSE_ERROR_FRAME_TYPE;
314 }
315
316
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->bit_alloc_params.sr_code == EAC3_SR_CODE_REDUCED) {
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. */
321 avpriv_request_sample(s->avctx, "Reduced sampling rate");
322 return AVERROR_PATCHWELCOME;
323 }
324
325 /* volume control params */
326
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++) {
327 1204 s->dialog_normalization[i] = hdr->dialog_normalization[i];
328
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->dialog_normalization[i] == 0) {
329 s->dialog_normalization[i] = -31;
330 }
331
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 if (s->target_level != 0) {
332 s->level_gain[i] = powf(2.0f,
333 (float)(s->target_level - s->dialog_normalization[i])/6.0f);
334 }
335
2/2
✓ Branch 0 taken 930 times.
✓ Branch 1 taken 274 times.
1204 if (hdr->compression_exists[i]) {
336 930 s->heavy_dynamic_range[i] = AC3_HEAVY_RANGE(hdr->heavy_dynamic_range[i]);
337 }
338 }
339
340 1204 s->channel_map = hdr->channel_map;
341
342 /* mixing metadata */
343 1204 s->preferred_downmix = hdr->preferred_downmix;
344 1204 s->center_mix_level_ltrt = hdr->center_mix_level_ltrt;
345 1204 s->center_mix_level = hdr->center_mix_level;
346 1204 s->surround_mix_level_ltrt = hdr->surround_mix_level_ltrt;
347 1204 s->surround_mix_level = hdr->surround_mix_level;
348 1204 s->lfe_mix_level_exists = hdr->lfe_mix_level_exists;
349 1204 s->lfe_mix_level = hdr->lfe_mix_level;
350 1204 s->dolby_surround_mode = hdr->dolby_surround_mode;
351 1204 s->dolby_headphone_mode = hdr->dolby_headphone_mode;
352 1204 s->dolby_surround_ex_mode = hdr->dolby_surround_ex_mode;
353
354 /* informational metadata */
355 1204 s->bitstream_mode = hdr->bitstream_mode;
356
357 /* additional bitstream info */
358 1204 s->eac3_extension_type_a = hdr->eac3_extension_type_a;
359
360 /* audio frame syntax flags, strategy data, and per-frame data */
361
362
2/2
✓ Branch 0 taken 1106 times.
✓ Branch 1 taken 98 times.
1204 if (s->num_blocks == 6) {
363 1106 ac3_exponent_strategy = get_bits1(gbc);
364 1106 parse_aht_info = get_bits1(gbc);
365 } else {
366 /* less than 6 blocks, so use AC-3-style exponent strategy syntax, and
367 do not use AHT */
368 98 ac3_exponent_strategy = 1;
369 98 parse_aht_info = 0;
370 }
371
372 1204 s->snr_offset_strategy = get_bits(gbc, 2);
373 1204 parse_transient_proc_info = get_bits1(gbc);
374
375 1204 s->block_switch_syntax = get_bits1(gbc);
376
1/2
✓ Branch 0 taken 1204 times.
✗ Branch 1 not taken.
1204 if (!s->block_switch_syntax)
377 1204 memset(s->block_switch, 0, sizeof(s->block_switch));
378
379 1204 s->dither_flag_syntax = get_bits1(gbc);
380
1/2
✓ Branch 0 taken 1204 times.
✗ Branch 1 not taken.
1204 if (!s->dither_flag_syntax) {
381
2/2
✓ Branch 0 taken 3164 times.
✓ Branch 1 taken 1204 times.
4368 for (ch = 1; ch <= s->fbw_channels; ch++)
382 3164 s->dither_flag[ch] = 1;
383 }
384 1204 s->dither_flag[CPL_CH] = s->dither_flag[s->lfe_ch] = 0;
385
386 1204 s->bit_allocation_syntax = get_bits1(gbc);
387
2/2
✓ Branch 0 taken 918 times.
✓ Branch 1 taken 286 times.
1204 if (!s->bit_allocation_syntax) {
388 /* set default bit allocation parameters */
389 918 s->bit_alloc_params.slow_decay = ff_ac3_slow_decay_tab[2];
390 918 s->bit_alloc_params.fast_decay = ff_ac3_fast_decay_tab[1];
391 918 s->bit_alloc_params.slow_gain = ff_ac3_slow_gain_tab [1];
392 918 s->bit_alloc_params.db_per_bit = ff_ac3_db_per_bit_tab[2];
393 918 s->bit_alloc_params.floor = ff_ac3_floor_tab [7];
394 }
395
396 1204 s->fast_gain_syntax = get_bits1(gbc);
397 1204 s->dba_syntax = get_bits1(gbc);
398 1204 s->skip_syntax = get_bits1(gbc);
399 1204 parse_spx_atten_data = get_bits1(gbc);
400
401 /* coupling strategy occurrence and coupling use per block */
402 1204 num_cpl_blocks = 0;
403
1/2
✓ Branch 0 taken 1204 times.
✗ Branch 1 not taken.
1204 if (s->channel_mode > 1) {
404
2/2
✓ Branch 0 taken 6734 times.
✓ Branch 1 taken 1204 times.
7938 for (blk = 0; blk < s->num_blocks; blk++) {
405
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));
406
2/2
✓ Branch 0 taken 1204 times.
✓ Branch 1 taken 5530 times.
6734 if (s->cpl_strategy_exists[blk]) {
407 1204 s->cpl_in_use[blk] = get_bits1(gbc);
408 } else {
409 5530 s->cpl_in_use[blk] = s->cpl_in_use[blk-1];
410 }
411 6734 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
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 1106 times.
1204 if (ac3_exponent_strategy) {
419 /* AC-3-style exponent strategy syntax */
420
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 98 times.
196 for (blk = 0; blk < s->num_blocks; blk++) {
421
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++) {
422 490 s->exp_strategy[blk][ch] = get_bits(gbc, 2);
423 }
424 }
425 } else {
426 /* LUT-based exponent strategy syntax */
427
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++) {
428 3079 int frmchexpstr = get_bits(gbc, 5);
429
2/2
✓ Branch 0 taken 18474 times.
✓ Branch 1 taken 3079 times.
21553 for (blk = 0; blk < 6; blk++) {
430 18474 s->exp_strategy[blk][ch] = ff_eac3_frm_expstr[frmchexpstr][blk];
431 }
432 }
433 }
434 /* LFE exponent strategy */
435
2/2
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 1058 times.
1204 if (s->lfe_on) {
436
2/2
✓ Branch 0 taken 386 times.
✓ Branch 1 taken 146 times.
532 for (blk = 0; blk < s->num_blocks; blk++) {
437 386 s->exp_strategy[blk][s->lfe_ch] = get_bits1(gbc);
438 }
439 }
440 /* original exponent strategies if this stream was converted from AC-3 */
441
2/2
✓ Branch 0 taken 1045 times.
✓ Branch 1 taken 159 times.
1204 if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT &&
442
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))) {
443 963 skip_bits(gbc, 5 * s->fbw_channels); // skip converter channel exponent strategy
444 }
445
446 /* determine which channels use AHT */
447
2/2
✓ Branch 0 taken 448 times.
✓ Branch 1 taken 756 times.
1204 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. */
452 448 s->channel_uses_aht[CPL_CH]=0;
453
2/2
✓ Branch 0 taken 1088 times.
✓ Branch 1 taken 448 times.
1536 for (ch = (num_cpl_blocks != 6); ch <= s->channels; ch++) {
454 1088 int use_aht = 1;
455
2/2
✓ Branch 0 taken 4734 times.
✓ Branch 1 taken 816 times.
5550 for (blk = 1; blk < 6; blk++) {
456
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) ||
457 (!ch && s->cpl_strategy_exists[blk])) {
458 272 use_aht = 0;
459 272 break;
460 }
461 }
462
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);
463 }
464 } else {
465 756 memset(s->channel_uses_aht, 0, sizeof(s->channel_uses_aht));
466 }
467
468 /* per-frame SNR offset */
469
1/2
✓ Branch 0 taken 1204 times.
✗ Branch 1 not taken.
1204 if (!s->snr_offset_strategy) {
470 1204 int csnroffst = (get_bits(gbc, 6) - 15) << 4;
471 1204 int snroffst = (csnroffst + get_bits(gbc, 4)) << 2;
472
2/2
✓ Branch 0 taken 4514 times.
✓ Branch 1 taken 1204 times.
5718 for (ch = 0; ch <= s->channels; ch++)
473 4514 s->snr_offset[ch] = snroffst;
474 }
475
476 /* transient pre-noise processing data */
477
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1204 times.
1204 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
2/2
✓ Branch 0 taken 3164 times.
✓ Branch 1 taken 1204 times.
4368 for (ch = 1; ch <= s->fbw_channels; ch++) {
488
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)) {
489 1055 s->spx_atten_code[ch] = get_bits(gbc, 5);
490 } else {
491 2109 s->spx_atten_code[ch] = -1;
492 }
493 }
494
495 /* block start information */
496
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)) {
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));
502 skip_bits_long(gbc, block_start_bits);
503 avpriv_request_sample(s->avctx, "Block start info");
504 }
505
506 /* syntax state initialization */
507
2/2
✓ Branch 0 taken 3164 times.
✓ Branch 1 taken 1204 times.
4368 for (ch = 1; ch <= s->fbw_channels; ch++) {
508 3164 s->first_spx_coords[ch] = 1;
509 3164 s->first_cpl_coords[ch] = 1;
510 }
511 1204 s->first_cpl_leak = 1;
512
513 1204 return 0;
514 }
515