Coverage Report

Created: 2026-10-28 08:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/atrac9dec.c
Line
Count
Source
1
/*
2
 * ATRAC9 decoder
3
 * Copyright (c) 2018 Rostislav Pehlivanov <atomnuker@gmail.com>
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
22
#include "libavutil/channel_layout.h"
23
#include "libavutil/mem.h"
24
#include "libavutil/thread.h"
25
26
#include "codec_internal.h"
27
#include "decode.h"
28
#include "get_bits.h"
29
#include "atrac9tab.h"
30
#include "libavutil/tx.h"
31
#include "libavutil/lfg.h"
32
#include "libavutil/float_dsp.h"
33
#include "libavutil/mem_internal.h"
34
35
2.33M
#define ATRAC9_SF_VLC_BITS 8
36
111M
#define ATRAC9_COEFF_VLC_BITS 9
37
38
typedef struct ATRAC9ChannelData {
39
    int band_ext;
40
    int q_unit_cnt;
41
    int band_ext_data[4];
42
    int32_t scalefactors[31];
43
    int32_t scalefactors_prev[31];
44
45
    int precision_coarse[30];
46
    int precision_fine[30];
47
    int precision_mask[30];
48
49
    int codebookset[30];
50
51
    int32_t q_coeffs_coarse[256];
52
    int32_t q_coeffs_fine[256];
53
54
    DECLARE_ALIGNED(32, float, coeffs  )[256];
55
    DECLARE_ALIGNED(32, float, prev_win)[128];
56
} ATRAC9ChannelData;
57
58
typedef struct ATRAC9BlockData {
59
    ATRAC9ChannelData channel[2];
60
61
    /* Base */
62
    int band_count;
63
    int q_unit_cnt;
64
    int q_unit_cnt_prev;
65
66
    /* Stereo block only */
67
    int stereo_q_unit;
68
69
    /* Band extension only */
70
    int has_band_ext;
71
    int has_band_ext_data;
72
    int band_ext_q_unit;
73
74
    /* Gradient */
75
    int grad_mode;
76
    int grad_boundary;
77
    int gradient[31];
78
79
    /* Stereo */
80
    int cpe_base_channel;
81
    int is_signs[30];
82
83
    int reusable;
84
85
} ATRAC9BlockData;
86
87
typedef struct ATRAC9Context {
88
    AVCodecContext *avctx;
89
    AVFloatDSPContext *fdsp;
90
    AVTXContext *tx;
91
    av_tx_fn tx_fn;
92
    ATRAC9BlockData block[5];
93
    AVLFG lfg;
94
95
    /* Set on init */
96
    int frame_log2;
97
    int avg_frame_size;
98
    int frame_count;
99
    int samplerate_idx;
100
    const ATRAC9BlockConfig *block_config;
101
102
    /* Generated on init */
103
    uint8_t alloc_curve[48][48];
104
    DECLARE_ALIGNED(32, float, imdct_win)[256];
105
106
    DECLARE_ALIGNED(32, float, temp)[2048];
107
} ATRAC9Context;
108
109
static const VLCElem *sf_vlc[2][8];       /* Signed/unsigned, length */
110
static const VLCElem *coeff_vlc[2][8][4]; /* Cookbook, precision, cookbook index */
111
112
static inline int parse_gradient(ATRAC9Context *s, ATRAC9BlockData *b,
113
                                 GetBitContext *gb)
114
3.06M
{
115
3.06M
    int grad_range[2];
116
3.06M
    int grad_value[2];
117
3.06M
    int values, sign, base;
118
3.06M
    uint8_t *curve;
119
3.06M
    float scale;
120
121
3.06M
    b->grad_mode = get_bits(gb, 2);
122
3.06M
    if (b->grad_mode) {
123
2.96M
        grad_range[0] = get_bits(gb, 5);
124
2.96M
        grad_range[1] = 31;
125
2.96M
        grad_value[0] = get_bits(gb, 5);
126
2.96M
        grad_value[1] = 31;
127
2.96M
    } else {
128
100k
        grad_range[0] = get_bits(gb, 6);
129
100k
        grad_range[1] = get_bits(gb, 6) + 1;
130
100k
        grad_value[0] = get_bits(gb, 5);
131
100k
        grad_value[1] = get_bits(gb, 5);
132
100k
    }
133
3.06M
    b->grad_boundary = get_bits(gb, 4);
134
135
3.06M
    if (grad_range[0] >= grad_range[1] || grad_range[1] > 31)
136
2.91k
        return AVERROR_INVALIDDATA;
137
138
3.06M
    if (b->grad_boundary > b->q_unit_cnt)
139
4.74k
        return AVERROR_INVALIDDATA;
140
141
3.05M
    values    = grad_value[1] - grad_value[0];
142
3.05M
    sign      = 1 - 2*(values < 0);
143
3.05M
    base      = grad_value[0] + sign;
144
3.05M
    scale     = (FFABS(values) - 1) / 31.0f;
145
3.05M
    curve     = s->alloc_curve[grad_range[1] - grad_range[0] - 1];
146
147
48.6M
    for (int i = 0; i <= b->q_unit_cnt; i++)
148
45.5M
        b->gradient[i] = grad_value[i >= grad_range[0]];
149
150
21.1M
    for (int i = grad_range[0]; i < grad_range[1]; i++)
151
18.0M
        b->gradient[i] = base + sign*((int)(scale*curve[i - grad_range[0]]));
152
153
3.05M
    return 0;
154
3.06M
}
155
156
static inline void calc_precision(ATRAC9Context *s, ATRAC9BlockData *b,
157
                                  ATRAC9ChannelData *c)
