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
25
34
35 #define ATRAC9_SF_VLC_BITS 8
36 #define ATRAC9_COEFF_VLC_BITS 9
37
44
48
50
53
57
60
61 /* Base */
65
66 /* Stereo block only */
68
69 /* Band extension only */
73
74 /* Gradient */
78
79 /* Stereo */
82
84
86
94
95 /* Set on init */
101
102 /* Generated on init */
105
108
111
114 {
115 int grad_range[2];
116 int grad_value[2];
118 uint8_t *curve;
120
124 grad_range[1] = 31;
126 grad_value[1] = 31;
127 } else {
129 grad_range[1] =
get_bits(gb, 6) + 1;
132 }
134
135 if (grad_range[0] >= grad_range[1] || grad_range[1] > 31)
137
138 if (
b->grad_boundary >
b->q_unit_cnt)
140
141 values = grad_value[1] - grad_value[0];
142 sign = 1 - 2*(
values < 0);
143 base = grad_value[0] + sign;
145 curve =
s->alloc_curve[grad_range[1] - grad_range[0] - 1];
146
147 for (
int i = 0;
i <=
b->q_unit_cnt;
i++)
148 b->gradient[
i] = grad_value[
i >= grad_range[0]];
149
150 for (
int i = grad_range[0];
i < grad_range[1];
i++)
151 b->gradient[
i] =
base + sign*((
int)(
scale*curve[
i - grad_range[0]]));
152
153 return 0;
154 }
155
158 {
159 memset(
c->precision_mask, 0,
sizeof(
c->precision_mask));
160 for (
int i = 1;
i <
b->q_unit_cnt;
i++) {
161 const int delta =
FFABS(
c->scalefactors[
i] -
c->scalefactors[
i - 1]) - 1;
163 const int neg =
c->scalefactors[
i - 1] >
c->scalefactors[
i];
165 }
166 }
167
169 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
170 c->precision_coarse[
i] =
c->scalefactors[
i];
171 c->precision_coarse[
i] +=
c->precision_mask[
i] -
b->gradient[
i];
172 if (
c->precision_coarse[
i] < 0)
173 continue;
174 switch (
b->grad_mode) {
175 case 1:
176 c->precision_coarse[
i] >>= 1;
177 break;
178 case 2:
179 c->precision_coarse[
i] = (3 *
c->precision_coarse[
i]) >> 3;
180 break;
181 case 3:
182 c->precision_coarse[
i] >>= 2;
183 break;
184 }
185 }
186 } else {
187 for (
int i = 0;
i <
b->q_unit_cnt;
i++)
188 c->precision_coarse[
i] =
c->scalefactors[
i] -
b->gradient[
i];
189 }
190
191
192 for (
int i = 0;
i <
b->q_unit_cnt;
i++)
193 c->precision_coarse[
i] =
FFMAX(
c->precision_coarse[
i], 1);
194
195 for (
int i = 0;
i <
b->grad_boundary;
i++)
196 c->precision_coarse[
i]++;
197
198 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
199 c->precision_fine[
i] = 0;
200 if (
c->precision_coarse[
i] > 15) {
201 c->precision_fine[
i] =
FFMIN(
c->precision_coarse[
i], 30) - 15;
202 c->precision_coarse[
i] = 15;
203 }
204 }
205 }
206
209 {
210 int ext_band = 0;
211
212 if (
b->has_band_ext) {
213 if (
b->q_unit_cnt < 13 ||
b->q_unit_cnt > 20)
216 if (stereo) {
217 b->channel[1].band_ext =
get_bits(gb, 2);
218 b->channel[1].band_ext = ext_band > 2 ?
b->channel[1].band_ext : 4;
219 } else {
221 }
222 }
223
225 if (!
b->has_band_ext_data)
226 return 0;
227
228 if (!
b->has_band_ext) {
231 return 0;
232 }
233
234 b->channel[0].band_ext =
get_bits(gb, 2);
235 b->channel[0].band_ext = ext_band > 2 ?
b->channel[0].band_ext : 4;
236
238 for (
int i = 0;
i <= stereo;
i++) {
241 for (int j = 0; j < count; j++) {
244 }
245 }
246
247 return 0;
248 }
249
250 for (
int i = 0;
i <= stereo;
i++) {
253 for (int j = 0; j < count; j++) {
256 }
257 }
258
259 return 0;
260 }
261
264 int channel_idx, int first_in_pkt)
265 {
266 static const uint8_t mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
267 const int mode = mode_map[channel_idx][
get_bits(gb, 2)];
268
269 memset(
c->scalefactors, 0,
sizeof(
c->scalefactors));
270
271 if (first_in_pkt && (
mode == 4 || ((
mode == 3) && !channel_idx))) {
274 }
275
277 case 0: { /* VLC delta offset */
282
284
285 for (
int i = 1;
i <
b->band_ext_q_unit;
i++) {
289 }
290
291 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
292 c->scalefactors[
i] +=
base - sf_weights[
i];
293
294 break;
295 }
296 case 1: { /* CLC offset */
299 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
301 break;
302 }
303 case 2:
304 case 4: { /* VLC dist to baseline */
305 const int *baseline =
mode == 4 ?
c->scalefactors_prev :
306 channel_idx ?
b->channel[0].scalefactors :
307 c->scalefactors_prev;
308 const int baseline_len =
mode == 4 ?
b->q_unit_cnt_prev :
309 channel_idx ?
b->band_ext_q_unit :
311
313 const int unit_cnt =
FFMIN(
b->band_ext_q_unit, baseline_len);
315
316 for (
int i = 0;
i < unit_cnt;
i++) {
318 c->scalefactors[
i] = baseline[
i] + dist;
319 }
320
321 for (
int i = unit_cnt;
i <
b->band_ext_q_unit;
i++)
323
324 break;
325 }
326 case 3: { /* VLC offset with baseline */
327 const int *baseline = channel_idx ?
b->channel[0].scalefactors :
328 c->scalefactors_prev;
329 const int baseline_len = channel_idx ?
b->band_ext_q_unit :
331
334 const int unit_cnt =
FFMIN(
b->band_ext_q_unit, baseline_len);
336
338
339 for (
int i = 1;
i < unit_cnt;
i++) {
343 }
344
345 for (
int i = 0;
i < unit_cnt;
i++)
346 c->scalefactors[
i] +=
base + baseline[
i];
347
348 for (
int i = unit_cnt;
i <
b->band_ext_q_unit;
i++)
350 break;
351 }
352 }
353
354 for (
int i = 0;
i <
b->band_ext_q_unit;
i++)
355 if (
c->scalefactors[
i] < 0 ||
c->scalefactors[
i] > 31)
357
358 memcpy(
c->scalefactors_prev,
c->scalefactors,
sizeof(
c->scalefactors));
359
360 return 0;
361 }
362
365 {
367 const int last_sf =
c->scalefactors[
c->q_unit_cnt];
368
369 memset(
c->codebookset, 0,
sizeof(
c->codebookset));
370
371 if (
c->q_unit_cnt <= 1)
372 return;
373 if (
s->samplerate_idx > 7)
374 return;
375
376 c->scalefactors[
c->q_unit_cnt] =
c->scalefactors[
c->q_unit_cnt - 1];
377
378 if (
c->q_unit_cnt > 12) {
379 for (
int i = 0;
i < 12;
i++)
380 avg +=
c->scalefactors[
i];
382 }
383
384 for (
int i = 8;
i <
c->q_unit_cnt;
i++) {
385 const int prev =
c->scalefactors[
i - 1];
386 const int cur =
c->scalefactors[
i ];
387 const int next =
c->scalefactors[
i + 1];
389 if ((cur -
min >= 3 || 2*cur - prev - next >= 3))
390 c->codebookset[
i] = 1;
391 }
392
393
394 for (
int i = 12;
i <
c->q_unit_cnt;
i++) {
395 const int cur =
c->scalefactors[
i];
397 const int min =
FFMIN(
c->scalefactors[
i + 1],
c->scalefactors[
i - 1]);
398 if (
c->codebookset[
i])
399 continue;
400
401 c->codebookset[
i] = (((cur -
min) >= 2) && (cur >= (
avg - cnd)));
402 }
403
404 c->scalefactors[
c->q_unit_cnt] = last_sf;
405 }
406
409 {
410 const int max_prec =
s->samplerate_idx > 7 ? 1 : 7;
411
412 memset(
c->q_coeffs_coarse, 0,
sizeof(
c->q_coeffs_coarse));
413
414 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
417 const int prec =
c->precision_coarse[
i] + 1;
418
419 if (prec <= max_prec) {
420 const int cb =
c->codebookset[
i];
425
426 for (int j = 0; j < groups; j++) {
428
429 for (
int k = 0; k < huff->
value_cnt; k++) {
432 }
433
435 }
436 } else {
437 for (
int j = 0; j <
bands; j++)
439 }
440 }
441 }
442
445 {
446 memset(
c->q_coeffs_fine, 0,
sizeof(
c->q_coeffs_fine));
447
448 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
451 const int len =
c->precision_fine[
i] + 1;
452
453 if (
c->precision_fine[
i] <= 0)
454 continue;
455
456 for (int j = start; j < end; j++)
458 }
459 }
460
463 {
464 memset(
c->coeffs, 0,
sizeof(
c->coeffs));
465
466 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
469
472
473 for (int j = start; j < end; j++) {
474 const float vc =
c->q_coeffs_coarse[j] * coarse_c;
475 const float vf =
c->q_coeffs_fine[j] * fine_c;
476 c->coeffs[j] = vc +
vf;
477 }
478 }
479 }
480
482 const int stereo)
483 {
484 float *
src =
b->channel[
b->cpe_base_channel].coeffs;
485 float *
dst =
b->channel[!
b->cpe_base_channel].coeffs;
486
487 if (!stereo)
488 return;
489
490 if (
b->q_unit_cnt <=
b->stereo_q_unit)
491 return;
492
493 for (
int i =
b->stereo_q_unit; i < b->q_unit_cnt;
i++) {
494 const int sign =
b->is_signs[
i];
497 for (int j = start; j < end; j++)
499 }
500 }
501
503 const int stereo)
504 {
505 for (
int i = 0;
i <= stereo;
i++) {
506 float *coeffs =
b->channel[
i].coeffs;
507 for (
int j = 0; j <
b->q_unit_cnt; j++) {
510 const int scalefactor =
b->channel[
i].scalefactors[j];
512 for (int k = start; k < end; k++)
514 }
515 }
516 }
517
519 int start, int count)
520 {
521 float maxval = 0.0f;
522 for (
int i = 0;
i < count;
i += 2) {
525 c->coeffs[start +
i + 0] =
tmp[0];
526 c->coeffs[start +
i + 1] =
tmp[1];
528 }
529 /* Normalize */
530 for (
int i = 0;
i < count;
i++)
531 c->coeffs[start +
i] /= maxval;
532 }
533
535 const int s_unit, const int e_unit)
536 {
537 for (
int i = s_unit;
i < e_unit;
i++) {
540 for (int j = start; j < end; j++)
541 c->coeffs[j] *= sf[
i - s_unit];
542 }
543 }
544
546 const int stereo)
547 {
548 const int g_units[4] = { /* A, B, C, total units */
552 FFMAX(g_units[2], 22),
553 };
554
555 const int g_bins[4] = { /* A, B, C, total bins */
560 };
561
562 for (int ch = 0; ch <= stereo; ch++) {
564
565 /* Mirror the spectrum */
566 for (
int i = 0;
i < 3;
i++)
567 for (
int j = 0; j < (g_bins[
i + 1] - g_bins[
i + 0]); j++)
568 c->coeffs[g_bins[
i] + j] =
c->coeffs[g_bins[
i] - j - 1];
569
570 switch (
c->band_ext) {
571 case 0: {
572 float sf[6] = { 0.0f };
573 const int l = g_units[3] - g_units[0] - 1;
577 case 3:
583 break;
584 case 4:
590 break;
591 case 5:
595 break;
596 }
597
599
602 break;
603 }
604 case 1: {
605 float sf[6];
606 for (
int i = g_units[0];
i < g_units[3];
i++)
608
611 break;
612 }
613 case 2: {
614 const float g_sf[2] = {
617 };
618
619 for (
int i = 0;
i < 2;
i++)
620 for (
int j = g_bins[
i + 0]; j < g_bins[
i + 1]; j++)
621 c->coeffs[j] *= g_sf[
i];
622 break;
623 }
624 case 3: {
627 rate = pow(2, rate);
628 for (
int i = g_bins[0];
i < g_bins[3];
i++) {
631 }
632 break;
633 }
634 case 4: {
636 const float g_sf[3] = { 0.7079468f*m, 0.5011902f*m, 0.3548279f*m };
637
638 for (
int i = 0;
i < 3;
i++)
639 for (
int j = g_bins[
i + 0]; j < g_bins[
i + 1]; j++)
640 c->coeffs[j] *= g_sf[
i];
641 break;
642 }
643 }
644 }
645 }
646
649 int frame_idx, int block_idx)
650 {
654
657 const int precision = reuse_params ? 8 : 4;
658 c->q_unit_cnt =
b->q_unit_cnt = 2;
659
660 memset(
c->scalefactors, 0,
sizeof(
c->scalefactors));
661 memset(
c->q_coeffs_fine, 0,
sizeof(
c->q_coeffs_fine));
662 memset(
c->q_coeffs_coarse, 0,
sizeof(
c->q_coeffs_coarse));
663
664 for (
int i = 0;
i <
b->q_unit_cnt;
i++) {
666 c->precision_coarse[
i] = precision;
667 c->precision_fine[
i] = 0;
668 }
669
670 for (
int i = 0;
i <
c->q_unit_cnt;
i++) {
673 for (int j = start; j < end; j++)
674 c->q_coeffs_coarse[j] =
get_bits(gb,
c->precision_coarse[
i] + 1);
675 }
676
679
680 goto imdct;
681 }
682
683 if (first_in_pkt && reuse_params) {
686 }
687
688 /* Band parameters */
689 if (!reuse_params) {
690 int stereo_band, ext_band;
691 const int min_band_count =
s->samplerate_idx > 7 ? 1 : 3;
693 b->band_count =
get_bits(gb, 4) + min_band_count;
695
696 b->band_ext_q_unit =
b->stereo_q_unit =
b->q_unit_cnt;
697
702 }
703
704 if (stereo) {
705 stereo_band =
get_bits(gb, 4) + min_band_count;
706 if (stereo_band >
b->band_count) {
708 stereo_band);
710 }
712 }
713
715 if (
b->has_band_ext) {
716 ext_band =
get_bits(gb, 4) + min_band_count;
717 if (ext_band < b->band_count) {
719 ext_band);
721 }
723 }
725 }
729 }
730
731 /* Calculate bit alloc gradient */
734
735 /* IS data */
736 b->cpe_base_channel = 0;
737 if (stereo) {
740 for (
int i =
b->stereo_q_unit; i < b->q_unit_cnt;
i++)
742 } else {
745 }
746 }
747
748 /* Band extension */
751
752 /* Scalefactors */
753 for (
int i = 0;
i <= stereo;
i++) {
755 c->q_unit_cnt =
i ==
b->cpe_base_channel ?
b->q_unit_cnt :
759
765 }
766
767 b->q_unit_cnt_prev =
b->has_band_ext ?
b->band_ext_q_unit :
b->q_unit_cnt;
768
771
772 if (
b->has_band_ext &&
b->has_band_ext_data)
774
775 imdct:
776 for (
int i = 0;
i <= stereo;
i++) {
778 const int dst_idx =
s->block_config->plane_map[block_idx][
i];
779 const int wsize = 1 <<
s->frame_log2;
780 const ptrdiff_t
offset = wsize*frame_idx*
sizeof(
float);
782
783 s->tx_fn(
s->tx,
s->temp,
c->coeffs,
sizeof(
float));
784 s->fdsp->vector_fmul_window(
dst,
c->prev_win,
s->temp,
785 s->imdct_win, wsize >> 1);
786 memcpy(
c->prev_win,
s->temp + (wsize >> 1),
sizeof(
float)*wsize >> 1);
787 }
788
789 return 0;
790 }
791
793 int *got_frame_ptr,
AVPacket *avpkt)
794 {
799
804
808
810 for (
int j = 0; j <
s->block_config->count; j++) {
815 }
816 }
817
818 *got_frame_ptr = 1;
819
821 }
822
824 {
826
827 for (
int j = 0; j <
s->block_config->count; j++) {
830 for (
int i = 0;
i <= stereo;
i++) {
832 memset(
c->prev_win, 0,
sizeof(
c->prev_win));
833 }
834 }
835 }
836
838 {
840
843
844 return 0;
845 }
846
848 int nb_bits, int nb_codes,
850 {
852
857 }
858
860 {
863 const uint8_t (*
tab)[2];
864
865 /* Unsigned scalefactor VLCs */
867 for (
int i = 1;
i < 7;
i++) {
869
872 }
873
874 /* Signed scalefactor VLCs */
876 for (
int i = 2;
i < 6;
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. */
883 hf->size, &
tab, -16);
884 }
885
886 /* Coefficient VLCs */
888 for (
int i = 0;
i < 2;
i++) {
889 for (int j = 2; j < 8; j++) {
890 for (
int k =
i; k < 4; k++) {
894 }
895 }
896 }
897 }
898
900 {
905 int err,
version, block_config_idx, superframe_idx, alloc_c_len;
906
908
910
914 }
915
919 }
920
925 }
926
928 if (err < 0)
929 return err;
930
934 }
935
938
939 block_config_idx =
get_bits(&gb, 3);
940 if (block_config_idx > 5) {
943 }
945
947 avctx->
ch_layout =
s->block_config->channel_layout;
949
953 }
954
955 /* Average frame size in bytes */
956 s->avg_frame_size =
get_bits(&gb, 11) + 1;
957
959 if (superframe_idx & 1) {
962 }
963
964 s->frame_count = 1 << superframe_idx;
966
967 scale = 1.0f / 32768.0;
969 1 <<
s->frame_log2, &
scale, 0);
970 if (err < 0)
971 return err;
972
976
977 /* iMDCT window */
978 for (
int i = 0;
i < (1 <<
s->frame_log2);
i++) {
979 const int len = 1 <<
s->frame_log2;
980 const float sidx = (
i + 0.5f) /
len;
981 const float eidx = (
len -
i - 0.5f) /
len;
984 s->imdct_win[
i] = s_c / ((s_c * s_c) + (e_c * e_c));
985 }
986
987 /* Allocation curve */
989 for (
int i = 1;
i <= alloc_c_len;
i++)
990 for (
int j = 0; j <
i; j++)
992
994
995 return 0;
996 }
997
1010 };