Coverage Report

Created: 2026-09-14 08:00

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.29M
#define ATRAC9_SF_VLC_BITS 8
36
89.7M
#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
2.49M
{
115
2.49M
    int grad_range[2];
116
2.49M
    int grad_value[2];
117
2.49M
    int values, sign, base;
118
2.49M
    uint8_t *curve;
119
2.49M
    float scale;
120
121
2.49M
    b->grad_mode = get_bits(gb, 2);
122
2.49M
    if (b->grad_mode) {
123
2.40M
        grad_range[0] = get_bits(gb, 5);
124
2.40M
        grad_range[1] = 31;
125
2.40M
        grad_value[0] = get_bits(gb, 5);
126
2.40M
        grad_value[1] = 31;
127
2.40M
    } else {
128
95.5k
        grad_range[0] = get_bits(gb, 6);
129
95.5k
        grad_range[1] = get_bits(gb, 6) + 1;
130
95.5k
        grad_value[0] = get_bits(gb, 5);
131
95.5k
        grad_value[1] = get_bits(gb, 5);
132
95.5k
    }
133
2.49M
    b->grad_boundary = get_bits(gb, 4);
134
135
2.49M
    if (grad_range[0] >= grad_range[1] || grad_range[1] > 31)
136
2.64k
        return AVERROR_INVALIDDATA;
137
138
2.49M
    if (b->grad_boundary > b->q_unit_cnt)
139
3.39k
        return AVERROR_INVALIDDATA;
140
141
2.49M
    values    = grad_value[1] - grad_value[0];
142
2.49M
    sign      = 1 - 2*(values < 0);
143
2.49M
    base      = grad_value[0] + sign;
144
2.49M
    scale     = (FFABS(values) - 1) / 31.0f;
145
2.49M
    curve     = s->alloc_curve[grad_range[1] - grad_range[0] - 1];
146
147
39.5M
    for (int i = 0; i <= b->q_unit_cnt; i++)
148
37.0M
        b->gradient[i] = grad_value[i >= grad_range[0]];
149
150
17.6M
    for (int i = grad_range[0]; i < grad_range[1]; i++)
151
15.1M
        b->gradient[i] = base + sign*((int)(scale*curve[i - grad_range[0]]));
152
153
2.49M
    return 0;
154
2.49M
}
155
156
static inline void calc_precision(ATRAC9Context *s, ATRAC9BlockData *b,
157
                                  ATRAC9ChannelData *c)
158
2.46M
{
159
2.46M
    memset(c->precision_mask, 0, sizeof(c->precision_mask));
160
34.3M
    for (int i = 1; i < b->q_unit_cnt; i++) {
161
31.8M
        const int delta = FFABS(c->scalefactors[i] - c->scalefactors[i - 1]) - 1;
162
31.8M
        if (delta > 0) {
163
16.7M
            const int neg = c->scalefactors[i - 1] > c->scalefactors[i];
164
16.7M
            c->precision_mask[i - neg] += FFMIN(delta, 5);
165
16.7M
        }
166
31.8M
    }
167
168
2.46M
    if (b->grad_mode) {
169
36.0M
        for (int i = 0; i < b->q_unit_cnt; i++) {
170
33.6M
            c->precision_coarse[i] = c->scalefactors[i];
171
33.6M
            c->precision_coarse[i] += c->precision_mask[i] - b->gradient[i];
172
33.6M
            if (c->precision_coarse[i] < 0)
173
1.16M
                continue;
174
32.5M
            switch (b->grad_mode) {
175
32.0M
            case 1:
176
32.0M
                c->precision_coarse[i] >>= 1;
177
32.0M
                break;
178
402k
            case 2:
179
402k
                c->precision_coarse[i] = (3 * c->precision_coarse[i]) >> 3;
180
402k
                break;
181
78.0k
            case 3:
182
78.0k
                c->precision_coarse[i] >>= 2;
183
78.0k
                break;
184
32.5M
            }
185
32.5M
        }
186
2.38M
    } else {
187
737k
        for (int i = 0; i < b->q_unit_cnt; i++)
188
659k
            c->precision_coarse[i] = c->scalefactors[i] - b->gradient[i];
189
77.9k
    }
190
191
192
36.8M
    for (int i = 0; i < b->q_unit_cnt; i++)
193
34.3M
        c->precision_coarse[i] = FFMAX(c->precision_coarse[i], 1);
194
195
12.3M
    for (int i = 0; i < b->grad_boundary; i++)
196
9.84M
        c->precision_coarse[i]++;
197
198
36.8M
    for (int i = 0; i < b->q_unit_cnt; i++) {
199
34.3M
        c->precision_fine[i] = 0;
200
34.3M
        if (c->precision_coarse[i] > 15) {
201
303k
            c->precision_fine[i] = FFMIN(c->precision_coarse[i], 30) - 15;
202
303k
            c->precision_coarse[i] = 15;
203
303k
        }
204
34.3M
    }
205
2.46M
}
206
207
static inline int parse_band_ext(ATRAC9Context *s, ATRAC9BlockData *b,
208
                                 GetBitContext *gb, int stereo)