158
3.02M
{
159
3.02M
    memset(c->precision_mask, 0, sizeof(c->precision_mask));
160
42.2M
    for (int i = 1; i < b->q_unit_cnt; i++) {
161
39.1M
        const int delta = FFABS(c->scalefactors[i] - c->scalefactors[i - 1]) - 1;
162
39.1M
        if (delta > 0) {
163
20.6M
            const int neg = c->scalefactors[i - 1] > c->scalefactors[i];
164
20.6M
            c->precision_mask[i - neg] += FFMIN(delta, 5);
165
20.6M
        }
166
39.1M
    }
167
168
3.02M
    if (b->grad_mode) {
169
44.4M
        for (int i = 0; i < b->q_unit_cnt; i++) {
170
41.5M
            c->precision_coarse[i] = c->scalefactors[i];
171
41.5M
            c->precision_coarse[i] += c->precision_mask[i] - b->gradient[i];
172
41.5M
            if (c->precision_coarse[i] < 0)
173
1.23M
                continue;
174
40.2M
            switch (b->grad_mode) {
175
39.8M
            case 1:
176
39.8M
                c->precision_coarse[i] >>= 1;
177
39.8M
                break;
178
382k
            case 2:
179
382k
                c->precision_coarse[i] = (3 * c->precision_coarse[i]) >> 3;
180
382k
                break;
181
74.1k
            case 3:
182
74.1k
                c->precision_coarse[i] >>= 2;
183
74.1k
                break;
184
40.2M
            }
185
40.2M
        }
186
2.94M
    } else {
187
779k
        for (int i = 0; i < b->q_unit_cnt; i++)
188
697k
            c->precision_coarse[i] = c->scalefactors[i] - b->gradient[i];
189
82.0k
    }
190
191
192
45.2M
    for (int i = 0; i < b->q_unit_cnt; i++)
193
42.2M
        c->precision_coarse[i] = FFMAX(c->precision_coarse[i], 1);
194
195
15.1M
    for (int i = 0; i < b->grad_boundary; i++)
196
12.0M
        c->precision_coarse[i]++;
197
198
45.2M
    for (int i = 0; i < b->q_unit_cnt; i++) {
199
42.2M
        c->precision_fine[i] = 0;
200
42.2M
        if (c->precision_coarse[i] > 15) {
201
317k
            c->precision_fine[i] = FFMIN(c->precision_coarse[i], 30) - 15;
202
317k
            c->precision_coarse[i] = 15;
203
317k
        }
204
42.2M
    }
205
3.02M
}
206
207
static inline int parse_band_ext(ATRAC9Context *s, ATRAC9BlockData *b,
208
                                 GetBitContext *gb, int stereo)
209
3.05M
{
210
3.05M
    int ext_band = 0;
211
212
3.05M
    if (b->has_band_ext) {
213
2.86M
        if (b->q_unit_cnt < 13 || b->q_unit_cnt > 20)
214
590
            return AVERROR_INVALIDDATA;
215
2.86M
        ext_band = at9_tab_band_ext_group[b->q_unit_cnt - 13][2];
216
2.86M
        if (stereo) {
217
4.36k
            b->channel[1].band_ext = get_bits(gb, 2);
218
4.36k
            b->channel[1].band_ext = ext_band > 2 ? b->channel[1].band_ext : 4;
219
2.86M
        } else {
220
2.86M
            skip_bits1(gb);
221
2.86M
        }
222
2.86M
    }
223
224
3.05M
    b->has_band_ext_data = get_bits1(gb);
225
3.05M
    if (!b->has_band_ext_data)
226
143k
        return 0;
227
228
2.91M
    if (!b->has_band_ext) {
229
68.0k
        skip_bits(gb, 2);
230
68.0k
        skip_bits_long(gb, get_bits(gb, 5));
231
68.0k
        return 0;
232
68.0k
    }
233
234
2.84M
    b->channel[0].band_ext = get_bits(gb, 2);
235
2.84M
    b->channel[0].band_ext = ext_band > 2 ? b->channel[0].band_ext : 4;
236
237
2.84M
    if (!get_bits(gb, 5)) {
238
3.88k
        for (int i = 0; i <= stereo; i++) {
239
2.19k
            ATRAC9ChannelData *c = &b->channel[i];
240
2.19k
            const int count = at9_tab_band_ext_cnt[c->band_ext][ext_band];
241
7.26k
            for (int j = 0; j < count; j++) {
242
5.07k
                int len = at9_tab_band_ext_lengths[c->band_ext][ext_band][j];
243
5.07k
                c->band_ext_data[j] = av_clip_uintp2_c(c->band_ext_data[j], len);
244
5.07k
            }
245
2.19k
        }
246
247
1.69k
        return 0;
248
1.69k
    }
249
250
5.69M
    for (int i = 0; i <= stereo; i++) {
251
2.84M
        ATRAC9ChannelData *c = &b->channel[i];
252
2.84M
        const int count = at9_tab_band_ext_cnt[c->band_ext][ext_band];
253
5.81M
        for (int j = 0; j < count; j++) {
254
2.96M
            int len = at9_tab_band_ext_lengths[c->band_ext][ext_band][j];
255
2.96M
            c->band_ext_data[j] = get_bits(gb, len);
256
2.96M
        }
257
2.84M
    }
258
259
2.84M
    return 0;
260
2.84M
}
261
262
static inline int read_scalefactors(ATRAC9Context *s, ATRAC9BlockData *b,
263
                                    ATRAC9ChannelData *c, GetBitContext *gb,
264
                                    int channel_idx, int first_in_pkt)
