FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aac/aacdec_usac.c
Date: 2026-08-29 16:27:19
Exec Total Coverage
Lines: 779 1300 59.9%
Functions: 28 36 77.8%
Branches: 391 800 48.9%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2024 Lynne <dev@lynne.ee>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include "aacdec_usac.h"
22 #include "aacdec_tab.h"
23 #include "aacdec_lpd.h"
24 #include "aacdec_ac.h"
25
26 #include "libavcodec/aacsbr.h"
27 #include "libavcodec/aactab.h"
28 #include "libavcodec/mpeg4audio.h"
29 #include "libavcodec/unary.h"
30
31 #include "libavutil/mem.h"
32 #include "libavutil/refstruct.h"
33
34 #include "aacdec_usac_mps212.h"
35
36 /* Number of scalefactor bands per complex prediction band, equal to 2. */
37 #define SFB_PER_PRED_BAND 2
38
39 90 static inline uint32_t get_escaped_value(GetBitContext *gb, int nb1, int nb2, int nb3)
40 {
41 90 uint32_t val = get_bits(gb, nb1), val2;
42
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 if (val < ((1 << nb1) - 1))
43 90 return val;
44
45 val += val2 = get_bits(gb, nb2);
46 if (nb3 && (val2 == ((1 << nb2) - 1)))
47 val += get_bits(gb, nb3);
48
49 return val;
50 }
51
52 /* ISO/IEC 23003-3, Table 74: bsOutputChannelPos */
53 static const enum AVChannel usac_ch_pos_to_av[64] = {
54 [0] = AV_CHAN_FRONT_LEFT,
55 [1] = AV_CHAN_FRONT_RIGHT,
56 [2] = AV_CHAN_FRONT_CENTER,
57 [3] = AV_CHAN_LOW_FREQUENCY,
58 [4] = AV_CHAN_SIDE_LEFT, // +110 degrees, Ls|LS|kAudioChannelLabel_LeftSurround
59 [5] = AV_CHAN_SIDE_RIGHT, // -110 degrees, Rs|RS|kAudioChannelLabel_RightSurround
60 [6] = AV_CHAN_FRONT_LEFT_OF_CENTER,
61 [7] = AV_CHAN_FRONT_RIGHT_OF_CENTER,
62 [8] = AV_CHAN_BACK_LEFT, // +135 degrees, Lsr|BL|kAudioChannelLabel_RearSurroundLeft
63 [9] = AV_CHAN_BACK_RIGHT, // -135 degrees, Rsr|BR|kAudioChannelLabel_RearSurroundRight
64 [10] = AV_CHAN_BACK_CENTER,
65 [11] = AV_CHAN_SURROUND_DIRECT_LEFT,
66 [12] = AV_CHAN_SURROUND_DIRECT_RIGHT,
67 [13] = AV_CHAN_SIDE_SURROUND_LEFT, // +90 degrees, Lss|SL|kAudioChannelLabel_LeftSideSurround
68 [14] = AV_CHAN_SIDE_SURROUND_RIGHT, // -90 degrees, Rss|SR|kAudioChannelLabel_RightSideSurround
69 [15] = AV_CHAN_WIDE_LEFT, // +60 degrees, Lw|FLw|kAudioChannelLabel_LeftWide
70 [16] = AV_CHAN_WIDE_RIGHT, // -60 degrees, Rw|FRw|kAudioChannelLabel_RightWide
71 [17] = AV_CHAN_TOP_FRONT_LEFT,
72 [18] = AV_CHAN_TOP_FRONT_RIGHT,
73 [19] = AV_CHAN_TOP_FRONT_CENTER,
74 [20] = AV_CHAN_TOP_BACK_LEFT,
75 [21] = AV_CHAN_TOP_BACK_RIGHT,
76 [22] = AV_CHAN_TOP_BACK_CENTER,
77 [23] = AV_CHAN_TOP_SIDE_LEFT,
78 [24] = AV_CHAN_TOP_SIDE_RIGHT,
79 [25] = AV_CHAN_TOP_CENTER,
80 [26] = AV_CHAN_LOW_FREQUENCY_2,
81 [27] = AV_CHAN_BOTTOM_FRONT_LEFT,
82 [28] = AV_CHAN_BOTTOM_FRONT_RIGHT,
83 [29] = AV_CHAN_BOTTOM_FRONT_CENTER,
84 [30] = AV_CHAN_TOP_SURROUND_LEFT, ///< +110 degrees, Lvs, TpLS
85 [31] = AV_CHAN_TOP_SURROUND_RIGHT, ///< -110 degrees, Rvs, TpRS
86 };
87
88 /* ISO/IEC 23003-4, Table A.48: bit width of bsMethodValue depends on methodDef. */
89 8 static int methodvalue_width(int method_def)
90 {
91
1/3
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
8 switch (method_def) {
92 case 7: return 5; /* mixing level */
93 case 8: return 2; /* room type */
94 8 default: return 8; /* loudness (0..6, 9) + reserved */
95 }
96 }
97
98 /* ISO/IEC 23003-4, Table 58/60: loudnessInfo(), loudnessInfoV1().
99 * The only difference in V1 is the added eqSetId field. */
100 8 static int decode_loudness_info(AACDecContext *ac, AACUSACLoudnessInfo *info,
101 GetBitContext *gb, int v1)
102 {
103 8 info->drc_set_id = get_bits(gb, 6);
104
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
8 info->eq_set_id = v1 ? get_bits(gb, 6) : 0;
105 8 info->downmix_id = get_bits(gb, 7);
106
107
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 if ((info->sample_peak.present = get_bits1(gb))) /* samplePeakLevelPresent */
108 8 info->sample_peak.lvl = get_bits(gb, 12);
109
110
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
8 if ((info->true_peak.present = get_bits1(gb))) { /* truePeakLevelPresent */
111 info->true_peak.lvl = get_bits(gb, 12);
112 info->true_peak.measurement = get_bits(gb, 4);
113 info->true_peak.reliability = get_bits(gb, 2);
114 }
115
116 8 info->nb_measurements = get_bits(gb, 4);
117
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 for (int i = 0; i < info->nb_measurements; i++) {
118 8 info->measurements[i].method_def = get_bits(gb, 4);
119 8 info->measurements[i].method_val =
120 8 get_bits(gb, methodvalue_width(info->measurements[i].method_def));
121 8 info->measurements[i].measurement = get_bits(gb, 4);
122 8 info->measurements[i].reliability = get_bits(gb, 2);
123 }
124
125 8 return 0;
126 }
127
128 /* ISO/IEC 23003-4, Table 61: loudnessInfoSetExtension(), UNIDRCLOUDEXT_EQ */
129 6 static int decode_loudness_set_v1(AACDecContext *ac, AACUSACConfig *usac,
130 GetBitContext *gb)
131 {
132 int ret;
133 6 int nb_album = get_bits(gb, 6); /* loudnessInfoV1AlbumCount */
134 6 int nb_info = get_bits(gb, 6); /* loudnessInfoV1Count */
135
136
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 for (int i = 0; i < nb_album; i++) {
137 AACUSACLoudnessInfo tmp;
138 ret = decode_loudness_info(ac, &tmp, gb, 1);
139 if (ret < 0)
140 return ret;
141 if (usac->loudness.nb_album < FF_ARRAY_ELEMS(usac->loudness.album_info))
142 usac->loudness.album_info[usac->loudness.nb_album++] = tmp;
143 }
144
145
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 for (int i = 0; i < nb_info; i++) {
146 AACUSACLoudnessInfo tmp;
147 6 ret = decode_loudness_info(ac, &tmp, gb, 1);
148
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret < 0)
149 return ret;
150
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if (usac->loudness.nb_info < FF_ARRAY_ELEMS(usac->loudness.info))
151 6 usac->loudness.info[usac->loudness.nb_info++] = tmp;
152 }
153
154 6 return 0;
155 }
156
157 /* Pick the bsMethodValue of a program- or anchor-loudness measurement.
158 * Per ISO/IEC 23003-4 6.1.2.5, downmixId, drcSetId and eqSetId identify the
159 * signal a loudnessInfo() applies to; only downmixId == 0 (base layout)
160 * together with drcSetId == 0 and eqSetId == 0 (no DRC/EQ) describes the
161 * unprocessed signal we output, so measurements for any other
162 * downmix/DRC/EQ set must not be used. */
163 22 static int select_loudness_measurement(const AACUSACConfig *usac)
164 {
165
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 14 times.
22 for (int i = 0; i < usac->loudness.nb_info; i++) {
166 8 const AACUSACLoudnessInfo *info = &usac->loudness.info[i];
167
3/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
8 if (info->downmix_id != 0 || info->drc_set_id != 0 || info->eq_set_id != 0)
168 continue;
169
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 for (int j = 0; j < info->nb_measurements; j++) {
170 8 int method = info->measurements[j].method_def;
171
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8 if (method == 1 || method == 2)
172 8 return info->measurements[j].method_val;
173 }
174 }
175 14 return -1;
176 }
177
178 8 static int decode_loudness_set(AACDecContext *ac, AACUSACConfig *usac,
179 GetBitContext *gb)
180 {
181 int ret;
182
183 8 usac->loudness.nb_album = get_bits(gb, 6); /* loudnessInfoAlbumCount */
184 8 usac->loudness.nb_info = get_bits(gb, 6); /* loudnessInfoCount */
185
186
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 for (int i = 0; i < usac->loudness.nb_album; i++) {
187 ret = decode_loudness_info(ac, &usac->loudness.album_info[i], gb, 0);
188 if (ret < 0)
189 return ret;
190 }
191
192
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
10 for (int i = 0; i < usac->loudness.nb_info; i++) {
193 2 ret = decode_loudness_info(ac, &usac->loudness.info[i], gb, 0);
194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (ret < 0)
195 return ret;
196 }
197
198
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 if (get_bits1(gb)) { /* loudnessInfoSetExtPresent */
199 enum AACUSACLoudnessExt type;
200
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
14 while ((type = get_bits(gb, 4)) != UNIDRCLOUDEXT_TERM) {
201 6 uint8_t size_bits = get_bits(gb, 4) + 4; /* bitSizeLen */
202 6 uint32_t bit_size = get_bits_long(gb, size_bits) + 1; /* bitSize */
203 6 int start = get_bits_count(gb);
204 int skip;
205
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 switch (type) {
206 6 case UNIDRCLOUDEXT_EQ:
207 6 ret = decode_loudness_set_v1(ac, usac, gb);
208
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret < 0)
209 return ret;
210 6 break;
211 default:
212 break;
213 }
214 /* The extension size is explicit, so unparsed (or unknown)
215 * data can be skipped without desynchronizing. */
216 6 skip = bit_size - (get_bits_count(gb) - start);
217
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (skip < 0)
218 return AVERROR_INVALIDDATA;
219 6 skip_bits_long(gb, skip);
220 }
221 }
222
223 8 return 0;
224 }
225
226 static int decode_usac_sbr_data(AACDecContext *ac,
227 AACUsacElemConfig *e, GetBitContext *gb)
228 {
229 uint8_t header_extra1;
230 uint8_t header_extra2;
231
232 e->sbr.harmonic_sbr = get_bits1(gb); /* harmonicSBR */
233 e->sbr.bs_intertes = get_bits1(gb); /* bs_interTes */
234 e->sbr.bs_pvc = get_bits1(gb); /* bs_pvc */
235 if (e->sbr.harmonic_sbr || e->sbr.bs_intertes || e->sbr.bs_pvc) {
236 avpriv_report_missing_feature(ac->avctx, "AAC USAC eSBR");
237 return AVERROR_PATCHWELCOME;
238 }
239
240 e->sbr.dflt.start_freq = get_bits(gb, 4); /* dflt_start_freq */
241 e->sbr.dflt.stop_freq = get_bits(gb, 4); /* dflt_stop_freq */
242
243 header_extra1 = get_bits1(gb); /* dflt_header_extra1 */
244 header_extra2 = get_bits1(gb); /* dflt_header_extra2 */
245
246 e->sbr.dflt.freq_scale = 2;
247 e->sbr.dflt.alter_scale = 1;
248 e->sbr.dflt.noise_bands = 2;
249 if (header_extra1) {
250 e->sbr.dflt.freq_scale = get_bits(gb, 2); /* dflt_freq_scale */
251 e->sbr.dflt.alter_scale = get_bits1(gb); /* dflt_alter_scale */
252 e->sbr.dflt.noise_bands = get_bits(gb, 2); /* dflt_noise_bands */
253 }
254
255 e->sbr.dflt.limiter_bands = 2;
256 e->sbr.dflt.limiter_gains = 2;
257 e->sbr.dflt.interpol_freq = 1;
258 e->sbr.dflt.smoothing_mode = 1;
259 if (header_extra2) {
260 e->sbr.dflt.limiter_bands = get_bits(gb, 2); /* dflt_limiter_bands */
261 e->sbr.dflt.limiter_gains = get_bits(gb, 2); /* dflt_limiter_gains */
262 e->sbr.dflt.interpol_freq = get_bits1(gb); /* dflt_interpol_freq */
263 e->sbr.dflt.smoothing_mode = get_bits1(gb); /* dflt_smoothing_mode */
264 }
265
266 return 0;
267 }
268
269 22 static void decode_usac_element_core(AACUsacElemConfig *e,
270 GetBitContext *gb,
271 int sbr_ratio)
272 {
273 22 e->tw_mdct = get_bits1(gb); /* tw_mdct */
274 22 e->noise_fill = get_bits1(gb);
275 22 e->sbr.ratio = sbr_ratio;
276 22 }
277
278 18 static int decode_usac_element_pair(AACDecContext *ac,
279 AACUsacElemConfig *e, GetBitContext *gb)
280 {
281 18 e->stereo_config_index = 0;
282
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (e->sbr.ratio) {
283 int ret = decode_usac_sbr_data(ac, e, gb);
284 if (ret < 0)
285 return ret;
286 e->stereo_config_index = get_bits(gb, 2);
287 }
288
289
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (e->stereo_config_index) {
290 e->mps.freq_res = get_bits(gb, 3); /* bsFreqRes */
291 if (!e->mps.freq_res)
292 return AVERROR_INVALIDDATA; /* value 0 is reserved */
293
294 int numBands = ((int[]){0,28,20,14,10,7,5,4})[e->mps.freq_res]; // ISO/IEC 23003-1:2007, 5.2, Table 39
295
296 e->mps.fixed_gain = get_bits(gb, 3); /* bsFixedGainDMX */
297 e->mps.temp_shape_config = get_bits(gb, 2); /* bsTempShapeConfig */
298 e->mps.decorr_config = get_bits(gb, 2); /* bsDecorrConfig */
299 e->mps.high_rate_mode = get_bits1(gb); /* bsHighRateMode */
300 e->mps.phase_coding = get_bits1(gb); /* bsPhaseCoding */
301
302 e->mps.otts_bands_phase_present = get_bits1(gb);
303 int otts_bands_phase = ((int[]){0,10,10,7,5,3,2,2})[e->mps.freq_res]; // Table 109: Default value of bsOttBandsPhase
304 if (e->mps.otts_bands_phase_present) { /* bsOttBandsPhasePresent */
305 otts_bands_phase = get_bits(gb, 5); /* bsOttBandsPhase */
306 if (otts_bands_phase > numBands)
307 return AVERROR_INVALIDDATA;
308 }
309 e->mps.otts_bands_phase = otts_bands_phase;
310
311 e->mps.residual_coding = e->stereo_config_index >= 2; /* bsResidualCoding */
312 if (e->mps.residual_coding) {
313 int residual_bands = get_bits(gb, 5); /* bsResidualBands */
314 if (residual_bands > numBands)
315 return AVERROR_INVALIDDATA;
316 e->mps.residual_bands = residual_bands;
317
318 e->mps.otts_bands_phase = FFMAX(e->mps.otts_bands_phase,
319 e->mps.residual_bands);
320 e->mps.pseudo_lr = get_bits1(gb); /* bsPseudoLr */
321 }
322 if (e->mps.temp_shape_config == 2)
323 e->mps.env_quant_mode = get_bits1(gb); /* bsEnvQuantMode */
324 }
325
326 18 return 0;
327 }
328
329 /* ISO/IEC 23003-4, Table 62: channelLayout() */
330 static int decode_drc_channel_layout(GetBitContext *gb)
331 {
332 int base_channel_count = get_bits(gb, 7); /* baseChannelCount */
333 if (get_bits1(gb)) { /* layoutSignallingPresent */
334 if (get_bits(gb, 8) == 0) /* definedLayout == 0 */
335 for (int i = 0; i < base_channel_count; i++)
336 skip_bits(gb, 7); /* speakerPosition */
337 }
338 return base_channel_count;
339 }
340
341 /* ISO/IEC 23003-4, Table 63: downmixInstructions() */
342 static void skip_drc_downmix_instructions(GetBitContext *gb, int base_channel_count)
343 {
344 int target_channel_count;
345 skip_bits(gb, 7); /* downmixId */
346 target_channel_count = get_bits(gb, 7); /* targetChannelCount */
347 skip_bits(gb, 8); /* targetLayout */
348 if (get_bits1(gb)) /* downmixCoefficientsPresent */
349 skip_bits_long(gb, 4 * target_channel_count * base_channel_count);
350 }
351
352 /* ISO/IEC 23003-4, Table 70: drcInstructionsBasic(), common with the
353 * uniDrc variant up to the loudness-target fields. */
354 static void decode_drc_instructions_basic(AACUsacElemConfig *e, GetBitContext *gb)
355 {
356 int set_effects;
357
358 skip_bits(gb, 6); /* drcSetId */
359 skip_bits(gb, 4); /* drcLocation */
360 skip_bits(gb, 7); /* downmixId */
361 if (get_bits1(gb)) { /* additionalDownmixIdPresent */
362 int add_downmix_cnt = get_bits(gb, 3); /* additionalDownmixIdCount */
363 for (int j = 0; j < add_downmix_cnt; j++)
364 skip_bits(gb, 7); /* additionalDownmixId */
365 }
366
367 set_effects = get_bits(gb, 16); /* drcSetEffect */
368 if ((set_effects & (3 << 10)) == 0) {
369 if (get_bits1(gb)) /* limiterPeakTargetPresent */
370 skip_bits(gb, 8); /* bsLimiterPeakTarget */
371 }
372
373 if (get_bits1(gb)) { /* drcSetTargetLoudnessPresent */
374 e->drc.loudness.upper = get_bits(gb, 6); /* bsDrcSetTargetLoudnessValueUpper */
375 if (get_bits1(gb)) /* drcSetTargetLoudnessValueLowerPresent */
376 e->drc.loudness.lower = get_bits(gb, 6); /* bsDrcSetTargetLoudnessValueLower */
377 }
378 }
379
380 /* ISO/IEC 23003-4, Table 57: uniDrcConfig() */
381 static int decode_drc_config(AACDecContext *ac, AACUsacElemConfig *e,
382 GetBitContext *gb)
383 {
384 int nb_downmix_instr, nb_coeff_basic = 0, nb_instr_basic = 0;
385 int nb_coeff_uni, nb_instr_uni;
386 int base_channel_count;
387
388 e->drc.loudness.lower = -1;
389 e->drc.loudness.upper = -1;
390
391 if (get_bits1(gb)) /* sampleRatePresent */
392 skip_bits(gb, 18); /* bsSampleRate */
393
394 nb_downmix_instr = get_bits(gb, 7); /* downmixInstructionsCount */
395
396 if (get_bits1(gb)) { /* drcDescriptionBasicPresent */
397 nb_coeff_basic = get_bits(gb, 3); /* drcCoefficientsBasicCount */
398 nb_instr_basic = get_bits(gb, 4); /* drcInstructionsBasicCount */
399 }
400
401 nb_coeff_uni = get_bits(gb, 3); /* drcCoefficientsUniDrcCount */
402 nb_instr_uni = get_bits(gb, 6); /* drcInstructionsUniDrcCount */
403
404 if (nb_coeff_uni || nb_instr_uni) {
405 avpriv_report_missing_feature(ac->avctx,
406 "AAC USAC uniDrc DRC processing");
407 return AVERROR_PATCHWELCOME;
408 }
409
410 base_channel_count = decode_drc_channel_layout(gb);
411
412 for (int i = 0; i < nb_downmix_instr; i++)
413 skip_drc_downmix_instructions(gb, base_channel_count);
414
415 for (int i = 0; i < nb_coeff_basic; i++)
416 skip_bits(gb, 4 + 7); /* drcLocation, drcCharacteristic */
417
418 for (int i = 0; i < nb_instr_basic; i++)
419 decode_drc_instructions_basic(e, gb);
420
421 if (get_bits1(gb)) { /* uniDrcConfigExtPresent */
422 enum AACUSACDRCExt type;
423 while ((type = get_bits(gb, 4)) != UNIDRCCONFEXT_TERM) {
424 uint8_t size_bits = get_bits(gb, 4) + 4; /* bitSizeLen */
425 uint32_t bit_size = get_bits_long(gb, size_bits) + 1; /* extBitSize */
426 switch (type) {
427 default:
428 skip_bits_long(gb, bit_size);
429 break;
430 }
431 }
432 }
433
434 return 0;
435 }
436
437 22 static int decode_usac_extension(AACDecContext *ac, AACUsacElemConfig *e,
438 GetBitContext *gb)
439 {
440 22 int len = 0, ext_config_len;
441
442 22 e->ext.type = get_escaped_value(gb, 4, 8, 16); /* usacExtElementType */
443 22 ext_config_len = get_escaped_value(gb, 4, 8, 16); /* usacExtElementConfigLength */
444
445
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
22 if (get_bits1(gb)) /* usacExtElementDefaultLengthPresent */
446 len = get_escaped_value(gb, 8, 16, 0) + 1;
447
448 22 e->ext.default_len = len;
449 22 e->ext.payload_frag = get_bits1(gb); /* usacExtElementPayloadFrag */
450
451 22 av_log(ac->avctx, AV_LOG_DEBUG, "Extension present: type %i, len %i\n",
452 22 e->ext.type, ext_config_len);
453
454
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 2 times.
22 switch (e->ext.type) {
455 #if 0 /* Skip unsupported values */
456 case ID_EXT_ELE_MPEGS:
457 break;
458 case ID_EXT_ELE_SAOC:
459 break;
460 #endif
461 case ID_EXT_ELE_UNI_DRC: {
462 int start = get_bits_count(gb);
463 int ret = decode_drc_config(ac, e, gb);
464 int skip = 8*ext_config_len - (get_bits_count(gb) - start);
465 if (ret == AVERROR_PATCHWELCOME) {
466 /* Unsupported uniDrcConfig(): ignore the DRC metadata and treat
467 * the element as fill so the stream stays decodable. */
468 e->ext.type = ID_EXT_ELE_FILL;
469 ret = 0;
470 }
471 if (ret < 0)
472 return ret;
473 if (skip < 0)
474 return AVERROR_INVALIDDATA;
475 /* The config is byte-padded to usacExtElementConfigLength */
476 skip_bits_long(gb, skip);
477 break;
478 }
479 20 case ID_EXT_ELE_FILL:
480 20 break; /* This is what the spec does */
481 2 case ID_EXT_ELE_AUDIOPREROLL:
482 /* No configuration needed - fallthrough (len should be 0) */
483 default:
484 2 skip_bits(gb, 8*ext_config_len);
485 2 e->ext.type = ID_EXT_ELE_FILL;
486 2 break;
487 };
488
489 22 return 0;
490 }
491
492 25 int ff_aac_usac_reset_state(AACDecContext *ac, OutputConfiguration *oc)
493 {
494 25 AACUSACConfig *usac = &oc->usac;
495 25 int elem_id[3 /* SCE, CPE, LFE */] = { 0, 0, 0 };
496
497 ChannelElement *che;
498 enum RawDataBlockType type;
499 int id, ch;
500
501 /* Initialize state */
502
2/2
✓ Branch 0 taken 44 times.
✓ Branch 1 taken 25 times.
69 for (int i = 0; i < usac->nb_elems; i++) {
503 44 AACUsacElemConfig *e = &usac->elems[i];
504
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 22 times.
44 if (e->type == ID_USAC_EXT)
505 22 continue;
506
507
2/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
22 switch (e->type) {
508 4 case ID_USAC_SCE:
509 4 ch = 1;
510 4 type = TYPE_SCE;
511 4 id = elem_id[0]++;
512 4 break;
513 18 case ID_USAC_CPE:
514 18 ch = 2;
515 18 type = TYPE_CPE;
516 18 id = elem_id[1]++;
517 18 break;
518 case ID_USAC_LFE:
519 ch = 1;
520 type = TYPE_LFE;
521 id = elem_id[2]++;
522 break;
523 }
524
525 22 che = ff_aac_get_che(ac, type, id);
526
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
22 if (che) {
527 22 AACUsacStereo *us = &che->us;
528 22 memset(us, 0, sizeof(*us));
529
530
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (e->sbr.ratio)
531 ff_aac_sbr_config_usac(ac, che, e);
532
533
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 22 times.
62 for (int j = 0; j < ch; j++) {
534 40 SingleChannelElement *sce = &che->ch[j];
535 40 AACUsacElemData *ue = &sce->ue;
536
537 40 memset(ue, 0, sizeof(*ue));
538
539
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40 times.
40 if (!ch)
540 ue->noise.seed = 0x3039;
541 else
542 40 che->ch[1].ue.noise.seed = 0x10932;
543 }
544 }
545 }
546
547 25 return 0;
548 }
549
550 /* UsacConfig */
551 22 int ff_aac_usac_config_decode(AACDecContext *ac, AVCodecContext *avctx,
552 GetBitContext *gb, OutputConfiguration *oc,
553 int channel_config)
554 {
555 int ret;
556 uint8_t freq_idx;
557 uint8_t channel_config_idx;
558 22 int nb_channels = 0;
559 int ratio_mult, ratio_dec;
560 int samplerate;
561 int sbr_ratio;
562 22 MPEG4AudioConfig *m4ac = &oc->m4ac;
563 22 AACUSACConfig *usac = &oc->usac;
564 int elem_id[3 /* SCE, CPE, LFE */];
565
566 22 int map_pos_set = 0;
567 22 uint8_t layout_map[MAX_ELEM_ID*4][3] = { 0 };
568
569
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (!ac)
570 return AVERROR_PATCHWELCOME;
571
572 22 memset(usac, 0, sizeof(*usac));
573 22 usac->loudness.input_method_val = -1;
574
575 22 freq_idx = get_bits(gb, 5); /* usacSamplingFrequencyIndex */
576
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (freq_idx == 0x1f) {
577 samplerate = get_bits(gb, 24); /* usacSamplingFrequency */
578 if (samplerate == 0)
579 return AVERROR(EINVAL);
580 } else {
581 22 samplerate = ff_aac_usac_samplerate[freq_idx];
582
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (samplerate < 0)
583 return AVERROR(EINVAL);
584 }
585
586 22 usac->core_sbr_frame_len_idx = get_bits(gb, 3); /* coreSbrFrameLengthIndex */
587
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
44 m4ac->frame_length_short = usac->core_sbr_frame_len_idx == 0 ||
588
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 usac->core_sbr_frame_len_idx == 2;
589
590
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
44 usac->core_frame_len = (usac->core_sbr_frame_len_idx == 0 ||
591
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 usac->core_sbr_frame_len_idx == 2) ? 768 : 1024;
592
593
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
44 sbr_ratio = usac->core_sbr_frame_len_idx == 2 ? 2 :
594
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
22 usac->core_sbr_frame_len_idx == 3 ? 3 :
595 22 usac->core_sbr_frame_len_idx == 4 ? 1 :
596 0;
597
598
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (sbr_ratio == 2) {
599 ratio_mult = 8;
600 ratio_dec = 3;
601
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 } else if (sbr_ratio == 3) {
602 ratio_mult = 2;
603 ratio_dec = 1;
604
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 } else if (sbr_ratio == 4) {
605 ratio_mult = 4;
606 ratio_dec = 1;
607 } else {
608 22 ratio_mult = 1;
609 22 ratio_dec = 1;
610 }
611
612 22 avctx->sample_rate = samplerate;
613 22 m4ac->ext_sample_rate = samplerate;
614 22 m4ac->sample_rate = (samplerate * ratio_dec) / ratio_mult;
615
616 22 m4ac->sampling_index = ff_aac_sample_rate_idx(m4ac->sample_rate);
617 22 m4ac->sbr = sbr_ratio > 0;
618
619 22 channel_config_idx = get_bits(gb, 5); /* channelConfigurationIndex */
620
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (!channel_config_idx) {
621 /* UsacChannelConfig() */
622 nb_channels = get_escaped_value(gb, 5, 8, 16); /* numOutChannels */
623 if (nb_channels > 64)
624 return AVERROR(EINVAL);
625
626 av_channel_layout_uninit(&ac->oc[1].ch_layout);
627
628 ret = av_channel_layout_custom_init(&ac->oc[1].ch_layout, nb_channels);
629 if (ret < 0)
630 return ret;
631
632 for (int i = 0; i < nb_channels; i++) {
633 AVChannelCustom *cm = &ac->oc[1].ch_layout.u.map[i];
634 cm->id = usac_ch_pos_to_av[get_bits(gb, 5)]; /* bsOutputChannelPos */
635 }
636
637 ret = av_channel_layout_retype(&ac->oc[1].ch_layout,
638 AV_CHANNEL_ORDER_NATIVE,
639 AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
640 if (ret < 0)
641 return ret;
642
643 ret = av_channel_layout_copy(&avctx->ch_layout, &ac->oc[1].ch_layout);
644 if (ret < 0)
645 return ret;
646 } else {
647 int nb_elements;
648
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
22 if ((ret = ff_aac_set_default_channel_config(ac, avctx, layout_map,
649 &nb_elements, channel_config_idx)))
650 return ret;
651
652 /* Fill in the number of expected channels */
653
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 22 times.
44 for (int i = 0; i < nb_elements; i++)
654
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 4 times.
22 nb_channels += layout_map[i][0] == TYPE_CPE ? 2 : 1;
655
656 22 map_pos_set = 1;
657 }
658
659 /* UsacDecoderConfig */
660 22 elem_id[0] = elem_id[1] = elem_id[2] = 0;
661 22 usac->nb_elems = get_escaped_value(gb, 4, 8, 16) + 1;
662
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (usac->nb_elems > 64) {
663 av_log(ac->avctx, AV_LOG_ERROR, "Too many elements: %i\n",
664 usac->nb_elems);
665 usac->nb_elems = 0;
666 return AVERROR(EINVAL);
667 }
668
669
2/2
✓ Branch 0 taken 44 times.
✓ Branch 1 taken 22 times.
66 for (int i = 0; i < usac->nb_elems; i++) {
670 44 int map_count = elem_id[0] + elem_id[1] + elem_id[2];
671 44 AACUsacElemConfig *e = &usac->elems[i];
672 44 memset(e, 0, sizeof(*e));
673
674 44 e->type = get_bits(gb, 2); /* usacElementType */
675
3/4
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
44 if (e->type != ID_USAC_EXT && (map_count + 1) > nb_channels) {
676 av_log(ac->avctx, AV_LOG_ERROR, "Too many channels for the channel "
677 "configuration\n");
678 usac->nb_elems = 0;
679 return AVERROR(EINVAL);
680 }
681
682 44 av_log(ac->avctx, AV_LOG_DEBUG, "Element present: idx %i, type %i\n",
683 44 i, e->type);
684
685
3/5
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
✗ Branch 4 not taken.
44 switch (e->type) {
686 4 case ID_USAC_SCE: /* SCE */
687 /* UsacCoreConfig */
688 4 decode_usac_element_core(e, gb, sbr_ratio);
689
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (e->sbr.ratio > 0) {
690 ret = decode_usac_sbr_data(ac, e, gb);
691 if (ret < 0)
692 return ret;
693 }
694 4 layout_map[map_count][0] = TYPE_SCE;
695 4 layout_map[map_count][1] = elem_id[0]++;
696
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!map_pos_set)
697 layout_map[map_count][2] = AAC_CHANNEL_FRONT;
698
699 4 break;
700 18 case ID_USAC_CPE: /* UsacChannelPairElementConf */
701 /* UsacCoreConfig */
702 18 decode_usac_element_core(e, gb, sbr_ratio);
703 18 ret = decode_usac_element_pair(ac, e, gb);
704
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (ret < 0)
705 return ret;
706 18 layout_map[map_count][0] = TYPE_CPE;
707 18 layout_map[map_count][1] = elem_id[1]++;
708
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (!map_pos_set)
709 layout_map[map_count][2] = AAC_CHANNEL_FRONT;
710
711 18 break;
712 case ID_USAC_LFE: /* LFE */
713 /* LFE has no need for any configuration */
714 e->tw_mdct = 0;
715 e->noise_fill = 0;
716 layout_map[map_count][0] = TYPE_LFE;
717 layout_map[map_count][1] = elem_id[2]++;
718 if (!map_pos_set)
719 layout_map[map_count][2] = AAC_CHANNEL_LFE;
720
721 break;
722 22 case ID_USAC_EXT: /* EXT */
723 22 ret = decode_usac_extension(ac, e, gb);
724
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (ret < 0)
725 return ret;
726 22 break;
727 };
728 }
729
730 22 ret = ff_aac_output_configure(ac, layout_map, elem_id[0] + elem_id[1] + elem_id[2],
731 OC_GLOBAL_HDR, 0);
732
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (ret < 0) {
733 av_log(avctx, AV_LOG_ERROR, "Unable to parse channel config!\n");
734 usac->nb_elems = 0;
735 return ret;
736 }
737
738
2/2
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 14 times.
22 if (get_bits1(gb)) { /* usacConfigExtensionPresent */
739 int invalid;
740 8 int nb_extensions = get_escaped_value(gb, 2, 4, 8) + 1; /* numConfigExtensions */
741
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 for (int i = 0; i < nb_extensions; i++) {
742 8 int type = get_escaped_value(gb, 4, 8, 16);
743 8 int len = get_escaped_value(gb, 4, 8, 16);
744
1/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8 switch (type) {
745 8 case ID_CONFIG_EXT_LOUDNESS_INFO:
746 8 ret = decode_loudness_set(ac, usac, gb);
747
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
748 return ret;
749 8 break;
750 case ID_CONFIG_EXT_STREAM_ID:
751 usac->stream_identifier = get_bits(gb, 16);
752 break;
753 case ID_CONFIG_EXT_FILL: /* fallthrough */
754 invalid = 0;
755 while (len--) {
756 if (get_bits(gb, 8) != 0xA5)
757 invalid++;
758 }
759 if (invalid)
760 av_log(avctx, AV_LOG_WARNING, "Invalid fill bytes: %i\n",
761 invalid);
762 break;
763 default:
764 while (len--)
765 skip_bits(gb, 8);
766 break;
767 }
768 }
769 }
770
771 22 ac->avctx->profile = AV_PROFILE_AAC_USAC;
772
773 22 usac->loudness.input_method_val = select_loudness_measurement(usac);
774
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 14 times.
22 if (usac->loudness.input_method_val >= 0)
775 8 av_log(avctx, AV_LOG_VERBOSE,
776 "USAC input loudness: %.2f LKFS (bsMethodValue=%d)\n",
777 8 -57.75f + 0.25f * usac->loudness.input_method_val,
778 usac->loudness.input_method_val);
779
780 22 ret = ff_aac_usac_reset_state(ac, oc);
781
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (ret < 0)
782 return ret;
783
784 22 return 0;
785 }
786
787 15984 static int decode_usac_scale_factors(AACDecContext *ac,
788 SingleChannelElement *sce,
789 GetBitContext *gb, uint8_t global_gain)
790 {
791 15984 IndividualChannelStream *ics = &sce->ics;
792
793 /* Decode all scalefactors. */
794 15984 int offset_sf = global_gain;
795
2/2
✓ Branch 0 taken 17700 times.
✓ Branch 1 taken 15984 times.
33684 for (int g = 0; g < ics->num_window_groups; g++) {
796
2/2
✓ Branch 0 taken 741698 times.
✓ Branch 1 taken 17700 times.
759398 for (int sfb = 0; sfb < ics->max_sfb; sfb++) {
797
4/4
✓ Branch 0 taken 721304 times.
✓ Branch 1 taken 20394 times.
✓ Branch 2 taken 705332 times.
✓ Branch 3 taken 15972 times.
741698 if (g || sfb)
798 725726 offset_sf += get_vlc2(gb, ff_vlc_scalefactors, 7, 3) - SCALE_DIFF_ZERO;
799
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 741698 times.
741698 if (offset_sf > 255U) {
800 av_log(ac->avctx, AV_LOG_ERROR,
801 "Scalefactor (%d) out of range.\n", offset_sf);
802 return AVERROR_INVALIDDATA;
803 }
804
805 741698 sce->sfo[g*ics->max_sfb + sfb] = offset_sf - 100;
806 }
807 }
808
809 15984 return 0;
810 }
811
812 /**
813 * Decode and dequantize arithmetically coded, uniformly quantized value
814 *
815 * @param coef array of dequantized, scaled spectral data
816 * @param sf array of scalefactors or intensity stereo positions
817 *
818 * @return Returns error status. 0 - OK, !0 - error
819 */
820 19988 static int decode_spectrum_ac(AACDecContext *s, float coef[1024],
821 GetBitContext *gb, AACArithState *state,
822 int reset, uint16_t len, uint16_t N)
823 {
824 AACArith ac;
825 int i, a, b;
826 uint32_t c;
827
828 int gb_count;
829 GetBitContext gb2;
830
831 19988 c = ff_aac_ac_map_process(state, reset, N);
832
833
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 19976 times.
19988 if (!len) {
834 12 ff_aac_ac_finish(state, 0, N);
835 12 return 0;
836 }
837
838 19976 ff_aac_ac_init(&ac, gb);
839
840 /* Backup reader for rolling back by 14 bits at the end */
841 19976 gb2 = *gb;
842 19976 gb_count = get_bits_count(&gb2);
843
844
2/2
✓ Branch 0 taken 3773419 times.
✓ Branch 1 taken 4652 times.
3778071 for (i = 0; i < len/2; i++) {
845 /* MSB */
846 int lvl, esc_nb, m;
847 3773419 c = ff_aac_ac_get_context(state, c, i, N);
848 4024691 for (lvl=esc_nb=0;;) {
849 4024691 uint32_t pki = ff_aac_ac_get_pk(c + (esc_nb << 17));
850 4024691 m = ff_aac_ac_decode(&ac, &gb2, ff_aac_ac_msb_cdfs[pki],
851 FF_ARRAY_ELEMS(ff_aac_ac_msb_cdfs[pki]));
852
2/2
✓ Branch 0 taken 3773419 times.
✓ Branch 1 taken 251272 times.
4024691 if (m < FF_AAC_AC_ESCAPE)
853 3773419 break;
854 251272 lvl++;
855
856 /* Cargo-culted value. */
857
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 251272 times.
251272 if (lvl > 23)
858 return AVERROR(EINVAL);
859
860
2/2
✓ Branch 0 taken 548 times.
✓ Branch 1 taken 250724 times.
251272 if ((esc_nb = lvl) > 7)
861 548 esc_nb = 7;
862 }
863
864 3773419 b = m >> 2;
865 3773419 a = m - (b << 2);
866
867 /* ARITH_STOP detection */
868
2/2
✓ Branch 0 taken 2341624 times.
✓ Branch 1 taken 1431795 times.
3773419 if (!m) {
869
2/2
✓ Branch 0 taken 15324 times.
✓ Branch 1 taken 2326300 times.
2341624 if (esc_nb)
870 15324 break;
871 2326300 a = b = 0;
872 }
873
874 /* LSB */
875
2/2
✓ Branch 0 taken 235948 times.
✓ Branch 1 taken 3758095 times.
3994043 for (int l = lvl; l > 0; l--) {
876
4/4
✓ Branch 0 taken 207053 times.
✓ Branch 1 taken 28895 times.
✓ Branch 2 taken 29261 times.
✓ Branch 3 taken 177792 times.
235948 int lsbidx = !a ? 1 : (!b ? 0 : 2);
877 235948 uint8_t r = ff_aac_ac_decode(&ac, &gb2, ff_aac_ac_lsb_cdfs[lsbidx],
878 FF_ARRAY_ELEMS(ff_aac_ac_lsb_cdfs[lsbidx]));
879 235948 a = (a << 1) | (r & 1);
880 235948 b = (b << 1) | ((r >> 1) & 1);
881 }
882
883 /* Dequantize coeffs here */
884 3758095 coef[2*i + 0] = a * cbrt(a);
885 3758095 coef[2*i + 1] = b * cbrt(b);
886 3758095 ff_aac_ac_update_context(state, i, a, b);
887 }
888
889
1/2
✓ Branch 0 taken 19976 times.
✗ Branch 1 not taken.
19976 if (len > 1) {
890 /* "Rewind" bitstream back by 14 bits */
891 19976 int gb_count2 = get_bits_count(&gb2);
892 19976 skip_bits(gb, gb_count2 - gb_count - 14);
893 } else {
894 *gb = gb2;
895 }
896
897 19976 ff_aac_ac_finish(state, i, N);
898
899
2/2
✓ Branch 0 taken 4419569 times.
✓ Branch 1 taken 19976 times.
4439545 for (; i < N/2; i++) {
900 4419569 coef[2*i + 0] = 0;
901 4419569 coef[2*i + 1] = 0;
902 }
903
904 /* Signs */
905
2/2
✓ Branch 0 taken 16160000 times.
✓ Branch 1 taken 19976 times.
16179976 for (i = 0; i < len; i++) {
906
2/2
✓ Branch 0 taken 1954258 times.
✓ Branch 1 taken 14205742 times.
16160000 if (coef[i]) {
907
2/2
✓ Branch 1 taken 978138 times.
✓ Branch 2 taken 976120 times.
1954258 if (!get_bits1(gb)) /* s */
908 978138 coef[i] *= -1;
909 }
910 }
911
912 19976 return 0;
913 }
914
915 1 static int decode_usac_stereo_cplx(AACDecContext *ac, AACUsacStereo *us,
916 ChannelElement *cpe, GetBitContext *gb,
917 int num_window_groups,
918 int prev_num_window_groups,
919 int indep_flag)
920 {
921 int delta_code_time;
922 1 IndividualChannelStream *ics = &cpe->ch[0].ics;
923
924
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (!get_bits1(gb)) { /* cplx_pred_all */
925
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < num_window_groups; g++) {
926
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 4 times.
28 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb += SFB_PER_PRED_BAND) {
927 24 const uint8_t val = get_bits1(gb);
928 24 us->pred_used[g*cpe->max_sfb_ste + sfb] = val;
929
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 if ((sfb + 1) < cpe->max_sfb_ste)
930 24 us->pred_used[g*cpe->max_sfb_ste + sfb + 1] = val;
931 }
932 }
933 } else {
934 for (int g = 0; g < num_window_groups; g++)
935 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++)
936 us->pred_used[g*cpe->max_sfb_ste + sfb] = 1;
937 }
938
939 1 us->pred_dir = get_bits1(gb);
940 1 us->complex_coef = get_bits1(gb);
941
942 1 us->use_prev_frame = 0;
943
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1 if (us->complex_coef && !indep_flag)
944 us->use_prev_frame = get_bits1(gb);
945
946 1 delta_code_time = 0;
947
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (!indep_flag)
948 1 delta_code_time = get_bits1(gb);
949
950 /* TODO: shouldn't be needed */
951
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < num_window_groups; g++) {
952
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 4 times.
28 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb += SFB_PER_PRED_BAND) {
953 24 float last_alpha_q_re = 0;
954 24 float last_alpha_q_im = 0;
955
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (delta_code_time) {
956 if (g) {
957 /* Transient, after the first group - use the current frame,
958 * previous window, alpha values. */
959 last_alpha_q_re = us->alpha_q_re[(g - 1)*cpe->max_sfb_ste + sfb];
960 last_alpha_q_im = us->alpha_q_im[(g - 1)*cpe->max_sfb_ste + sfb];
961 } else if (!g &&
962 (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) &&
963 (ics->window_sequence[1] == EIGHT_SHORT_SEQUENCE)) {
964 /* The spec doesn't explicitly mention this, but it doesn't make
965 * any other sense otherwise! */
966 const int wg = prev_num_window_groups - 1;
967 last_alpha_q_re = us->prev_alpha_q_re[wg*cpe->max_sfb_ste + sfb];
968 last_alpha_q_im = us->prev_alpha_q_im[wg*cpe->max_sfb_ste + sfb];
969 } else {
970 last_alpha_q_re = us->prev_alpha_q_re[g*cpe->max_sfb_ste + sfb];
971 last_alpha_q_im = us->prev_alpha_q_im[g*cpe->max_sfb_ste + sfb];
972 }
973 } else {
974
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 4 times.
24 if (sfb) {
975 20 last_alpha_q_re = us->alpha_q_re[g*cpe->max_sfb_ste + sfb - 1];
976 20 last_alpha_q_im = us->alpha_q_im[g*cpe->max_sfb_ste + sfb - 1];
977 }
978 }
979
980
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 7 times.
24 if (us->pred_used[g*cpe->max_sfb_ste + sfb]) {
981 17 int val = -get_vlc2(gb, ff_vlc_scalefactors, 7, 3) + 60;
982 17 last_alpha_q_re += val * 0.1f;
983
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
17 if (us->complex_coef) {
984 val = -get_vlc2(gb, ff_vlc_scalefactors, 7, 3) + 60;
985 last_alpha_q_im += val * 0.1f;
986 }
987 17 us->alpha_q_re[g*cpe->max_sfb_ste + sfb] = last_alpha_q_re;
988 17 us->alpha_q_im[g*cpe->max_sfb_ste + sfb] = last_alpha_q_im;
989 } else {
990 7 us->alpha_q_re[g*cpe->max_sfb_ste + sfb] = 0;
991 7 us->alpha_q_im[g*cpe->max_sfb_ste + sfb] = 0;
992 }
993
994
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 if ((sfb + 1) < cpe->max_sfb_ste) {
995 24 us->alpha_q_re[g*cpe->max_sfb_ste + sfb + 1] =
996 24 us->alpha_q_re[g*cpe->max_sfb_ste + sfb];
997 24 us->alpha_q_im[g*cpe->max_sfb_ste + sfb + 1] =
998 24 us->alpha_q_im[g*cpe->max_sfb_ste + sfb];
999 }
1000 }
1001 }
1002
1003 1 return 0;
1004 }
1005
1006 15984 static int setup_sce(AACDecContext *ac, SingleChannelElement *sce,
1007 AACUSACConfig *usac)
1008 {
1009 15984 AACUsacElemData *ue = &sce->ue;
1010 15984 IndividualChannelStream *ics = &sce->ics;
1011 15984 const int sampling_index = ac->oc[1].m4ac.sampling_index;
1012
1013 /* Setup window parameters */
1014 15984 ics->prev_num_window_groups = FFMAX(ics->num_window_groups, 1);
1015
2/2
✓ Branch 0 taken 572 times.
✓ Branch 1 taken 15412 times.
15984 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1016
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 572 times.
572 if (usac->core_frame_len == 768) {
1017 ics->swb_offset = ff_swb_offset_96[sampling_index];
1018 ics->num_swb = ff_aac_num_swb_96[sampling_index];
1019 } else {
1020 572 ics->swb_offset = ff_swb_offset_128[sampling_index];
1021 572 ics->num_swb = ff_aac_num_swb_128[sampling_index];
1022 }
1023 572 ics->tns_max_bands = ff_tns_max_bands_usac_128[sampling_index];
1024
1025 /* Setup scalefactor grouping. 7 bit mask. */
1026 572 ics->num_window_groups = 0;
1027
2/2
✓ Branch 0 taken 4004 times.
✓ Branch 1 taken 572 times.
4576 for (int j = 0; j < 7; j++) {
1028 4004 ics->group_len[j] = 1;
1029
2/2
✓ Branch 0 taken 2288 times.
✓ Branch 1 taken 1716 times.
4004 if (ue->scale_factor_grouping & (1 << (6 - j)))
1030 2288 ics->group_len[ics->num_window_groups] += 1;
1031 else
1032 1716 ics->num_window_groups++;
1033 }
1034
1035 572 ics->group_len[7] = 1;
1036 572 ics->num_window_groups++;
1037 572 ics->num_windows = 8;
1038 } else {
1039
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15412 times.
15412 if (usac->core_frame_len == 768) {
1040 ics->swb_offset = ff_swb_offset_768[sampling_index];
1041 ics->num_swb = ff_aac_num_swb_768[sampling_index];
1042 } else {
1043 15412 ics->swb_offset = ff_swb_offset_1024[sampling_index];
1044 15412 ics->num_swb = ff_aac_num_swb_1024[sampling_index];
1045 }
1046 15412 ics->tns_max_bands = ff_tns_max_bands_usac_1024[sampling_index];
1047
1048 15412 ics->group_len[0] = 1;
1049 15412 ics->num_window_groups = 1;
1050 15412 ics->num_windows = 1;
1051 }
1052
1053
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15984 times.
15984 if (ics->max_sfb > ics->num_swb) {
1054 av_log(ac->avctx, AV_LOG_ERROR,
1055 "Number of scalefactor bands in group (%d) "
1056 "exceeds limit (%d).\n",
1057 ics->max_sfb, ics->num_swb);
1058 ics->max_sfb = 0;
1059 return AVERROR(EINVAL);
1060 }
1061
1062 /* Just some defaults for the band types */
1063
2/2
✓ Branch 0 taken 2045952 times.
✓ Branch 1 taken 15984 times.
2061936 for (int i = 0; i < FF_ARRAY_ELEMS(sce->band_type); i++)
1064 2045952 sce->band_type[i] = ESC_BT;
1065
1066 15984 return 0;
1067 }
1068
1069 7089 static int decode_usac_stereo_info(AACDecContext *ac, AACUSACConfig *usac,
1070 AACUsacElemConfig *ec, ChannelElement *cpe,
1071 GetBitContext *gb, int indep_flag)
1072 {
1073 int ret, tns_active;
1074
1075 7089 AACUsacStereo *us = &cpe->us;
1076 7089 SingleChannelElement *sce1 = &cpe->ch[0];
1077 7089 SingleChannelElement *sce2 = &cpe->ch[1];
1078 7089 IndividualChannelStream *ics1 = &sce1->ics;
1079 7089 IndividualChannelStream *ics2 = &sce2->ics;
1080 7089 AACUsacElemData *ue1 = &sce1->ue;
1081 7089 AACUsacElemData *ue2 = &sce2->ue;
1082
1083 7089 us->common_window = 0;
1084 7089 us->common_tw = 0;
1085
1086 /* Alpha values must always be zeroed out for the current frame,
1087 * as they are propagated to the next frame and may be used. */
1088 7089 memset(us->alpha_q_re, 0, sizeof(us->alpha_q_re));
1089 7089 memset(us->alpha_q_im, 0, sizeof(us->alpha_q_im));
1090
1091
2/4
✓ Branch 0 taken 7089 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7089 times.
7089 if (!(!ue1->core_mode && !ue2->core_mode))
1092 return 0;
1093
1094 7089 tns_active = get_bits1(gb);
1095 7089 us->common_window = get_bits1(gb);
1096
1097
4/4
✓ Branch 0 taken 5664 times.
✓ Branch 1 taken 1425 times.
✓ Branch 2 taken 416 times.
✓ Branch 3 taken 5248 times.
7089 if (!us->common_window || indep_flag) {
1098 1841 memset(us->prev_alpha_q_re, 0, sizeof(us->prev_alpha_q_re));
1099 1841 memset(us->prev_alpha_q_im, 0, sizeof(us->prev_alpha_q_im));
1100 }
1101
1102
2/2
✓ Branch 0 taken 5664 times.
✓ Branch 1 taken 1425 times.
7089 if (us->common_window) {
1103 /* ics_info() */
1104 5664 ics1->window_sequence[1] = ics1->window_sequence[0];
1105 5664 ics2->window_sequence[1] = ics2->window_sequence[0];
1106 5664 ics1->window_sequence[0] = ics2->window_sequence[0] = get_bits(gb, 2);
1107
1108 5664 ics1->use_kb_window[1] = ics1->use_kb_window[0];
1109 5664 ics2->use_kb_window[1] = ics2->use_kb_window[0];
1110 5664 ics1->use_kb_window[0] = ics2->use_kb_window[0] = get_bits1(gb);
1111
1112 /* If there's a change in the transform sequence, zero out last frame's
1113 * stereo prediction coefficients */
1114
2/2
✓ Branch 0 taken 286 times.
✓ Branch 1 taken 5378 times.
5664 if ((ics1->window_sequence[0] == EIGHT_SHORT_SEQUENCE &&
1115
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 4 times.
286 ics1->window_sequence[1] != EIGHT_SHORT_SEQUENCE) ||
1116
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 5378 times.
5660 (ics1->window_sequence[1] == EIGHT_SHORT_SEQUENCE &&
1117
1/2
✓ Branch 0 taken 282 times.
✗ Branch 1 not taken.
282 ics1->window_sequence[0] != EIGHT_SHORT_SEQUENCE) ||
1118
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 5378 times.
5660 (ics2->window_sequence[0] == EIGHT_SHORT_SEQUENCE &&
1119
1/2
✓ Branch 0 taken 282 times.
✗ Branch 1 not taken.
282 ics2->window_sequence[1] != EIGHT_SHORT_SEQUENCE) ||
1120
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 5378 times.
5660 (ics2->window_sequence[1] == EIGHT_SHORT_SEQUENCE &&
1121
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 282 times.
282 ics2->window_sequence[0] != EIGHT_SHORT_SEQUENCE)) {
1122 4 memset(us->prev_alpha_q_re, 0, sizeof(us->prev_alpha_q_re));
1123 4 memset(us->prev_alpha_q_im, 0, sizeof(us->prev_alpha_q_im));
1124 }
1125
1126
2/2
✓ Branch 0 taken 286 times.
✓ Branch 1 taken 5378 times.
5664 if (ics1->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1127 286 ics1->max_sfb = ics2->max_sfb = get_bits(gb, 4);
1128 286 ue1->scale_factor_grouping = ue2->scale_factor_grouping = get_bits(gb, 7);
1129 } else {
1130 5378 ics1->max_sfb = ics2->max_sfb = get_bits(gb, 6);
1131 }
1132
1133
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5664 times.
5664 if (!get_bits1(gb)) { /* common_max_sfb */
1134 if (ics2->window_sequence[0] == EIGHT_SHORT_SEQUENCE)
1135 ics2->max_sfb = get_bits(gb, 4);
1136 else
1137 ics2->max_sfb = get_bits(gb, 6);
1138 }
1139
1140 5664 ret = setup_sce(ac, sce1, usac);
1141
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5664 times.
5664 if (ret < 0) {
1142 ics2->max_sfb = 0;
1143 return ret;
1144 }
1145
1146 5664 ret = setup_sce(ac, sce2, usac);
1147
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5664 times.
5664 if (ret < 0)
1148 return ret;
1149
1150 5664 cpe->max_sfb_ste = FFMAX(ics1->max_sfb, ics2->max_sfb);
1151
1152 5664 us->ms_mask_mode = get_bits(gb, 2); /* ms_mask_present */
1153 5664 memset(cpe->ms_mask, 0, sizeof(cpe->ms_mask));
1154
2/2
✓ Branch 0 taken 3716 times.
✓ Branch 1 taken 1948 times.
5664 if (us->ms_mask_mode == 1) {
1155
2/2
✓ Branch 0 taken 3716 times.
✓ Branch 1 taken 3716 times.
7432 for (int g = 0; g < ics1->num_window_groups; g++)
1156
2/2
✓ Branch 0 taken 162324 times.
✓ Branch 1 taken 3716 times.
166040 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++)
1157 162324 cpe->ms_mask[g*cpe->max_sfb_ste + sfb] = get_bits1(gb);
1158
2/2
✓ Branch 0 taken 82 times.
✓ Branch 1 taken 1866 times.
1948 } else if (us->ms_mask_mode == 2) {
1159 82 memset(cpe->ms_mask, 0xFF, sizeof(cpe->ms_mask));
1160
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1865 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1866 } else if ((us->ms_mask_mode == 3) && !ec->stereo_config_index) {
1161 1 ret = decode_usac_stereo_cplx(ac, us, cpe, gb,
1162 ics1->num_window_groups,
1163 ics1->prev_num_window_groups,
1164 indep_flag);
1165
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (ret < 0)
1166 return ret;
1167 }
1168 }
1169
1170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7089 times.
7089 if (ec->tw_mdct) {
1171 us->common_tw = get_bits1(gb);
1172 avpriv_report_missing_feature(ac->avctx,
1173 "AAC USAC timewarping");
1174 return AVERROR_PATCHWELCOME;
1175 }
1176
1177 7089 us->tns_on_lr = 0;
1178 7089 ue1->tns_data_present = ue2->tns_data_present = 0;
1179
2/2
✓ Branch 0 taken 1300 times.
✓ Branch 1 taken 5789 times.
7089 if (tns_active) {
1180 1300 int common_tns = 0;
1181
2/2
✓ Branch 0 taken 655 times.
✓ Branch 1 taken 645 times.
1300 if (us->common_window)
1182 655 common_tns = get_bits1(gb);
1183
1184 1300 us->tns_on_lr = get_bits1(gb);
1185
2/2
✓ Branch 0 taken 327 times.
✓ Branch 1 taken 973 times.
1300 if (common_tns) {
1186 327 ret = ff_aac_decode_tns(ac, &sce1->tns, gb, ics1);
1187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 327 times.
327 if (ret < 0)
1188 return ret;
1189 327 memcpy(&sce2->tns, &sce1->tns, sizeof(sce1->tns));
1190 327 sce2->tns.present = 1;
1191 327 sce1->tns.present = 1;
1192 327 ue1->tns_data_present = 0;
1193 327 ue2->tns_data_present = 0;
1194 } else {
1195
2/2
✓ Branch 1 taken 196 times.
✓ Branch 2 taken 777 times.
973 if (get_bits1(gb)) {
1196 196 ue1->tns_data_present = 1;
1197 196 ue2->tns_data_present = 1;
1198 } else {
1199 777 ue2->tns_data_present = get_bits1(gb);
1200 777 ue1->tns_data_present = !ue2->tns_data_present;
1201 }
1202 }
1203 }
1204
1205 7089 return 0;
1206 }
1207
1208 /* 7.2.4 Generation of random signs for spectral noise filling
1209 * This function is exactly defined, though we've helped the definition
1210 * along with being slightly faster. */
1211 37876 static inline float noise_random_sign(unsigned int *seed)
1212 {
1213 37876 unsigned int new_seed = *seed = ((*seed) * 69069) + 5;
1214
2/2
✓ Branch 0 taken 19156 times.
✓ Branch 1 taken 18720 times.
37876 if (((new_seed) & 0x10000) > 0)
1215 19156 return -1.f;
1216 18720 return +1.f;
1217 }
1218
1219 96 static void apply_noise_fill(AACDecContext *ac, SingleChannelElement *sce,
1220 AACUsacElemData *ue)
1221 {
1222 float *coef;
1223 96 IndividualChannelStream *ics = &sce->ics;
1224
1225 96 float noise_val = powf(2, ((float)ue->noise.level - 14.0f)/3.0f);
1226 96 int noise_offset = ue->noise.offset - 16;
1227 int band_off;
1228
1229 96 band_off = ff_usac_noise_fill_start_offset[ac->oc[1].m4ac.frame_length_short]
1230 96 [ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE];
1231
1232 96 coef = sce->coeffs;
1233
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 96 times.
198 for (int g = 0; g < ics->num_window_groups; g++) {
1234 102 unsigned g_len = ics->group_len[g];
1235
1236
2/2
✓ Branch 0 taken 3500 times.
✓ Branch 1 taken 102 times.
3602 for (int sfb = 0; sfb < ics->max_sfb; sfb++) {
1237 3500 float *cb = coef + ics->swb_offset[sfb];
1238 3500 int cb_len = ics->swb_offset[sfb + 1] - ics->swb_offset[sfb];
1239 3500 int band_quantized_to_zero = 1;
1240
1241
2/2
✓ Branch 0 taken 2108 times.
✓ Branch 1 taken 1392 times.
3500 if (ics->swb_offset[sfb] < band_off)
1242 2108 continue;
1243
1244
2/2
✓ Branch 0 taken 1448 times.
✓ Branch 1 taken 1392 times.
2840 for (int group = 0; group < (unsigned)g_len; group++, cb += 128) {
1245
2/2
✓ Branch 0 taken 37952 times.
✓ Branch 1 taken 1448 times.
39400 for (int z = 0; z < cb_len; z++) {
1246
2/2
✓ Branch 0 taken 37876 times.
✓ Branch 1 taken 76 times.
37952 if (cb[z] == 0)
1247 37876 cb[z] = noise_random_sign(&sce->ue.noise.seed) * noise_val;
1248 else
1249 76 band_quantized_to_zero = 0;
1250 }
1251 }
1252
1253
2/2
✓ Branch 0 taken 1385 times.
✓ Branch 1 taken 7 times.
1392 if (band_quantized_to_zero) {
1254 1385 sce->sfo[g*ics->max_sfb + sfb] = FFMAX(sce->sfo[g*ics->max_sfb + sfb] + noise_offset, -200);
1255 }
1256 }
1257 102 coef += g_len << 7;
1258 }
1259 96 }
1260
1261 15984 static void spectrum_scale(AACDecContext *ac, SingleChannelElement *sce,
1262 AACUsacElemData *ue)
1263 {
1264 15984 IndividualChannelStream *ics = &sce->ics;
1265 float *coef;
1266
1267 /* Synthesise noise */
1268
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 15888 times.
15984 if (ue->noise.level)
1269 96 apply_noise_fill(ac, sce, ue);
1270
1271 /* Noise filling may apply an offset to the scalefactor offset */
1272 15984 ac->dsp.dequant_scalefactors(sce);
1273
1274 /* Apply scalefactors */
1275 15984 coef = sce->coeffs;
1276
2/2
✓ Branch 0 taken 17700 times.
✓ Branch 1 taken 15984 times.
33684 for (int g = 0; g < ics->num_window_groups; g++) {
1277 17700 unsigned g_len = ics->group_len[g];
1278
1279
2/2
✓ Branch 0 taken 741698 times.
✓ Branch 1 taken 17700 times.
759398 for (int sfb = 0; sfb < ics->max_sfb; sfb++) {
1280 741698 float *cb = coef + ics->swb_offset[sfb];
1281 741698 int cb_len = ics->swb_offset[sfb + 1] - ics->swb_offset[sfb];
1282 741698 float sf = sce->sf[g*ics->max_sfb + sfb];
1283
1284
2/2
✓ Branch 0 taken 768890 times.
✓ Branch 1 taken 741698 times.
1510588 for (int group = 0; group < (unsigned)g_len; group++, cb += 128)
1285 768890 ac->fdsp->vector_fmul_scalar(cb, cb, sf, cb_len);
1286 }
1287 17700 coef += g_len << 7;
1288 }
1289 15984 }
1290
1291 1 static void complex_stereo_downmix_prev(AACDecContext *ac, ChannelElement *cpe,
1292 float *dmix_re)
1293 {
1294 1 IndividualChannelStream *ics = &cpe->ch[0].ics;
1295
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 int sign = !cpe->us.pred_dir ? +1 : -1;
1296 1 float *coef1 = cpe->ch[0].coeffs;
1297 1 float *coef2 = cpe->ch[1].coeffs;
1298
1299
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < ics->num_window_groups; g++) {
1300 4 unsigned g_len = ics->group_len[g];
1301
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 4 times.
52 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++) {
1302 48 int off = ics->swb_offset[sfb];
1303 48 int cb_len = ics->swb_offset[sfb + 1] - off;
1304
1305 48 float *c1 = coef1 + off;
1306 48 float *c2 = coef2 + off;
1307 48 float *dm = dmix_re + off;
1308
1309
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 48 times.
144 for (int group = 0; group < (unsigned)g_len;
1310 96 group++, c1 += 128, c2 += 128, dm += 128) {
1311
2/2
✓ Branch 0 taken 768 times.
✓ Branch 1 taken 96 times.
864 for (int z = 0; z < cb_len; z++)
1312 768 dm[z] = 0.5*(c1[z] + sign*c2[z]);
1313 }
1314 }
1315
1316 4 coef1 += g_len << 7;
1317 4 coef2 += g_len << 7;
1318 4 dmix_re += g_len << 7;
1319 }
1320 1 }
1321
1322 1 static void complex_stereo_downmix_cur(AACDecContext *ac, ChannelElement *cpe,
1323 float *dmix_re)
1324 {
1325 1 AACUsacStereo *us = &cpe->us;
1326 1 IndividualChannelStream *ics = &cpe->ch[0].ics;
1327
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 int sign = !cpe->us.pred_dir ? +1 : -1;
1328 1 float *coef1 = cpe->ch[0].coeffs;
1329 1 float *coef2 = cpe->ch[1].coeffs;
1330
1331
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < ics->num_window_groups; g++) {
1332 4 unsigned g_len = ics->group_len[g];
1333
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 4 times.
52 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++) {
1334 48 int off = ics->swb_offset[sfb];
1335 48 int cb_len = ics->swb_offset[sfb + 1] - off;
1336
1337 48 float *c1 = coef1 + off;
1338 48 float *c2 = coef2 + off;
1339 48 float *dm = dmix_re + off;
1340
1341
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 14 times.
48 if (us->pred_used[g*cpe->max_sfb_ste + sfb]) {
1342
2/2
✓ Branch 0 taken 82 times.
✓ Branch 1 taken 34 times.
116 for (int group = 0; group < (unsigned)g_len;
1343 82 group++, c1 += 128, c2 += 128, dm += 128) {
1344
2/2
✓ Branch 0 taken 672 times.
✓ Branch 1 taken 82 times.
754 for (int z = 0; z < cb_len; z++)
1345 672 dm[z] = 0.5*(c1[z] + sign*c2[z]);
1346 }
1347 } else {
1348
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 14 times.
28 for (int group = 0; group < (unsigned)g_len;
1349 14 group++, c1 += 128, c2 += 128, dm += 128) {
1350
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 14 times.
110 for (int z = 0; z < cb_len; z++)
1351 96 dm[z] = c1[z];
1352 }
1353 }
1354 }
1355
1356 4 coef1 += g_len << 7;
1357 4 coef2 += g_len << 7;
1358 4 dmix_re += g_len << 7;
1359 }
1360 1 }
1361
1362 1 static void complex_stereo_interpolate_imag(float *im, float *re, const float f[7],
1363 int len, int factor_even, int factor_odd)
1364 {
1365 1 int i = 0;
1366 float s;
1367
1368 1 s = f[6]*re[2] + f[5]*re[1] + f[4]*re[0] +
1369 1 f[3]*re[0] +
1370 1 f[2]*re[1] + f[1]*re[2] + f[0]*re[3];
1371 1 im[i] += s*factor_even;
1372
1373 1 i = 1;
1374 1 s = f[6]*re[1] + f[5]*re[0] + f[4]*re[0] +
1375 1 f[3]*re[1] +
1376 1 f[2]*re[2] + f[1]*re[3] + f[0]*re[4];
1377 1 im[i] += s*factor_odd;
1378
1379 1 i = 2;
1380 1 s = f[6]*re[0] + f[5]*re[0] + f[4]*re[1] +
1381 1 f[3]*re[2] +
1382 1 f[2]*re[3] + f[1]*re[4] + f[0]*re[5];
1383
1384 1 im[i] += s*factor_even;
1385
2/2
✓ Branch 0 taken 509 times.
✓ Branch 1 taken 1 times.
510 for (i = 3; i < len - 4; i += 2) {
1386 509 s = f[6]*re[i-3] + f[5]*re[i-2] + f[4]*re[i-1] +
1387 509 f[3]*re[i] +
1388 509 f[2]*re[i+1] + f[1]*re[i+2] + f[0]*re[i+3];
1389 509 im[i+0] += s*factor_odd;
1390
1391 509 s = f[6]*re[i-2] + f[5]*re[i-1] + f[4]*re[i] +
1392 509 f[3]*re[i+1] +
1393 509 f[2]*re[i+2] + f[1]*re[i+3] + f[0]*re[i+4];
1394 509 im[i+1] += s*factor_even;
1395 }
1396
1397 1 i = len - 3;
1398 1 s = f[6]*re[i-3] + f[5]*re[i-2] + f[4]*re[i-1] +
1399 1 f[3]*re[i] +
1400 1 f[2]*re[i+1] + f[1]*re[i+2] + f[0]*re[i+2];
1401 1 im[i] += s*factor_odd;
1402
1403 1 i = len - 2;
1404 1 s = f[6]*re[i-3] + f[5]*re[i-2] + f[4]*re[i-1] +
1405 1 f[3]*re[i] +
1406 1 f[2]*re[i+1] + f[1]*re[i+1] + f[0]*re[i];
1407 1 im[i] += s*factor_even;
1408
1409 1 i = len - 1;
1410 1 s = f[6]*re[i-3] + f[5]*re[i-2] + f[4]*re[i-1] +
1411 1 f[3]*re[i] +
1412 1 f[2]*re[i] + f[1]*re[i-1] + f[0]*re[i-2];
1413 1 im[i] += s*factor_odd;
1414 1 }
1415
1416 1 static void apply_complex_stereo(AACDecContext *ac, ChannelElement *cpe)
1417 {
1418 1 AACUsacStereo *us = &cpe->us;
1419 1 IndividualChannelStream *ics = &cpe->ch[0].ics;
1420 1 float *coef1 = cpe->ch[0].coeffs;
1421 1 float *coef2 = cpe->ch[1].coeffs;
1422 1 float *dmix_im = us->dmix_im;
1423
1424
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < ics->num_window_groups; g++) {
1425 4 unsigned g_len = ics->group_len[g];
1426
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 4 times.
52 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++) {
1427 48 int off = ics->swb_offset[sfb];
1428 48 int cb_len = ics->swb_offset[sfb + 1] - off;
1429
1430 48 float *c1 = coef1 + off;
1431 48 float *c2 = coef2 + off;
1432 48 float *dm_im = dmix_im + off;
1433 48 float alpha_re = us->alpha_q_re[g*cpe->max_sfb_ste + sfb];
1434 48 float alpha_im = us->alpha_q_im[g*cpe->max_sfb_ste + sfb];
1435
1436
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 34 times.
48 if (!us->pred_used[g*cpe->max_sfb_ste + sfb])
1437 14 continue;
1438
1439
1/2
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
34 if (!cpe->us.pred_dir) {
1440
2/2
✓ Branch 0 taken 82 times.
✓ Branch 1 taken 34 times.
116 for (int group = 0; group < (unsigned)g_len;
1441 82 group++, c1 += 128, c2 += 128, dm_im += 128) {
1442
2/2
✓ Branch 0 taken 672 times.
✓ Branch 1 taken 82 times.
754 for (int z = 0; z < cb_len; z++) {
1443 float side;
1444 672 side = c2[z] - alpha_re*c1[z] - alpha_im*dm_im[z];
1445 672 c2[z] = c1[z] - side;
1446 672 c1[z] = c1[z] + side;
1447 }
1448 }
1449 } else {
1450 for (int group = 0; group < (unsigned)g_len;
1451 group++, c1 += 128, c2 += 128, dm_im += 128) {
1452 for (int z = 0; z < cb_len; z++) {
1453 float mid;
1454 mid = c2[z] - alpha_re*c1[z] - alpha_im*dm_im[z];
1455 c2[z] = mid - c1[z];
1456 c1[z] = mid + c1[z];
1457 }
1458 }
1459 }
1460 }
1461
1462 4 coef1 += g_len << 7;
1463 4 coef2 += g_len << 7;
1464 4 dmix_im += g_len << 7;
1465 }
1466 1 }
1467
1468 1 static const float *complex_stereo_get_filter(ChannelElement *cpe, int is_prev)
1469 {
1470 int win, shape;
1471
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (!is_prev) {
1472
1/3
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
1 switch (cpe->ch[0].ics.window_sequence[0]) {
1473 1 default:
1474 case ONLY_LONG_SEQUENCE:
1475 case EIGHT_SHORT_SEQUENCE:
1476 1 win = 0;
1477 1 break;
1478 case LONG_START_SEQUENCE:
1479 win = 1;
1480 break;
1481 case LONG_STOP_SEQUENCE:
1482 win = 2;
1483 break;
1484 }
1485
1486
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (cpe->ch[0].ics.use_kb_window[0] == 0 &&
1487 cpe->ch[0].ics.use_kb_window[1] == 0)
1488 shape = 0;
1489
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 else if (cpe->ch[0].ics.use_kb_window[0] == 1 &&
1490
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 cpe->ch[0].ics.use_kb_window[1] == 1)
1491 1 shape = 1;
1492 else if (cpe->ch[0].ics.use_kb_window[0] == 0 &&
1493 cpe->ch[0].ics.use_kb_window[1] == 1)
1494 shape = 2;
1495 else if (cpe->ch[0].ics.use_kb_window[0] == 1 &&
1496 cpe->ch[0].ics.use_kb_window[1] == 0)
1497 shape = 3;
1498 else
1499 shape = 3;
1500 } else {
1501 win = cpe->ch[0].ics.window_sequence[0] == LONG_STOP_SEQUENCE;
1502 shape = cpe->ch[0].ics.use_kb_window[1];
1503 }
1504
1505 1 return ff_aac_usac_mdst_filt_cur[win][shape];
1506 }
1507
1508 8895 static void spectrum_decode(AACDecContext *ac, AACUSACConfig *usac,
1509 ChannelElement *cpe, int nb_channels)
1510 {
1511 8895 AACUsacStereo *us = &cpe->us;
1512
1513
2/2
✓ Branch 0 taken 15984 times.
✓ Branch 1 taken 8895 times.
24879 for (int ch = 0; ch < nb_channels; ch++) {
1514 15984 SingleChannelElement *sce = &cpe->ch[ch];
1515 15984 AACUsacElemData *ue = &sce->ue;
1516
1517
1/2
✓ Branch 0 taken 15984 times.
✗ Branch 1 not taken.
15984 if (!ue->core_mode)
1518 15984 spectrum_scale(ac, sce, ue);
1519 }
1520
1521
4/4
✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 1806 times.
✓ Branch 2 taken 5664 times.
✓ Branch 3 taken 1425 times.
8895 if (nb_channels > 1 && us->common_window) {
1522
2/2
✓ Branch 0 taken 11328 times.
✓ Branch 1 taken 5664 times.
16992 for (int ch = 0; ch < nb_channels; ch++) {
1523 11328 SingleChannelElement *sce = &cpe->ch[ch];
1524
1525 /* Apply TNS, if the tns_on_lr bit is not set. */
1526
3/4
✓ Branch 0 taken 1049 times.
✓ Branch 1 taken 10279 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1049 times.
11328 if (sce->tns.present && !us->tns_on_lr)
1527 ac->dsp.apply_tns(sce->coeffs, &sce->tns, &sce->ics, 1);
1528 }
1529
1530
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5663 times.
5664 if (us->ms_mask_mode == 3) {
1531 const float *filt;
1532 1 complex_stereo_downmix_cur(ac, cpe, us->dmix_re);
1533 1 complex_stereo_downmix_prev(ac, cpe, us->prev_dmix_re);
1534
1535 1 filt = complex_stereo_get_filter(cpe, 0);
1536 1 complex_stereo_interpolate_imag(us->dmix_im, us->dmix_re, filt,
1537 1 usac->core_frame_len, 1, 1);
1538
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (us->use_prev_frame) {
1539 filt = complex_stereo_get_filter(cpe, 1);
1540 complex_stereo_interpolate_imag(us->dmix_im, us->prev_dmix_re, filt,
1541 usac->core_frame_len, -1, 1);
1542 }
1543
1544 1 apply_complex_stereo(ac, cpe);
1545
2/2
✓ Branch 0 taken 3798 times.
✓ Branch 1 taken 1865 times.
5663 } else if (us->ms_mask_mode > 0) {
1546 3798 ac->dsp.apply_mid_side_stereo(ac, cpe);
1547 }
1548 }
1549
1550 /* Save coefficients and alpha values for prediction reasons */
1551
2/2
✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 1806 times.
8895 if (nb_channels > 1) {
1552 7089 AACUsacStereo *us2 = &cpe->us;
1553
2/2
✓ Branch 0 taken 14178 times.
✓ Branch 1 taken 7089 times.
21267 for (int ch = 0; ch < nb_channels; ch++) {
1554 14178 SingleChannelElement *sce = &cpe->ch[ch];
1555 14178 memcpy(sce->prev_coeffs, sce->coeffs, sizeof(sce->coeffs));
1556 }
1557 7089 memcpy(us2->prev_alpha_q_re, us2->alpha_q_re, sizeof(us2->alpha_q_re));
1558 7089 memcpy(us2->prev_alpha_q_im, us2->alpha_q_im, sizeof(us2->alpha_q_im));
1559 }
1560
1561
2/2
✓ Branch 0 taken 15984 times.
✓ Branch 1 taken 8895 times.
24879 for (int ch = 0; ch < nb_channels; ch++) {
1562 15984 SingleChannelElement *sce = &cpe->ch[ch];
1563
1564 /* Apply TNS, if it hasn't been applied yet. */
1565
4/6
✓ Branch 0 taken 1823 times.
✓ Branch 1 taken 14161 times.
✓ Branch 2 taken 1823 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1823 times.
✗ Branch 5 not taken.
15984 if (sce->tns.present && ((nb_channels == 1) || (us->tns_on_lr)))
1566 1823 ac->dsp.apply_tns(sce->coeffs, &sce->tns, &sce->ics, 1);
1567
1568
1/2
✓ Branch 0 taken 15984 times.
✗ Branch 1 not taken.
15984 if (!sce->ue.core_mode)
1569
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15984 times.
15984 ac->oc[1].m4ac.frame_length_short ? ac->dsp.imdct_and_windowing_768(ac, sce) :
1570 15984 ac->dsp.imdct_and_windowing(ac, sce);
1571 }
1572 8895 }
1573
1574 static const uint8_t mps_fr_nb_bands[8] = {
1575 255 /* Reserved */, 28, 20, 14, 10, 7, 5, 4,
1576 };
1577
1578 static const uint8_t mps_fr_stride_smg[4] = {
1579 1, 2, 5, 28,
1580 };
1581
1582 static void decode_tsd(GetBitContext *gb, int *data,
1583 int nb_tr_slots, int nb_slots)
1584 {
1585 int nb_bits = av_log2(nb_slots / (nb_tr_slots + 1));
1586 int s = get_bits(gb, nb_bits);
1587 for (int k = 0; k < nb_slots; k++)
1588 data[k]=0;
1589
1590 int p = nb_tr_slots + 1;
1591 for (int k = nb_slots - 1; k >= 0; k--) {
1592 if (p > k) {
1593 for (; k >= 0; k--)
1594 data[k] = 1;
1595 break;
1596 }
1597 int64_t c = k - p + 1;
1598 for (int h = 2; h <= p && c <= s; h++) {
1599 c += c*(k-p)/h;
1600 }
1601 if (s >= c) {
1602 s -= c;
1603 data[k] = 1;
1604 p--;
1605 if (!p)
1606 break;
1607 }
1608 }
1609 }
1610
1611 static int parse_mps212(AACDecContext *ac, AACUSACConfig *usac,
1612 AACUsacMPSData *mps, AACUsacElemConfig *ec,
1613 GetBitContext *gb, int frame_indep_flag)
1614 {
1615 int err;
1616 int nb_bands = mps_fr_nb_bands[ec->mps.freq_res];
1617
1618 /* Framing info */
1619 mps->framing_type = 0;
1620 mps->nb_param_sets = 2;
1621 if (ec->mps.high_rate_mode) {
1622 mps->framing_type = get_bits1(gb);
1623 mps->nb_param_sets = get_bits(gb, 3) + 1;
1624 }
1625 int param_slot_bits = usac->core_sbr_frame_len_idx == 4 ? 6 : 5;
1626 int nb_time_slots = usac->core_sbr_frame_len_idx == 4 ? 64 : 32;
1627
1628 if (mps->framing_type)
1629 for (int i = 0; i < mps->nb_param_sets; i++)
1630 mps->param_sets[i] = get_bits(gb, param_slot_bits);
1631
1632 int indep = frame_indep_flag;
1633 if (!frame_indep_flag)
1634 indep = get_bits1(gb);
1635
1636 int extend_frame = mps->param_sets[mps->nb_param_sets - 1] !=
1637 (nb_time_slots - 1);
1638
1639 /* CLD */
1640 err = ff_aac_ec_data_dec(gb, &mps->ott[MPS_CLD], MPS_CLD,
1641 0, 0, nb_bands,
1642 indep, indep, mps->nb_param_sets);
1643 if (err < 0) {
1644 av_log(ac->avctx, AV_LOG_ERROR, "Error parsing OTT CLD data!\n");
1645 return err;
1646 }
1647 ff_aac_map_index_data(&mps->ott[MPS_CLD], MPS_CLD, mps->ott_idx[MPS_CLD],
1648 0, 0, nb_bands, mps->nb_param_sets,
1649 mps->param_sets, extend_frame);
1650
1651 /* ICC */
1652 err = ff_aac_ec_data_dec(gb, &mps->ott[MPS_ICC], MPS_ICC, 0, 0, nb_bands,
1653 indep, indep, mps->nb_param_sets);
1654 if (err < 0) {
1655 av_log(ac->avctx, AV_LOG_ERROR, "Error parsing OTT ICC data!\n");
1656 return err;
1657 }
1658 ff_aac_map_index_data(&mps->ott[MPS_ICC], MPS_ICC, mps->ott_idx[MPS_ICC],
1659 0, 0, nb_bands, mps->nb_param_sets,
1660 mps->param_sets, extend_frame);
1661
1662 /* IPD */
1663 if (ec->mps.phase_coding) {
1664 if (get_bits1(gb)) {
1665 mps->opd_smoothing_mode = get_bits1(gb);
1666 err = ff_aac_ec_data_dec(gb, &mps->ott[MPS_IPD], MPS_IPD, 0, 0,
1667 ec->mps.otts_bands_phase,
1668 indep, indep, mps->nb_param_sets);
1669 ff_aac_map_index_data(&mps->ott[MPS_IPD], MPS_IPD, mps->ott_idx[MPS_IPD],
1670 0, 0, nb_bands, mps->nb_param_sets,
1671 mps->param_sets, extend_frame);
1672 if (err < 0) {
1673 av_log(ac->avctx, AV_LOG_ERROR, "Error parsing OTT IPD data!\n");
1674 return err;
1675 }
1676 }
1677 }
1678
1679 /* SMG data */
1680 memset(mps->smooth_mode, 0, sizeof(mps->smooth_mode));
1681 if (ec->mps.high_rate_mode) {
1682 for (int i = 0; i < mps->nb_param_sets; i++) {
1683 mps->smooth_mode[i] = get_bits(gb, 2);
1684 if (mps->smooth_mode[i] >= 2)
1685 mps->smooth_time[i] = get_bits(gb, 2);
1686 if (mps->smooth_mode[i] >= 3) {
1687 mps->freq_res_stride_smg[i] = get_bits(gb, 2);
1688 int nb_data_bands = (nb_bands - 1);
1689 nb_data_bands /= (mps_fr_stride_smg[mps->freq_res_stride_smg[i]] + 1);
1690 for (int j = 0; j < nb_data_bands; j++)
1691 mps->smg_data[i][j] = get_bits1(gb);
1692 }
1693 }
1694 }
1695
1696 /* Temp shape data */
1697 mps->tsd_enable = 0;
1698 if (ec->mps.temp_shape_config == 3) {
1699 mps->tsd_enable = get_bits1(gb);
1700 } else if (ec->mps.temp_shape_config) {
1701 mps->temp_shape_enable = get_bits1(gb);
1702 if (mps->temp_shape_enable) {
1703 for (int i = 0; i < 2; i++)
1704 mps->temp_shape_enable_ch[i] = get_bits1(gb);
1705 if (ec->mps.temp_shape_config == 2) {
1706 err = ff_aac_huff_dec_reshape(gb, mps->temp_shape_data, 16);
1707 if (err < 0) {
1708 av_log(ac->avctx, AV_LOG_ERROR,
1709 "Error parsing TSD reshape data!\n");
1710 return err;
1711 }
1712 }
1713 }
1714 }
1715
1716 /* TSD data */
1717 if (mps->tsd_enable) {
1718 mps->tsd_num_tr_slots = get_bits(gb, param_slot_bits - 1);
1719 int tsd_pos[64];
1720 decode_tsd(gb, tsd_pos, mps->tsd_num_tr_slots, nb_time_slots);
1721 for (int i = 0; i < nb_time_slots; i++) {
1722 mps->tsd_phase_data[i] = 0;
1723 if (tsd_pos[i])
1724 mps->tsd_phase_data[i] = get_bits(gb, 3);
1725 }
1726 }
1727
1728 return 0;
1729 }
1730
1731 8895 static int decode_usac_core_coder(AACDecContext *ac, AACUSACConfig *usac,
1732 AACUsacElemConfig *ec, ChannelElement *che,
1733 GetBitContext *gb, int indep_flag, int nb_channels)
1734 {
1735 int ret;
1736 int arith_reset_flag;
1737 8895 AACUsacStereo *us = &che->us;
1738 8895 int core_nb_channels = nb_channels;
1739
1740 /* Local symbols */
1741 uint8_t global_gain;
1742
1743 8895 us->common_window = 0;
1744
1745
2/2
✓ Branch 0 taken 15984 times.
✓ Branch 1 taken 8895 times.
24879 for (int ch = 0; ch < core_nb_channels; ch++) {
1746 15984 SingleChannelElement *sce = &che->ch[ch];
1747 15984 AACUsacElemData *ue = &sce->ue;
1748
1749 15984 sce->tns.present = 0;
1750 15984 ue->tns_data_present = 0;
1751
1752 15984 ue->core_mode = get_bits1(gb);
1753 }
1754
1755
3/4
✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 1806 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7089 times.
8895 if (nb_channels > 1 && ec->stereo_config_index == 1)
1756 core_nb_channels = 1;
1757
1758
2/2
✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 1806 times.
8895 if (core_nb_channels == 2) {
1759 7089 ret = decode_usac_stereo_info(ac, usac, ec, che, gb, indep_flag);
1760
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7089 times.
7089 if (ret)
1761 return ret;
1762 }
1763
1764
2/2
✓ Branch 0 taken 15984 times.
✓ Branch 1 taken 8895 times.
24879 for (int ch = 0; ch < core_nb_channels; ch++) {
1765 15984 SingleChannelElement *sce = &che->ch[ch];
1766 15984 IndividualChannelStream *ics = &sce->ics;
1767 15984 AACUsacElemData *ue = &sce->ue;
1768
1769
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15984 times.
15984 if (ue->core_mode) { /* lpd_channel_stream */
1770 ret = ff_aac_ldp_parse_channel_stream(ac, usac, ue, gb);
1771 if (ret < 0)
1772 return ret;
1773 continue;
1774 }
1775
1776
2/2
✓ Branch 0 taken 14178 times.
✓ Branch 1 taken 1806 times.
15984 if ((core_nb_channels == 1) ||
1777
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14178 times.
14178 (che->ch[0].ue.core_mode != che->ch[1].ue.core_mode))
1778 1806 ue->tns_data_present = get_bits1(gb);
1779
1780 /* fd_channel_stream */
1781 15984 global_gain = get_bits(gb, 8);
1782
1783 15984 ue->noise.level = 0;
1784
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 15888 times.
15984 if (ec->noise_fill) {
1785 96 ue->noise.level = get_bits(gb, 3);
1786 96 ue->noise.offset = get_bits(gb, 5);
1787 }
1788
1789
2/2
✓ Branch 0 taken 4656 times.
✓ Branch 1 taken 11328 times.
15984 if (!us->common_window) {
1790 /* ics_info() */
1791 4656 ics->window_sequence[1] = ics->window_sequence[0];
1792 4656 ics->window_sequence[0] = get_bits(gb, 2);
1793 4656 ics->use_kb_window[1] = ics->use_kb_window[0];
1794 4656 ics->use_kb_window[0] = get_bits1(gb);
1795
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4656 times.
4656 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1796 ics->max_sfb = get_bits(gb, 4);
1797 ue->scale_factor_grouping = get_bits(gb, 7);
1798 } else {
1799 4656 ics->max_sfb = get_bits(gb, 6);
1800 }
1801
1802 4656 ret = setup_sce(ac, sce, usac);
1803
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4656 times.
4656 if (ret < 0)
1804 return ret;
1805 }
1806
1807
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 15984 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15984 if (ec->tw_mdct && !us->common_tw) {
1808 /* tw_data() */
1809 if (get_bits1(gb)) { /* tw_data_present */
1810 /* Time warping is not supported in baseline profile streams. */
1811 avpriv_report_missing_feature(ac->avctx,
1812 "AAC USAC timewarping");
1813 return AVERROR_PATCHWELCOME;
1814 }
1815 }
1816
1817 15984 ret = decode_usac_scale_factors(ac, sce, gb, global_gain);
1818
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15984 times.
15984 if (ret < 0)
1819 return ret;
1820
1821
2/2
✓ Branch 0 taken 1169 times.
✓ Branch 1 taken 14815 times.
15984 if (ue->tns_data_present) {
1822 1169 sce->tns.present = 1;
1823 1169 ret = ff_aac_decode_tns(ac, &sce->tns, gb, ics);
1824
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1169 times.
1169 if (ret < 0)
1825 return ret;
1826 }
1827
1828 /* ac_spectral_data */
1829 15984 arith_reset_flag = indep_flag;
1830
2/2
✓ Branch 0 taken 15053 times.
✓ Branch 1 taken 931 times.
15984 if (!arith_reset_flag)
1831 15053 arith_reset_flag = get_bits1(gb);
1832
1833 /* Decode coeffs */
1834 15984 memset(&sce->coeffs[0], 0, 1024*sizeof(float));
1835
2/2
✓ Branch 0 taken 19988 times.
✓ Branch 1 taken 15984 times.
35972 for (int win = 0; win < ics->num_windows; win++) {
1836 19988 int lg = ics->swb_offset[ics->max_sfb];
1837 int N;
1838
2/2
✓ Branch 0 taken 4576 times.
✓ Branch 1 taken 15412 times.
19988 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE)
1839 4576 N = usac->core_frame_len / 8;
1840 else
1841 15412 N = usac->core_frame_len;
1842
1843
4/4
✓ Branch 0 taken 6181 times.
✓ Branch 1 taken 13807 times.
✓ Branch 2 taken 2191 times.
✓ Branch 3 taken 3990 times.
19988 ret = decode_spectrum_ac(ac, sce->coeffs + win*128, gb, &ue->ac,
1844 arith_reset_flag && (win == 0), lg, N);
1845
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 19988 times.
19988 if (ret < 0)
1846 return ret;
1847 }
1848
1849
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15984 times.
15984 if (get_bits1(gb)) { /* fac_data_present */
1850 const uint16_t len_8 = usac->core_frame_len / 8;
1851 const uint16_t len_16 = usac->core_frame_len / 16;
1852 const uint16_t fac_len = ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE ?
1853 len_16 : len_8;
1854 ret = ff_aac_parse_fac_data(ue, gb, 1, fac_len);
1855 if (ret < 0)
1856 return ret;
1857 }
1858 }
1859
1860
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (ec->sbr.ratio) {
1861 int sbr_ch = nb_channels;
1862 if (nb_channels == 2 &&
1863 !(ec->stereo_config_index == 0 || ec->stereo_config_index == 3))
1864 sbr_ch = 1;
1865
1866 ret = ff_aac_sbr_decode_usac_data(ac, che, ec, gb, sbr_ch, indep_flag);
1867 if (ret < 0)
1868 return ret;
1869 }
1870
1871
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (ec->stereo_config_index) {
1872 ret = parse_mps212(ac, usac, &us->mps, ec, gb, indep_flag);
1873 if (ret < 0)
1874 return ret;
1875 }
1876
1877 8895 spectrum_decode(ac, usac, che, core_nb_channels);
1878
1879
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (ac->oc[1].m4ac.sbr > 0) {
1880 ac->proc.sbr_apply(ac, che, nb_channels == 2 ? TYPE_CPE : TYPE_SCE, 0,
1881 che->ch[0].output,
1882 che->ch[1].output);
1883 }
1884
1885 8895 return 0;
1886 }
1887
1888 static int parse_audio_preroll(AACDecContext *ac, GetBitContext *gb)
1889 {
1890 int ret = 0;
1891 GetBitContext gbc;
1892 OutputConfiguration *oc = &ac->oc[1];
1893 MPEG4AudioConfig *m4ac = &oc->m4ac;
1894 MPEG4AudioConfig m4ac_bak = oc->m4ac;
1895 uint8_t temp_data[512];
1896 uint8_t *tmp_buf = temp_data;
1897 size_t tmp_buf_size = sizeof(temp_data);
1898
1899 av_unused int crossfade;
1900 int num_preroll_frames;
1901
1902 int config_len = get_escaped_value(gb, 4, 4, 8);
1903
1904 /* Implementations are free to pad the config to any length, so use a
1905 * different reader for this. */
1906 gbc = *gb;
1907 ret = ff_aac_usac_config_decode(ac, ac->avctx, &gbc, oc, m4ac->chan_config);
1908 if (ret < 0) {
1909 *m4ac = m4ac_bak;
1910 return ret;
1911 } else {
1912 ac->oc[1].m4ac.chan_config = 0;
1913 }
1914
1915 /* 7.18.3.3 Bitrate adaption
1916 * If configuration didn't change after applying preroll, continue
1917 * without decoding it. */
1918 if (!memcmp(m4ac, &m4ac_bak, sizeof(m4ac_bak)))
1919 return 0;
1920
1921 skip_bits_long(gb, config_len*8);
1922
1923 crossfade = get_bits1(gb); /* applyCrossfade */
1924 skip_bits1(gb); /* reserved */
1925 num_preroll_frames = get_escaped_value(gb, 2, 4, 0); /* numPreRollFrames */
1926
1927 for (int i = 0; i < num_preroll_frames; i++) {
1928 int got_frame_ptr = 0;
1929 int au_len = get_escaped_value(gb, 16, 16, 0);
1930
1931 if (au_len*8 > tmp_buf_size) {
1932 uint8_t *tmp2;
1933 tmp_buf = tmp_buf == temp_data ? NULL : tmp_buf;
1934 tmp2 = av_realloc_array(tmp_buf, au_len, 8);
1935 if (!tmp2) {
1936 if (tmp_buf != temp_data)
1937 av_free(tmp_buf);
1938 return AVERROR(ENOMEM);
1939 }
1940 tmp_buf = tmp2;
1941 }
1942
1943 /* Byte alignment is not guaranteed. */
1944 for (int j = 0; j < au_len; j++)
1945 tmp_buf[j] = get_bits(gb, 8);
1946
1947 ret = init_get_bits8(&gbc, tmp_buf, au_len);
1948 if (ret < 0)
1949 break;
1950
1951 ret = ff_aac_usac_decode_frame(ac->avctx, ac, &gbc, &got_frame_ptr);
1952 if (ret < 0)
1953 break;
1954 }
1955
1956 if (tmp_buf != temp_data)
1957 av_free(tmp_buf);
1958
1959 return 0;
1960 }
1961
1962 8895 static int parse_ext_ele(AACDecContext *ac, AACUsacElemConfig *e,
1963 GetBitContext *gb)
1964 {
1965 8895 uint8_t pl_frag_start = 1;
1966 8895 uint8_t pl_frag_end = 1;
1967 uint32_t len;
1968
1969
2/2
✓ Branch 1 taken 6535 times.
✓ Branch 2 taken 2360 times.
8895 if (!get_bits1(gb)) /* usacExtElementPresent */
1970 6535 return 0;
1971
1972
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2360 times.
2360 if (get_bits1(gb)) { /* usacExtElementUseDefaultLength */
1973 len = e->ext.default_len;
1974 } else {
1975 2360 len = get_bits(gb, 8); /* usacExtElementPayloadLength */
1976
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2352 times.
2360 if (len == 255)
1977 8 len += get_bits(gb, 16) - 2;
1978 }
1979
1980
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2354 times.
2360 if (!len)
1981 6 return 0;
1982
1983
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2354 times.
2354 if (e->ext.payload_frag) {
1984 pl_frag_start = get_bits1(gb); /* usacExtElementStart */
1985 pl_frag_end = get_bits1(gb); /* usacExtElementStop */
1986 }
1987
1988
1/2
✓ Branch 0 taken 2354 times.
✗ Branch 1 not taken.
2354 if (pl_frag_start)
1989 2354 e->ext.pl_data_offset = 0;
1990
1991 /* If an extension starts and ends this packet, we can directly use it below.
1992 * Otherwise, we have to copy it to a buffer and accumulate it. */
1993
2/4
✓ Branch 0 taken 2354 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2354 times.
2354 if (!(pl_frag_start && pl_frag_end)) {
1994 /* Reallocate the data */
1995 uint8_t *tmp_buf = av_refstruct_alloc_ext(e->ext.pl_data_offset + len,
1996 AV_REFSTRUCT_FLAG_NO_ZEROING,
1997 NULL, NULL);
1998 if (!tmp_buf)
1999 return AVERROR(ENOMEM);
2000
2001 /* Copy the data over only if we had saved data to begin with */
2002 if (e->ext.pl_buf)
2003 memcpy(tmp_buf, e->ext.pl_buf, e->ext.pl_data_offset);
2004
2005 av_refstruct_unref(&e->ext.pl_buf);
2006 e->ext.pl_buf = tmp_buf;
2007
2008 /* Readout data to a buffer */
2009 for (int i = 0; i < len; i++)
2010 e->ext.pl_buf[e->ext.pl_data_offset + i] = get_bits(gb, 8);
2011 }
2012
2013 2354 e->ext.pl_data_offset += len;
2014
2015
1/2
✓ Branch 0 taken 2354 times.
✗ Branch 1 not taken.
2354 if (pl_frag_end) {
2016 2354 int ret = 0;
2017 2354 int start_bits = get_bits_count(gb);
2018 2354 const int pl_len = e->ext.pl_data_offset;
2019 2354 GetBitContext *gb2 = gb;
2020 GetBitContext gbc;
2021
2/4
✓ Branch 0 taken 2354 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2354 times.
2354 if (!(pl_frag_start && pl_frag_end)) {
2022 ret = init_get_bits8(&gbc, e->ext.pl_buf, pl_len);
2023 if (ret < 0)
2024 return ret;
2025
2026 gb2 = &gbc;
2027 }
2028
2029
1/4
✓ Branch 0 taken 2354 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2354 switch (e->ext.type) {
2030 2354 case ID_EXT_ELE_FILL:
2031 /* Filler elements have no usable payload */
2032 2354 break;
2033 case ID_EXT_ELE_AUDIOPREROLL:
2034 ret = parse_audio_preroll(ac, gb2);
2035 break;
2036 case ID_EXT_ELE_UNI_DRC:
2037 /* uniDrcGain() payload: DRC is not applied, just consume the
2038 * bits via skip_bits_long below. */
2039 break;
2040 default:
2041 /* This should never happen */
2042 av_assert0(0);
2043 }
2044 2354 av_refstruct_unref(&e->ext.pl_buf);
2045
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2354 times.
2354 if (ret < 0)
2046 return ret;
2047
2048 2354 skip_bits_long(gb, pl_len*8 - (get_bits_count(gb) - start_bits));
2049 }
2050
2051 2354 return 0;
2052 }
2053
2054 8895 int ff_aac_usac_decode_frame(AVCodecContext *avctx, AACDecContext *ac,
2055 GetBitContext *gb, int *got_frame_ptr)
2056 {
2057 8895 int ret, is_dmono = 0;
2058 8895 int indep_flag, samples = 0;
2059 8895 int audio_found = 0;
2060 8895 int elem_id[3 /* SCE, CPE, LFE */] = { 0, 0, 0 };
2061 8895 AVFrame *frame = ac->frame;
2062
2063 int ratio_mult, ratio_dec;
2064 8895 AACUSACConfig *usac = &ac->oc[1].usac;
2065
1/2
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
17790 int sbr_ratio = usac->core_sbr_frame_len_idx == 2 ? 2 :
2066
1/2
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
8895 usac->core_sbr_frame_len_idx == 3 ? 3 :
2067 8895 usac->core_sbr_frame_len_idx == 4 ? 1 :
2068 0;
2069
2070
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (sbr_ratio == 2) {
2071 ratio_mult = 8;
2072 ratio_dec = 3;
2073
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 } else if (sbr_ratio == 3) {
2074 ratio_mult = 2;
2075 ratio_dec = 1;
2076
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 } else if (sbr_ratio == 4) {
2077 ratio_mult = 4;
2078 ratio_dec = 1;
2079 } else {
2080 8895 ratio_mult = 1;
2081 8895 ratio_dec = 1;
2082 }
2083
2084 8895 ff_aac_output_configure(ac, ac->oc[1].layout_map, ac->oc[1].layout_map_tags,
2085 ac->oc[1].status, 0);
2086
2087 8895 ac->avctx->profile = AV_PROFILE_AAC_USAC;
2088
2089 8895 indep_flag = get_bits1(gb);
2090
2091
2/2
✓ Branch 0 taken 17790 times.
✓ Branch 1 taken 8895 times.
26685 for (int i = 0; i < ac->oc[1].usac.nb_elems; i++) {
2092 int layout_id;
2093 int layout_type;
2094 17790 AACUsacElemConfig *e = &ac->oc[1].usac.elems[i];
2095 ChannelElement *che;
2096
2097
2/2
✓ Branch 0 taken 1806 times.
✓ Branch 1 taken 15984 times.
17790 if (e->type == ID_USAC_SCE) {
2098 1806 layout_id = elem_id[0]++;
2099 1806 layout_type = TYPE_SCE;
2100 1806 che = ff_aac_get_che(ac, TYPE_SCE, layout_id);
2101
2/2
✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 8895 times.
15984 } else if (e->type == ID_USAC_CPE) {
2102 7089 layout_id = elem_id[1]++;
2103 7089 layout_type = TYPE_CPE;
2104 7089 che = ff_aac_get_che(ac, TYPE_CPE, layout_id);
2105
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 } else if (e->type == ID_USAC_LFE) {
2106 layout_id = elem_id[2]++;
2107 layout_type = TYPE_LFE;
2108 che = ff_aac_get_che(ac, TYPE_LFE, layout_id);
2109 }
2110
2111
3/4
✓ Branch 0 taken 8895 times.
✓ Branch 1 taken 8895 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8895 times.
17790 if (e->type != ID_USAC_EXT && !che) {
2112 av_log(ac->avctx, AV_LOG_ERROR,
2113 "channel element %d.%d is not allocated\n",
2114 layout_type, layout_id);
2115 return AVERROR_INVALIDDATA;
2116 }
2117
2118
3/4
✓ Branch 0 taken 1806 times.
✓ Branch 1 taken 7089 times.
✓ Branch 2 taken 8895 times.
✗ Branch 3 not taken.
17790 switch (e->type) {
2119 1806 case ID_USAC_LFE:
2120 /* Fallthrough */
2121 case ID_USAC_SCE:
2122 1806 ret = decode_usac_core_coder(ac, &ac->oc[1].usac, e, che, gb,
2123 indep_flag, 1);
2124
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1806 times.
1806 if (ret < 0)
2125 return ret;
2126
2127 1806 audio_found = 1;
2128 1806 che->present = 1;
2129 1806 break;
2130 7089 case ID_USAC_CPE:
2131 7089 ret = decode_usac_core_coder(ac, &ac->oc[1].usac, e, che, gb,
2132 indep_flag, 2);
2133
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7089 times.
7089 if (ret < 0)
2134 return ret;
2135
2136 7089 audio_found = 1;
2137 7089 che->present = 1;
2138 7089 break;
2139 8895 case ID_USAC_EXT:
2140 8895 ret = parse_ext_ele(ac, e, gb);
2141
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (ret < 0)
2142 return ret;
2143 8895 break;
2144 }
2145 }
2146
2147
1/2
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
8895 if (audio_found)
2148
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 samples = ac->oc[1].m4ac.frame_length_short ? 768 : 1024;
2149
2150 8895 samples = (samples * ratio_mult) / ratio_dec;
2151
2152
2/4
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8895 times.
✗ Branch 3 not taken.
8895 if (ac->oc[1].status && audio_found) {
2153 8895 avctx->sample_rate = ac->oc[1].m4ac.ext_sample_rate;
2154 8895 avctx->frame_size = samples;
2155 8895 ac->oc[1].status = OC_LOCKED;
2156 }
2157
2158
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8895 if (!frame->data[0] && samples) {
2159 av_log(avctx, AV_LOG_ERROR, "no frame data found\n");
2160 return AVERROR_INVALIDDATA;
2161 }
2162
2163
1/2
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
8895 if (samples) {
2164 8895 frame->nb_samples = samples;
2165 8895 frame->sample_rate = avctx->sample_rate;
2166
2/2
✓ Branch 0 taken 487 times.
✓ Branch 1 taken 8408 times.
8895 frame->flags = indep_flag ? AV_FRAME_FLAG_KEY : 0x0;
2167 8895 *got_frame_ptr = 1;
2168 } else {
2169 av_frame_unref(ac->frame);
2170 frame->flags = indep_flag ? AV_FRAME_FLAG_KEY : 0x0;
2171 *got_frame_ptr = 0;
2172 }
2173
2174
3/4
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 339 times.
✓ Branch 3 taken 8556 times.
8895 if (samples && ac->target_level) {
2175 339 int method_val = usac->loudness.input_method_val;
2176
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 339 times.
339 if (method_val < 0) {
2177 if (!ac->warned_loudness_missing) {
2178 av_log(avctx, AV_LOG_WARNING,
2179 "target_level set but no program/anchor loudness "
2180 "measurement available; normalization skipped\n");
2181 ac->warned_loudness_missing = 1;
2182 }
2183 } else {
2184 /* Per ISO/IEC 23003-4 Table A.48: L = -57.75 + 0.25 * μ */
2185 339 float input_loudness = -57.75f + 0.25f * method_val;
2186 339 float gain_dB = (float)ac->target_level - input_loudness;
2187 339 float gain = powf(10.0f, gain_dB / 20.0f);
2188
2189
2/2
✓ Branch 0 taken 678 times.
✓ Branch 1 taken 339 times.
1017 for (int ch = 0; ch < frame->ch_layout.nb_channels; ch++)
2190 678 ac->fdsp->vector_fmul_scalar((float *)frame->extended_data[ch],
2191 678 (float *)frame->extended_data[ch],
2192 gain, frame->nb_samples);
2193 }
2194 }
2195
2196 /* for dual-mono audio (SCE + SCE) */
2197
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
8895 is_dmono = ac->dmono_mode && elem_id[0] == 2 &&
2198 !av_channel_layout_compare(&ac->oc[1].ch_layout,
2199 &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO);
2200
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (is_dmono) {
2201 if (ac->dmono_mode == 1)
2202 frame->data[1] = frame->data[0];
2203 else if (ac->dmono_mode == 2)
2204 frame->data[0] = frame->data[1];
2205 }
2206
2207 8895 return 0;
2208 }
2209