209
2.49M
{
210
2.49M
    int ext_band = 0;
211
212
2.49M
    if (b->has_band_ext) {
213
2.30M
        if (b->q_unit_cnt < 13 || b->q_unit_cnt > 20)
214
601
            return AVERROR_INVALIDDATA;
215
2.30M
        ext_band = at9_tab_band_ext_group[b->q_unit_cnt - 13][2];
216
2.30M
        if (stereo) {
217
4.52k
            b->channel[1].band_ext = get_bits(gb, 2);
218
4.52k
            b->channel[1].band_ext = ext_band > 2 ? b->channel[1].band_ext : 4;
219
2.30M
        } else {
220
2.30M
            skip_bits1(gb);
221
2.30M
        }
222
2.30M
    }
223
224
2.49M
    b->has_band_ext_data = get_bits1(gb);
225
2.49M
    if (!b->has_band_ext_data)
226
135k
        return 0;
227
228
2.35M
    if (!b->has_band_ext) {
229
65.8k
        skip_bits(gb, 2);
230
65.8k
        skip_bits_long(gb, get_bits(gb, 5));
231
65.8k
        return 0;
232
65.8k
    }
233
234
2.29M
    b->channel[0].band_ext = get_bits(gb, 2);
235
2.29M
    b->channel[0].band_ext = ext_band > 2 ? b->channel[0].band_ext : 4;
236
237
2.29M
    if (!get_bits(gb, 5)) {
238
3.65k
        for (int i = 0; i <= stereo; i++) {
239
2.08k
            ATRAC9ChannelData *c = &b->channel[i];
240
2.08k
            const int count = at9_tab_band_ext_cnt[c->band_ext][ext_band];
241
6.64k
            for (int j = 0; j < count; j++) {
242
4.56k
                int len = at9_tab_band_ext_lengths[c->band_ext][ext_band][j];
243
4.56k
                c->band_ext_data[j] = av_clip_uintp2_c(c->band_ext_data[j], len);
244
4.56k
            }
245
2.08k
        }
246
247
1.56k
        return 0;
248
1.56k
    }
249
250
4.57M
    for (int i = 0; i <= stereo; i++) {
251
2.29M
        ATRAC9ChannelData *c = &b->channel[i];
252
2.29M
        const int count = at9_tab_band_ext_cnt[c->band_ext][ext_band];
253
4.68M
        for (int j = 0; j < count; j++) {
254
2.39M
            int len = at9_tab_band_ext_lengths[c->band_ext][ext_band][j];
255
2.39M
            c->band_ext_data[j] = get_bits(gb, len);
256
2.39M
        }
257
2.29M
    }
258
259
2.28M
    return 0;
260
2.29M
}
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
2.51M
{
266
2.51M
    static const uint8_t mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
267
2.51M
    const int mode = mode_map[channel_idx][get_bits(gb, 2)];
268
269
2.51M
    memset(c->scalefactors, 0, sizeof(c->scalefactors));
270
271
2.51M
    if (first_in_pkt && (mode == 4 || ((mode == 3) && !channel_idx))) {
272
593
        av_log(s->avctx, AV_LOG_ERROR, "Invalid scalefactor coding mode!\n");
273
593
        return AVERROR_INVALIDDATA;
274
593
    }
275
276
2.50M
    switch (mode) {
277
131k
    case 0: { /* VLC delta offset */
278
131k
        const uint8_t *sf_weights = at9_tab_sf_weights[get_bits(gb, 3)];
279
131k
        const int base = get_bits(gb, 5);
280
131k
        const int len = get_bits(gb, 2) + 3;
281
131k
        const VLCElem *tab = sf_vlc[0][len];
282
283
131k
        c->scalefactors[0] = get_bits(gb, len);
284
285
1.45M
        for (int i = 1; i < b->band_ext_q_unit; i++) {
286
1.32M
            int val = c->scalefactors[i - 1] + get_vlc2(gb, tab,
287
1.32M
                                                        ATRAC9_SF_VLC_BITS, 1);
288
1.32M
            c->scalefactors[i] = av_zero_extend(val, len);
289
1.32M
        }
290
291
1.58M
        for (int i = 0; i < b->band_ext_q_unit; i++)
292
1.45M
            c->scalefactors[i] += base - sf_weights[i];
293
294
131k
        break;
295
0
    }
296
2.29M
    case 1: { /* CLC offset */
297
2.29M
        const int len = get_bits(gb, 2) + 2;
298
2.29M
        const int base = len < 5 ? get_bits(gb, 5) : 0;
299
36.9M
        for (int i = 0; i < b->band_ext_q_unit; i++)
300
34.6M
            c->scalefactors[i] = base + get_bits(gb, len);
301
2.29M
        break;
302
0
    }
303
69.2k
    case 2:
304
69.9k
    case 4: { /* VLC dist to baseline */
305
69.9k
        const int *baseline = mode == 4 ? c->scalefactors_prev :
306
69.9k
                              channel_idx ? b->channel[0].scalefactors :
307
69.2k
                              c->scalefactors_prev;
308
69.9k
        const int baseline_len = mode == 4 ? b->q_unit_cnt_prev :
309
69.9k
                                 channel_idx ? b->band_ext_q_unit :
310
69.2k
                                 b->q_unit_cnt_prev;
311
312
69.9k
        const int len = get_bits(gb, 2) + 2;
313
69.9k
        const int unit_cnt = FFMIN(b->band_ext_q_unit, baseline_len);
314
69.9k
        const VLCElem *tab = sf_vlc[1][len];
315
316
900k
        for (int i = 0; i < unit_cnt; i++) {
317
830k
            int dist = get_vlc2(gb, tab, ATRAC9_SF_VLC_BITS, 1);
318
830k
            c->scalefactors[i] = baseline[i] + dist;
319
830k
        }
320
321
327k
        for (int i = unit_cnt; i < b->band_ext_q_unit; i++)
322
257k
            c->scalefactors[i] = get_bits(gb, 5);
323
324
69.9k
        break;
325
69.2k
    }
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
153k
            c->scalefactors[i] += base + baseline[i];
347
348
42.3k
        for (int i = unit_cnt; i < b->band_ext_q_unit; i++)
349
30.8k
            c->scalefactors[i] = get_bits(gb, 5);
350
11.4k
        break;
351
69.2k
    }
352
2.50M
    }