265
3.07M
{
266
3.07M
    static const uint8_t mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
267
3.07M
    const int mode = mode_map[channel_idx][get_bits(gb, 2)];
268
269
3.07M
    memset(c->scalefactors, 0, sizeof(c->scalefactors));
270
271
3.07M
    if (first_in_pkt && (mode == 4 || ((mode == 3) && !channel_idx))) {
272
560
        av_log(s->avctx, AV_LOG_ERROR, "Invalid scalefactor coding mode!\n");
273
560
        return AVERROR_INVALIDDATA;
274
560
    }
275
276
3.07M
    switch (mode) {
277
137k
    case 0: { /* VLC delta offset */
278
137k
        const uint8_t *sf_weights = at9_tab_sf_weights[get_bits(gb, 3)];
279
137k
        const int base = get_bits(gb, 5);
280
137k
        const int len = get_bits(gb, 2) + 3;
281
137k
        const VLCElem *tab = sf_vlc[0][len];
282
283
137k
        c->scalefactors[0] = get_bits(gb, len);
284
285
1.47M
        for (int i = 1; i < b->band_ext_q_unit; i++) {
286
1.33M
            int val = c->scalefactors[i - 1] + get_vlc2(gb, tab,
287
1.33M
                                                        ATRAC9_SF_VLC_BITS, 1);
288
1.33M
            c->scalefactors[i] = av_zero_extend(val, len);
289
1.33M
        }
290
291
1.60M
        for (int i = 0; i < b->band_ext_q_unit; i++)
292
1.47M
            c->scalefactors[i] += base - sf_weights[i];
293
294
137k
        break;
295
0
    }
296
2.85M
    case 1: { /* CLC offset */
297
2.85M
        const int len = get_bits(gb, 2) + 2;
298
2.85M
        const int base = len < 5 ? get_bits(gb, 5) : 0;
299
45.8M
        for (int i = 0; i < b->band_ext_q_unit; i++)
300
43.0M
            c->scalefactors[i] = base + get_bits(gb, len);
301
2.85M
        break;
302
0
    }
303
71.9k
    case 2:
304
72.6k
    case 4: { /* VLC dist to baseline */
305
72.6k
        const int *baseline = mode == 4 ? c->scalefactors_prev :
306
72.6k
                              channel_idx ? b->channel[0].scalefactors :
307
71.9k
                              c->scalefactors_prev;
308
72.6k
        const int baseline_len = mode == 4 ? b->q_unit_cnt_prev :
309
72.6k
                                 channel_idx ? b->band_ext_q_unit :
310
71.9k
                                 b->q_unit_cnt_prev;
311
312
72.6k
        const int len = get_bits(gb, 2) + 2;
313
72.6k
        const int unit_cnt = FFMIN(b->band_ext_q_unit, baseline_len);
314
72.6k
        const VLCElem *tab = sf_vlc[1][len];
315
316
926k
        for (int i = 0; i < unit_cnt; i++) {
317
854k
            int dist = get_vlc2(gb, tab, ATRAC9_SF_VLC_BITS, 1);
318
854k
            c->scalefactors[i] = baseline[i] + dist;
319
854k
        }
320
321
342k
        for (int i = unit_cnt; i < b->band_ext_q_unit; i++)
322
269k
            c->scalefactors[i] = get_bits(gb, 5);
323
324
72.6k
        break;
325
71.9k
    }
326
11.4k
    case 3: { /* VLC offset with baseline */
327
11.4k
        const int *baseline = channel_idx ? b->channel[0].scalefactors :
328
11.4k
                              c->scalefactors_prev;
329
11.4k
        const int baseline_len = channel_idx ? b->band_ext_q_unit :
330
11.4k
                                 b->q_unit_cnt_prev;
331
332
11.4k
        const int base = get_bits(gb, 5) - (1 << (5 - 1));
333
11.4k
        const int len = get_bits(gb, 2) + 1;
334
11.4k
        const int unit_cnt = FFMIN(b->band_ext_q_unit, baseline_len);
335
11.4k
        const VLCElem *tab = sf_vlc[0][len];
336
337
11.4k
        c->scalefactors[0] = get_bits(gb, len);
338
339
155k
        for (int i = 1; i < unit_cnt; i++) {
340
144k
            int val = c->scalefactors[i - 1] + get_vlc2(gb, tab,
341
144k
                                                        ATRAC9_SF_VLC_BITS, 1);
342
144k
            c->scalefactors[i] = av_zero_extend(val, len);
343
144k
        }
344
345
165k
        for (int i = 0; i < unit_cnt; i++)
346
154k
            c->scalefactors[i] += base + baseline[i];
347
348
41.1k
        for (int i = unit_cnt; i < b->band_ext_q_unit; i++)
349
29.7k
            c->scalefactors[i] = get_bits(gb, 5);
350
11.4k
        break;
351
71.9k
    }
352
3.07M
    }
353
354
48.5M
    for (int i = 0; i < b->band_ext_q_unit; i++)
355
45.4M
        if (c->scalefactors[i] < 0 || c->scalefactors[i] > 31)
356
50.9k
            return AVERROR_INVALIDDATA;
357
358
3.02M
    memcpy(c->scalefactors_prev, c->scalefactors, sizeof(c->scalefactors));
359
360
3.02M
    return 0;
361
3.07M
}
362
363
static inline void calc_codebook_idx(ATRAC9Context *s, ATRAC9BlockData *b,
364
                                     ATRAC9ChannelData *c)
365
3.02M
{
366
3.02M
    int avg = 0;
367
3.02M
    const int last_sf = c->scalefactors[c->q_unit_cnt];
368
369
3.02M
    memset(c->codebookset, 0, sizeof(c->codebookset));
370
371
3.02M
    if (c->q_unit_cnt <= 1)
372
0
        return;
373
3.02M
    if (s->samplerate_idx > 7)
374
128k
        return;
375
376
2.89M
    c->scalefactors[c->q_unit_cnt] = c->scalefactors[c->q_unit_cnt - 1];
377
378
2.89M
    if (c->q_unit_cnt > 12) {
379
37.4M
        for (int i = 0; i < 12; i++)
380
34.5M
            avg += c->scalefactors[i];
381
2.88M
        avg = (avg + 6) / 12;
382
2.88M
    }
383
384
20.5M
    for (int i = 8; i < c->q_unit_cnt; i++) {
385
17.6M
        const int prev = c->scalefactors[i - 1];
386
17.6M
        const int cur  = c->scalefactors[i    ];
387
17.6M
        const int next = c->scalefactors[i + 1];
388
17.6M
        const int min  = FFMIN(prev, next);
389
17.6M
        if ((cur - min >= 3 || 2*cur - prev - next >= 3))
390
2.99M
            c->codebookset[i] = 1;
391
17.6M
    }
392
393
394
8.97M
    for (int i = 12; i < c->q_unit_cnt; i++) {
395
6.07M
        const int cur = c->scalefactors[i];
396
6.07M
        const int cnd = at9_q_unit_to_coeff_cnt[i] == 16;
397
6.07M
        const int min = FFMIN(c->scalefactors[i + 1], c->scalefactors[i - 1]);
398
6.07M
        if (c->codebookset[i])
399
108k
            continue;
400
401
5.97M
        c->codebookset[i] = (((cur - min) >= 2) && (cur >= (avg - cnd)));
402
5.97M
    }
403
404
2.89M
    c->scalefactors[c->q_unit_cnt] = last_sf;
405
2.89M
}
406
407
static inline void read_coeffs_coarse(ATRAC9Context *s, ATRAC9BlockData *b,
408
                                      ATRAC9ChannelData *c, GetBitContext *gb)
