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
92
93 /* Set on init */
99
100 /* Generated on init */
103
106
108 static VLC coeff_vlc[2][8][4];
/* Cookbook, precision, cookbook index */
109
112 {
113 int grad_range[2];
114 int grad_value[2];
116 uint8_t *curve;
118
122 grad_range[1] = 31;
124 grad_value[1] = 31;
125 } else {
127 grad_range[1] =
get_bits(gb, 6) + 1;
130 }
132
133 if (grad_range[0] >= grad_range[1] || grad_range[1] > 31)
135
136 if (
b->grad_boundary >
b->q_unit_cnt)
138
139 values = grad_value[1] - grad_value[0];
140 sign = 1 - 2*(
values < 0);
141 base = grad_value[0] + sign;
143 curve =
s->alloc_curve[grad_range[1] - grad_range[0] - 1];
144
145 for (
int i = 0;
i <=
b->q_unit_cnt;
i++)
146 b->gradient[
i] = grad_value[
i >= grad_range[0]];
147
148 for (
int i = grad_range[0];
i < grad_range[1];
i++)
149 b->gradient[
i] =
base + sign*((
int)(
scale*curve[
i - grad_range[0]]));
150
151 return 0;
152 }
153
156 {
157 memset(
c->precision_mask, 0,
sizeof(
c->precision_mask));
158 for (
int i = 1;
i <
b->q_unit_cnt;
i++) {
159 const int delta =
FFABS(
c->scalefactors[
i] -
c->scalefactors[
i - 1]) - 1;
161 const int neg =
c->scalefactors[
i - 1] >
c->scalefactors[
i];
163 }
164 }
165
167 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
168 c->precision_coarse[
i] =
c->scalefactors[
i];
169 c->precision_coarse[
i] +=
c->precision_mask[
i] -
b->gradient[
i];
170 if (
c->precision_coarse[
i] < 0)
171 continue;
172 switch (
b->grad_mode) {
173 case 1:
174 c->precision_coarse[
i] >>= 1;
175 break;
176 case 2:
177 c->precision_coarse[
i] = (3 *
c->precision_coarse[
i]) >> 3;
178 break;
179 case 3:
180 c->precision_coarse[
i] >>= 2;
181 break;
182 }
183 }
184 } else {
185 for (
int i = 0;
i <
b->q_unit_cnt;
i++)
186 c->precision_coarse[
i] =
c->scalefactors[
i] -
b->gradient[
i];
187 }
188
189
190 for (
int i = 0;
i <
b->q_unit_cnt;
i++)
191 c->precision_coarse[
i] =
FFMAX(
c->precision_coarse[
i], 1);
192
193 for (
int i = 0;
i <
b->grad_boundary;
i++)
194 c->precision_coarse[
i]++;
195
196 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
197 c->precision_fine[
i] = 0;
198 if (
c->precision_coarse[
i] > 15) {
199 c->precision_fine[
i] =
FFMIN(
c->precision_coarse[
i], 30) - 15;
200 c->precision_coarse[
i] = 15;
201 }
202 }
203 }
204
207 {
208 int ext_band = 0;
209
210 if (
b->has_band_ext) {
211 if (
b->q_unit_cnt < 13 ||
b->q_unit_cnt > 20)
214 if (stereo) {
215 b->channel[1].band_ext =
get_bits(gb, 2);
216 b->channel[1].band_ext = ext_band > 2 ?
b->channel[1].band_ext : 4;
217 } else {
219 }
220 }
221
223 if (!
b->has_band_ext_data)
224 return 0;
225
226 if (!
b->has_band_ext) {
229 return 0;
230 }
231
232 b->channel[0].band_ext =
get_bits(gb, 2);
233 b->channel[0].band_ext = ext_band > 2 ?
b->channel[0].band_ext : 4;
234
236 for (
int i = 0;
i <= stereo;
i++) {
239 for (int j = 0; j < count; j++) {
242 }
243 }
244
245 return 0;
246 }
247
248 for (
int i = 0;
i <= stereo;
i++) {
251 for (int j = 0; j < count; j++) {
254 }
255 }
256
257 return 0;
258 }
259
262 int channel_idx, int first_in_pkt)
263 {
264 static const uint8_t mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
265 const int mode = mode_map[channel_idx][
get_bits(gb, 2)];
266
267 memset(
c->scalefactors, 0,
sizeof(
c->scalefactors));
268
269 if (first_in_pkt && (
mode == 4 || ((
mode == 3) && !channel_idx))) {
272 }
273
275 case 0: { /* VLC delta offset */
280
282
283 for (
int i = 1;
i <
b->band_ext_q_unit;
i++) {
286 c->scalefactors[
i] =
val & ((1 <<
len) - 1);
287 }
288
289 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
290 c->scalefactors[
i] +=
base - sf_weights[
i];
291
292 break;
293 }
294 case 1: { /* CLC offset */
297 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
299 break;
300 }
301 case 2:
302 case 4: { /* VLC dist to baseline */
303 const int *baseline =
mode == 4 ?
c->scalefactors_prev :
304 channel_idx ?
b->channel[0].scalefactors :
305 c->scalefactors_prev;
306 const int baseline_len =
mode == 4 ?
b->q_unit_cnt_prev :
307 channel_idx ?
b->band_ext_q_unit :
309
311 const int unit_cnt =
FFMIN(
b->band_ext_q_unit, baseline_len);
313
314 for (
int i = 0;
i < unit_cnt;
i++) {
316 c->scalefactors[
i] = baseline[
i] + dist;
317 }
318
319 for (
int i = unit_cnt;
i <
b->band_ext_q_unit;
i++)
321
322 break;
323 }
324 case 3: { /* VLC offset with baseline */
325 const int *baseline = channel_idx ?
b->channel[0].scalefactors :
326 c->scalefactors_prev;
327 const int baseline_len = channel_idx ?
b->band_ext_q_unit :
329
332 const int unit_cnt =
FFMIN(
b->band_ext_q_unit, baseline_len);
334
336
337 for (
int i = 1;
i < unit_cnt;
i++) {
340 c->scalefactors[
i] =
val & ((1 <<
len) - 1);
341 }
342
343 for (
int i = 0;
i < unit_cnt;
i++)
344 c->scalefactors[
i] +=
base + baseline[
i];
345
346 for (
int i = unit_cnt;
i <
b->band_ext_q_unit;
i++)
348 break;
349 }
350 }
351
352 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
353 if (
c->scalefactors[
i] < 0 ||
c->scalefactors[
i] > 31)
355
356 memcpy(
c->scalefactors_prev,
c->scalefactors,
sizeof(
c->scalefactors));
357
358 return 0;
359 }
360
363 {
365 const int last_sf =
c->scalefactors[
c->q_unit_cnt];
366
367 memset(
c->codebookset, 0,
sizeof(
c->codebookset));
368
369 if (
c->q_unit_cnt <= 1)
370 return;
371 if (
s->samplerate_idx > 7)
372 return;
373
374 c->scalefactors[
c->q_unit_cnt] =
c->scalefactors[
c->q_unit_cnt - 1];
375
376 if (
c->q_unit_cnt > 12) {
377 for (
int i = 0;
i < 12;
i++)
378 avg +=
c->scalefactors[
i];
380 }
381
382 for (
int i = 8;
i <
c->q_unit_cnt;
i++) {
383 const int prev =
c->scalefactors[
i - 1];
384 const int cur =
c->scalefactors[
i ];
385 const int next =
c->scalefactors[
i + 1];
387 if ((cur -
min >= 3 || 2*cur - prev - next >= 3))
388 c->codebookset[
i] = 1;
389 }
390
391
392 for (
int i = 12;
i <
c->q_unit_cnt;
i++) {
393 const int cur =
c->scalefactors[
i];
395 const int min =
FFMIN(
c->scalefactors[
i + 1],
c->scalefactors[
i - 1]);
396 if (
c->codebookset[
i])
397 continue;
398
399 c->codebookset[
i] = (((cur -
min) >= 2) && (cur >= (
avg - cnd)));
400 }
401
402 c->scalefactors[
c->q_unit_cnt] = last_sf;
403 }
404
407 {
408 const int max_prec =
s->samplerate_idx > 7 ? 1 : 7;
409
410 memset(
c->q_coeffs_coarse, 0,
sizeof(
c->q_coeffs_coarse));
411
412 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
415 const int prec =
c->precision_coarse[
i] + 1;
416
417 if (prec <= max_prec) {
418 const int cb =
c->codebookset[
i];
423
424 for (int j = 0; j < groups; j++) {
426
427 for (
int k = 0; k < huff->
value_cnt; k++) {
430 }
431
433 }
434 } else {
435 for (
int j = 0; j <
bands; j++)
437 }
438 }
439 }
440
443 {
444 memset(
c->q_coeffs_fine, 0,
sizeof(
c->q_coeffs_fine));
445
446 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
449 const int len =
c->precision_fine[
i] + 1;
450
451 if (
c->precision_fine[
i] <= 0)
452 continue;
453
454 for (int j = start; j < end; j++)
456 }
457 }
458
461 {
462 memset(
c->coeffs, 0,
sizeof(
c->coeffs));
463
464 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
467
470
471 for (int j = start; j < end; j++) {
472 const float vc =
c->q_coeffs_coarse[j] * coarse_c;
473 const float vf =
c->q_coeffs_fine[j] * fine_c;
474 c->coeffs[j] = vc + vf;
475 }
476 }
477 }
478
480 const int stereo)
481 {
482 float *
src =
b->channel[
b->cpe_base_channel].coeffs;
483 float *dst =
b->channel[!
b->cpe_base_channel].coeffs;
484
485 if (!stereo)
486 return;
487
488 if (
b->q_unit_cnt <=
b->stereo_q_unit)
489 return;
490
491 for (
int i =
b->stereo_q_unit; i < b->q_unit_cnt;
i++) {
492 const int sign =
b->is_signs[
i];
495 for (int j = start; j < end; j++)
496 dst[j] = sign*
src[j];
497 }
498 }
499
501 const int stereo)
502 {
503 for (
int i = 0;
i <= stereo;
i++) {
504 float *coeffs =
b->channel[
i].coeffs;
505 for (
int j = 0; j <
b->q_unit_cnt; j++) {
508 const int scalefactor =
b->channel[
i].scalefactors[j];
510 for (int k = start; k < end; k++)
512 }
513 }
514 }
515
517 int start, int count)
518 {
519 float maxval = 0.0f;
520 for (
int i = 0;
i < count;
i += 2) {
523 c->coeffs[start +
i + 0] =
tmp[0];
524 c->coeffs[start +
i + 1] =
tmp[1];
526 }
527 /* Normalize */
528 for (
int i = 0;
i < count;
i++)
529 c->coeffs[start +
i] /= maxval;
530 }
531
533 const int s_unit, const int e_unit)
534 {
535 for (
int i = s_unit;
i < e_unit;
i++) {
538 for (int j = start; j < end; j++)
539 c->coeffs[j] *= sf[
i - s_unit];
540 }
541 }
542
544 const int stereo)
545 {
546 const int g_units[4] = { /* A, B, C, total units */
550 FFMAX(g_units[2], 22),
551 };
552
553 const int g_bins[4] = { /* A, B, C, total bins */
558 };
559
560 for (int ch = 0; ch <= stereo; ch++) {
562
563 /* Mirror the spectrum */
564 for (
int i = 0;
i < 3;
i++)
565 for (
int j = 0; j < (g_bins[
i + 1] - g_bins[
i + 0]); j++)
566 c->coeffs[g_bins[
i] + j] =
c->coeffs[g_bins[
i] - j - 1];
567
568 switch (
c->band_ext) {
569 case 0: {
570 float sf[6] = { 0.0f };
571 const int l = g_units[3] - g_units[0] - 1;
575 case 3:
581 break;
582 case 4:
588 break;
589 case 5:
593 break;
594 }
595
597
600 break;
601 }
602 case 1: {
603 float sf[6];
604 for (
int i = g_units[0];
i < g_units[3];
i++)
606
609 break;
610 }
611 case 2: {
612 const float g_sf[2] = {
615 };
616
617 for (
int i = 0;
i < 2;
i++)
618 for (
int j = g_bins[
i + 0]; j < g_bins[
i + 1]; j++)
619 c->coeffs[j] *= g_sf[
i];
620 break;
621 }
622 case 3: {
625 rate = pow(2, rate);
626 for (
int i = g_bins[0];
i < g_bins[3];
i++) {
629 }
630 break;
631 }
632 case 4: {
634 const float g_sf[3] = { 0.7079468f*m, 0.5011902f*m, 0.3548279f*m };
635
636 for (
int i = 0;
i < 3;
i++)
637 for (
int j = g_bins[
i + 0]; j < g_bins[
i + 1]; j++)
638 c->coeffs[j] *= g_sf[
i];
639 break;
640 }
641 }
642 }
643 }
644
647 int frame_idx, int block_idx)
648 {
652
655 const int precision = reuse_params ? 8 : 4;
656 c->q_unit_cnt =
b->q_unit_cnt = 2;
657
658 memset(
c->scalefactors, 0,
sizeof(
c->scalefactors));
659 memset(
c->q_coeffs_fine, 0,
sizeof(
c->q_coeffs_fine));
660 memset(
c->q_coeffs_coarse, 0,
sizeof(
c->q_coeffs_coarse));
661
662 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
664 c->precision_coarse[
i] = precision;
665 c->precision_fine[
i] = 0;
666 }
667
668 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
671 for (int j = start; j < end; j++)
672 c->q_coeffs_coarse[j] =
get_bits(gb,
c->precision_coarse[
i] + 1);
673 }
674
677
678 goto imdct;
679 }
680
681 if (first_in_pkt && reuse_params) {
684 }
685
686 /* Band parameters */
687 if (!reuse_params) {
688 int stereo_band, ext_band;
689 const int min_band_count =
s->samplerate_idx > 7 ? 1 : 3;
691 b->band_count =
get_bits(gb, 4) + min_band_count;
693
694 b->band_ext_q_unit =
b->stereo_q_unit =
b->q_unit_cnt;
695
700 }
701
702 if (stereo) {
703 stereo_band =
get_bits(gb, 4) + min_band_count;
704 if (stereo_band >
b->band_count) {
706 stereo_band);
708 }
710 }
711
713 if (
b->has_band_ext) {
714 ext_band =
get_bits(gb, 4) + min_band_count;
715 if (ext_band < b->band_count) {
717 ext_band);
719 }
721 }
723 }
727 }
728
729 /* Calculate bit alloc gradient */
732
733 /* IS data */
734 b->cpe_base_channel = 0;
735 if (stereo) {
738 for (
int i =
b->stereo_q_unit; i < b->q_unit_cnt;
i++)
740 } else {
743 }
744 }
745
746 /* Band extension */
749
750 /* Scalefactors */
751 for (
int i = 0;
i <= stereo;
i++) {
753 c->q_unit_cnt =
i ==
b->cpe_base_channel ?
b->q_unit_cnt :
757
763 }
764
765 b->q_unit_cnt_prev =
b->has_band_ext ?
b->band_ext_q_unit :
b->q_unit_cnt;
766
769
770 if (
b->has_band_ext &&
b->has_band_ext_data)
772
773 imdct:
774 for (
int i = 0;
i <= stereo;
i++) {
776 const int dst_idx =
s->block_config->plane_map[block_idx][
i];
777 const int wsize = 1 <<
s->frame_log2;
778 const ptrdiff_t
offset = wsize*frame_idx*
sizeof(
float);
779 float *dst = (
float *)(
frame->extended_data[dst_idx] +
offset);
780
781 s->imdct.imdct_half(&
s->imdct,
s->temp,
c->coeffs);
782 s->fdsp->vector_fmul_window(dst,
c->prev_win,
s->temp,
783 s->imdct_win, wsize >> 1);
784 memcpy(
c->prev_win,
s->temp + (wsize >> 1),
sizeof(
float)*wsize >> 1);
785 }
786
787 return 0;
788 }
789
791 int *got_frame_ptr,
AVPacket *avpkt)
792 {
797
802
804
806 for (
int j = 0; j <
s->block_config->count; j++) {
811 }
812 }
813
814 *got_frame_ptr = 1;
815
817 }
818
820 {
822
823 for (
int j = 0; j <
s->block_config->count; j++) {
826 for (
int i = 0;
i <= stereo;
i++) {
828 memset(
c->prev_win, 0,
sizeof(
c->prev_win));
829 }
830 }
831 }
832
834 {
836
839
840 return 0;
841 }
842
844 const uint8_t (**
tab)[2],
845 unsigned *buf_offset,
int offset)
846 {
848
852 &(*
tab)[0][1], 2, &(*
tab)[0][0], 2, 1,
856 }
857
859 {
860 const uint8_t (*
tab)[2];
862
863 /* Unsigned scalefactor VLCs */
865 for (
int i = 1;
i < 7;
i++) {
867
870 }
871
872 /* Signed scalefactor VLCs */
874 for (
int i = 2;
i < 6;
i++) {
876
877 /* The symbols are signed integers in the range -16..15;
878 * the values in the source table are offset by 16 to make
879 * them fit into an uint8_t; the -16 reverses this shift. */
882 }
883
884 /* Coefficient VLCs */
886 for (
int i = 0;
i < 2;
i++) {
887 for (int j = 2; j < 8; j++) {
888 for (
int k =
i; k < 4; k++) {
892 }
893 }
894 }
895 }
896
898 {
902 int version, block_config_idx, superframe_idx, alloc_c_len;
903
905
907
911 }
912
916 }
917
922 }
923
925
929 }
930
933
934 block_config_idx =
get_bits(&gb, 3);
935 if (block_config_idx > 5) {
938 }
940
942 avctx->
ch_layout =
s->block_config->channel_layout;
944
948 }
949
950 /* Average frame size in bytes */
951 s->avg_frame_size =
get_bits(&gb, 11) + 1;
952
954 if (superframe_idx & 1) {
957 }
958
959 s->frame_count = 1 << superframe_idx;
961
962 if (
ff_mdct_init(&
s->imdct,
s->frame_log2 + 1, 1, 1.0f / 32768.0f))
964
968
969 /* iMDCT window */
970 for (
int i = 0;
i < (1 <<
s->frame_log2);
i++) {
971 const int len = 1 <<
s->frame_log2;
972 const float sidx = (
i + 0.5f) /
len;
973 const float eidx = (
len -
i - 0.5f) /
len;
976 s->imdct_win[
i] = s_c / ((s_c * s_c) + (e_c * e_c));
977 }
978
979 /* Allocation curve */
981 for (
int i = 1;
i <= alloc_c_len;
i++)
982 for (
int j = 0; j <
i; j++)
984
986
987 return 0;
988 }
989
1002 };