353
354
39.4M
    for (int i = 0; i < b->band_ext_q_unit; i++)
355
37.0M
        if (c->scalefactors[i] < 0 || c->scalefactors[i] > 31)
356
48.5k
            return AVERROR_INVALIDDATA;
357
358
2.46M
    memcpy(c->scalefactors_prev, c->scalefactors, sizeof(c->scalefactors));
359
360
2.46M
    return 0;
361
2.50M
}
362
363
static inline void calc_codebook_idx(ATRAC9Context *s, ATRAC9BlockData *b,
364
                                     ATRAC9ChannelData *c)
365
2.46M
{
366
2.46M
    int avg = 0;
367
2.46M
    const int last_sf = c->scalefactors[c->q_unit_cnt];
368
369
2.46M
    memset(c->codebookset, 0, sizeof(c->codebookset));
370
371
2.46M
    if (c->q_unit_cnt <= 1)
372
0
        return;
373
2.46M
    if (s->samplerate_idx > 7)
374
120k
        return;
375
376
2.34M
    c->scalefactors[c->q_unit_cnt] = c->scalefactors[c->q_unit_cnt - 1];
377
378
2.34M
    if (c->q_unit_cnt > 12) {
379
30.2M
        for (int i = 0; i < 12; i++)
380
27.9M
            avg += c->scalefactors[i];
381
2.32M
        avg = (avg + 6) / 12;
382
2.32M
    }
383
384
16.6M
    for (int i = 8; i < c->q_unit_cnt; i++) {
385
14.2M
        const int prev = c->scalefactors[i - 1];
386
14.2M
        const int cur  = c->scalefactors[i    ];
387
14.2M
        const int next = c->scalefactors[i + 1];
388
14.2M
        const int min  = FFMIN(prev, next);
389
14.2M
        if ((cur - min >= 3 || 2*cur - prev - next >= 3))
390
2.43M
            c->codebookset[i] = 1;
391
14.2M
    }
392
393
394
7.29M
    for (int i = 12; i < c->q_unit_cnt; i++) {
395
4.95M
        const int cur = c->scalefactors[i];
396
4.95M
        const int cnd = at9_q_unit_to_coeff_cnt[i] == 16;
397
4.95M
        const int min = FFMIN(c->scalefactors[i + 1], c->scalefactors[i - 1]);
398
4.95M
        if (c->codebookset[i])
399
105k
            continue;
400
401
4.84M
        c->codebookset[i] = (((cur - min) >= 2) && (cur >= (avg - cnd)));
402
4.84M
    }
403
404
2.34M
    c->scalefactors[c->q_unit_cnt] = last_sf;
405
2.34M
}
406
407
static inline void read_coeffs_coarse(ATRAC9Context *s, ATRAC9BlockData *b,
408
                                      ATRAC9ChannelData *c, GetBitContext *gb)
409
2.46M
{
410
2.46M
    const int max_prec = s->samplerate_idx > 7 ? 1 : 7;
411
412
2.46M
    memset(c->q_coeffs_coarse, 0, sizeof(c->q_coeffs_coarse));
413
414
36.7M
    for (int i = 0; i < c->q_unit_cnt; i++) {
415
34.2M
        int *coeffs = &c->q_coeffs_coarse[at9_q_unit_to_coeff_idx[i]];
416
34.2M
        const int bands = at9_q_unit_to_coeff_cnt[i];
417
34.2M
        const int prec = c->precision_coarse[i] + 1;
418
419
34.2M
        if (prec <= max_prec) {
420
30.6M
            const int cb = c->codebookset[i];
421
30.6M
            const int cbi = at9_q_unit_to_codebookidx[i];
422
30.6M
            const VLCElem *tab = coeff_vlc[cb][prec][cbi];
423
30.6M
            const HuffmanCodebook *huff = &at9_huffman_coeffs[cb][prec][cbi];
424
30.6M
            const int groups = bands >> huff->value_cnt_pow;
425
426
120M
            for (int j = 0; j < groups; j++) {
427
89.7M
                uint16_t val = get_vlc2(gb, tab, ATRAC9_COEFF_VLC_BITS, 2);
428
429
199M
                for (int k = 0; k < huff->value_cnt; k++) {
430
109M
                    coeffs[k] = sign_extend(val, huff->value_bits);
431
109M
                    val >>= huff->value_bits;
432
109M
                }
433
434
89.7M
                coeffs += huff->value_cnt;
435
89.7M
            }
436
30.6M
        } else {
437
12.7M
            for (int j = 0; j < bands; j++)
438
9.15M
                coeffs[j] = sign_extend(get_bits(gb, prec), prec);
439
3.60M
        }
440
34.2M
    }
441
2.46M
}
442
443
static inline void read_coeffs_fine(ATRAC9Context *s, ATRAC9BlockData *b,
444
                                    ATRAC9ChannelData *c, GetBitContext *gb)