409
3.02M
{
410
3.02M
    const int max_prec = s->samplerate_idx > 7 ? 1 : 7;
411
412
3.02M
    memset(c->q_coeffs_coarse, 0, sizeof(c->q_coeffs_coarse));
413
414
45.1M
    for (int i = 0; i < c->q_unit_cnt; i++) {
415
42.1M
        int *coeffs = &c->q_coeffs_coarse[at9_q_unit_to_coeff_idx[i]];
416
42.1M
        const int bands = at9_q_unit_to_coeff_cnt[i];
417
42.1M
        const int prec = c->precision_coarse[i] + 1;
418
419
42.1M
        if (prec <= max_prec) {
420
37.9M
            const int cb = c->codebookset[i];
421
37.9M
            const int cbi = at9_q_unit_to_codebookidx[i];
422
37.9M
            const VLCElem *tab = coeff_vlc[cb][prec][cbi];
423
37.9M
            const HuffmanCodebook *huff = &at9_huffman_coeffs[cb][prec][cbi];
424
37.9M
            const int groups = bands >> huff->value_cnt_pow;
425
426
149M
            for (int j = 0; j < groups; j++) {
427
111M
                uint16_t val = get_vlc2(gb, tab, ATRAC9_COEFF_VLC_BITS, 2);
428
429
246M
                for (int k = 0; k < huff->value_cnt; k++) {
430
135M
                    coeffs[k] = sign_extend(val, huff->value_bits);
431
135M
                    val >>= huff->value_bits;
432
135M
                }
433
434
111M
                coeffs += huff->value_cnt;
435
111M
            }
436
37.9M
        } else {
437
14.7M
            for (int j = 0; j < bands; j++)
438
10.5M
                coeffs[j] = sign_extend(get_bits(gb, prec), prec);
439
4.24M
        }
440
42.1M
    }
441
3.02M
}
442
443
static inline void read_coeffs_fine(ATRAC9Context *s, ATRAC9BlockData *b,
444
                                    ATRAC9ChannelData *c, GetBitContext *gb)
445
3.02M
{
446
3.02M
    memset(c->q_coeffs_fine, 0, sizeof(c->q_coeffs_fine));
447
448
45.1M
    for (int i = 0; i < c->q_unit_cnt; i++) {
449
42.1M
        const int start = at9_q_unit_to_coeff_idx[i + 0];
450
42.1M
        const int end   = at9_q_unit_to_coeff_idx[i + 1];
451
42.1M
        const int len   = c->precision_fine[i] + 1;
452
453
42.1M
        if (c->precision_fine[i] <= 0)
454
41.8M
            continue;
455
456
1.45M
        for (int j = start; j < end; j++)
457
1.13M
            c->q_coeffs_fine[j] = sign_extend(get_bits(gb, len), len);
458
316k
    }
459
3.02M
}
460
461
static inline void dequantize(ATRAC9Context *s, ATRAC9BlockData *b,
462
                              ATRAC9ChannelData *c)
463
3.02M
{
464
3.02M
    memset(c->coeffs, 0, sizeof(c->coeffs));
465
466
45.2M
    for (int i = 0; i < c->q_unit_cnt; i++) {
467
42.1M
        const int start = at9_q_unit_to_coeff_idx[i + 0];
468
42.1M
        const int end   = at9_q_unit_to_coeff_idx[i + 1];
469
470
42.1M
        const float coarse_c = at9_quant_step_coarse[c->precision_coarse[i]];
471
42.1M
        const float fine_c   = at9_quant_step_fine[c->precision_fine[i]];
472
473
188M
        for (int j = start; j < end; j++) {
474
145M
            const float vc = c->q_coeffs_coarse[j] * coarse_c;
475
145M
            const float vf = c->q_coeffs_fine[j]   * fine_c;
476
145M
            c->coeffs[j] = vc + vf;
477
145M
        }
478
42.1M
    }
479
3.02M
}
480
481
static inline void apply_intensity_stereo(ATRAC9Context *s, ATRAC9BlockData *b,
482
                                          const int stereo)
483
3.00M
{
484
3.00M
    float *src = b->channel[ b->cpe_base_channel].coeffs;
485
3.00M
    float *dst = b->channel[!b->cpe_base_channel].coeffs;
486
487
3.00M
    if (!stereo)
488
2.99M
        return;
489
490
10.7k
    if (b->q_unit_cnt <= b->stereo_q_unit)
491
2.30k
        return;
492
493
43.0k
    for (int i = b->stereo_q_unit; i < b->q_unit_cnt; i++) {
494
34.6k
        const int sign  = b->is_signs[i];
495
34.6k
        const int start = at9_q_unit_to_coeff_idx[i + 0];
496
34.6k
        const int end   = at9_q_unit_to_coeff_idx[i + 1];
497
290k
        for (int j = start; j < end; j++)
498
255k
            dst[j] = sign*src[j];
499
34.6k
    }
500
8.39k
}
501
502
static inline void apply_scalefactors(ATRAC9Context *s, ATRAC9BlockData *b,
503
                                      const int stereo)
504
3.01M
{
505
6.03M
    for (int i = 0; i <= stereo; i++) {
506
3.02M
        float *coeffs = b->channel[i].coeffs;
507
45.1M
        for (int j = 0; j < b->q_unit_cnt; j++) {
508
42.1M
            const int start = at9_q_unit_to_coeff_idx[j + 0];
509
42.1M
            const int end   = at9_q_unit_to_coeff_idx[j + 1];
510
42.1M
            const int scalefactor = b->channel[i].scalefactors[j];
511
42.1M
            const float scale = at9_scalefactor_c[scalefactor];
512
188M
            for (int k = start; k < end; k++)
513
146M
                coeffs[k] *= scale;
514
42.1M
        }
515
3.02M
    }
516
3.01M
}
517
518
static inline void fill_with_noise(ATRAC9Context *s, ATRAC9ChannelData *c,
519
                                   int start, int count)
520
56.2k
{
521
56.2k
    float maxval = 0.0f;
522
677k
    for (int i = 0; i < count; i += 2) {
523
621k
        double tmp[2];
524
621k
        av_bmg_get(&s->lfg, tmp);
525
621k
        c->coeffs[start + i + 0] = tmp[0];
526
621k
        c->coeffs[start + i + 1] = tmp[1];
527
621k
        maxval = FFMAX(FFMAX(FFABS(tmp[0]), FFABS(tmp[1])), maxval);
528
621k
    }
529
    /* Normalize */
530
1.29M
    for (int i = 0; i < count; i++)
531
1.24M
        c->coeffs[start + i] /= maxval;
532
56.2k
}
533
534
static inline void scale_band_ext_coeffs(ATRAC9ChannelData *c, float sf[6],
535
                                         const int s_unit, const int e_unit)
