/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 | | }; |