445
2.46M
{
446
2.46M
    memset(c->q_coeffs_fine, 0, sizeof(c->q_coeffs_fine));
447
448
36.7M
    for (int i = 0; i < c->q_unit_cnt; i++) {
449
34.2M
        const int start = at9_q_unit_to_coeff_idx[i + 0];
450
34.2M
        const int end   = at9_q_unit_to_coeff_idx[i + 1];
451
34.2M
        const int len   = c->precision_fine[i] + 1;
452
453
34.2M
        if (c->precision_fine[i] <= 0)
454
33.9M
            continue;
455
456
1.39M
        for (int j = start; j < end; j++)
457
1.09M
            c->q_coeffs_fine[j] = sign_extend(get_bits(gb, len), len);
458
303k
    }
459
2.46M
}
460
461
static inline void dequantize(ATRAC9Context *s, ATRAC9BlockData *b,
462
                              ATRAC9ChannelData *c)
463
2.46M
{
464
2.46M
    memset(c->coeffs, 0, sizeof(c->coeffs));
465
466
36.7M
    for (int i = 0; i < c->q_unit_cnt; i++) {
467
34.2M
        const int start = at9_q_unit_to_coeff_idx[i + 0];
468
34.2M
        const int end   = at9_q_unit_to_coeff_idx[i + 1];
469
470
34.2M
        const float coarse_c = at9_quant_step_coarse[c->precision_coarse[i]];
471
34.2M
        const float fine_c   = at9_quant_step_fine[c->precision_fine[i]];
472
473
153M
        for (int j = start; j < end; j++) {
474
118M
            const float vc = c->q_coeffs_coarse[j] * coarse_c;
475
118M
            const float vf = c->q_coeffs_fine[j]   * fine_c;
476
118M
            c->coeffs[j] = vc + vf;
477
118M
        }
478
34.2M
    }
479
2.46M
}
480
481
static inline void apply_intensity_stereo(ATRAC9Context *s, ATRAC9BlockData *b,
482
                                          const int stereo)
483
2.44M
{
484
2.44M
    float *src = b->channel[ b->cpe_base_channel].coeffs;
485
2.44M
    float *dst = b->channel[!b->cpe_base_channel].coeffs;
486
487
2.44M
    if (!stereo)
488
2.43M
        return;
489
490
11.6k
    if (b->q_unit_cnt <= b->stereo_q_unit)
491
2.32k
        return;
492
493
46.8k
    for (int i = b->stereo_q_unit; i < b->q_unit_cnt; i++) {
494
37.4k
        const int sign  = b->is_signs[i];
495
37.4k
        const int start = at9_q_unit_to_coeff_idx[i + 0];
496
37.4k
        const int end   = at9_q_unit_to_coeff_idx[i + 1];
497
317k
        for (int j = start; j < end; j++)
498
279k
            dst[j] = sign*src[j];
499
37.4k
    }
500
9.35k
}
501
502
static inline void apply_scalefactors(ATRAC9Context *s, ATRAC9BlockData *b,
503
                                      const int stereo)
504
2.44M
{
505
4.90M
    for (int i = 0; i <= stereo; i++) {
506
2.45M
        float *coeffs = b->channel[i].coeffs;
507
36.7M
        for (int j = 0; j < b->q_unit_cnt; j++) {
508
34.2M
            const int start = at9_q_unit_to_coeff_idx[j + 0];
509
34.2M
            const int end   = at9_q_unit_to_coeff_idx[j + 1];
510
34.2M
            const int scalefactor = b->channel[i].scalefactors[j];
511
34.2M
            const float scale = at9_scalefactor_c[scalefactor];
512
153M
            for (int k = start; k < end; k++)
513
118M
                coeffs[k] *= scale;
514
34.2M
        }
515
2.45M
    }
516
2.44M
}
517
518
static inline void fill_with_noise(ATRAC9Context *s, ATRAC9ChannelData *c,
519
                                   int start, int count)
520
53.3k
{
521
53.3k
    float maxval = 0.0f;
522
651k
    for (int i = 0; i < count; i += 2) {
523
598k
        double tmp[2];
524
598k
        av_bmg_get(&s->lfg, tmp);
525
598k
        c->coeffs[start + i + 0] = tmp[0];
526
598k
        c->coeffs[start + i + 1] = tmp[1];
527
598k
        maxval = FFMAX(FFMAX(FFABS(tmp[0]), FFABS(tmp[1])), maxval);
528
598k
    }
529
    /* Normalize */
530
1.24M
    for (int i = 0; i < count; i++)
531
1.19M
        c->coeffs[start + i] /= maxval;
532
53.3k
}
533
534
static inline void scale_band_ext_coeffs(ATRAC9ChannelData *c, float sf[6],
535
                                         const int s_unit, const int e_unit)