536
56.2k
{
537
357k
    for (int i = s_unit; i < e_unit; i++) {
538
301k
        const int start = at9_q_unit_to_coeff_idx[i + 0];
539
301k
        const int end   = at9_q_unit_to_coeff_idx[i + 1];
540
4.45M
        for (int j = start; j < end; j++)
541
4.15M
            c->coeffs[j] *= sf[i - s_unit];
542
301k
    }
543
56.2k
}
544
545
static inline void apply_band_extension(ATRAC9Context *s, ATRAC9BlockData *b,
546
                                       const int stereo)
547
2.84M
{
548
2.84M
    const int g_units[4] = { /* A, B, C, total units */
549
2.84M
        b->q_unit_cnt,
550
2.84M
        at9_tab_band_ext_group[b->q_unit_cnt - 13][0],
551
2.84M
        at9_tab_band_ext_group[b->q_unit_cnt - 13][1],
552
2.84M
        FFMAX(g_units[2], 22),
553
2.84M
    };
554
555
2.84M
    const int g_bins[4] = { /* A, B, C, total bins */
556
2.84M
        at9_q_unit_to_coeff_idx[g_units[0]],
557
2.84M
        at9_q_unit_to_coeff_idx[g_units[1]],
558
2.84M
        at9_q_unit_to_coeff_idx[g_units[2]],
559
2.84M
        at9_q_unit_to_coeff_idx[g_units[3]],
560
2.84M
    };
561
562
5.69M
    for (int ch = 0; ch <= stereo; ch++) {
563
2.84M
        ATRAC9ChannelData *c = &b->channel[ch];
564
565
        /* Mirror the spectrum */
566
11.3M
        for (int i = 0; i < 3; i++)
567
236M
            for (int j = 0; j < (g_bins[i + 1] - g_bins[i + 0]); j++)
568
227M
                c->coeffs[g_bins[i] + j] = c->coeffs[g_bins[i] - j - 1];
569
570
2.84M
        switch (c->band_ext) {
571
49.6k
        case 0: {
572
49.6k
            float sf[6] = { 0.0f };
573
49.6k
            const int l = g_units[3] - g_units[0] - 1;
574
49.6k
            const int n_start = at9_q_unit_to_coeff_idx[g_units[3] - 1];
575
49.6k
            const int n_cnt   = at9_q_unit_to_coeff_cnt[g_units[3] - 1];
576
49.6k
            switch (at9_tab_band_ext_group[b->q_unit_cnt - 13][2]) {
577
2.31k
            case 3:
578
2.31k
                sf[0] = at9_band_ext_scales_m0[0][0][c->band_ext_data[0]];
579
2.31k
                sf[1] = at9_band_ext_scales_m0[0][1][c->band_ext_data[0]];
580
2.31k
                sf[2] = at9_band_ext_scales_m0[0][2][c->band_ext_data[1]];
581
2.31k
                sf[3] = at9_band_ext_scales_m0[0][3][c->band_ext_data[2]];
582
2.31k
                sf[4] = at9_band_ext_scales_m0[0][4][c->band_ext_data[3]];
583
2.31k
                break;
584
33.1k
            case 4:
585
33.1k
                sf[0] = at9_band_ext_scales_m0[1][0][c->band_ext_data[0]];
586
33.1k
                sf[1] = at9_band_ext_scales_m0[1][1][c->band_ext_data[0]];
587
33.1k
                sf[2] = at9_band_ext_scales_m0[1][2][c->band_ext_data[1]];
588
33.1k
                sf[3] = at9_band_ext_scales_m0[1][3][c->band_ext_data[2]];
589
33.1k
                sf[4] = at9_band_ext_scales_m0[1][4][c->band_ext_data[3]];
590
33.1k
                break;
591
14.2k
            case 5:
592
14.2k
                sf[0] = at9_band_ext_scales_m0[2][0][c->band_ext_data[0]];
593
14.2k
                sf[1] = at9_band_ext_scales_m0[2][1][c->band_ext_data[1]];
594
14.2k
                sf[2] = at9_band_ext_scales_m0[2][2][c->band_ext_data[1]];
595
14.2k
                break;
596
49.6k
            }
597
598
49.6k
            sf[l] = at9_scalefactor_c[c->scalefactors[g_units[0]]];
599
600
49.6k
            fill_with_noise(s, c, n_start, n_cnt);
601
49.6k
            scale_band_ext_coeffs(c, sf, g_units[0], g_units[3]);
602
49.6k
            break;
603
49.6k
        }
604
6.58k
        case 1: {
605
6.58k
            float sf[6];
606
38.2k
            for (int i = g_units[0]; i < g_units[3]; i++)
607
31.6k
                sf[i - g_units[0]] = at9_scalefactor_c[c->scalefactors[i]];
608
609
6.58k
            fill_with_noise(s, c, g_bins[0], g_bins[3] - g_bins[0]);
610
6.58k
            scale_band_ext_coeffs(c, sf, g_units[0], g_units[3]);
611
6.58k
            break;
612
49.6k
        }
613
3.17k
        case 2: {
614
3.17k
            const float g_sf[2] = {
615
3.17k
                at9_band_ext_scales_m2[c->band_ext_data[0]],
616
3.17k
                at9_band_ext_scales_m2[c->band_ext_data[1]],
617
3.17k
            };
618
619
9.51k
            for (int i = 0; i < 2; i++)
620
247k
                for (int j = g_bins[i + 0]; j < g_bins[i + 1]; j++)
621
240k
                    c->coeffs[j] *= g_sf[i];
622
3.17k
            break;
623
49.6k
        }
624
925
        case 3: {
625
925
            float scale = at9_band_ext_scales_m3[c->band_ext_data[0]][0];
626
925
            float rate  = at9_band_ext_scales_m3[c->band_ext_data[1]][1];
627
925
            rate = pow(2, rate);
628
73.5k
            for (int i = g_bins[0]; i < g_bins[3]; i++) {
629
72.6k
                scale *= rate;
630
72.6k
                c->coeffs[i] *= scale;
631
72.6k
            }
632
925
            break;
633
49.6k
        }
634
2.78M
        case 4: {
635
2.78M
            const float m = at9_band_ext_scales_m4[c->band_ext_data[0]];
636
2.78M
            const float g_sf[3] = { 0.7079468f*m, 0.5011902f*m, 0.3548279f*m };
637
638
11.1M
            for (int i = 0; i < 3; i++)
639
231M
                for (int j = g_bins[i + 0]; j < g_bins[i + 1]; j++)
640
223M
                    c->coeffs[j] *= g_sf[i];
641
2.78M
            break;
642
49.6k
        }
643
2.84M
        }
644
2.84M
    }
645
2.84M
}
646
647
static int atrac9_decode_block(ATRAC9Context *s, GetBitContext *gb,
648
                               ATRAC9BlockData *b, AVFrame *frame,
649
                               int frame_idx, int block_idx)
