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
24
33
34 #define ATRAC9_SF_VLC_BITS 8
35 #define ATRAC9_COEFF_VLC_BITS 9
36
43
47
49
52
56
59
60 /* Base */
64
65 /* Stereo block only */
67
68 /* Band extension only */
72
73 /* Gradient */
77
78 /* Stereo */
81
83
85
93
94 /* Set on init */
100
101 /* Generated on init */
104
107
110
113 {
114 int grad_range[2];
115 int grad_value[2];
117 uint8_t *curve;
119
123 grad_range[1] = 31;
125 grad_value[1] = 31;
126 } else {
128 grad_range[1] =
get_bits(gb, 6) + 1;
131 }
133
134 if (grad_range[0] >= grad_range[1] || grad_range[1] > 31)
136
137 if (
b->grad_boundary >
b->q_unit_cnt)
139
140 values = grad_value[1] - grad_value[0];
141 sign = 1 - 2*(
values < 0);
142 base = grad_value[0] + sign;
144 curve =
s->alloc_curve[grad_range[1] - grad_range[0] - 1];
145
146 for (
int i = 0;
i <=
b->q_unit_cnt;
i++)
147 b->gradient[
i] = grad_value[
i >= grad_range[0]];
148
149 for (
int i = grad_range[0];
i < grad_range[1];
i++)
150 b->gradient[
i] =
base + sign*((
int)(
scale*curve[
i - grad_range[0]]));
151
152 return 0;
153 }
154
157 {
158 memset(
c->precision_mask, 0,
sizeof(
c->precision_mask));
159 for (
int i = 1;
i <
b->q_unit_cnt;
i++) {
160 const int delta =
FFABS(
c->scalefactors[
i] -
c->scalefactors[
i - 1]) - 1;
162 const int neg =
c->scalefactors[
i - 1] >
c->scalefactors[
i];
164 }
165 }
166
168 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
169 c->precision_coarse[
i] =
c->scalefactors[
i];
170 c->precision_coarse[
i] +=
c->precision_mask[
i] -
b->gradient[
i];
171 if (
c->precision_coarse[
i] < 0)
172 continue;
173 switch (
b->grad_mode) {
174 case 1:
175 c->precision_coarse[
i] >>= 1;
176 break;
177 case 2:
178 c->precision_coarse[
i] = (3 *
c->precision_coarse[
i]) >> 3;
179 break;
180 case 3:
181 c->precision_coarse[
i] >>= 2;
182 break;
183 }
184 }
185 } else {
186 for (
int i = 0;
i <
b->q_unit_cnt;
i++)
187 c->precision_coarse[
i] =
c->scalefactors[
i] -
b->gradient[
i];
188 }
189
190
191 for (
int i = 0;
i <
b->q_unit_cnt;
i++)
192 c->precision_coarse[
i] =
FFMAX(
c->precision_coarse[
i], 1);
193
194 for (
int i = 0;
i <
b->grad_boundary;
i++)
195 c->precision_coarse[
i]++;
196
197 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
198 c->precision_fine[
i] = 0;
199 if (
c->precision_coarse[
i] > 15) {
200 c->precision_fine[
i] =
FFMIN(
c->precision_coarse[
i], 30) - 15;
201 c->precision_coarse[
i] = 15;
202 }
203 }
204 }
205
208 {
209 int ext_band = 0;
210
211 if (
b->has_band_ext) {
212 if (
b->q_unit_cnt < 13 ||
b->q_unit_cnt > 20)
215 if (stereo) {
216 b->channel[1].band_ext =
get_bits(gb, 2);
217 b->channel[1].band_ext = ext_band > 2 ?
b->channel[1].band_ext : 4;
218 } else {
220 }
221 }
222
224 if (!
b->has_band_ext_data)
225 return 0;
226
227 if (!
b->has_band_ext) {
230 return 0;
231 }
232
233 b->channel[0].band_ext =
get_bits(gb, 2);
234 b->channel[0].band_ext = ext_band > 2 ?
b->channel[0].band_ext : 4;
235
237 for (
int i = 0;
i <= stereo;
i++) {
240 for (int j = 0; j < count; j++) {
243 }
244 }
245
246 return 0;
247 }
248
249 for (
int i = 0;
i <= stereo;
i++) {
252 for (int j = 0; j < count; j++) {
255 }
256 }
257
258 return 0;
259 }
260
263 int channel_idx, int first_in_pkt)
264 {
265 static const uint8_t mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
266 const int mode = mode_map[channel_idx][
get_bits(gb, 2)];
267
268 memset(
c->scalefactors, 0,
sizeof(
c->scalefactors));
269
270 if (first_in_pkt && (
mode == 4 || ((
mode == 3) && !channel_idx))) {
273 }
274
276 case 0: { /* VLC delta offset */
281
283
284 for (
int i = 1;
i <
b->band_ext_q_unit;
i++) {
287 c->scalefactors[
i] =
val & ((1 <<
len) - 1);
288 }
289
290 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
291 c->scalefactors[
i] +=
base - sf_weights[
i];
292
293 break;
294 }
295 case 1: { /* CLC offset */
298 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
300 break;
301 }
302 case 2:
303 case 4: { /* VLC dist to baseline */
304 const int *baseline =
mode == 4 ?
c->scalefactors_prev :
305 channel_idx ?
b->channel[0].scalefactors :
306 c->scalefactors_prev;
307 const int baseline_len =
mode == 4 ?
b->q_unit_cnt_prev :
308 channel_idx ?
b->band_ext_q_unit :
310
312 const int unit_cnt =
FFMIN(
b->band_ext_q_unit, baseline_len);
314
315 for (
int i = 0;
i < unit_cnt;
i++) {
317 c->scalefactors[
i] = baseline[
i] + dist;
318 }
319
320 for (
int i = unit_cnt;
i <
b->band_ext_q_unit;
i++)
322
323 break;
324 }
325 case 3: { /* VLC offset with baseline */
326 const int *baseline = channel_idx ?
b->channel[0].scalefactors :
327 c->scalefactors_prev;
328 const int baseline_len = channel_idx ?
b->band_ext_q_unit :
330
333 const int unit_cnt =
FFMIN(
b->band_ext_q_unit, baseline_len);
335
337
338 for (
int i = 1;
i < unit_cnt;
i++) {
341 c->scalefactors[
i] =
val & ((1 <<
len) - 1);
342 }
343
344 for (
int i = 0;
i < unit_cnt;
i++)
345 c->scalefactors[
i] +=
base + baseline[
i];
346
347 for (
int i = unit_cnt;
i <
b->band_ext_q_unit;
i++)
349 break;
350 }
351 }
352
353 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
354 if (
c->scalefactors[
i] < 0 ||
c->scalefactors[
i] > 31)
356
357 memcpy(
c->scalefactors_prev,
c->scalefactors,
sizeof(
c->scalefactors));
358
359 return 0;
360 }
361
364 {
366 const int last_sf =
c->scalefactors[
c->q_unit_cnt];
367
368 memset(
c->codebookset, 0,
sizeof(
c->codebookset));
369
370 if (
c->q_unit_cnt <= 1)
371 return;
372 if (
s->samplerate_idx > 7)
373 return;
374
375 c->scalefactors[
c->q_unit_cnt] =
c->scalefactors[
c->q_unit_cnt - 1];
376
377 if (
c->q_unit_cnt > 12) {
378 for (
int i = 0;
i < 12;
i++)
379 avg +=
c->scalefactors[
i];
381 }
382
383 for (
int i = 8;
i <
c->q_unit_cnt;
i++) {
384 const int prev =
c->scalefactors[
i - 1];
385 const int cur =
c->scalefactors[
i ];
386 const int next =
c->scalefactors[
i + 1];
388 if ((cur -
min >= 3 || 2*cur - prev - next >= 3))
389 c->codebookset[
i] = 1;
390 }
391
392
393 for (
int i = 12;
i <
c->q_unit_cnt;
i++) {
394 const int cur =
c->scalefactors[
i];
396 const int min =
FFMIN(
c->scalefactors[
i + 1],
c->scalefactors[
i - 1]);
397 if (
c->codebookset[
i])
398 continue;
399
400 c->codebookset[
i] = (((cur -
min) >= 2) && (cur >= (
avg - cnd)));
401 }
402
403 c->scalefactors[
c->q_unit_cnt] = last_sf;
404 }
405
408 {
409 const int max_prec =
s->samplerate_idx > 7 ? 1 : 7;
410
411 memset(
c->q_coeffs_coarse, 0,
sizeof(
c->q_coeffs_coarse));
412
413 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
416 const int prec =
c->precision_coarse[
i] + 1;
417
418 if (prec <= max_prec) {
419 const int cb =
c->codebookset[
i];
424
425 for (int j = 0; j < groups; j++) {
427
428 for (
int k = 0; k < huff->
value_cnt; k++) {
431 }
432
434 }
435 } else {
436 for (
int j = 0; j <
bands; j++)
438 }
439 }
440 }
441
444 {
445 memset(
c->q_coeffs_fine, 0,
sizeof(
c->q_coeffs_fine));
446
447 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
450 const int len =
c->precision_fine[
i] + 1;
451
452 if (
c->precision_fine[
i] <= 0)
453 continue;
454
455 for (int j = start; j < end; j++)
457 }
458 }
459
462 {
463 memset(
c->coeffs, 0,
sizeof(
c->coeffs));
464
465 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
468
471
472 for (int j = start; j < end; j++) {
473 const float vc =
c->q_coeffs_coarse[j] * coarse_c;
474 const float vf =
c->q_coeffs_fine[j] * fine_c;
475 c->coeffs[j] = vc + vf;
476 }
477 }
478 }
479
481 const int stereo)
482 {
483 float *
src =
b->channel[
b->cpe_base_channel].coeffs;
484 float *dst =
b->channel[!
b->cpe_base_channel].coeffs;
485
486 if (!stereo)
487 return;
488
489 if (
b->q_unit_cnt <=
b->stereo_q_unit)
490 return;
491
492 for (
int i =
b->stereo_q_unit; i < b->q_unit_cnt;
i++) {
493 const int sign =
b->is_signs[
i];
496 for (int j = start; j < end; j++)
497 dst[j] = sign*
src[j];
498 }
499 }
500
502 const int stereo)
503 {
504 for (
int i = 0;
i <= stereo;
i++) {
505 float *coeffs =
b->channel[
i].coeffs;
506 for (
int j = 0; j <
b->q_unit_cnt; j++) {
509 const int scalefactor =
b->channel[
i].scalefactors[j];
511 for (int k = start; k < end; k++)
513 }
514 }
515 }
516
518 int start, int count)
519 {
520 float maxval = 0.0f;
521 for (
int i = 0;
i < count;
i += 2) {
524 c->coeffs[start +
i + 0] =
tmp[0];
525 c->coeffs[start +
i + 1] =
tmp[1];
527 }
528 /* Normalize */
529 for (
int i = 0;
i < count;
i++)
530 c->coeffs[start +
i] /= maxval;
531 }
532
534 const int s_unit, const int e_unit)
535 {
536 for (
int i = s_unit;
i < e_unit;
i++) {
539 for (int j = start; j < end; j++)
540 c->coeffs[j] *= sf[
i - s_unit];
541 }
542 }
543
545 const int stereo)
546 {
547 const int g_units[4] = { /* A, B, C, total units */
551 FFMAX(g_units[2], 22),
552 };
553
554 const int g_bins[4] = { /* A, B, C, total bins */
559 };
560
561 for (int ch = 0; ch <= stereo; ch++) {
563
564 /* Mirror the spectrum */
565 for (
int i = 0;
i < 3;
i++)
566 for (
int j = 0; j < (g_bins[
i + 1] - g_bins[
i + 0]); j++)
567 c->coeffs[g_bins[
i] + j] =
c->coeffs[g_bins[
i] - j - 1];
568
569 switch (
c->band_ext) {
570 case 0: {
571 float sf[6] = { 0.0f };
572 const int l = g_units[3] - g_units[0] - 1;
576 case 3:
582 break;
583 case 4:
589 break;
590 case 5:
594 break;
595 }
596
598
601 break;
602 }
603 case 1: {
604 float sf[6];
605 for (
int i = g_units[0];
i < g_units[3];
i++)
607
610 break;
611 }
612 case 2: {
613 const float g_sf[2] = {
616 };
617
618 for (
int i = 0;
i < 2;
i++)
619 for (
int j = g_bins[
i + 0]; j < g_bins[
i + 1]; j++)
620 c->coeffs[j] *= g_sf[
i];
621 break;
622 }
623 case 3: {
626 rate = pow(2, rate);
627 for (
int i = g_bins[0];
i < g_bins[3];
i++) {
630 }
631 break;
632 }
633 case 4: {
635 const float g_sf[3] = { 0.7079468f*m, 0.5011902f*m, 0.3548279f*m };
636
637 for (
int i = 0;
i < 3;
i++)
638 for (
int j = g_bins[
i + 0]; j < g_bins[
i + 1]; j++)
639 c->coeffs[j] *= g_sf[
i];
640 break;
641 }
642 }
643 }
644 }
645
648 int frame_idx, int block_idx)
649 {
653
656 const int precision = reuse_params ? 8 : 4;
657 c->q_unit_cnt =
b->q_unit_cnt = 2;
658
659 memset(
c->scalefactors, 0,
sizeof(
c->scalefactors));
660 memset(
c->q_coeffs_fine, 0,
sizeof(
c->q_coeffs_fine));
661 memset(
c->q_coeffs_coarse, 0,
sizeof(
c->q_coeffs_coarse));
662
663 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
665 c->precision_coarse[
i] = precision;
666 c->precision_fine[
i] = 0;
667 }
668
669 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
672 for (int j = start; j < end; j++)
673 c->q_coeffs_coarse[j] =
get_bits(gb,
c->precision_coarse[
i] + 1);
674 }
675
678
679 goto imdct;
680 }
681
682 if (first_in_pkt && reuse_params) {
685 }
686
687 /* Band parameters */
688 if (!reuse_params) {
689 int stereo_band, ext_band;
690 const int min_band_count =
s->samplerate_idx > 7 ? 1 : 3;
692 b->band_count =
get_bits(gb, 4) + min_band_count;
694
695 b->band_ext_q_unit =
b->stereo_q_unit =
b->q_unit_cnt;
696
701 }
702
703 if (stereo) {
704 stereo_band =
get_bits(gb, 4) + min_band_count;
705 if (stereo_band >
b->band_count) {
707 stereo_band);
709 }
711 }
712
714 if (
b->has_band_ext) {
715 ext_band =
get_bits(gb, 4) + min_band_count;
716 if (ext_band < b->band_count) {
718 ext_band);
720 }
722 }
724 }
728 }
729
730 /* Calculate bit alloc gradient */
733
734 /* IS data */
735 b->cpe_base_channel = 0;
736 if (stereo) {
739 for (
int i =
b->stereo_q_unit; i < b->q_unit_cnt;
i++)
741 } else {
744 }
745 }
746
747 /* Band extension */
750
751 /* Scalefactors */
752 for (
int i = 0;
i <= stereo;
i++) {
754 c->q_unit_cnt =
i ==
b->cpe_base_channel ?
b->q_unit_cnt :
758
764 }
765
766 b->q_unit_cnt_prev =
b->has_band_ext ?
b->band_ext_q_unit :
b->q_unit_cnt;
767
770
771 if (
b->has_band_ext &&
b->has_band_ext_data)
773
774 imdct:
775 for (
int i = 0;
i <= stereo;
i++) {
777 const int dst_idx =
s->block_config->plane_map[block_idx][
i];
778 const int wsize = 1 <<
s->frame_log2;
779 const ptrdiff_t
offset = wsize*frame_idx*
sizeof(
float);
781
782 s->tx_fn(
s->tx,
s->temp,
c->coeffs,
sizeof(
float));
783 s->fdsp->vector_fmul_window(dst,
c->prev_win,
s->temp,
784 s->imdct_win, wsize >> 1);
785 memcpy(
c->prev_win,
s->temp + (wsize >> 1),
sizeof(
float)*wsize >> 1);
786 }
787
788 return 0;
789 }
790
792 int *got_frame_ptr,
AVPacket *avpkt)
793 {
798
803
807
809 for (
int j = 0; j <
s->block_config->count; j++) {
814 }
815 }
816
817 *got_frame_ptr = 1;
818
820 }
821
823 {
825
826 for (
int j = 0; j <
s->block_config->count; j++) {
829 for (
int i = 0;
i <= stereo;
i++) {
831 memset(
c->prev_win, 0,
sizeof(
c->prev_win));
832 }
833 }
834 }
835
837 {
839
842
843 return 0;
844 }
845
847 int nb_bits, int nb_codes,
849 {
851
856 }
857
859 {
862 const uint8_t (*
tab)[2];
863
864 /* Unsigned scalefactor VLCs */
866 for (
int i = 1;
i < 7;
i++) {
868
871 }
872
873 /* Signed scalefactor VLCs */
875 for (
int i = 2;
i < 6;
i++) {
877
878 /* The symbols are signed integers in the range -16..15;
879 * the values in the source table are offset by 16 to make
880 * them fit into an uint8_t; the -16 reverses this shift. */
883 }
884
885 /* Coefficient VLCs */
887 for (
int i = 0;
i < 2;
i++) {
888 for (int j = 2; j < 8; j++) {
889 for (
int k =
i; k < 4; k++) {
893 }
894 }
895 }
896 }
897
899 {
904 int err,
version, block_config_idx, superframe_idx, alloc_c_len;
905
907
909
913 }
914
918 }
919
924 }
925
927 if (err < 0)
928 return err;
929
933 }
934
937
938 block_config_idx =
get_bits(&gb, 3);
939 if (block_config_idx > 5) {
942 }
944
946 avctx->
ch_layout =
s->block_config->channel_layout;
948
952 }
953
954 /* Average frame size in bytes */
955 s->avg_frame_size =
get_bits(&gb, 11) + 1;
956
958 if (superframe_idx & 1) {
961 }
962
963 s->frame_count = 1 << superframe_idx;
965
966 scale = 1.0f / 32768.0;
968 1 <<
s->frame_log2, &
scale, 0);
969 if (err < 0)
970 return err;
971
975
976 /* iMDCT window */
977 for (
int i = 0;
i < (1 <<
s->frame_log2);
i++) {
978 const int len = 1 <<
s->frame_log2;
979 const float sidx = (
i + 0.5f) /
len;
980 const float eidx = (
len -
i - 0.5f) /
len;
983 s->imdct_win[
i] = s_c / ((s_c * s_c) + (e_c * e_c));
984 }
985
986 /* Allocation curve */
988 for (
int i = 1;
i <= alloc_c_len;
i++)
989 for (
int j = 0; j <
i; j++)
991
993
994 return 0;
995 }
996
1008 .p.capabilities =
1009 #if FF_API_SUBFRAMES
1010 AV_CODEC_CAP_SUBFRAMES |
1011 #endif
1013 };