536
53.3k
{
537
337k
    for (int i = s_unit; i < e_unit; i++) {
538
284k
        const int start = at9_q_unit_to_coeff_idx[i + 0];
539
284k
        const int end   = at9_q_unit_to_coeff_idx[i + 1];
540
4.19M
        for (int j = start; j < end; j++)
541
3.91M
            c->coeffs[j] *= sf[i - s_unit];
542
284k
    }
543
53.3k
}
544
545
static inline void apply_band_extension(ATRAC9Context *s, ATRAC9BlockData *b,
546
                                       const int stereo)
547
2.28M
{
548
2.28M
    const int g_units[4] = { /* A, B, C, total units */
549
2.28M
        b->q_unit_cnt,
550
2.28M
        at9_tab_band_ext_group[b->q_unit_cnt - 13][0],
551
2.28M
        at9_tab_band_ext_group[b->q_unit_cnt - 13][1],
552
2.28M
        FFMAX(g_units[2], 22),
553
2.28M
    };
554
555
2.28M
    const int g_bins[4] = { /* A, B, C, total bins */
556
2.28M
        at9_q_unit_to_coeff_idx[g_units[0]],
557
2.28M
        at9_q_unit_to_coeff_idx[g_units[1]],
558
2.28M
        at9_q_unit_to_coeff_idx[g_units[2]],
559
2.28M
        at9_q_unit_to_coeff_idx[g_units[3]],
560
2.28M
    };
561
562
4.57M
    for (int ch = 0; ch <= stereo; ch++) {
563
2.29M
        ATRAC9ChannelData *c = &b->channel[ch];
564
565
        /* Mirror the spectrum */
566
9.16M
        for (int i = 0; i < 3; i++)
567
189M
            for (int j = 0; j < (g_bins[i + 1] - g_bins[i + 0]); j++)
568
182M
                c->coeffs[g_bins[i] + j] = c->coeffs[g_bins[i] - j - 1];
569
570
2.29M
        switch (c->band_ext) {
571
46.7k
        case 0: {
572
46.7k
            float sf[6] = { 0.0f };
573
46.7k
            const int l = g_units[3] - g_units[0] - 1;
574
46.7k
            const int n_start = at9_q_unit_to_coeff_idx[g_units[3] - 1];
575
46.7k
            const int n_cnt   = at9_q_unit_to_coeff_cnt[g_units[3] - 1];
576
46.7k
            switch (at9_tab_band_ext_group[b->q_unit_cnt - 13][2]) {
577
2.92k
            case 3:
578
2.92k
                sf[0] = at9_band_ext_scales_m0[0][0][c->band_ext_data[0]];
579
2.92k
                sf[1] = at9_band_ext_scales_m0[0][1][c->band_ext_data[0]];
580
2.92k
                sf[2] = at9_band_ext_scales_m0[0][2][c->band_ext_data[1]];
581
2.92k
                sf[3] = at9_band_ext_scales_m0[0][3][c->band_ext_data[2]];
582
2.92k
                sf[4] = at9_band_ext_scales_m0[0][4][c->band_ext_data[3]];
583
2.92k
                break;
584
29.7k
            case 4:
585
29.7k
                sf[0] = at9_band_ext_scales_m0[1][0][c->band_ext_data[0]];
586
29.7k
                sf[1] = at9_band_ext_scales_m0[1][1][c->band_ext_data[0]];
587
29.7k
                sf[2] = at9_band_ext_scales_m0[1][2][c->band_ext_data[1]];
588
29.7k
                sf[3] = at9_band_ext_scales_m0[1][3][c->band_ext_data[2]];
589
29.7k
                sf[4] = at9_band_ext_scales_m0[1][4][c->band_ext_data[3]];
590
29.7k
                break;
591
14.0k
            case 5:
592
14.0k
                sf[0] = at9_band_ext_scales_m0[2][0][c->band_ext_data[0]];
593
14.0k
                sf[1] = at9_band_ext_scales_m0[2][1][c->band_ext_data[1]];
594
14.0k
                sf[2] = at9_band_ext_scales_m0[2][2][c->band_ext_data[1]];
595
14.0k
                break;
596
46.7k
            }
597
598
46.7k
            sf[l] = at9_scalefactor_c[c->scalefactors[g_units[0]]];
599
600
46.7k
            fill_with_noise(s, c, n_start, n_cnt);
601
46.7k
            scale_band_ext_coeffs(c, sf, g_units[0], g_units[3]);
602
46.7k
            break;
603
46.7k
        }
604
6.62k
        case 1: {
605
6.62k
            float sf[6];
606
38.6k
            for (int i = g_units[0]; i < g_units[3]; i++)
607
32.0k
                sf[i - g_units[0]] = at9_scalefactor_c[c->scalefactors[i]];
608
609
6.62k
            fill_with_noise(s, c, g_bins[0], g_bins[3] - g_bins[0]);
610
6.62k
            scale_band_ext_coeffs(c, sf, g_units[0], g_units[3]);
611
6.62k
            break;
612
46.7k
        }
613
2.96k
        case 2: {
614
2.96k
            const float g_sf[2] = {
615
2.96k
                at9_band_ext_scales_m2[c->band_ext_data[0]],
616
2.96k
                at9_band_ext_scales_m2[c->band_ext_data[1]],
617
2.96k
            };
618
619
8.89k
            for (int i = 0; i < 2; i++)
620
230k
                for (int j = g_bins[i + 0]; j < g_bins[i + 1]; j++)
621
224k
                    c->coeffs[j] *= g_sf[i];
622
2.96k
            break;
623
46.7k
        }
624
894
        case 3: {
625
894
            float scale = at9_band_ext_scales_m3[c->band_ext_data[0]][0];
626
894
            float rate  = at9_band_ext_scales_m3[c->band_ext_data[1]][1];
627
894
            rate = pow(2, rate);
628
71.0k
            for (int i = g_bins[0]; i < g_bins[3]; i++) {
629
70.1k
                scale *= rate;
630
70.1k
                c->coeffs[i] *= scale;
631
70.1k
            }
632
894
            break;
633
46.7k
        }
634
2.23M
        case 4: {
635
2.23M
            const float m = at9_band_ext_scales_m4[c->band_ext_data[0]];
636
2.23M
            const float g_sf[3] = { 0.7079468f*m, 0.5011902f*m, 0.3548279f*m };
637
638
8.93M
            for (int i = 0; i < 3; i++)
639
185M
                for (int j = g_bins[i + 0]; j < g_bins[i + 1]; j++)
640
178M
                    c->coeffs[j] *= g_sf[i];
641
2.23M
            break;
642
46.7k
        }
643
2.29M
        }
644
2.29M
    }
645
2.28M
}
646
647
static int atrac9_decode_block(ATRAC9Context *s, GetBitContext *gb,
648
                               ATRAC9BlockData *b, AVFrame *frame,
649
                               int frame_idx, int block_idx)