650
3.10M
{
651
3.10M
    const int first_in_pkt = !get_bits1(gb);
652
3.10M
    const int reuse_params =  get_bits1(gb);
653
3.10M
    const int stereo = s->block_config->type[block_idx] == ATRAC9_BLOCK_TYPE_CPE;
654
655
3.10M
    if (s->block_config->type[block_idx] == ATRAC9_BLOCK_TYPE_LFE) {
656
2.72k
        ATRAC9ChannelData *c = &b->channel[0];
657
2.72k
        const int precision = reuse_params ? 8 : 4;
658
2.72k
        c->q_unit_cnt = b->q_unit_cnt = 2;
659
660
2.72k
        memset(c->scalefactors, 0, sizeof(c->scalefactors));
661
2.72k
        memset(c->q_coeffs_fine, 0, sizeof(c->q_coeffs_fine));
662
2.72k
        memset(c->q_coeffs_coarse, 0, sizeof(c->q_coeffs_coarse));
663
664
8.16k
        for (int i = 0; i < b->q_unit_cnt; i++) {
665
5.44k
            c->scalefactors[i] = get_bits(gb, 5);
666
5.44k
            c->precision_coarse[i] = precision;
667
5.44k
            c->precision_fine[i] = 0;
668
5.44k
        }
669
670
8.16k
        for (int i = 0; i < c->q_unit_cnt; i++) {
671
5.44k
            const int start = at9_q_unit_to_coeff_idx[i + 0];
672
5.44k
            const int end   = at9_q_unit_to_coeff_idx[i + 1];
673
16.3k
            for (int j = start; j < end; j++)
674
10.8k
                c->q_coeffs_coarse[j] = get_bits(gb, c->precision_coarse[i] + 1);
675
5.44k
        }
676
677
2.72k
        dequantize        (s, b, c);
678
2.72k
        apply_scalefactors(s, b, 0);
679
680
2.72k
        goto imdct;
681
2.72k
    }
682
683
3.10M
    if (first_in_pkt && reuse_params) {
684
6.54k
        av_log(s->avctx, AV_LOG_ERROR, "Invalid block flags!\n");
685
6.54k
        return AVERROR_INVALIDDATA;
686
6.54k
    }
687
688
    /* Band parameters */
689
3.09M
    if (!reuse_params) {
690
2.98M
        int stereo_band, ext_band;
691
2.98M
        const int min_band_count = s->samplerate_idx > 7 ? 1 : 3;
692
2.98M
        b->reusable = 0;
693
2.98M
        b->band_count = get_bits(gb, 4) + min_band_count;
694
2.98M
        b->q_unit_cnt = at9_tab_band_q_unit_map[b->band_count];
695
696
2.98M
        b->band_ext_q_unit = b->stereo_q_unit = b->q_unit_cnt;
697
698
2.98M
        if (b->band_count > at9_tab_sri_max_bands[s->samplerate_idx]) {
699
3.85k
            av_log(s->avctx, AV_LOG_ERROR, "Invalid band count %i!\n",
700
3.85k
                   b->band_count);
701
3.85k
            return AVERROR_INVALIDDATA;
702
3.85k
        }
703
704
2.97M
        if (stereo) {
705
28.5k
            stereo_band = get_bits(gb, 4) + min_band_count;
706
28.5k
            if (stereo_band > b->band_count) {
707
6.26k
                av_log(s->avctx, AV_LOG_ERROR, "Invalid stereo band %i!\n",
708
6.26k
                       stereo_band);
709
6.26k
                return AVERROR_INVALIDDATA;
710
6.26k
            }
711
22.2k
            b->stereo_q_unit = at9_tab_band_q_unit_map[stereo_band];
712
22.2k
        }
713
714
2.97M
        b->has_band_ext = get_bits1(gb);
715
2.97M
        if (b->has_band_ext) {
716
2.80M
            ext_band = get_bits(gb, 4) + min_band_count;
717
2.80M
            if (ext_band < b->band_count) {
718
303
                av_log(s->avctx, AV_LOG_ERROR, "Invalid extension band %i!\n",
719
303
                       ext_band);
720
303
                return AVERROR_INVALIDDATA;
721
303
            }
722
2.80M
            b->band_ext_q_unit = at9_tab_band_q_unit_map[ext_band];
723
2.80M
        }
724
2.96M
        b->reusable = 1;
725
2.96M
    }
726
3.08M
    if (!b->reusable) {
727
20.9k
        av_log(s->avctx, AV_LOG_ERROR, "invalid block reused!\n");
728
20.9k
        return AVERROR_INVALIDDATA;
729
20.9k
    }
730
731
    /* Calculate bit alloc gradient */
732
3.06M
    if (parse_gradient(s, b, gb))
733
7.66k
        return AVERROR_INVALIDDATA;
734
735
    /* IS data */
736
3.05M
    b->cpe_base_channel = 0;
737
3.05M
    if (stereo) {
738
48.5k
        b->cpe_base_channel = get_bits1(gb);
739
48.5k
        if (get_bits1(gb)) {
740
25.0k
            for (int i = b->stereo_q_unit; i < b->q_unit_cnt; i++)
741
19.8k
                b->is_signs[i] = 1 - 2*get_bits1(gb);
742
43.3k
        } else {
743
1.34M
            for (int i = 0; i < FF_ARRAY_ELEMS(b->is_signs); i++)
744
1.30M
                b->is_signs[i] = 1;
745
43.3k
        }
746
48.5k
    }
747
748
    /* Band extension */
749
3.05M
    if (parse_band_ext(s, b, gb, stereo))
750
590
        return AVERROR_INVALIDDATA;
751
752
    /* Scalefactors */
753
6.08M
    for (int i = 0; i <= stereo; i++) {
754
3.07M
        ATRAC9ChannelData *c = &b->channel[i];
755
3.07M
        c->q_unit_cnt = i == b->cpe_base_channel ? b->q_unit_cnt :
756
3.07M
                                                   b->stereo_q_unit;
757
3.07M
        if (read_scalefactors(s, b, c, gb, i, first_in_pkt))
758
51.4k
            return AVERROR_INVALIDDATA;
759
760
3.02M
        calc_precision    (s, b, c);
761
3.02M
        calc_codebook_idx (s, b, c);
762
3.02M
        read_coeffs_coarse(s, b, c, gb);
763
3.02M
        read_coeffs_fine  (s, b, c, gb);
764
3.02M
        dequantize        (s, b, c);
765
3.02M
    }
766
767
3.00M
    b->q_unit_cnt_prev = b->has_band_ext ? b->band_ext_q_unit : b->q_unit_cnt;
768
769
3.00M
    apply_intensity_stereo(s, b, stereo);
770
3.00M
    apply_scalefactors    (s, b, stereo);
771
772
3.00M
    if (b->has_band_ext && b->has_band_ext_data)
773
2.84M
        apply_band_extension  (s, b, stereo);
774
775
3.01M
imdct:
776
6.03M
    for (int i = 0; i <= stereo; i++) {
777
3.02M
        ATRAC9ChannelData *c = &b->channel[i];
778
3.02M
        const int dst_idx = s->block_config->plane_map[block_idx][i];
779
3.02M
        const int wsize = 1 << s->frame_log2;
780
3.02M
        const ptrdiff_t offset = wsize*frame_idx*sizeof(float);
781
3.02M
        float *dst = (float *)(frame->extended_data[dst_idx] + offset);
782
783
3.02M
        s->tx_fn(s->tx, s->temp, c->coeffs, sizeof(float));
784
3.02M
        s->fdsp->vector_fmul_window(dst, c->prev_win, s->temp,
785
3.02M
                                    s->imdct_win, wsize >> 1);
786
3.02M
        memcpy(c->prev_win, s->temp + (wsize >> 1), sizeof(float)*wsize >> 1);
787
3.02M
    }
788
789
3.01M
    return 0;
790
3.00M
}
791
792
static int atrac9_decode_frame(AVCodecContext *avctx, AVFrame *frame,
793
                               int *got_frame_ptr, AVPacket *avpkt)
