FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aac/aacdec_usac.c
Date: 2026-10-06 00:26:59
Exec Total Coverage
Lines: 784 1311 59.8%
Functions: 28 36 77.8%
Branches: 399 814 49.0%

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 int nb_elements = 0;
568 22 uint8_t layout_map[MAX_ELEM_ID*4][3] = { 0 };
569
570
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (!ac)
571 ✗ return AVERROR_PATCHWELCOME;
572
573 22 memset(usac, 0, sizeof(*usac));
574 22 usac->loudness.input_method_val = -1;
575
576 22 freq_idx = get_bits(gb, 5); /* usacSamplingFrequencyIndex */
577
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (freq_idx == 0x1f) {
578 ✗ samplerate = get_bits(gb, 24); /* usacSamplingFrequency */
579 ✗ if (samplerate == 0)
580 ✗ return AVERROR(EINVAL);
581 } else {
582 22 samplerate = ff_aac_usac_samplerate[freq_idx];
583
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (samplerate < 0)
584 ✗ return AVERROR(EINVAL);
585 }
586
587 22 usac->core_sbr_frame_len_idx = get_bits(gb, 3); /* coreSbrFrameLengthIndex */
588
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
44 m4ac->frame_length_short = usac->core_sbr_frame_len_idx == 0 ||
589
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 usac->core_sbr_frame_len_idx == 2;
590
591
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
44 usac->core_frame_len = (usac->core_sbr_frame_len_idx == 0 ||
592
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 usac->core_sbr_frame_len_idx == 2) ? 768 : 1024;
593
594
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
44 sbr_ratio = usac->core_sbr_frame_len_idx == 2 ? 2 :
595
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
22 usac->core_sbr_frame_len_idx == 3 ? 3 :
596 22 usac->core_sbr_frame_len_idx == 4 ? 1 :
597 0;
598
599
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (sbr_ratio == 2) {
600 ✗ ratio_mult = 8;
601 ✗ ratio_dec = 3;
602
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 } else if (sbr_ratio == 3) {
603 ✗ ratio_mult = 2;
604 ✗ ratio_dec = 1;
605
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 } else if (sbr_ratio == 4) {
606 ✗ ratio_mult = 4;
607 ✗ ratio_dec = 1;
608 } else {
609 22 ratio_mult = 1;
610 22 ratio_dec = 1;
611 }
612
613 22 avctx->sample_rate = samplerate;
614 22 m4ac->ext_sample_rate = samplerate;
615 22 m4ac->sample_rate = (samplerate * ratio_dec) / ratio_mult;
616
617 22 m4ac->sampling_index = ff_aac_sample_rate_idx(m4ac->sample_rate);
618 22 m4ac->sbr = sbr_ratio > 0;
619
620 22 channel_config_idx = get_bits(gb, 5); /* channelConfigurationIndex */
621
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (!channel_config_idx) {
622 /* UsacChannelConfig() */
623 ✗ nb_channels = get_escaped_value(gb, 5, 8, 16); /* numOutChannels */
624 ✗ if (nb_channels > 64)
625 ✗ return AVERROR(EINVAL);
626
627 ✗ av_channel_layout_uninit(&ac->oc[1].ch_layout);
628
629 ✗ ret = av_channel_layout_custom_init(&ac->oc[1].ch_layout, nb_channels);
630 ✗ if (ret < 0)
631 ✗ return ret;
632
633 ✗ for (int i = 0; i < nb_channels; i++) {
634 ✗ AVChannelCustom *cm = &ac->oc[1].ch_layout.u.map[i];
635 ✗ cm->id = usac_ch_pos_to_av[get_bits(gb, 5)]; /* bsOutputChannelPos */
636 }
637
638 ✗ ret = av_channel_layout_retype(&ac->oc[1].ch_layout,
639 AV_CHANNEL_ORDER_NATIVE,
640 AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
641 ✗ if (ret < 0)
642 ✗ return ret;
643
644 ✗ ret = av_channel_layout_copy(&avctx->ch_layout, &ac->oc[1].ch_layout);
645 ✗ if (ret < 0)
646 ✗ return ret;
647 } else {
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
3/4
✓ Branch 0 taken 44 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 22 times.
44 if (map_pos_set && e->type != ID_USAC_EXT &&
682
2/4
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
44 (map_count >= nb_elements ||
683
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
22 layout_map[map_count][0] != (e->type == ID_USAC_LFE ? TYPE_LFE : e->type))) {
684 ✗ av_log(ac->avctx, AV_LOG_ERROR, "Element %d does not match the "
685 "channel configuration\n", i);
686 ✗ usac->nb_elems = 0;
687 ✗ return AVERROR_INVALIDDATA;
688 }
689
690 44 av_log(ac->avctx, AV_LOG_DEBUG, "Element present: idx %i, type %i\n",
691 44 i, e->type);
692
693
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) {
694 4 case ID_USAC_SCE: /* SCE */
695 /* UsacCoreConfig */
696 4 decode_usac_element_core(e, gb, sbr_ratio);
697
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (e->sbr.ratio > 0) {
698 ✗ ret = decode_usac_sbr_data(ac, e, gb);
699 ✗ if (ret < 0)
700 ✗ return ret;
701 }
702 4 layout_map[map_count][0] = TYPE_SCE;
703 4 layout_map[map_count][1] = elem_id[0]++;
704
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!map_pos_set)
705 ✗ layout_map[map_count][2] = AAC_CHANNEL_FRONT;
706
707 4 break;
708 18 case ID_USAC_CPE: /* UsacChannelPairElementConf */
709 /* UsacCoreConfig */
710 18 decode_usac_element_core(e, gb, sbr_ratio);
711 18 ret = decode_usac_element_pair(ac, e, gb);
712
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (ret < 0)
713 ✗ return ret;
714 18 layout_map[map_count][0] = TYPE_CPE;
715 18 layout_map[map_count][1] = elem_id[1]++;
716
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (!map_pos_set)
717 ✗ layout_map[map_count][2] = AAC_CHANNEL_FRONT;
718
719 18 break;
720 ✗ case ID_USAC_LFE: /* LFE */
721 /* LFE has no need for any configuration */
722 ✗ e->tw_mdct = 0;
723 ✗ e->noise_fill = 0;
724 ✗ layout_map[map_count][0] = TYPE_LFE;
725 ✗ layout_map[map_count][1] = elem_id[2]++;
726 ✗ if (!map_pos_set)
727 ✗ layout_map[map_count][2] = AAC_CHANNEL_LFE;
728
729 ✗ break;
730 22 case ID_USAC_EXT: /* EXT */
731 22 ret = decode_usac_extension(ac, e, gb);
732
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (ret < 0)
733 ✗ return ret;
734 22 break;
735 };
736 }
737
738
2/4
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
22 if (map_pos_set && elem_id[0] + elem_id[1] + elem_id[2] != nb_elements) {
739 ✗ av_log(ac->avctx, AV_LOG_ERROR, "Element count does not match the "
740 "channel configuration\n");
741 ✗ usac->nb_elems = 0;
742 ✗ return AVERROR_INVALIDDATA;
743 }
744
745 22 ret = ff_aac_output_configure(ac, layout_map, elem_id[0] + elem_id[1] + elem_id[2],
746 OC_GLOBAL_HDR, 0);
747
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (ret < 0) {
748 ✗ av_log(avctx, AV_LOG_ERROR, "Unable to parse channel config!\n");
749 ✗ usac->nb_elems = 0;
750 ✗ return ret;
751 }
752
753
2/2
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 14 times.
22 if (get_bits1(gb)) { /* usacConfigExtensionPresent */
754 int invalid;
755 8 int nb_extensions = get_escaped_value(gb, 2, 4, 8) + 1; /* numConfigExtensions */
756
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 for (int i = 0; i < nb_extensions; i++) {
757 8 int type = get_escaped_value(gb, 4, 8, 16);
758 8 int len = get_escaped_value(gb, 4, 8, 16);
759
1/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8 switch (type) {
760 8 case ID_CONFIG_EXT_LOUDNESS_INFO:
761 8 ret = decode_loudness_set(ac, usac, gb);
762
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
763 ✗ return ret;
764 8 break;
765 ✗ case ID_CONFIG_EXT_STREAM_ID:
766 ✗ usac->stream_identifier = get_bits(gb, 16);
767 ✗ break;
768 ✗ case ID_CONFIG_EXT_FILL: /* fallthrough */
769 ✗ invalid = 0;
770 ✗ while (len--) {
771 ✗ if (get_bits(gb, 8) != 0xA5)
772 ✗ invalid++;
773 }
774 ✗ if (invalid)
775 ✗ av_log(avctx, AV_LOG_WARNING, "Invalid fill bytes: %i\n",
776 invalid);
777 ✗ break;
778 ✗ default:
779 ✗ while (len--)
780 ✗ skip_bits(gb, 8);
781 ✗ break;
782 }
783 }
784 }
785
786 22 ac->avctx->profile = AV_PROFILE_AAC_USAC;
787
788 22 usac->loudness.input_method_val = select_loudness_measurement(usac);
789
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 14 times.
22 if (usac->loudness.input_method_val >= 0)
790 8 av_log(avctx, AV_LOG_VERBOSE,
791 "USAC input loudness: %.2f LKFS (bsMethodValue=%d)\n",
792 8 -57.75f + 0.25f * usac->loudness.input_method_val,
793 usac->loudness.input_method_val);
794
795 22 ret = ff_aac_usac_reset_state(ac, oc);
796
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (ret < 0)
797 ✗ return ret;
798
799 22 return 0;
800 }
801
802 15984 static int decode_usac_scale_factors(AACDecContext *ac,
803 SingleChannelElement *sce,
804 GetBitContext *gb, uint8_t global_gain)
805 {
806 15984 IndividualChannelStream *ics = &sce->ics;
807
808 /* Decode all scalefactors. */
809 15984 int offset_sf = global_gain;
810
2/2
✓ Branch 0 taken 17700 times.
✓ Branch 1 taken 15984 times.
33684 for (int g = 0; g < ics->num_window_groups; g++) {
811
2/2
✓ Branch 0 taken 741698 times.
✓ Branch 1 taken 17700 times.
759398 for (int sfb = 0; sfb < ics->max_sfb; sfb++) {
812
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)
813 725726 offset_sf += get_vlc2(gb, ff_vlc_scalefactors, 7, 3) - SCALE_DIFF_ZERO;
814
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 741698 times.
741698 if (offset_sf > 255U) {
815 ✗ av_log(ac->avctx, AV_LOG_ERROR,
816 "Scalefactor (%d) out of range.\n", offset_sf);
817 ✗ return AVERROR_INVALIDDATA;
818 }
819
820 741698 sce->sfo[g*ics->max_sfb + sfb] = offset_sf - 100;
821 }
822 }
823
824 15984 return 0;
825 }
826
827 /**
828 * Decode and dequantize arithmetically coded, uniformly quantized value
829 *
830 * @param coef array of dequantized, scaled spectral data
831 * @param sf array of scalefactors or intensity stereo positions
832 *
833 * @return Returns error status. 0 - OK, !0 - error
834 */
835 19988 static int decode_spectrum_ac(AACDecContext *s, float coef[1024],
836 GetBitContext *gb, AACArithState *state,
837 int reset, uint16_t len, uint16_t N)
838 {
839 AACArith ac;
840 int i, a, b;
841 uint32_t c;
842
843 int gb_count;
844 GetBitContext gb2;
845
846 19988 c = ff_aac_ac_map_process(state, reset, N);
847
848
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 19976 times.
19988 if (!len) {
849 12 ff_aac_ac_finish(state, 0, N);
850 12 return 0;
851 }
852
853 19976 ff_aac_ac_init(&ac, gb);
854
855 /* Backup reader for rolling back by 14 bits at the end */
856 19976 gb2 = *gb;
857 19976 gb_count = get_bits_count(&gb2);
858
859
2/2
✓ Branch 0 taken 3773419 times.
✓ Branch 1 taken 4652 times.
3778071 for (i = 0; i < len/2; i++) {
860 /* MSB */
861 int lvl, esc_nb, m;
862 3773419 c = ff_aac_ac_get_context(state, c, i, N);
863 4024691 for (lvl=esc_nb=0;;) {
864 4024691 uint32_t pki = ff_aac_ac_get_pk(c + (esc_nb << 17));
865 4024691 m = ff_aac_ac_decode(&ac, &gb2, ff_aac_ac_msb_cdfs[pki],
866 FF_ARRAY_ELEMS(ff_aac_ac_msb_cdfs[pki]));
867
2/2
✓ Branch 0 taken 3773419 times.
✓ Branch 1 taken 251272 times.
4024691 if (m < FF_AAC_AC_ESCAPE)
868 3773419 break;
869 251272 lvl++;
870
871 /* Cargo-culted value. */
872
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 251272 times.
251272 if (lvl > 23)
873 ✗ return AVERROR(EINVAL);
874
875
2/2
✓ Branch 0 taken 548 times.
✓ Branch 1 taken 250724 times.
251272 if ((esc_nb = lvl) > 7)
876 548 esc_nb = 7;
877 }
878
879 3773419 b = m >> 2;
880 3773419 a = m - (b << 2);
881
882 /* ARITH_STOP detection */
883
2/2
✓ Branch 0 taken 2341624 times.
✓ Branch 1 taken 1431795 times.
3773419 if (!m) {
884
2/2
✓ Branch 0 taken 15324 times.
✓ Branch 1 taken 2326300 times.
2341624 if (esc_nb)
885 15324 break;
886 2326300 a = b = 0;
887 }
888
889 /* LSB */
890
2/2
✓ Branch 0 taken 235948 times.
✓ Branch 1 taken 3758095 times.
3994043 for (int l = lvl; l > 0; l--) {
891
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);
892 235948 uint8_t r = ff_aac_ac_decode(&ac, &gb2, ff_aac_ac_lsb_cdfs[lsbidx],
893 FF_ARRAY_ELEMS(ff_aac_ac_lsb_cdfs[lsbidx]));
894 235948 a = (a << 1) | (r & 1);
895 235948 b = (b << 1) | ((r >> 1) & 1);
896 }
897
898 /* Dequantize coeffs here */
899 3758095 coef[2*i + 0] = a * cbrt(a);
900 3758095 coef[2*i + 1] = b * cbrt(b);
901 3758095 ff_aac_ac_update_context(state, i, a, b);
902 }
903
904
1/2
✓ Branch 0 taken 19976 times.
✗ Branch 1 not taken.
19976 if (len > 1) {
905 /* "Rewind" bitstream back by 14 bits */
906 19976 int gb_count2 = get_bits_count(&gb2);
907 19976 skip_bits(gb, gb_count2 - gb_count - 14);
908 } else {
909 ✗ *gb = gb2;
910 }
911
912 19976 ff_aac_ac_finish(state, i, N);
913
914
2/2
✓ Branch 0 taken 4419569 times.
✓ Branch 1 taken 19976 times.
4439545 for (; i < N/2; i++) {
915 4419569 coef[2*i + 0] = 0;
916 4419569 coef[2*i + 1] = 0;
917 }
918
919 /* Signs */
920
2/2
✓ Branch 0 taken 16160000 times.
✓ Branch 1 taken 19976 times.
16179976 for (i = 0; i < len; i++) {
921
2/2
✓ Branch 0 taken 1954258 times.
✓ Branch 1 taken 14205742 times.
16160000 if (coef[i]) {
922
2/2
✓ Branch 1 taken 978138 times.
✓ Branch 2 taken 976120 times.
1954258 if (!get_bits1(gb)) /* s */
923 978138 coef[i] *= -1;
924 }
925 }
926
927 19976 return 0;
928 }
929
930 1 static int decode_usac_stereo_cplx(AACDecContext *ac, AACUsacStereo *us,
931 ChannelElement *cpe, GetBitContext *gb,
932 int num_window_groups,
933 int prev_num_window_groups,
934 int indep_flag)
935 {
936 int delta_code_time;
937 1 IndividualChannelStream *ics = &cpe->ch[0].ics;
938
939
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (!get_bits1(gb)) { /* cplx_pred_all */
940
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < num_window_groups; g++) {
941
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) {
942 24 const uint8_t val = get_bits1(gb);
943 24 us->pred_used[g*cpe->max_sfb_ste + sfb] = val;
944
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 if ((sfb + 1) < cpe->max_sfb_ste)
945 24 us->pred_used[g*cpe->max_sfb_ste + sfb + 1] = val;
946 }
947 }
948 } else {
949 ✗ for (int g = 0; g < num_window_groups; g++)
950 ✗ for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++)
951 ✗ us->pred_used[g*cpe->max_sfb_ste + sfb] = 1;
952 }
953
954 1 us->pred_dir = get_bits1(gb);
955 1 us->complex_coef = get_bits1(gb);
956
957 1 us->use_prev_frame = 0;
958
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)
959 ✗ us->use_prev_frame = get_bits1(gb);
960
961 1 delta_code_time = 0;
962
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (!indep_flag)
963 1 delta_code_time = get_bits1(gb);
964
965 /* TODO: shouldn't be needed */
966
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < num_window_groups; g++) {
967
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) {
968 24 float last_alpha_q_re = 0;
969 24 float last_alpha_q_im = 0;
970
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (delta_code_time) {
971 ✗ if (g) {
972 /* Transient, after the first group - use the current frame,
973 * previous window, alpha values. */
974 ✗ last_alpha_q_re = us->alpha_q_re[(g - 1)*cpe->max_sfb_ste + sfb];
975 ✗ last_alpha_q_im = us->alpha_q_im[(g - 1)*cpe->max_sfb_ste + sfb];
976 ✗ } else if (!g &&
977 ✗ (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) &&
978 ✗ (ics->window_sequence[1] == EIGHT_SHORT_SEQUENCE)) {
979 /* The spec doesn't explicitly mention this, but it doesn't make
980 * any other sense otherwise! */
981 ✗ const int wg = prev_num_window_groups - 1;
982 ✗ last_alpha_q_re = us->prev_alpha_q_re[wg*cpe->max_sfb_ste + sfb];
983 ✗ last_alpha_q_im = us->prev_alpha_q_im[wg*cpe->max_sfb_ste + sfb];
984 } else {
985 ✗ last_alpha_q_re = us->prev_alpha_q_re[g*cpe->max_sfb_ste + sfb];
986 ✗ last_alpha_q_im = us->prev_alpha_q_im[g*cpe->max_sfb_ste + sfb];
987 }
988 } else {
989
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 4 times.
24 if (sfb) {
990 20 last_alpha_q_re = us->alpha_q_re[g*cpe->max_sfb_ste + sfb - 1];
991 20 last_alpha_q_im = us->alpha_q_im[g*cpe->max_sfb_ste + sfb - 1];
992 }
993 }
994
995
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 7 times.
24 if (us->pred_used[g*cpe->max_sfb_ste + sfb]) {
996 17 int val = -get_vlc2(gb, ff_vlc_scalefactors, 7, 3) + 60;
997 17 last_alpha_q_re += val * 0.1f;
998
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
17 if (us->complex_coef) {
999 ✗ val = -get_vlc2(gb, ff_vlc_scalefactors, 7, 3) + 60;
1000 ✗ last_alpha_q_im += val * 0.1f;
1001 }
1002 17 us->alpha_q_re[g*cpe->max_sfb_ste + sfb] = last_alpha_q_re;
1003 17 us->alpha_q_im[g*cpe->max_sfb_ste + sfb] = last_alpha_q_im;
1004 } else {
1005 7 us->alpha_q_re[g*cpe->max_sfb_ste + sfb] = 0;
1006 7 us->alpha_q_im[g*cpe->max_sfb_ste + sfb] = 0;
1007 }
1008
1009
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 if ((sfb + 1) < cpe->max_sfb_ste) {
1010 24 us->alpha_q_re[g*cpe->max_sfb_ste + sfb + 1] =
1011 24 us->alpha_q_re[g*cpe->max_sfb_ste + sfb];
1012 24 us->alpha_q_im[g*cpe->max_sfb_ste + sfb + 1] =
1013 24 us->alpha_q_im[g*cpe->max_sfb_ste + sfb];
1014 }
1015 }
1016 }
1017
1018 1 return 0;
1019 }
1020
1021 15984 static int setup_sce(AACDecContext *ac, SingleChannelElement *sce,
1022 AACUSACConfig *usac)
1023 {
1024 15984 AACUsacElemData *ue = &sce->ue;
1025 15984 IndividualChannelStream *ics = &sce->ics;
1026 15984 const int sampling_index = ac->oc[1].m4ac.sampling_index;
1027
1028 /* Setup window parameters */
1029 15984 ics->prev_num_window_groups = FFMAX(ics->num_window_groups, 1);
1030
2/2
✓ Branch 0 taken 572 times.
✓ Branch 1 taken 15412 times.
15984 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1031
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 572 times.
572 if (usac->core_frame_len == 768) {
1032 ✗ ics->swb_offset = ff_swb_offset_96[sampling_index];
1033 ✗ ics->num_swb = ff_aac_num_swb_96[sampling_index];
1034 } else {
1035 572 ics->swb_offset = ff_swb_offset_128[sampling_index];
1036 572 ics->num_swb = ff_aac_num_swb_128[sampling_index];
1037 }
1038 572 ics->tns_max_bands = ff_tns_max_bands_usac_128[sampling_index];
1039
1040 /* Setup scalefactor grouping. 7 bit mask. */
1041 572 ics->num_window_groups = 0;
1042
2/2
✓ Branch 0 taken 4004 times.
✓ Branch 1 taken 572 times.
4576 for (int j = 0; j < 7; j++) {
1043 4004 ics->group_len[j] = 1;
1044
2/2
✓ Branch 0 taken 2288 times.
✓ Branch 1 taken 1716 times.
4004 if (ue->scale_factor_grouping & (1 << (6 - j)))
1045 2288 ics->group_len[ics->num_window_groups] += 1;
1046 else
1047 1716 ics->num_window_groups++;
1048 }
1049
1050 572 ics->group_len[7] = 1;
1051 572 ics->num_window_groups++;
1052 572 ics->num_windows = 8;
1053 } else {
1054
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15412 times.
15412 if (usac->core_frame_len == 768) {
1055 ✗ ics->swb_offset = ff_swb_offset_768[sampling_index];
1056 ✗ ics->num_swb = ff_aac_num_swb_768[sampling_index];
1057 } else {
1058 15412 ics->swb_offset = ff_swb_offset_1024[sampling_index];
1059 15412 ics->num_swb = ff_aac_num_swb_1024[sampling_index];
1060 }
1061 15412 ics->tns_max_bands = ff_tns_max_bands_usac_1024[sampling_index];
1062
1063 15412 ics->group_len[0] = 1;
1064 15412 ics->num_window_groups = 1;
1065 15412 ics->num_windows = 1;
1066 }
1067
1068
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15984 times.
15984 if (ics->max_sfb > ics->num_swb) {
1069 ✗ av_log(ac->avctx, AV_LOG_ERROR,
1070 "Number of scalefactor bands in group (%d) "
1071 "exceeds limit (%d).\n",
1072 ✗ ics->max_sfb, ics->num_swb);
1073 ✗ ics->max_sfb = 0;
1074 ✗ return AVERROR(EINVAL);
1075 }
1076
1077 /* Just some defaults for the band types */
1078
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++)
1079 2045952 sce->band_type[i] = ESC_BT;
1080
1081 15984 return 0;
1082 }
1083
1084 7089 static int decode_usac_stereo_info(AACDecContext *ac, AACUSACConfig *usac,
1085 AACUsacElemConfig *ec, ChannelElement *cpe,
1086 GetBitContext *gb, int indep_flag)
1087 {
1088 int ret, tns_active;
1089
1090 7089 AACUsacStereo *us = &cpe->us;
1091 7089 SingleChannelElement *sce1 = &cpe->ch[0];
1092 7089 SingleChannelElement *sce2 = &cpe->ch[1];
1093 7089 IndividualChannelStream *ics1 = &sce1->ics;
1094 7089 IndividualChannelStream *ics2 = &sce2->ics;
1095 7089 AACUsacElemData *ue1 = &sce1->ue;
1096 7089 AACUsacElemData *ue2 = &sce2->ue;
1097
1098 7089 us->common_window = 0;
1099 7089 us->common_tw = 0;
1100
1101 /* Alpha values must always be zeroed out for the current frame,
1102 * as they are propagated to the next frame and may be used. */
1103 7089 memset(us->alpha_q_re, 0, sizeof(us->alpha_q_re));
1104 7089 memset(us->alpha_q_im, 0, sizeof(us->alpha_q_im));
1105
1106
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))
1107 ✗ return 0;
1108
1109 7089 tns_active = get_bits1(gb);
1110 7089 us->common_window = get_bits1(gb);
1111
1112
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) {
1113 1841 memset(us->prev_alpha_q_re, 0, sizeof(us->prev_alpha_q_re));
1114 1841 memset(us->prev_alpha_q_im, 0, sizeof(us->prev_alpha_q_im));
1115 }
1116
1117
2/2
✓ Branch 0 taken 5664 times.
✓ Branch 1 taken 1425 times.
7089 if (us->common_window) {
1118 /* ics_info() */
1119 5664 ics1->window_sequence[1] = ics1->window_sequence[0];
1120 5664 ics2->window_sequence[1] = ics2->window_sequence[0];
1121 5664 ics1->window_sequence[0] = ics2->window_sequence[0] = get_bits(gb, 2);
1122
1123 5664 ics1->use_kb_window[1] = ics1->use_kb_window[0];
1124 5664 ics2->use_kb_window[1] = ics2->use_kb_window[0];
1125 5664 ics1->use_kb_window[0] = ics2->use_kb_window[0] = get_bits1(gb);
1126
1127 /* If there's a change in the transform sequence, zero out last frame's
1128 * stereo prediction coefficients */
1129
2/2
✓ Branch 0 taken 286 times.
✓ Branch 1 taken 5378 times.
5664 if ((ics1->window_sequence[0] == EIGHT_SHORT_SEQUENCE &&
1130
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 4 times.
286 ics1->window_sequence[1] != EIGHT_SHORT_SEQUENCE) ||
1131
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 5378 times.
5660 (ics1->window_sequence[1] == EIGHT_SHORT_SEQUENCE &&
1132
1/2
✓ Branch 0 taken 282 times.
✗ Branch 1 not taken.
282 ics1->window_sequence[0] != EIGHT_SHORT_SEQUENCE) ||
1133
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 5378 times.
5660 (ics2->window_sequence[0] == EIGHT_SHORT_SEQUENCE &&
1134
1/2
✓ Branch 0 taken 282 times.
✗ Branch 1 not taken.
282 ics2->window_sequence[1] != EIGHT_SHORT_SEQUENCE) ||
1135
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 5378 times.
5660 (ics2->window_sequence[1] == EIGHT_SHORT_SEQUENCE &&
1136
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 282 times.
282 ics2->window_sequence[0] != EIGHT_SHORT_SEQUENCE)) {
1137 4 memset(us->prev_alpha_q_re, 0, sizeof(us->prev_alpha_q_re));
1138 4 memset(us->prev_alpha_q_im, 0, sizeof(us->prev_alpha_q_im));
1139 }
1140
1141
2/2
✓ Branch 0 taken 286 times.
✓ Branch 1 taken 5378 times.
5664 if (ics1->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1142 286 ics1->max_sfb = ics2->max_sfb = get_bits(gb, 4);
1143 286 ue1->scale_factor_grouping = ue2->scale_factor_grouping = get_bits(gb, 7);
1144 } else {
1145 5378 ics1->max_sfb = ics2->max_sfb = get_bits(gb, 6);
1146 }
1147
1148
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5664 times.
5664 if (!get_bits1(gb)) { /* common_max_sfb */
1149 ✗ if (ics2->window_sequence[0] == EIGHT_SHORT_SEQUENCE)
1150 ✗ ics2->max_sfb = get_bits(gb, 4);
1151 else
1152 ✗ ics2->max_sfb = get_bits(gb, 6);
1153 }
1154
1155 5664 ret = setup_sce(ac, sce1, usac);
1156
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5664 times.
5664 if (ret < 0) {
1157 ✗ ics2->max_sfb = 0;
1158 ✗ return ret;
1159 }
1160
1161 5664 ret = setup_sce(ac, sce2, usac);
1162
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5664 times.
5664 if (ret < 0)
1163 ✗ return ret;
1164
1165 5664 cpe->max_sfb_ste = FFMAX(ics1->max_sfb, ics2->max_sfb);
1166
1167 5664 us->ms_mask_mode = get_bits(gb, 2); /* ms_mask_present */
1168 5664 memset(cpe->ms_mask, 0, sizeof(cpe->ms_mask));
1169
2/2
✓ Branch 0 taken 3716 times.
✓ Branch 1 taken 1948 times.
5664 if (us->ms_mask_mode == 1) {
1170
2/2
✓ Branch 0 taken 3716 times.
✓ Branch 1 taken 3716 times.
7432 for (int g = 0; g < ics1->num_window_groups; g++)
1171
2/2
✓ Branch 0 taken 162324 times.
✓ Branch 1 taken 3716 times.
166040 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++)
1172 162324 cpe->ms_mask[g*cpe->max_sfb_ste + sfb] = get_bits1(gb);
1173
2/2
✓ Branch 0 taken 82 times.
✓ Branch 1 taken 1866 times.
1948 } else if (us->ms_mask_mode == 2) {
1174 82 memset(cpe->ms_mask, 0xFF, sizeof(cpe->ms_mask));
1175
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) {
1176 1 ret = decode_usac_stereo_cplx(ac, us, cpe, gb,
1177 ics1->num_window_groups,
1178 ics1->prev_num_window_groups,
1179 indep_flag);
1180
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (ret < 0)
1181 ✗ return ret;
1182 }
1183 }
1184
1185
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7089 times.
7089 if (ec->tw_mdct) {
1186 ✗ us->common_tw = get_bits1(gb);
1187 ✗ avpriv_report_missing_feature(ac->avctx,
1188 "AAC USAC timewarping");
1189 ✗ return AVERROR_PATCHWELCOME;
1190 }
1191
1192 7089 us->tns_on_lr = 0;
1193 7089 ue1->tns_data_present = ue2->tns_data_present = 0;
1194
2/2
✓ Branch 0 taken 1300 times.
✓ Branch 1 taken 5789 times.
7089 if (tns_active) {
1195 1300 int common_tns = 0;
1196
2/2
✓ Branch 0 taken 655 times.
✓ Branch 1 taken 645 times.
1300 if (us->common_window)
1197 655 common_tns = get_bits1(gb);
1198
1199 1300 us->tns_on_lr = get_bits1(gb);
1200
2/2
✓ Branch 0 taken 327 times.
✓ Branch 1 taken 973 times.
1300 if (common_tns) {
1201 327 ret = ff_aac_decode_tns(ac, &sce1->tns, gb, ics1);
1202
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 327 times.
327 if (ret < 0)
1203 ✗ return ret;
1204 327 memcpy(&sce2->tns, &sce1->tns, sizeof(sce1->tns));
1205 327 sce2->tns.present = 1;
1206 327 sce1->tns.present = 1;
1207 327 ue1->tns_data_present = 0;
1208 327 ue2->tns_data_present = 0;
1209 } else {
1210
2/2
✓ Branch 1 taken 196 times.
✓ Branch 2 taken 777 times.
973 if (get_bits1(gb)) {
1211 196 ue1->tns_data_present = 1;
1212 196 ue2->tns_data_present = 1;
1213 } else {
1214 777 ue2->tns_data_present = get_bits1(gb);
1215 777 ue1->tns_data_present = !ue2->tns_data_present;
1216 }
1217 }
1218 }
1219
1220 7089 return 0;
1221 }
1222
1223 /* 7.2.4 Generation of random signs for spectral noise filling
1224 * This function is exactly defined, though we've helped the definition
1225 * along with being slightly faster. */
1226 37876 static inline float noise_random_sign(unsigned int *seed)
1227 {
1228 37876 unsigned int new_seed = *seed = ((*seed) * 69069) + 5;
1229
2/2
✓ Branch 0 taken 19156 times.
✓ Branch 1 taken 18720 times.
37876 if (((new_seed) & 0x10000) > 0)
1230 19156 return -1.f;
1231 18720 return +1.f;
1232 }
1233
1234 96 static void apply_noise_fill(AACDecContext *ac, SingleChannelElement *sce,
1235 AACUsacElemData *ue)
1236 {
1237 float *coef;
1238 96 IndividualChannelStream *ics = &sce->ics;
1239
1240 96 float noise_val = powf(2, ((float)ue->noise.level - 14.0f)/3.0f);
1241 96 int noise_offset = ue->noise.offset - 16;
1242 int band_off;
1243
1244 96 band_off = ff_usac_noise_fill_start_offset[ac->oc[1].m4ac.frame_length_short]
1245 96 [ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE];
1246
1247 96 coef = sce->coeffs;
1248
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 96 times.
198 for (int g = 0; g < ics->num_window_groups; g++) {
1249 102 unsigned g_len = ics->group_len[g];
1250
1251
2/2
✓ Branch 0 taken 3500 times.
✓ Branch 1 taken 102 times.
3602 for (int sfb = 0; sfb < ics->max_sfb; sfb++) {
1252 3500 float *cb = coef + ics->swb_offset[sfb];
1253 3500 int cb_len = ics->swb_offset[sfb + 1] - ics->swb_offset[sfb];
1254 3500 int band_quantized_to_zero = 1;
1255
1256
2/2
✓ Branch 0 taken 2108 times.
✓ Branch 1 taken 1392 times.
3500 if (ics->swb_offset[sfb] < band_off)
1257 2108 continue;
1258
1259
2/2
✓ Branch 0 taken 1448 times.
✓ Branch 1 taken 1392 times.
2840 for (int group = 0; group < (unsigned)g_len; group++, cb += 128) {
1260
2/2
✓ Branch 0 taken 37952 times.
✓ Branch 1 taken 1448 times.
39400 for (int z = 0; z < cb_len; z++) {
1261
2/2
✓ Branch 0 taken 37876 times.
✓ Branch 1 taken 76 times.
37952 if (cb[z] == 0)
1262 37876 cb[z] = noise_random_sign(&sce->ue.noise.seed) * noise_val;
1263 else
1264 76 band_quantized_to_zero = 0;
1265 }
1266 }
1267
1268
2/2
✓ Branch 0 taken 1385 times.
✓ Branch 1 taken 7 times.
1392 if (band_quantized_to_zero) {
1269 1385 sce->sfo[g*ics->max_sfb + sfb] = FFMAX(sce->sfo[g*ics->max_sfb + sfb] + noise_offset, -200);
1270 }
1271 }
1272 102 coef += g_len << 7;
1273 }
1274 96 }
1275
1276 15984 static void spectrum_scale(AACDecContext *ac, SingleChannelElement *sce,
1277 AACUsacElemData *ue)
1278 {
1279 15984 IndividualChannelStream *ics = &sce->ics;
1280 float *coef;
1281
1282 /* Synthesise noise */
1283
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 15888 times.
15984 if (ue->noise.level)
1284 96 apply_noise_fill(ac, sce, ue);
1285
1286 /* Noise filling may apply an offset to the scalefactor offset */
1287 15984 ac->dsp.dequant_scalefactors(sce);
1288
1289 /* Apply scalefactors */
1290 15984 coef = sce->coeffs;
1291
2/2
✓ Branch 0 taken 17700 times.
✓ Branch 1 taken 15984 times.
33684 for (int g = 0; g < ics->num_window_groups; g++) {
1292 17700 unsigned g_len = ics->group_len[g];
1293
1294
2/2
✓ Branch 0 taken 741698 times.
✓ Branch 1 taken 17700 times.
759398 for (int sfb = 0; sfb < ics->max_sfb; sfb++) {
1295 741698 float *cb = coef + ics->swb_offset[sfb];
1296 741698 int cb_len = ics->swb_offset[sfb + 1] - ics->swb_offset[sfb];
1297 741698 float sf = sce->sf[g*ics->max_sfb + sfb];
1298
1299
2/2
✓ Branch 0 taken 768890 times.
✓ Branch 1 taken 741698 times.
1510588 for (int group = 0; group < (unsigned)g_len; group++, cb += 128)
1300 768890 ac->fdsp->vector_fmul_scalar(cb, cb, sf, cb_len);
1301 }
1302 17700 coef += g_len << 7;
1303 }
1304 15984 }
1305
1306 1 static void complex_stereo_downmix_prev(AACDecContext *ac, ChannelElement *cpe,
1307 float *dmix_re)
1308 {
1309 1 IndividualChannelStream *ics = &cpe->ch[0].ics;
1310
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 int sign = !cpe->us.pred_dir ? +1 : -1;
1311 1 float *coef1 = cpe->ch[0].coeffs;
1312 1 float *coef2 = cpe->ch[1].coeffs;
1313
1314
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < ics->num_window_groups; g++) {
1315 4 unsigned g_len = ics->group_len[g];
1316
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 4 times.
52 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++) {
1317 48 int off = ics->swb_offset[sfb];
1318 48 int cb_len = ics->swb_offset[sfb + 1] - off;
1319
1320 48 float *c1 = coef1 + off;
1321 48 float *c2 = coef2 + off;
1322 48 float *dm = dmix_re + off;
1323
1324
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 48 times.
144 for (int group = 0; group < (unsigned)g_len;
1325 96 group++, c1 += 128, c2 += 128, dm += 128) {
1326
2/2
✓ Branch 0 taken 768 times.
✓ Branch 1 taken 96 times.
864 for (int z = 0; z < cb_len; z++)
1327 768 dm[z] = 0.5*(c1[z] + sign*c2[z]);
1328 }
1329 }
1330
1331 4 coef1 += g_len << 7;
1332 4 coef2 += g_len << 7;
1333 4 dmix_re += g_len << 7;
1334 }
1335 1 }
1336
1337 1 static void complex_stereo_downmix_cur(AACDecContext *ac, ChannelElement *cpe,
1338 float *dmix_re)
1339 {
1340 1 AACUsacStereo *us = &cpe->us;
1341 1 IndividualChannelStream *ics = &cpe->ch[0].ics;
1342
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 int sign = !cpe->us.pred_dir ? +1 : -1;
1343 1 float *coef1 = cpe->ch[0].coeffs;
1344 1 float *coef2 = cpe->ch[1].coeffs;
1345
1346
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < ics->num_window_groups; g++) {
1347 4 unsigned g_len = ics->group_len[g];
1348
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 4 times.
52 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++) {
1349 48 int off = ics->swb_offset[sfb];
1350 48 int cb_len = ics->swb_offset[sfb + 1] - off;
1351
1352 48 float *c1 = coef1 + off;
1353 48 float *c2 = coef2 + off;
1354 48 float *dm = dmix_re + off;
1355
1356
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 14 times.
48 if (us->pred_used[g*cpe->max_sfb_ste + sfb]) {
1357
2/2
✓ Branch 0 taken 82 times.
✓ Branch 1 taken 34 times.
116 for (int group = 0; group < (unsigned)g_len;
1358 82 group++, c1 += 128, c2 += 128, dm += 128) {
1359
2/2
✓ Branch 0 taken 672 times.
✓ Branch 1 taken 82 times.
754 for (int z = 0; z < cb_len; z++)
1360 672 dm[z] = 0.5*(c1[z] + sign*c2[z]);
1361 }
1362 } else {
1363
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 14 times.
28 for (int group = 0; group < (unsigned)g_len;
1364 14 group++, c1 += 128, c2 += 128, dm += 128) {
1365
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 14 times.
110 for (int z = 0; z < cb_len; z++)
1366 96 dm[z] = c1[z];
1367 }
1368 }
1369 }
1370
1371 4 coef1 += g_len << 7;
1372 4 coef2 += g_len << 7;
1373 4 dmix_re += g_len << 7;
1374 }
1375 1 }
1376
1377 1 static void complex_stereo_interpolate_imag(float *im, float *re, const float f[7],
1378 int len, int factor_even, int factor_odd)
1379 {
1380 1 int i = 0;
1381 float s;
1382
1383 1 s = f[6]*re[2] + f[5]*re[1] + f[4]*re[0] +
1384 1 f[3]*re[0] +
1385 1 f[2]*re[1] + f[1]*re[2] + f[0]*re[3];
1386 1 im[i] += s*factor_even;
1387
1388 1 i = 1;
1389 1 s = f[6]*re[1] + f[5]*re[0] + f[4]*re[0] +
1390 1 f[3]*re[1] +
1391 1 f[2]*re[2] + f[1]*re[3] + f[0]*re[4];
1392 1 im[i] += s*factor_odd;
1393
1394 1 i = 2;
1395 1 s = f[6]*re[0] + f[5]*re[0] + f[4]*re[1] +
1396 1 f[3]*re[2] +
1397 1 f[2]*re[3] + f[1]*re[4] + f[0]*re[5];
1398
1399 1 im[i] += s*factor_even;
1400
2/2
✓ Branch 0 taken 509 times.
✓ Branch 1 taken 1 times.
510 for (i = 3; i < len - 4; i += 2) {
1401 509 s = f[6]*re[i-3] + f[5]*re[i-2] + f[4]*re[i-1] +
1402 509 f[3]*re[i] +
1403 509 f[2]*re[i+1] + f[1]*re[i+2] + f[0]*re[i+3];
1404 509 im[i+0] += s*factor_odd;
1405
1406 509 s = f[6]*re[i-2] + f[5]*re[i-1] + f[4]*re[i] +
1407 509 f[3]*re[i+1] +
1408 509 f[2]*re[i+2] + f[1]*re[i+3] + f[0]*re[i+4];
1409 509 im[i+1] += s*factor_even;
1410 }
1411
1412 1 i = len - 3;
1413 1 s = f[6]*re[i-3] + f[5]*re[i-2] + f[4]*re[i-1] +
1414 1 f[3]*re[i] +
1415 1 f[2]*re[i+1] + f[1]*re[i+2] + f[0]*re[i+2];
1416 1 im[i] += s*factor_odd;
1417
1418 1 i = len - 2;
1419 1 s = f[6]*re[i-3] + f[5]*re[i-2] + f[4]*re[i-1] +
1420 1 f[3]*re[i] +
1421 1 f[2]*re[i+1] + f[1]*re[i+1] + f[0]*re[i];
1422 1 im[i] += s*factor_even;
1423
1424 1 i = len - 1;
1425 1 s = f[6]*re[i-3] + f[5]*re[i-2] + f[4]*re[i-1] +
1426 1 f[3]*re[i] +
1427 1 f[2]*re[i] + f[1]*re[i-1] + f[0]*re[i-2];
1428 1 im[i] += s*factor_odd;
1429 1 }
1430
1431 1 static void apply_complex_stereo(AACDecContext *ac, ChannelElement *cpe)
1432 {
1433 1 AACUsacStereo *us = &cpe->us;
1434 1 IndividualChannelStream *ics = &cpe->ch[0].ics;
1435 1 float *coef1 = cpe->ch[0].coeffs;
1436 1 float *coef2 = cpe->ch[1].coeffs;
1437 1 float *dmix_im = us->dmix_im;
1438
1439
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (int g = 0; g < ics->num_window_groups; g++) {
1440 4 unsigned g_len = ics->group_len[g];
1441
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 4 times.
52 for (int sfb = 0; sfb < cpe->max_sfb_ste; sfb++) {
1442 48 int off = ics->swb_offset[sfb];
1443 48 int cb_len = ics->swb_offset[sfb + 1] - off;
1444
1445 48 float *c1 = coef1 + off;
1446 48 float *c2 = coef2 + off;
1447 48 float *dm_im = dmix_im + off;
1448 48 float alpha_re = us->alpha_q_re[g*cpe->max_sfb_ste + sfb];
1449 48 float alpha_im = us->alpha_q_im[g*cpe->max_sfb_ste + sfb];
1450
1451
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 34 times.
48 if (!us->pred_used[g*cpe->max_sfb_ste + sfb])
1452 14 continue;
1453
1454
1/2
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
34 if (!cpe->us.pred_dir) {
1455
2/2
✓ Branch 0 taken 82 times.
✓ Branch 1 taken 34 times.
116 for (int group = 0; group < (unsigned)g_len;
1456 82 group++, c1 += 128, c2 += 128, dm_im += 128) {
1457
2/2
✓ Branch 0 taken 672 times.
✓ Branch 1 taken 82 times.
754 for (int z = 0; z < cb_len; z++) {
1458 float side;
1459 672 side = c2[z] - alpha_re*c1[z] - alpha_im*dm_im[z];
1460 672 c2[z] = c1[z] - side;
1461 672 c1[z] = c1[z] + side;
1462 }
1463 }
1464 } else {
1465 ✗ for (int group = 0; group < (unsigned)g_len;
1466 ✗ group++, c1 += 128, c2 += 128, dm_im += 128) {
1467 ✗ for (int z = 0; z < cb_len; z++) {
1468 float mid;
1469 ✗ mid = c2[z] - alpha_re*c1[z] - alpha_im*dm_im[z];
1470 ✗ c2[z] = mid - c1[z];
1471 ✗ c1[z] = mid + c1[z];
1472 }
1473 }
1474 }
1475 }
1476
1477 4 coef1 += g_len << 7;
1478 4 coef2 += g_len << 7;
1479 4 dmix_im += g_len << 7;
1480 }
1481 1 }
1482
1483 1 static const float *complex_stereo_get_filter(ChannelElement *cpe, int is_prev)
1484 {
1485 int win, shape;
1486
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (!is_prev) {
1487
1/3
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
1 switch (cpe->ch[0].ics.window_sequence[0]) {
1488 1 default:
1489 case ONLY_LONG_SEQUENCE:
1490 case EIGHT_SHORT_SEQUENCE:
1491 1 win = 0;
1492 1 break;
1493 ✗ case LONG_START_SEQUENCE:
1494 ✗ win = 1;
1495 ✗ break;
1496 ✗ case LONG_STOP_SEQUENCE:
1497 ✗ win = 2;
1498 ✗ break;
1499 }
1500
1501
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (cpe->ch[0].ics.use_kb_window[0] == 0 &&
1502 ✗ cpe->ch[0].ics.use_kb_window[1] == 0)
1503 ✗ shape = 0;
1504
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 else if (cpe->ch[0].ics.use_kb_window[0] == 1 &&
1505
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 cpe->ch[0].ics.use_kb_window[1] == 1)
1506 1 shape = 1;
1507 ✗ else if (cpe->ch[0].ics.use_kb_window[0] == 0 &&
1508 ✗ cpe->ch[0].ics.use_kb_window[1] == 1)
1509 ✗ shape = 2;
1510 ✗ else if (cpe->ch[0].ics.use_kb_window[0] == 1 &&
1511 ✗ cpe->ch[0].ics.use_kb_window[1] == 0)
1512 ✗ shape = 3;
1513 else
1514 ✗ shape = 3;
1515 } else {
1516 ✗ win = cpe->ch[0].ics.window_sequence[0] == LONG_STOP_SEQUENCE;
1517 ✗ shape = cpe->ch[0].ics.use_kb_window[1];
1518 }
1519
1520 1 return ff_aac_usac_mdst_filt_cur[win][shape];
1521 }
1522
1523 8895 static void spectrum_decode(AACDecContext *ac, AACUSACConfig *usac,
1524 ChannelElement *cpe, int nb_channels)
1525 {
1526 8895 AACUsacStereo *us = &cpe->us;
1527
1528
2/2
✓ Branch 0 taken 15984 times.
✓ Branch 1 taken 8895 times.
24879 for (int ch = 0; ch < nb_channels; ch++) {
1529 15984 SingleChannelElement *sce = &cpe->ch[ch];
1530 15984 AACUsacElemData *ue = &sce->ue;
1531
1532
1/2
✓ Branch 0 taken 15984 times.
✗ Branch 1 not taken.
15984 if (!ue->core_mode)
1533 15984 spectrum_scale(ac, sce, ue);
1534 }
1535
1536
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) {
1537
2/2
✓ Branch 0 taken 11328 times.
✓ Branch 1 taken 5664 times.
16992 for (int ch = 0; ch < nb_channels; ch++) {
1538 11328 SingleChannelElement *sce = &cpe->ch[ch];
1539
1540 /* Apply TNS, if the tns_on_lr bit is not set. */
1541
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)
1542 ✗ ac->dsp.apply_tns(sce->coeffs, &sce->tns, &sce->ics, 1);
1543 }
1544
1545
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5663 times.
5664 if (us->ms_mask_mode == 3) {
1546 const float *filt;
1547 1 complex_stereo_downmix_cur(ac, cpe, us->dmix_re);
1548 1 complex_stereo_downmix_prev(ac, cpe, us->prev_dmix_re);
1549
1550 1 filt = complex_stereo_get_filter(cpe, 0);
1551 1 complex_stereo_interpolate_imag(us->dmix_im, us->dmix_re, filt,
1552 1 usac->core_frame_len, 1, 1);
1553
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (us->use_prev_frame) {
1554 ✗ filt = complex_stereo_get_filter(cpe, 1);
1555 ✗ complex_stereo_interpolate_imag(us->dmix_im, us->prev_dmix_re, filt,
1556 ✗ usac->core_frame_len, -1, 1);
1557 }
1558
1559 1 apply_complex_stereo(ac, cpe);
1560
2/2
✓ Branch 0 taken 3798 times.
✓ Branch 1 taken 1865 times.
5663 } else if (us->ms_mask_mode > 0) {
1561 3798 ac->dsp.apply_mid_side_stereo(ac, cpe);
1562 }
1563 }
1564
1565 /* Save coefficients and alpha values for prediction reasons */
1566
2/2
✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 1806 times.
8895 if (nb_channels > 1) {
1567 7089 AACUsacStereo *us2 = &cpe->us;
1568
2/2
✓ Branch 0 taken 14178 times.
✓ Branch 1 taken 7089 times.
21267 for (int ch = 0; ch < nb_channels; ch++) {
1569 14178 SingleChannelElement *sce = &cpe->ch[ch];
1570 14178 memcpy(sce->prev_coeffs, sce->coeffs, sizeof(sce->coeffs));
1571 }
1572 7089 memcpy(us2->prev_alpha_q_re, us2->alpha_q_re, sizeof(us2->alpha_q_re));
1573 7089 memcpy(us2->prev_alpha_q_im, us2->alpha_q_im, sizeof(us2->alpha_q_im));
1574 }
1575
1576
2/2
✓ Branch 0 taken 15984 times.
✓ Branch 1 taken 8895 times.
24879 for (int ch = 0; ch < nb_channels; ch++) {
1577 15984 SingleChannelElement *sce = &cpe->ch[ch];
1578
1579 /* Apply TNS, if it hasn't been applied yet. */
1580
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)))
1581 1823 ac->dsp.apply_tns(sce->coeffs, &sce->tns, &sce->ics, 1);
1582
1583
1/2
✓ Branch 0 taken 15984 times.
✗ Branch 1 not taken.
15984 if (!sce->ue.core_mode)
1584
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) :
1585 15984 ac->dsp.imdct_and_windowing(ac, sce);
1586 }
1587 8895 }
1588
1589 static const uint8_t mps_fr_nb_bands[8] = {
1590 255 /* Reserved */, 28, 20, 14, 10, 7, 5, 4,
1591 };
1592
1593 static const uint8_t mps_fr_stride_smg[4] = {
1594 1, 2, 5, 28,
1595 };
1596
1597 ✗ static void decode_tsd(GetBitContext *gb, int *data,
1598 int nb_tr_slots, int nb_slots)
1599 {
1600 ✗ int nb_bits = av_log2(nb_slots / (nb_tr_slots + 1));
1601 ✗ int s = get_bits(gb, nb_bits);
1602 ✗ for (int k = 0; k < nb_slots; k++)
1603 ✗ data[k]=0;
1604
1605 ✗ int p = nb_tr_slots + 1;
1606 ✗ for (int k = nb_slots - 1; k >= 0; k--) {
1607 ✗ if (p > k) {
1608 ✗ for (; k >= 0; k--)
1609 ✗ data[k] = 1;
1610 ✗ break;
1611 }
1612 ✗ int64_t c = k - p + 1;
1613 ✗ for (int h = 2; h <= p && c <= s; h++) {
1614 ✗ c += c*(k-p)/h;
1615 }
1616 ✗ if (s >= c) {
1617 ✗ s -= c;
1618 ✗ data[k] = 1;
1619 ✗ p--;
1620 ✗ if (!p)
1621 ✗ break;
1622 }
1623 }
1624 ✗ }
1625
1626 ✗ static int parse_mps212(AACDecContext *ac, AACUSACConfig *usac,
1627 AACUsacMPSData *mps, AACUsacElemConfig *ec,
1628 GetBitContext *gb, int frame_indep_flag)
1629 {
1630 int err;
1631 ✗ int nb_bands = mps_fr_nb_bands[ec->mps.freq_res];
1632
1633 /* Framing info */
1634 ✗ mps->framing_type = 0;
1635 ✗ mps->nb_param_sets = 2;
1636 ✗ if (ec->mps.high_rate_mode) {
1637 ✗ mps->framing_type = get_bits1(gb);
1638 ✗ mps->nb_param_sets = get_bits(gb, 3) + 1;
1639 }
1640 ✗ int param_slot_bits = usac->core_sbr_frame_len_idx == 4 ? 6 : 5;
1641 ✗ int nb_time_slots = usac->core_sbr_frame_len_idx == 4 ? 64 : 32;
1642
1643 ✗ if (mps->framing_type)
1644 ✗ for (int i = 0; i < mps->nb_param_sets; i++)
1645 ✗ mps->param_sets[i] = get_bits(gb, param_slot_bits);
1646
1647 ✗ int indep = frame_indep_flag;
1648 ✗ if (!frame_indep_flag)
1649 ✗ indep = get_bits1(gb);
1650
1651 ✗ int extend_frame = mps->param_sets[mps->nb_param_sets - 1] !=
1652 ✗ (nb_time_slots - 1);
1653
1654 /* CLD */
1655 ✗ err = ff_aac_ec_data_dec(gb, &mps->ott[MPS_CLD], MPS_CLD,
1656 0, 0, nb_bands,
1657 indep, indep, mps->nb_param_sets);
1658 ✗ if (err < 0) {
1659 ✗ av_log(ac->avctx, AV_LOG_ERROR, "Error parsing OTT CLD data!\n");
1660 ✗ return err;
1661 }
1662 ✗ ff_aac_map_index_data(&mps->ott[MPS_CLD], MPS_CLD, mps->ott_idx[MPS_CLD],
1663 0, 0, nb_bands, mps->nb_param_sets,
1664 ✗ mps->param_sets, extend_frame);
1665
1666 /* ICC */
1667 ✗ err = ff_aac_ec_data_dec(gb, &mps->ott[MPS_ICC], MPS_ICC, 0, 0, nb_bands,
1668 indep, indep, mps->nb_param_sets);
1669 ✗ if (err < 0) {
1670 ✗ av_log(ac->avctx, AV_LOG_ERROR, "Error parsing OTT ICC data!\n");
1671 ✗ return err;
1672 }
1673 ✗ ff_aac_map_index_data(&mps->ott[MPS_ICC], MPS_ICC, mps->ott_idx[MPS_ICC],
1674 0, 0, nb_bands, mps->nb_param_sets,
1675 ✗ mps->param_sets, extend_frame);
1676
1677 /* IPD */
1678 ✗ if (ec->mps.phase_coding) {
1679 ✗ if (get_bits1(gb)) {
1680 ✗ mps->opd_smoothing_mode = get_bits1(gb);
1681 ✗ err = ff_aac_ec_data_dec(gb, &mps->ott[MPS_IPD], MPS_IPD, 0, 0,
1682 ✗ ec->mps.otts_bands_phase,
1683 indep, indep, mps->nb_param_sets);
1684 ✗ ff_aac_map_index_data(&mps->ott[MPS_IPD], MPS_IPD, mps->ott_idx[MPS_IPD],
1685 0, 0, nb_bands, mps->nb_param_sets,
1686 ✗ mps->param_sets, extend_frame);
1687 ✗ if (err < 0) {
1688 ✗ av_log(ac->avctx, AV_LOG_ERROR, "Error parsing OTT IPD data!\n");
1689 ✗ return err;
1690 }
1691 }
1692 }
1693
1694 /* SMG data */
1695 ✗ memset(mps->smooth_mode, 0, sizeof(mps->smooth_mode));
1696 ✗ if (ec->mps.high_rate_mode) {
1697 ✗ for (int i = 0; i < mps->nb_param_sets; i++) {
1698 ✗ mps->smooth_mode[i] = get_bits(gb, 2);
1699 ✗ if (mps->smooth_mode[i] >= 2)
1700 ✗ mps->smooth_time[i] = get_bits(gb, 2);
1701 ✗ if (mps->smooth_mode[i] >= 3) {
1702 ✗ mps->freq_res_stride_smg[i] = get_bits(gb, 2);
1703 ✗ int nb_data_bands = (nb_bands - 1);
1704 ✗ nb_data_bands /= (mps_fr_stride_smg[mps->freq_res_stride_smg[i]] + 1);
1705 ✗ for (int j = 0; j < nb_data_bands; j++)
1706 ✗ mps->smg_data[i][j] = get_bits1(gb);
1707 }
1708 }
1709 }
1710
1711 /* Temp shape data */
1712 ✗ mps->tsd_enable = 0;
1713 ✗ if (ec->mps.temp_shape_config == 3) {
1714 ✗ mps->tsd_enable = get_bits1(gb);
1715 ✗ } else if (ec->mps.temp_shape_config) {
1716 ✗ mps->temp_shape_enable = get_bits1(gb);
1717 ✗ if (mps->temp_shape_enable) {
1718 ✗ for (int i = 0; i < 2; i++)
1719 ✗ mps->temp_shape_enable_ch[i] = get_bits1(gb);
1720 ✗ if (ec->mps.temp_shape_config == 2) {
1721 ✗ err = ff_aac_huff_dec_reshape(gb, mps->temp_shape_data, 16);
1722 ✗ if (err < 0) {
1723 ✗ av_log(ac->avctx, AV_LOG_ERROR,
1724 "Error parsing TSD reshape data!\n");
1725 ✗ return err;
1726 }
1727 }
1728 }
1729 }
1730
1731 /* TSD data */
1732 ✗ if (mps->tsd_enable) {
1733 ✗ mps->tsd_num_tr_slots = get_bits(gb, param_slot_bits - 1);
1734 int tsd_pos[64];
1735 ✗ decode_tsd(gb, tsd_pos, mps->tsd_num_tr_slots, nb_time_slots);
1736 ✗ for (int i = 0; i < nb_time_slots; i++) {
1737 ✗ mps->tsd_phase_data[i] = 0;
1738 ✗ if (tsd_pos[i])
1739 ✗ mps->tsd_phase_data[i] = get_bits(gb, 3);
1740 }
1741 }
1742
1743 ✗ return 0;
1744 }
1745
1746 8895 static int decode_usac_core_coder(AACDecContext *ac, AACUSACConfig *usac,
1747 AACUsacElemConfig *ec, ChannelElement *che,
1748 GetBitContext *gb, int indep_flag, int nb_channels)
1749 {
1750 int ret;
1751 int arith_reset_flag;
1752 8895 AACUsacStereo *us = &che->us;
1753 8895 int core_nb_channels = nb_channels;
1754
1755 /* Local symbols */
1756 uint8_t global_gain;
1757
1758 8895 us->common_window = 0;
1759
1760
2/2
✓ Branch 0 taken 15984 times.
✓ Branch 1 taken 8895 times.
24879 for (int ch = 0; ch < core_nb_channels; ch++) {
1761 15984 SingleChannelElement *sce = &che->ch[ch];
1762 15984 AACUsacElemData *ue = &sce->ue;
1763
1764 15984 sce->tns.present = 0;
1765 15984 ue->tns_data_present = 0;
1766
1767 15984 ue->core_mode = get_bits1(gb);
1768 }
1769
1770
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)
1771 ✗ core_nb_channels = 1;
1772
1773
2/2
✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 1806 times.
8895 if (core_nb_channels == 2) {
1774 7089 ret = decode_usac_stereo_info(ac, usac, ec, che, gb, indep_flag);
1775
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7089 times.
7089 if (ret)
1776 ✗ return ret;
1777 }
1778
1779
2/2
✓ Branch 0 taken 15984 times.
✓ Branch 1 taken 8895 times.
24879 for (int ch = 0; ch < core_nb_channels; ch++) {
1780 15984 SingleChannelElement *sce = &che->ch[ch];
1781 15984 IndividualChannelStream *ics = &sce->ics;
1782 15984 AACUsacElemData *ue = &sce->ue;
1783
1784
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15984 times.
15984 if (ue->core_mode) { /* lpd_channel_stream */
1785 ✗ ret = ff_aac_ldp_parse_channel_stream(ac, usac, ue, gb);
1786 ✗ if (ret < 0)
1787 ✗ return ret;
1788 ✗ continue;
1789 }
1790
1791
2/2
✓ Branch 0 taken 14178 times.
✓ Branch 1 taken 1806 times.
15984 if ((core_nb_channels == 1) ||
1792
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14178 times.
14178 (che->ch[0].ue.core_mode != che->ch[1].ue.core_mode))
1793 1806 ue->tns_data_present = get_bits1(gb);
1794
1795 /* fd_channel_stream */
1796 15984 global_gain = get_bits(gb, 8);
1797
1798 15984 ue->noise.level = 0;
1799
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 15888 times.
15984 if (ec->noise_fill) {
1800 96 ue->noise.level = get_bits(gb, 3);
1801 96 ue->noise.offset = get_bits(gb, 5);
1802 }
1803
1804
2/2
✓ Branch 0 taken 4656 times.
✓ Branch 1 taken 11328 times.
15984 if (!us->common_window) {
1805 /* ics_info() */
1806 4656 ics->window_sequence[1] = ics->window_sequence[0];
1807 4656 ics->window_sequence[0] = get_bits(gb, 2);
1808 4656 ics->use_kb_window[1] = ics->use_kb_window[0];
1809 4656 ics->use_kb_window[0] = get_bits1(gb);
1810
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4656 times.
4656 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1811 ✗ ics->max_sfb = get_bits(gb, 4);
1812 ✗ ue->scale_factor_grouping = get_bits(gb, 7);
1813 } else {
1814 4656 ics->max_sfb = get_bits(gb, 6);
1815 }
1816
1817 4656 ret = setup_sce(ac, sce, usac);
1818
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4656 times.
4656 if (ret < 0)
1819 ✗ return ret;
1820 }
1821
1822
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) {
1823 /* tw_data() */
1824 ✗ if (get_bits1(gb)) { /* tw_data_present */
1825 /* Time warping is not supported in baseline profile streams. */
1826 ✗ avpriv_report_missing_feature(ac->avctx,
1827 "AAC USAC timewarping");
1828 ✗ return AVERROR_PATCHWELCOME;
1829 }
1830 }
1831
1832 15984 ret = decode_usac_scale_factors(ac, sce, gb, global_gain);
1833
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15984 times.
15984 if (ret < 0)
1834 ✗ return ret;
1835
1836
2/2
✓ Branch 0 taken 1169 times.
✓ Branch 1 taken 14815 times.
15984 if (ue->tns_data_present) {
1837 1169 sce->tns.present = 1;
1838 1169 ret = ff_aac_decode_tns(ac, &sce->tns, gb, ics);
1839
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1169 times.
1169 if (ret < 0)
1840 ✗ return ret;
1841 }
1842
1843 /* ac_spectral_data */
1844 15984 arith_reset_flag = indep_flag;
1845
2/2
✓ Branch 0 taken 15053 times.
✓ Branch 1 taken 931 times.
15984 if (!arith_reset_flag)
1846 15053 arith_reset_flag = get_bits1(gb);
1847
1848 /* Decode coeffs */
1849 15984 memset(&sce->coeffs[0], 0, 1024*sizeof(float));
1850
2/2
✓ Branch 0 taken 19988 times.
✓ Branch 1 taken 15984 times.
35972 for (int win = 0; win < ics->num_windows; win++) {
1851 19988 int lg = ics->swb_offset[ics->max_sfb];
1852 int N;
1853
2/2
✓ Branch 0 taken 4576 times.
✓ Branch 1 taken 15412 times.
19988 if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE)
1854 4576 N = usac->core_frame_len / 8;
1855 else
1856 15412 N = usac->core_frame_len;
1857
1858
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,
1859 arith_reset_flag && (win == 0), lg, N);
1860
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 19988 times.
19988 if (ret < 0)
1861 ✗ return ret;
1862 }
1863
1864
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15984 times.
15984 if (get_bits1(gb)) { /* fac_data_present */
1865 ✗ const uint16_t len_8 = usac->core_frame_len / 8;
1866 ✗ const uint16_t len_16 = usac->core_frame_len / 16;
1867 ✗ const uint16_t fac_len = ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE ?
1868 len_16 : len_8;
1869 ✗ ret = ff_aac_parse_fac_data(ue, gb, 1, fac_len);
1870 ✗ if (ret < 0)
1871 ✗ return ret;
1872 }
1873 }
1874
1875
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (ec->sbr.ratio) {
1876 ✗ int sbr_ch = nb_channels;
1877 ✗ if (nb_channels == 2 &&
1878 ✗ !(ec->stereo_config_index == 0 || ec->stereo_config_index == 3))
1879 ✗ sbr_ch = 1;
1880
1881 ✗ ret = ff_aac_sbr_decode_usac_data(ac, che, ec, gb, sbr_ch, indep_flag);
1882 ✗ if (ret < 0)
1883 ✗ return ret;
1884 }
1885
1886
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (ec->stereo_config_index) {
1887 ✗ ret = parse_mps212(ac, usac, &us->mps, ec, gb, indep_flag);
1888 ✗ if (ret < 0)
1889 ✗ return ret;
1890 }
1891
1892 8895 spectrum_decode(ac, usac, che, core_nb_channels);
1893
1894
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (ac->oc[1].m4ac.sbr > 0) {
1895 ✗ ac->proc.sbr_apply(ac, che, nb_channels == 2 ? TYPE_CPE : TYPE_SCE, 0,
1896 ✗ che->ch[0].output,
1897 ✗ che->ch[1].output);
1898 }
1899
1900 8895 return 0;
1901 }
1902
1903 ✗ static int parse_audio_preroll(AACDecContext *ac, GetBitContext *gb)
1904 {
1905 ✗ int ret = 0;
1906 GetBitContext gbc;
1907 ✗ OutputConfiguration *oc = &ac->oc[1];
1908 ✗ MPEG4AudioConfig *m4ac = &oc->m4ac;
1909 ✗ MPEG4AudioConfig m4ac_bak = oc->m4ac;
1910 uint8_t temp_data[512];
1911 ✗ uint8_t *tmp_buf = temp_data;
1912 ✗ size_t tmp_buf_size = sizeof(temp_data);
1913
1914 av_unused int crossfade;
1915 int num_preroll_frames;
1916
1917 ✗ int config_len = get_escaped_value(gb, 4, 4, 8);
1918
1919 /* Implementations are free to pad the config to any length, so use a
1920 * different reader for this. */
1921 ✗ gbc = *gb;
1922 ✗ ret = ff_aac_usac_config_decode(ac, ac->avctx, &gbc, oc, m4ac->chan_config);
1923 ✗ if (ret < 0) {
1924 ✗ *m4ac = m4ac_bak;
1925 ✗ return ret;
1926 } else {
1927 ✗ ac->oc[1].m4ac.chan_config = 0;
1928 }
1929
1930 /* 7.18.3.3 Bitrate adaption
1931 * If configuration didn't change after applying preroll, continue
1932 * without decoding it. */
1933 ✗ if (!memcmp(m4ac, &m4ac_bak, sizeof(m4ac_bak)))
1934 ✗ return 0;
1935
1936 ✗ skip_bits_long(gb, config_len*8);
1937
1938 ✗ crossfade = get_bits1(gb); /* applyCrossfade */
1939 ✗ skip_bits1(gb); /* reserved */
1940 ✗ num_preroll_frames = get_escaped_value(gb, 2, 4, 0); /* numPreRollFrames */
1941
1942 ✗ for (int i = 0; i < num_preroll_frames; i++) {
1943 ✗ int got_frame_ptr = 0;
1944 ✗ int au_len = get_escaped_value(gb, 16, 16, 0);
1945
1946 ✗ if (au_len*8 > tmp_buf_size) {
1947 uint8_t *tmp2;
1948 ✗ tmp_buf = tmp_buf == temp_data ? NULL : tmp_buf;
1949 ✗ tmp2 = av_realloc_array(tmp_buf, au_len, 8);
1950 ✗ if (!tmp2) {
1951 ✗ if (tmp_buf != temp_data)
1952 ✗ av_free(tmp_buf);
1953 ✗ return AVERROR(ENOMEM);
1954 }
1955 ✗ tmp_buf = tmp2;
1956 }
1957
1958 /* Byte alignment is not guaranteed. */
1959 ✗ for (int j = 0; j < au_len; j++)
1960 ✗ tmp_buf[j] = get_bits(gb, 8);
1961
1962 ✗ ret = init_get_bits8(&gbc, tmp_buf, au_len);
1963 ✗ if (ret < 0)
1964 ✗ break;
1965
1966 ✗ ret = ff_aac_usac_decode_frame(ac->avctx, ac, &gbc, &got_frame_ptr);
1967 ✗ if (ret < 0)
1968 ✗ break;
1969 }
1970
1971 ✗ if (tmp_buf != temp_data)
1972 ✗ av_free(tmp_buf);
1973
1974 ✗ return 0;
1975 }
1976
1977 8895 static int parse_ext_ele(AACDecContext *ac, AACUsacElemConfig *e,
1978 GetBitContext *gb)
1979 {
1980 8895 uint8_t pl_frag_start = 1;
1981 8895 uint8_t pl_frag_end = 1;
1982 uint32_t len;
1983
1984
2/2
✓ Branch 1 taken 6535 times.
✓ Branch 2 taken 2360 times.
8895 if (!get_bits1(gb)) /* usacExtElementPresent */
1985 6535 return 0;
1986
1987
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2360 times.
2360 if (get_bits1(gb)) { /* usacExtElementUseDefaultLength */
1988 ✗ len = e->ext.default_len;
1989 } else {
1990 2360 len = get_bits(gb, 8); /* usacExtElementPayloadLength */
1991
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2352 times.
2360 if (len == 255)
1992 8 len += get_bits(gb, 16) - 2;
1993 }
1994
1995
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2354 times.
2360 if (!len)
1996 6 return 0;
1997
1998
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2354 times.
2354 if (e->ext.payload_frag) {
1999 ✗ pl_frag_start = get_bits1(gb); /* usacExtElementStart */
2000 ✗ pl_frag_end = get_bits1(gb); /* usacExtElementStop */
2001 }
2002
2003
1/2
✓ Branch 0 taken 2354 times.
✗ Branch 1 not taken.
2354 if (pl_frag_start)
2004 2354 e->ext.pl_data_offset = 0;
2005
2006 /* If an extension starts and ends this packet, we can directly use it below.
2007 * Otherwise, we have to copy it to a buffer and accumulate it. */
2008
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)) {
2009 /* Reallocate the data */
2010 ✗ uint8_t *tmp_buf = av_refstruct_alloc_ext(e->ext.pl_data_offset + len,
2011 AV_REFSTRUCT_FLAG_NO_ZEROING,
2012 NULL, NULL);
2013 ✗ if (!tmp_buf)
2014 ✗ return AVERROR(ENOMEM);
2015
2016 /* Copy the data over only if we had saved data to begin with */
2017 ✗ if (e->ext.pl_buf)
2018 ✗ memcpy(tmp_buf, e->ext.pl_buf, e->ext.pl_data_offset);
2019
2020 ✗ av_refstruct_unref(&e->ext.pl_buf);
2021 ✗ e->ext.pl_buf = tmp_buf;
2022
2023 /* Readout data to a buffer */
2024 ✗ for (int i = 0; i < len; i++)
2025 ✗ e->ext.pl_buf[e->ext.pl_data_offset + i] = get_bits(gb, 8);
2026 }
2027
2028 2354 e->ext.pl_data_offset += len;
2029
2030
1/2
✓ Branch 0 taken 2354 times.
✗ Branch 1 not taken.
2354 if (pl_frag_end) {
2031 2354 int ret = 0;
2032 2354 int start_bits = get_bits_count(gb);
2033 2354 const int pl_len = e->ext.pl_data_offset;
2034 2354 GetBitContext *gb2 = gb;
2035 GetBitContext gbc;
2036
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)) {
2037 ✗ ret = init_get_bits8(&gbc, e->ext.pl_buf, pl_len);
2038 ✗ if (ret < 0)
2039 ✗ return ret;
2040
2041 ✗ gb2 = &gbc;
2042 }
2043
2044
1/4
✓ Branch 0 taken 2354 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2354 switch (e->ext.type) {
2045 2354 case ID_EXT_ELE_FILL:
2046 /* Filler elements have no usable payload */
2047 2354 break;
2048 ✗ case ID_EXT_ELE_AUDIOPREROLL:
2049 ✗ ret = parse_audio_preroll(ac, gb2);
2050 ✗ break;
2051 ✗ case ID_EXT_ELE_UNI_DRC:
2052 /* uniDrcGain() payload: DRC is not applied, just consume the
2053 * bits via skip_bits_long below. */
2054 ✗ break;
2055 ✗ default:
2056 /* This should never happen */
2057 ✗ av_assert0(0);
2058 }
2059 2354 av_refstruct_unref(&e->ext.pl_buf);
2060
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2354 times.
2354 if (ret < 0)
2061 ✗ return ret;
2062
2063 2354 skip_bits_long(gb, pl_len*8 - (get_bits_count(gb) - start_bits));
2064 }
2065
2066 2354 return 0;
2067 }
2068
2069 8895 int ff_aac_usac_decode_frame(AVCodecContext *avctx, AACDecContext *ac,
2070 GetBitContext *gb, int *got_frame_ptr)
2071 {
2072 8895 int ret, is_dmono = 0;
2073 8895 int indep_flag, samples = 0;
2074 8895 int audio_found = 0;
2075 8895 int elem_id[3 /* SCE, CPE, LFE */] = { 0, 0, 0 };
2076 8895 AVFrame *frame = ac->frame;
2077
2078 int ratio_mult, ratio_dec;
2079 8895 AACUSACConfig *usac = &ac->oc[1].usac;
2080
1/2
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
17790 int sbr_ratio = usac->core_sbr_frame_len_idx == 2 ? 2 :
2081
1/2
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
8895 usac->core_sbr_frame_len_idx == 3 ? 3 :
2082 8895 usac->core_sbr_frame_len_idx == 4 ? 1 :
2083 0;
2084
2085
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (sbr_ratio == 2) {
2086 ✗ ratio_mult = 8;
2087 ✗ ratio_dec = 3;
2088
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 } else if (sbr_ratio == 3) {
2089 ✗ ratio_mult = 2;
2090 ✗ ratio_dec = 1;
2091
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 } else if (sbr_ratio == 4) {
2092 ✗ ratio_mult = 4;
2093 ✗ ratio_dec = 1;
2094 } else {
2095 8895 ratio_mult = 1;
2096 8895 ratio_dec = 1;
2097 }
2098
2099 8895 ff_aac_output_configure(ac, ac->oc[1].layout_map, ac->oc[1].layout_map_tags,
2100 ac->oc[1].status, 0);
2101
2102 8895 ac->avctx->profile = AV_PROFILE_AAC_USAC;
2103
2104 8895 indep_flag = get_bits1(gb);
2105
2106
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++) {
2107 int layout_id;
2108 int layout_type;
2109 17790 AACUsacElemConfig *e = &ac->oc[1].usac.elems[i];
2110 ChannelElement *che;
2111
2112
2/2
✓ Branch 0 taken 1806 times.
✓ Branch 1 taken 15984 times.
17790 if (e->type == ID_USAC_SCE) {
2113 1806 layout_id = elem_id[0]++;
2114 1806 layout_type = TYPE_SCE;
2115 1806 che = ff_aac_get_che(ac, TYPE_SCE, layout_id);
2116
2/2
✓ Branch 0 taken 7089 times.
✓ Branch 1 taken 8895 times.
15984 } else if (e->type == ID_USAC_CPE) {
2117 7089 layout_id = elem_id[1]++;
2118 7089 layout_type = TYPE_CPE;
2119 7089 che = ff_aac_get_che(ac, TYPE_CPE, layout_id);
2120
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 } else if (e->type == ID_USAC_LFE) {
2121 ✗ layout_id = elem_id[2]++;
2122 ✗ layout_type = TYPE_LFE;
2123 ✗ che = ff_aac_get_che(ac, TYPE_LFE, layout_id);
2124 }
2125
2126
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) {
2127 ✗ av_log(ac->avctx, AV_LOG_ERROR,
2128 "channel element %d.%d is not allocated\n",
2129 layout_type, layout_id);
2130 ✗ return AVERROR_INVALIDDATA;
2131 }
2132
2133
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) {
2134 1806 case ID_USAC_LFE:
2135 /* Fallthrough */
2136 case ID_USAC_SCE:
2137 1806 ret = decode_usac_core_coder(ac, &ac->oc[1].usac, e, che, gb,
2138 indep_flag, 1);
2139
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1806 times.
1806 if (ret < 0)
2140 ✗ return ret;
2141
2142 1806 audio_found = 1;
2143 1806 che->present = 1;
2144 1806 break;
2145 7089 case ID_USAC_CPE:
2146 7089 ret = decode_usac_core_coder(ac, &ac->oc[1].usac, e, che, gb,
2147 indep_flag, 2);
2148
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7089 times.
7089 if (ret < 0)
2149 ✗ return ret;
2150
2151 7089 audio_found = 1;
2152 7089 che->present = 1;
2153 7089 break;
2154 8895 case ID_USAC_EXT:
2155 8895 ret = parse_ext_ele(ac, e, gb);
2156
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (ret < 0)
2157 ✗ return ret;
2158 8895 break;
2159 }
2160 }
2161
2162
1/2
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
8895 if (audio_found)
2163
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 samples = ac->oc[1].m4ac.frame_length_short ? 768 : 1024;
2164
2165 8895 samples = (samples * ratio_mult) / ratio_dec;
2166
2167
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) {
2168 8895 avctx->sample_rate = ac->oc[1].m4ac.ext_sample_rate;
2169 8895 avctx->frame_size = samples;
2170 8895 ac->oc[1].status = OC_LOCKED;
2171 }
2172
2173
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) {
2174 ✗ av_log(avctx, AV_LOG_ERROR, "no frame data found\n");
2175 ✗ return AVERROR_INVALIDDATA;
2176 }
2177
2178
1/2
✓ Branch 0 taken 8895 times.
✗ Branch 1 not taken.
8895 if (samples) {
2179 8895 frame->nb_samples = samples;
2180 8895 frame->sample_rate = avctx->sample_rate;
2181
2/2
✓ Branch 0 taken 487 times.
✓ Branch 1 taken 8408 times.
8895 frame->flags = indep_flag ? AV_FRAME_FLAG_KEY : 0x0;
2182 8895 *got_frame_ptr = 1;
2183 } else {
2184 ✗ av_frame_unref(ac->frame);
2185 ✗ frame->flags = indep_flag ? AV_FRAME_FLAG_KEY : 0x0;
2186 ✗ *got_frame_ptr = 0;
2187 }
2188
2189
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) {
2190 339 int method_val = usac->loudness.input_method_val;
2191
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 339 times.
339 if (method_val < 0) {
2192 ✗ if (!ac->warned_loudness_missing) {
2193 ✗ av_log(avctx, AV_LOG_WARNING,
2194 "target_level set but no program/anchor loudness "
2195 "measurement available; normalization skipped\n");
2196 ✗ ac->warned_loudness_missing = 1;
2197 }
2198 } else {
2199 /* Per ISO/IEC 23003-4 Table A.48: L = -57.75 + 0.25 * μ */
2200 339 float input_loudness = -57.75f + 0.25f * method_val;
2201 339 float gain_dB = (float)ac->target_level - input_loudness;
2202 339 float gain = powf(10.0f, gain_dB / 20.0f);
2203
2204
2/2
✓ Branch 0 taken 678 times.
✓ Branch 1 taken 339 times.
1017 for (int ch = 0; ch < frame->ch_layout.nb_channels; ch++)
2205 678 ac->fdsp->vector_fmul_scalar((float *)frame->extended_data[ch],
2206 678 (float *)frame->extended_data[ch],
2207 gain, frame->nb_samples);
2208 }
2209 }
2210
2211 /* for dual-mono audio (SCE + SCE) */
2212
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 &&
2213 ✗ !av_channel_layout_compare(&ac->oc[1].ch_layout,
2214 ✗ &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO);
2215
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8895 times.
8895 if (is_dmono) {
2216 ✗ if (ac->dmono_mode == 1)
2217 ✗ frame->data[1] = frame->data[0];
2218 ✗ else if (ac->dmono_mode == 2)
2219 ✗ frame->data[0] = frame->data[1];
2220 }
2221
2222 8895 return 0;
2223 }
2224