650
2.53M
{
651
2.53M
    const int first_in_pkt = !get_bits1(gb);
652
2.53M
    const int reuse_params =  get_bits1(gb);
653
2.53M
    const int stereo = s->block_config->type[block_idx] == ATRAC9_BLOCK_TYPE_CPE;
654
655
2.53M
    if (s->block_config->type[block_idx] == ATRAC9_BLOCK_TYPE_LFE) {
656
3.06k
        ATRAC9ChannelData *c = &b->channel[0];
657
3.06k
        const int precision = reuse_params ? 8 : 4;
658
3.06k
        c->q_unit_cnt = b->q_unit_cnt = 2;
659
660
3.06k
        memset(c->scalefactors, 0, sizeof(c->scalefactors));
661
3.06k
        memset(c->q_coeffs_fine, 0, sizeof(c->q_coeffs_fine));
662
3.06k
        memset(c->q_coeffs_coarse, 0, sizeof(c->q_coeffs_coarse));
663
664
9.19k
        for (int i = 0; i < b->q_unit_cnt; i++) {
665
6.13k
            c->scalefactors[i] = get_bits(gb, 5);
666
6.13k
            c->precision_coarse[i] = precision;
667
6.13k
            c->precision_fine[i] = 0;
668
6.13k
        }
669
670
9.19k
        for (int i = 0; i < c->q_unit_cnt; i++) {
671
6.13k
            const int start = at9_q_unit_to_coeff_idx[i + 0];
672
6.13k
            const int end   = at9_q_unit_to_coeff_idx[i + 1];
673
18.3k
            for (int j = start; j < end; j++)
674
12.2k
                c->q_coeffs_coarse[j] = get_bits(gb, c->precision_coarse[i] + 1);
675
6.13k
        }
676
677
3.06k
        dequantize        (s, b, c);
678
3.06k
        apply_scalefactors(s, b, 0);
679
680
3.06k
        goto imdct;
681
3.06k
    }
682
683
2.53M
    if (first_in_pkt && reuse_params) {
684
5.68k
        av_log(s->avctx, AV_LOG_ERROR, "Invalid block flags!\n");
685
5.68k
        return AVERROR_INVALIDDATA;
686
5.68k
    }
687
688
    /* Band parameters */
689
2.52M
    if (!reuse_params) {
690
2.41M
        int stereo_band, ext_band;
691
2.41M
        const int min_band_count = s->samplerate_idx > 7 ? 1 : 3;
692
2.41M
        b->reusable = 0;
693
2.41M
        b->band_count = get_bits(gb, 4) + min_band_count;
694
2.41M
        b->q_unit_cnt = at9_tab_band_q_unit_map[b->band_count];
695
696
2.41M
        b->band_ext_q_unit = b->stereo_q_unit = b->q_unit_cnt;
697
698
2.41M
        if (b->band_count > at9_tab_sri_max_bands[s->samplerate_idx]) {
699
3.75k
            av_log(s->avctx, AV_LOG_ERROR, "Invalid band count %i!\n",
700
3.75k
                   b->band_count);
701
3.75k
            return AVERROR_INVALIDDATA;
702
3.75k
        }
703
704
2.41M
        if (stereo) {
705
29.5k
            stereo_band = get_bits(gb, 4) + min_band_count;
706
29.5k
            if (stereo_band > b->band_count) {
707
6.34k
                av_log(s->avctx, AV_LOG_ERROR, "Invalid stereo band %i!\n",
708
6.34k
                       stereo_band);
709
6.34k
                return AVERROR_INVALIDDATA;
710
6.34k
            }
711
23.2k
            b->stereo_q_unit = at9_tab_band_q_unit_map[stereo_band];
712
23.2k
        }
713
714
2.40M
        b->has_band_ext = get_bits1(gb);
715
2.40M
        if (b->has_band_ext) {
716
2.25M
            ext_band = get_bits(gb, 4) + min_band_count;
717
2.25M
            if (ext_band < b->band_count) {
718
309
                av_log(s->avctx, AV_LOG_ERROR, "Invalid extension band %i!\n",
719
309
                       ext_band);
720
309
                return AVERROR_INVALIDDATA;
721
309
            }
722
2.25M
            b->band_ext_q_unit = at9_tab_band_q_unit_map[ext_band];
723
2.25M
        }
724
2.40M
        b->reusable = 1;
725
2.40M
    }
726
2.51M
    if (!b->reusable) {
727
20.1k
        av_log(s->avctx, AV_LOG_ERROR, "invalid block reused!\n");
728
20.1k
        return AVERROR_INVALIDDATA;
729
20.1k
    }
730
731
    /* Calculate bit alloc gradient */
732
2.49M
    if (parse_gradient(s, b, gb))
733
6.04k
        return AVERROR_INVALIDDATA;
734
735
    /* IS data */
736
2.49M
    b->cpe_base_channel = 0;
737
2.49M
    if (stereo) {
738
50.6k
        b->cpe_base_channel = get_bits1(gb);
739
50.6k
        if (get_bits1(gb)) {
740
26.3k
            for (int i = b->stereo_q_unit; i < b->q_unit_cnt; i++)
741
20.8k
                b->is_signs[i] = 1 - 2*get_bits1(gb);
742
45.1k
        } else {
743
1.40M
            for (int i = 0; i < FF_ARRAY_ELEMS(b->is_signs); i++)
744
1.35M
                b->is_signs[i] = 1;
745
45.1k
        }
746
50.6k
    }
747
748
    /* Band extension */
749
2.49M
    if (parse_band_ext(s, b, gb, stereo))
750
601
        return AVERROR_INVALIDDATA;
751
752
    /* Scalefactors */
753
4.95M
    for (int i = 0; i <= stereo; i++) {
754
2.51M
        ATRAC9ChannelData *c = &b->channel[i];
755
2.51M
        c->q_unit_cnt = i == b->cpe_base_channel ? b->q_unit_cnt :
756
2.51M
                                                   b->stereo_q_unit;
757
2.51M
        if (read_scalefactors(s, b, c, gb, i, first_in_pkt))
758
49.1k
            return AVERROR_INVALIDDATA;
759
760
2.46M
        calc_precision    (s, b, c);
761
2.46M
        calc_codebook_idx (s, b, c);
762
2.46M
        read_coeffs_coarse(s, b, c, gb);
763
2.46M
        read_coeffs_fine  (s, b, c, gb);
764
2.46M
        dequantize        (s, b, c);
765
2.46M
    }
766
767
2.44M
    b->q_unit_cnt_prev = b->has_band_ext ? b->band_ext_q_unit : b->q_unit_cnt;
768
769
2.44M
    apply_intensity_stereo(s, b, stereo);
770
2.44M
    apply_scalefactors    (s, b, stereo);
771
772
2.44M
    if (b->has_band_ext && b->has_band_ext_data)
773
2.28M
        apply_band_extension  (s, b, stereo);
774
775
2.44M
imdct:
776
4.90M
    for (int i = 0; i <= stereo; i++) {
777
2.45M
        ATRAC9ChannelData *c = &b->channel[i];
778
2.45M
        const int dst_idx = s->block_config->plane_map[block_idx][i];
779
2.45M
        const int wsize = 1 << s->frame_log2;
780
2.45M
        const ptrdiff_t offset = wsize*frame_idx*sizeof(float);
781
2.45M
        float *dst = (float *)(frame->extended_data[dst_idx] + offset);
782
783
2.45M
        s->tx_fn(s->tx, s->temp, c->coeffs, sizeof(float));
784
2.45M
        s->fdsp->vector_fmul_window(dst, c->prev_win, s->temp,
785
2.45M
                                    s->imdct_win, wsize >> 1);
786
2.45M
        memcpy(c->prev_win, s->temp + (wsize >> 1), sizeof(float)*wsize >> 1);
787
2.45M
    }
788
789
2.44M
    return 0;
790
2.44M
}
791
792
static int atrac9_decode_frame(AVCodecContext *avctx, AVFrame *frame,
793
                               int *got_frame_ptr, AVPacket *avpkt)