794
949k
{
795
949k
    int ret;
796
949k
    GetBitContext gb;
797
949k
    ATRAC9Context *s = avctx->priv_data;
798
949k
    const int frames = FFMIN(avpkt->size / s->avg_frame_size, s->frame_count);
799
800
949k
    frame->nb_samples = (1 << s->frame_log2) * frames;
801
949k
    ret = ff_get_buffer(avctx, frame, 0);
802
949k
    if (ret < 0)
803
6.77k
        return ret;
804
805
942k
    ret = init_get_bits8(&gb, avpkt->data, avpkt->size);
806
942k
    if (ret < 0)
807
0
        return ret;
808
809
3.93M
    for (int i = 0; i < frames; i++) {
810
6.09M
        for (int j = 0; j < s->block_config->count; j++) {
811
3.10M
            ret = atrac9_decode_block(s, &gb, &s->block[j], frame, i, j);
812
3.10M
            if (ret)
813
97.6k
                return ret;
814
3.01M
            align_get_bits(&gb);
815
3.01M
        }
816
3.08M
    }
817
818
845k
    *got_frame_ptr = 1;
819
820
845k
    return frames < s->frame_count ? (get_bits_count(&gb) >> 3) : avctx->block_align;
821
942k
}
822
823
static av_cold void atrac9_decode_flush(AVCodecContext *avctx)
824
90.5k
{
825
90.5k
    ATRAC9Context *s = avctx->priv_data;
826
827
191k
    for (int j = 0; j < s->block_config->count; j++) {
828
100k
        ATRAC9BlockData *b = &s->block[j];
829
100k
        const int stereo = s->block_config->type[j] == ATRAC9_BLOCK_TYPE_CPE;
830
215k
        for (int i = 0; i <= stereo; i++) {
831
114k
            ATRAC9ChannelData *c = &b->channel[i];
832
114k
            memset(c->prev_win, 0, sizeof(c->prev_win));
833
114k
        }
834
100k
    }
835
90.5k
}
836
837
static av_cold int atrac9_decode_close(AVCodecContext *avctx)
838
1.32k
{
839
1.32k
    ATRAC9Context *s = avctx->priv_data;
840
841
1.32k
    av_tx_uninit(&s->tx);
842
1.32k
    av_freep(&s->fdsp);
843
844
1.32k
    return 0;
845
1.32k
}
846
847
static av_cold const VLCElem *atrac9_init_vlc(VLCInitState *state,
848
                                              int nb_bits, int nb_codes,
849
                                              const uint8_t (**tab)[2], int offset)
850
52
{
851
52
    const uint8_t (*table)[2] = *tab;
852
853
52
    *tab        += nb_codes;
854
52
    return ff_vlc_init_tables_from_lengths(state, nb_bits, nb_codes,
855
52
                                           &table[0][1], 2, &table[0][0], 2, 1,
856
52
                                           offset, 0);
857
52
}
858
859
static av_cold void atrac9_init_static(void)
860
1
{
861
1
    static VLCElem vlc_buf[24812];
862
1
    VLCInitState state = VLC_INIT_STATE(vlc_buf);
863
1
    const uint8_t (*tab)[2];
864
865
    /* Unsigned scalefactor VLCs */
866
1
    tab = at9_sfb_a_tab;
867
7
    for (int i = 1; i < 7; i++) {
868
6
        const HuffmanCodebook *hf = &at9_huffman_sf_unsigned[i];
869
870
6
        sf_vlc[0][i] = atrac9_init_vlc(&state, ATRAC9_SF_VLC_BITS,
871
6
                                       hf->size, &tab, 0);
872
6
    }
873
874
    /* Signed scalefactor VLCs */
875
1
    tab = at9_sfb_b_tab;
876
5
    for (int i = 2; i < 6; i++) {
877
4
        const HuffmanCodebook *hf = &at9_huffman_sf_signed[i];
878
879
        /* The symbols are signed integers in the range -16..15;
880
         * the values in the source table are offset by 16 to make
881
         * them fit into an uint8_t; the -16 reverses this shift. */
882
4
        sf_vlc[1][i] = atrac9_init_vlc(&state, ATRAC9_SF_VLC_BITS,
883
4
                                       hf->size, &tab, -16);
884
4
    }
885
886
    /* Coefficient VLCs */
887
1
    tab = at9_coeffs_tab;
888
3
    for (int i = 0; i < 2; i++) {
889
14
        for (int j = 2; j < 8; j++) {
890
54
            for (int k = i; k < 4; k++) {
891
42
                const HuffmanCodebook *hf = &at9_huffman_coeffs[i][j][k];
892
42
                coeff_vlc[i][j][k] = atrac9_init_vlc(&state, ATRAC9_COEFF_VLC_BITS,
893
42
                                                     hf->size, &tab, 0);
894
42
            }
895
12
        }
896
2
    }
897
1
}
898
899
static av_cold int atrac9_decode_init(AVCodecContext *avctx)
900
1.32k
{
901
1.32k
    float scale;
902
1.32k
    static AVOnce static_table_init = AV_ONCE_INIT;
903
1.32k
    GetBitContext gb;
904
1.32k
    ATRAC9Context *s = avctx->priv_data;
905
1.32k
    int err, version, block_config_idx, superframe_idx, alloc_c_len;
906
907
1.32k
    s->avctx = avctx;
908
909
1.32k
    av_lfg_init(&s->lfg, 0xFBADF00D);
910
911
1.32k
    if (avctx->block_align <= 0) {
912
39
        av_log(avctx, AV_LOG_ERROR, "Invalid block align\n");
913
39
        return AVERROR_INVALIDDATA;
914
39
    }
915
916
1.28k
    if (avctx->extradata_size != 12) {
917
163
        av_log(avctx, AV_LOG_ERROR, "Invalid extradata length!\n");
918
163
        return AVERROR_INVALIDDATA;
919
163
    }
920
921
1.11k
    version = AV_RL32(avctx->extradata);
922
1.11k
    if (version > 2) {
923
1
        av_log(avctx, AV_LOG_ERROR, "Unsupported version (%i)!\n", version);
924
1
        return AVERROR_INVALIDDATA;
925
1
    }
926
927
1.11k
    err = init_get_bits8(&gb, avctx->extradata + 4, avctx->extradata_size);
928
1.11k
    if (err < 0)
929
0
        return err;
930
931
1.11k
    if (get_bits(&gb, 8) != 0xFE) {
932
5
        av_log(avctx, AV_LOG_ERROR, "Incorrect magic byte!\n");
933
5
        return AVERROR_INVALIDDATA;
934
5
    }
935
936
1.11k
    s->samplerate_idx = get_bits(&gb, 4);
937
1.11k
    avctx->sample_rate = at9_tab_samplerates[s->samplerate_idx];
938
939
1.11k
    block_config_idx = get_bits(&gb, 3);
940
1.11k
    if (block_config_idx > 5) {
941
1
        av_log(avctx, AV_LOG_ERROR, "Incorrect block config!\n");
942
1
        return AVERROR_INVALIDDATA;
943
1
    }
944
1.11k
    s->block_config = &at9_block_layout[block_config_idx];
945
946
1.11k
    av_channel_layout_uninit(&avctx->ch_layout);
947
1.11k
    avctx->ch_layout      = s->block_config->channel_layout;
948
1.11k
    avctx->sample_fmt     = AV_SAMPLE_FMT_FLTP;
949
950
1.11k
    if (get_bits1(&gb)) {
951
1
        av_log(avctx, AV_LOG_ERROR, "Incorrect verification bit!\n");
952
1
        return AVERROR_INVALIDDATA;
953
1
    }
954
955
    /* Average frame size in bytes */
956
1.11k
    s->avg_frame_size = get_bits(&gb, 11) + 1;
957
958
1.11k
    superframe_idx = get_bits(&gb, 2);
959
1.11k
    if (superframe_idx & 1) {
960
1
        av_log(avctx, AV_LOG_ERROR, "Invalid superframe index!\n");
961
1
        return AVERROR_INVALIDDATA;
962
1
    }
963
964
1.11k
    s->frame_count = 1 << superframe_idx;
965
1.11k
    s->frame_log2  = at9_tab_sri_frame_log2[s->samplerate_idx];
966
967
1.11k
    scale = 1.0f / 32768.0;
968
1.11k
    err = av_tx_init(&s->tx, &s->tx_fn, AV_TX_FLOAT_MDCT, 1,
969
1.11k
                     1 << s->frame_log2, &scale, 0);
970
1.11k
    if (err < 0)
971
0
        return err;
972
973
1.11k
    s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
974
1.11k
    if (!s->fdsp)
975
0
        return AVERROR(ENOMEM);
976
977
    /* iMDCT window */
978
163k
    for (int i = 0; i < (1 << s->frame_log2); i++) {
979
162k
        const int   len  = 1 << s->frame_log2;
980
162k
        const float sidx = (      i + 0.5f) / len;
981
162k
        const float eidx = (len - i - 0.5f) / len;
982
162k
        const float s_c  = sinf(sidx*M_PI - M_PI_2)*0.5f + 0.5f;
983
162k
        const float e_c  = sinf(eidx*M_PI - M_PI_2)*0.5f + 0.5f;
984
162k
        s->imdct_win[i]  = s_c / ((s_c * s_c) + (e_c * e_c));
985
162k
    }
986
987
    /* Allocation curve */
988
1.11k
    alloc_c_len = FF_ARRAY_ELEMS(at9_tab_b_dist);
989
54.3k
    for (int i = 1; i <= alloc_c_len; i++)
990
1.35M
        for (int j = 0; j < i; j++)
991
1.30M
            s->alloc_curve[i - 1][j] = at9_tab_b_dist[(j * alloc_c_len) / i];
992
993
1.11k
    ff_thread_once(&static_table_init, atrac9_init_static);
994
995
1.11k
    return 0;
996
1.11k
}
997
998
const FFCodec ff_atrac9_decoder = {
999
    .p.name         = "atrac9",
1000
    CODEC_LONG_NAME("ATRAC9 (Adaptive TRansform Acoustic Coding 9)"),
1001
    .p.type         = AVMEDIA_TYPE_AUDIO,
1002
    .p.id           = AV_CODEC_ID_ATRAC9,
1003
    .priv_data_size = sizeof(ATRAC9Context),
1004
    .init           = atrac9_decode_init,
1005
    .close          = atrac9_decode_close,
1006
    FF_CODEC_DECODE_CB(atrac9_decode_frame),
1007
    .flush          = atrac9_decode_flush,
1008
    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
1009
    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
1010
};