794
798k
{
795
798k
    int ret;
796
798k
    GetBitContext gb;
797
798k
    ATRAC9Context *s = avctx->priv_data;
798
798k
    const int frames = FFMIN(avpkt->size / s->avg_frame_size, s->frame_count);
799
800
798k
    frame->nb_samples = (1 << s->frame_log2) * frames;
801
798k
    ret = ff_get_buffer(avctx, frame, 0);
802
798k
    if (ret < 0)
803
7.55k
        return ret;
804
805
790k
    ret = init_get_bits8(&gb, avpkt->data, avpkt->size);
806
790k
    if (ret < 0)
807
0
        return ret;
808
809
3.21M
    for (int i = 0; i < frames; i++) {
810
4.96M
        for (int j = 0; j < s->block_config->count; j++) {
811
2.53M
            ret = atrac9_decode_block(s, &gb, &s->block[j], frame, i, j);
812
2.53M
            if (ret)
813
91.9k
                return ret;
814
2.44M
            align_get_bits(&gb);
815
2.44M
        }
816
2.51M
    }
817
818
698k
    *got_frame_ptr = 1;
819
820
698k
    return frames < s->frame_count ? (get_bits_count(&gb) >> 3) : avctx->block_align;
821
790k
}
822
823
static av_cold void atrac9_decode_flush(AVCodecContext *avctx)
824
86.7k
{
825
86.7k
    ATRAC9Context *s = avctx->priv_data;
826
827
183k
    for (int j = 0; j < s->block_config->count; j++) {
828
96.7k
        ATRAC9BlockData *b = &s->block[j];
829
96.7k
        const int stereo = s->block_config->type[j] == ATRAC9_BLOCK_TYPE_CPE;
830
207k
        for (int i = 0; i <= stereo; i++) {
831
110k
            ATRAC9ChannelData *c = &b->channel[i];
832
110k
            memset(c->prev_win, 0, sizeof(c->prev_win));
833
110k
        }
834
96.7k
    }
835
86.7k
}
836
837
static av_cold int atrac9_decode_close(AVCodecContext *avctx)
838
1.40k
{
839
1.40k
    ATRAC9Context *s = avctx->priv_data;
840
841
1.40k
    av_tx_uninit(&s->tx);
842
1.40k
    av_freep(&s->fdsp);
843
844
1.40k
    return 0;
845
1.40k
}
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.40k
{
901
1.40k
    float scale;
902
1.40k
    static AVOnce static_table_init = AV_ONCE_INIT;
903
1.40k
    GetBitContext gb;
904
1.40k
    ATRAC9Context *s = avctx->priv_data;
905
1.40k
    int err, version, block_config_idx, superframe_idx, alloc_c_len;
906
907
1.40k
    s->avctx = avctx;
908
909
1.40k
    av_lfg_init(&s->lfg, 0xFBADF00D);
910
911
1.40k
    if (avctx->block_align <= 0) {
912
42
        av_log(avctx, AV_LOG_ERROR, "Invalid block align\n");
913
42
        return AVERROR_INVALIDDATA;
914
42
    }
915
916
1.36k
    if (avctx->extradata_size != 12) {
917
165
        av_log(avctx, AV_LOG_ERROR, "Invalid extradata length!\n");
918
165
        return AVERROR_INVALIDDATA;
919
165
    }
920
921
1.19k
    version = AV_RL32(avctx->extradata);
922
1.19k
    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.19k
    err = init_get_bits8(&gb, avctx->extradata + 4, avctx->extradata_size);
928
1.19k
    if (err < 0)
929
0
        return err;
930
931
1.19k
    if (get_bits(&gb, 8) != 0xFE) {
932
12
        av_log(avctx, AV_LOG_ERROR, "Incorrect magic byte!\n");
933
12
        return AVERROR_INVALIDDATA;
934
12
    }
935
936
1.18k
    s->samplerate_idx = get_bits(&gb, 4);
937
1.18k
    avctx->sample_rate = at9_tab_samplerates[s->samplerate_idx];
938
939
1.18k
    block_config_idx = get_bits(&gb, 3);
940
1.18k
    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.18k
    s->block_config = &at9_block_layout[block_config_idx];
945
946
1.18k
    av_channel_layout_uninit(&avctx->ch_layout);
947
1.18k
    avctx->ch_layout      = s->block_config->channel_layout;
948
1.18k
    avctx->sample_fmt     = AV_SAMPLE_FMT_FLTP;
949
950
1.18k
    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.18k
    s->avg_frame_size = get_bits(&gb, 11) + 1;
957
958
1.18k
    superframe_idx = get_bits(&gb, 2);
959
1.18k
    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.18k
    s->frame_count = 1 << superframe_idx;
965
1.18k
    s->frame_log2  = at9_tab_sri_frame_log2[s->samplerate_idx];
966
967
1.18k
    scale = 1.0f / 32768.0;
968
1.18k
    err = av_tx_init(&s->tx, &s->tx_fn, AV_TX_FLOAT_MDCT, 1,
969
1.18k
                     1 << s->frame_log2, &scale, 0);
970
1.18k
    if (err < 0)
971
0
        return err;
972
973
1.18k
    s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
974
1.18k
    if (!s->fdsp)
975
0
        return AVERROR(ENOMEM);
976
977
    /* iMDCT window */
978
174k
    for (int i = 0; i < (1 << s->frame_log2); i++) {
979
172k
        const int   len  = 1 << s->frame_log2;
980
172k
        const float sidx = (      i + 0.5f) / len;
981
172k
        const float eidx = (len - i - 0.5f) / len;
982
172k
        const float s_c  = sinf(sidx*M_PI - M_PI_2)*0.5f + 0.5f;
983
172k
        const float e_c  = sinf(eidx*M_PI - M_PI_2)*0.5f + 0.5f;
984
172k
        s->imdct_win[i]  = s_c / ((s_c * s_c) + (e_c * e_c));
985
172k
    }
986
987
    /* Allocation curve */
988
1.18k
    alloc_c_len = FF_ARRAY_ELEMS(at9_tab_b_dist);
989
57.8k
    for (int i = 1; i <= alloc_c_len; i++)
990
1.44M
        for (int j = 0; j < i; j++)
991
1.38M
            s->alloc_curve[i - 1][j] = at9_tab_b_dist[(j * alloc_c_len) / i];
992
993
1.18k
    ff_thread_once(&static_table_init, atrac9_init_static);
994
995
1.18k
    return 0;
996
1.18k
}
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
};