2 * ATRAC3 compatible decoder
3 * Copyright (c) 2006-2008 Maxim Poliakovski
4 * Copyright (c) 2006-2008 Benjamin Larsson
6 * This file is part of Libav.
8 * Libav is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * Libav is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with Libav; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * ATRAC3 compatible decoder.
26 * This decoder handles Sony's ATRAC3 data.
28 * Container formats used to store ATRAC3 data:
29 * RealMedia (.rm), RIFF WAV (.wav, .at3), Sony OpenMG (.oma, .aa3).
31 * To use this decoder, a calling application must supply the extradata
32 * bytes provided in the containers above.
39 #include "libavutil/attributes.h"
40 #include "libavutil/float_dsp.h"
43 #include "bitstream.h"
44 #include "bytestream.h"
50 #include "atrac3data.h"
52 #define JOINT_STEREO 0x12
55 #define SAMPLES_PER_FRAME 1024
58 typedef struct GainBlock
{
59 AtracGainInfo g_block
[4];
62 typedef struct TonalComponent
{
68 typedef struct ChannelUnit
{
71 float prev_frame
[SAMPLES_PER_FRAME
];
73 TonalComponent components
[64];
74 GainBlock gain_block
[2];
76 DECLARE_ALIGNED(32, float, spectrum
)[SAMPLES_PER_FRAME
];
77 DECLARE_ALIGNED(32, float, imdct_buf
)[SAMPLES_PER_FRAME
];
79 float delay_buf1
[46]; ///<qmf delay buffers
84 typedef struct ATRAC3Context
{
93 /** joint-stereo related variables */
94 int matrix_coeff_index_prev
[4];
95 int matrix_coeff_index_now
[4];
96 int matrix_coeff_index_next
[4];
97 int weighting_delay
[6];
101 uint8_t *decoded_bytes_buffer
;
102 float temp_buf
[1070];
106 int scrambled_stream
;
109 AtracGCContext gainc_ctx
;
111 AVFloatDSPContext fdsp
;
114 static DECLARE_ALIGNED(32, float, mdct_window
)[MDCT_SIZE
];
115 static VLC_TYPE atrac3_vlc_table
[4096][2];
116 static VLC spectral_coeff_tab
[7];
119 * Regular 512 points IMDCT without overlapping, with the exception of the
120 * swapping of odd bands caused by the reverse spectra of the QMF.
122 * @param odd_band 1 if the band is an odd band
124 static void imlt(ATRAC3Context
*q
, float *input
, float *output
, int odd_band
)
130 * Reverse the odd bands before IMDCT, this is an effect of the QMF
131 * transform or it gives better compression to do it this way.
132 * FIXME: It should be possible to handle this in imdct_calc
133 * for that to happen a modification of the prerotation step of
134 * all SIMD code and C code is needed.
135 * Or fix the functions before so they generate a pre reversed spectrum.
137 for (i
= 0; i
< 128; i
++)
138 FFSWAP(float, input
[i
], input
[255 - i
]);
141 q
->mdct_ctx
.imdct_calc(&q
->mdct_ctx
, output
, input
);
143 /* Perform windowing on the output. */
144 q
->fdsp
.vector_fmul(output
, output
, mdct_window
, MDCT_SIZE
);
148 * indata descrambling, only used for data coming from the rm container
150 static int decode_bytes(const uint8_t *input
, uint8_t *out
, int bytes
)
155 uint32_t *output
= (uint32_t *)out
;
157 off
= (intptr_t)input
& 3;
158 buf
= (const uint32_t *)(input
- off
);
160 c
= av_be2ne32((0x537F6103U
>> (off
* 8)) | (0x537F6103U
<< (32 - (off
* 8))));
162 c
= av_be2ne32(0x537F6103U
);
164 for (i
= 0; i
< bytes
/ 4; i
++)
165 output
[i
] = c
^ buf
[i
];
168 avpriv_request_sample(NULL
, "Offset of %d", off
);
173 static av_cold
void init_imdct_window(void)
177 /* generate the mdct window, for details see
178 * http://wiki.multimedia.cx/index.php?title=RealAudio_atrc#Windows */
179 for (i
= 0, j
= 255; i
< 128; i
++, j
--) {
180 float wi
= sin(((i
+ 0.5) / 256.0 - 0.5) * M_PI
) + 1.0;
181 float wj
= sin(((j
+ 0.5) / 256.0 - 0.5) * M_PI
) + 1.0;
182 float w
= 0.5 * (wi
* wi
+ wj
* wj
);
183 mdct_window
[i
] = mdct_window
[511 - i
] = wi
/ w
;
184 mdct_window
[j
] = mdct_window
[511 - j
] = wj
/ w
;
188 static av_cold
int atrac3_decode_close(AVCodecContext
*avctx
)
190 ATRAC3Context
*q
= avctx
->priv_data
;
193 av_free(q
->decoded_bytes_buffer
);
195 ff_mdct_end(&q
->mdct_ctx
);
203 * @param selector which table the output values are coded with
204 * @param coding_flag constant length coding or variable length coding
205 * @param mantissas mantissa output table
206 * @param num_codes number of values to get
208 static void read_quant_spectral_coeffs(BitstreamContext
*bc
, int selector
,
209 int coding_flag
, int *mantissas
,
212 int i
, code
, huff_symb
;
217 if (coding_flag
!= 0) {
218 /* constant length coding (CLC) */
219 int num_bits
= clc_length_tab
[selector
];
222 for (i
= 0; i
< num_codes
; i
++) {
224 code
= bitstream_read_signed(bc
, num_bits
);
230 for (i
= 0; i
< num_codes
; i
++) {
232 code
= bitstream_read(bc
, num_bits
); // num_bits is always 4 in this case
235 mantissas
[i
* 2 ] = mantissa_clc_tab
[code
>> 2];
236 mantissas
[i
* 2 + 1] = mantissa_clc_tab
[code
& 3];
240 /* variable length coding (VLC) */
242 for (i
= 0; i
< num_codes
; i
++) {
243 huff_symb
= bitstream_read_vlc(bc
, spectral_coeff_tab
[selector
-1].table
,
244 spectral_coeff_tab
[selector
-1].bits
, 3);
246 code
= huff_symb
>> 1;
252 for (i
= 0; i
< num_codes
; i
++) {
253 huff_symb
= bitstream_read_vlc(bc
, spectral_coeff_tab
[selector
- 1].table
,
254 spectral_coeff_tab
[selector
- 1].bits
, 3);
255 mantissas
[i
* 2 ] = mantissa_vlc_tab
[huff_symb
* 2 ];
256 mantissas
[i
* 2 + 1] = mantissa_vlc_tab
[huff_symb
* 2 + 1];
263 * Restore the quantized band spectrum coefficients
265 * @return subband count, fix for broken specification/files
267 static int decode_spectrum(BitstreamContext
*bc
, float *output
)
269 int num_subbands
, coding_mode
, i
, j
, first
, last
, subband_size
;
270 int subband_vlc_index
[32], sf_index
[32];
274 num_subbands
= bitstream_read(bc
, 5); // number of coded subbands
275 coding_mode
= bitstream_read_bit(bc
); // coding Mode: 0 - VLC/ 1 - CLC
277 /* get the VLC selector table for the subbands, 0 means not coded */
278 for (i
= 0; i
<= num_subbands
; i
++)
279 subband_vlc_index
[i
] = bitstream_read(bc
, 3);
281 /* read the scale factor indexes from the stream */
282 for (i
= 0; i
<= num_subbands
; i
++) {
283 if (subband_vlc_index
[i
] != 0)
284 sf_index
[i
] = bitstream_read(bc
, 6);
287 for (i
= 0; i
<= num_subbands
; i
++) {
288 first
= subband_tab
[i
];
289 last
= subband_tab
[i
+ 1];
291 subband_size
= last
- first
;
293 if (subband_vlc_index
[i
] != 0) {
294 /* decode spectral coefficients for this subband */
295 /* TODO: This can be done faster is several blocks share the
296 * same VLC selector (subband_vlc_index) */
297 read_quant_spectral_coeffs(bc
, subband_vlc_index
[i
], coding_mode
,
298 mantissas
, subband_size
);
300 /* decode the scale factor for this subband */
301 scale_factor
= ff_atrac_sf_table
[sf_index
[i
]] *
302 inv_max_quant
[subband_vlc_index
[i
]];
304 /* inverse quantize the coefficients */
305 for (j
= 0; first
< last
; first
++, j
++)
306 output
[first
] = mantissas
[j
] * scale_factor
;
308 /* this subband was not coded, so zero the entire subband */
309 memset(output
+ first
, 0, subband_size
* sizeof(*output
));
313 /* clear the subbands that were not coded */
314 first
= subband_tab
[i
];
315 memset(output
+ first
, 0, (SAMPLES_PER_FRAME
- first
) * sizeof(*output
));
320 * Restore the quantized tonal components
322 * @param components tonal components
323 * @param num_bands number of coded bands
325 static int decode_tonal_components(BitstreamContext
*bc
,
326 TonalComponent
*components
, int num_bands
)
329 int nb_components
, coding_mode_selector
, coding_mode
;
330 int band_flags
[4], mantissa
[8];
331 int component_count
= 0;
333 nb_components
= bitstream_read(bc
, 5);
335 /* no tonal components */
336 if (nb_components
== 0)
339 coding_mode_selector
= bitstream_read(bc
, 2);
340 if (coding_mode_selector
== 2)
341 return AVERROR_INVALIDDATA
;
343 coding_mode
= coding_mode_selector
& 1;
345 for (i
= 0; i
< nb_components
; i
++) {
346 int coded_values_per_component
, quant_step_index
;
348 for (b
= 0; b
<= num_bands
; b
++)
349 band_flags
[b
] = bitstream_read_bit(bc
);
351 coded_values_per_component
= bitstream_read(bc
, 3);
353 quant_step_index
= bitstream_read(bc
, 3);
354 if (quant_step_index
<= 1)
355 return AVERROR_INVALIDDATA
;
357 if (coding_mode_selector
== 3)
358 coding_mode
= bitstream_read_bit(bc
);
360 for (b
= 0; b
< (num_bands
+ 1) * 4; b
++) {
361 int coded_components
;
363 if (band_flags
[b
>> 2] == 0)
366 coded_components
= bitstream_read(bc
, 3);
368 for (c
= 0; c
< coded_components
; c
++) {
369 TonalComponent
*cmp
= &components
[component_count
];
370 int sf_index
, coded_values
, max_coded_values
;
373 sf_index
= bitstream_read(bc
, 6);
374 if (component_count
>= 64)
375 return AVERROR_INVALIDDATA
;
377 cmp
->pos
= b
* 64 + bitstream_read(bc
, 6);
379 max_coded_values
= SAMPLES_PER_FRAME
- cmp
->pos
;
380 coded_values
= coded_values_per_component
+ 1;
381 coded_values
= FFMIN(max_coded_values
, coded_values
);
383 scale_factor
= ff_atrac_sf_table
[sf_index
] *
384 inv_max_quant
[quant_step_index
];
386 read_quant_spectral_coeffs(bc
, quant_step_index
, coding_mode
,
387 mantissa
, coded_values
);
389 cmp
->num_coefs
= coded_values
;
392 for (m
= 0; m
< coded_values
; m
++)
393 cmp
->coef
[m
] = mantissa
[m
] * scale_factor
;
400 return component_count
;
404 * Decode gain parameters for the coded bands
406 * @param block the gainblock for the current band
407 * @param num_bands amount of coded bands
409 static int decode_gain_control(BitstreamContext
*bc
, GainBlock
*block
,
415 AtracGainInfo
*gain
= block
->g_block
;
417 for (i
= 0; i
<= num_bands
; i
++) {
418 gain
[i
].num_points
= bitstream_read(bc
, 3);
419 level
= gain
[i
].lev_code
;
420 loc
= gain
[i
].loc_code
;
422 for (j
= 0; j
< gain
[i
].num_points
; j
++) {
423 level
[j
] = bitstream_read(bc
, 4);
424 loc
[j
] = bitstream_read(bc
, 5);
425 if (j
&& loc
[j
] <= loc
[j
- 1])
426 return AVERROR_INVALIDDATA
;
430 /* Clear the unused blocks. */
432 gain
[i
].num_points
= 0;
438 * Combine the tonal band spectrum and regular band spectrum
440 * @param spectrum output spectrum buffer
441 * @param num_components number of tonal components
442 * @param components tonal components for this band
443 * @return position of the last tonal coefficient
445 static int add_tonal_components(float *spectrum
, int num_components
,
446 TonalComponent
*components
)
448 int i
, j
, last_pos
= -1;
449 float *input
, *output
;
451 for (i
= 0; i
< num_components
; i
++) {
452 last_pos
= FFMAX(components
[i
].pos
+ components
[i
].num_coefs
, last_pos
);
453 input
= components
[i
].coef
;
454 output
= &spectrum
[components
[i
].pos
];
456 for (j
= 0; j
< components
[i
].num_coefs
; j
++)
457 output
[j
] += input
[j
];
463 #define INTERPOLATE(old, new, nsample) \
464 ((old) + (nsample) * 0.125 * ((new) - (old)))
466 static void reverse_matrixing(float *su1
, float *su2
, int *prev_code
,
469 int i
, nsample
, band
;
470 float mc1_l
, mc1_r
, mc2_l
, mc2_r
;
472 for (i
= 0, band
= 0; band
< 4 * 256; band
+= 256, i
++) {
473 int s1
= prev_code
[i
];
474 int s2
= curr_code
[i
];
478 /* Selector value changed, interpolation needed. */
479 mc1_l
= matrix_coeffs
[s1
* 2 ];
480 mc1_r
= matrix_coeffs
[s1
* 2 + 1];
481 mc2_l
= matrix_coeffs
[s2
* 2 ];
482 mc2_r
= matrix_coeffs
[s2
* 2 + 1];
484 /* Interpolation is done over the first eight samples. */
485 for (; nsample
< band
+ 8; nsample
++) {
486 float c1
= su1
[nsample
];
487 float c2
= su2
[nsample
];
488 c2
= c1
* INTERPOLATE(mc1_l
, mc2_l
, nsample
- band
) +
489 c2
* INTERPOLATE(mc1_r
, mc2_r
, nsample
- band
);
491 su2
[nsample
] = c1
* 2.0 - c2
;
495 /* Apply the matrix without interpolation. */
497 case 0: /* M/S decoding */
498 for (; nsample
< band
+ 256; nsample
++) {
499 float c1
= su1
[nsample
];
500 float c2
= su2
[nsample
];
501 su1
[nsample
] = c2
* 2.0;
502 su2
[nsample
] = (c1
- c2
) * 2.0;
506 for (; nsample
< band
+ 256; nsample
++) {
507 float c1
= su1
[nsample
];
508 float c2
= su2
[nsample
];
509 su1
[nsample
] = (c1
+ c2
) * 2.0;
510 su2
[nsample
] = c2
* -2.0;
515 for (; nsample
< band
+ 256; nsample
++) {
516 float c1
= su1
[nsample
];
517 float c2
= su2
[nsample
];
518 su1
[nsample
] = c1
+ c2
;
519 su2
[nsample
] = c1
- c2
;
528 static void get_channel_weights(int index
, int flag
, float ch
[2])
534 ch
[0] = (index
& 7) / 7.0;
535 ch
[1] = sqrt(2 - ch
[0] * ch
[0]);
537 FFSWAP(float, ch
[0], ch
[1]);
541 static void channel_weighting(float *su1
, float *su2
, int *p3
)
544 /* w[x][y] y=0 is left y=1 is right */
547 if (p3
[1] != 7 || p3
[3] != 7) {
548 get_channel_weights(p3
[1], p3
[0], w
[0]);
549 get_channel_weights(p3
[3], p3
[2], w
[1]);
551 for (band
= 256; band
< 4 * 256; band
+= 256) {
552 for (nsample
= band
; nsample
< band
+ 8; nsample
++) {
553 su1
[nsample
] *= INTERPOLATE(w
[0][0], w
[0][1], nsample
- band
);
554 su2
[nsample
] *= INTERPOLATE(w
[1][0], w
[1][1], nsample
- band
);
556 for(; nsample
< band
+ 256; nsample
++) {
557 su1
[nsample
] *= w
[1][0];
558 su2
[nsample
] *= w
[1][1];
565 * Decode a Sound Unit
567 * @param snd the channel unit to be used
568 * @param output the decoded samples before IQMF in float representation
569 * @param channel_num channel number
570 * @param coding_mode the coding mode (JOINT_STEREO or regular stereo/mono)
572 static int decode_channel_sound_unit(ATRAC3Context
*q
, BitstreamContext
*bc
,
573 ChannelUnit
*snd
, float *output
,
574 int channel_num
, int coding_mode
)
576 int band
, ret
, num_subbands
, last_tonal
, num_bands
;
577 GainBlock
*gain1
= &snd
->gain_block
[ snd
->gc_blk_switch
];
578 GainBlock
*gain2
= &snd
->gain_block
[1 - snd
->gc_blk_switch
];
580 if (coding_mode
== JOINT_STEREO
&& channel_num
== 1) {
581 if (bitstream_read(bc
, 2) != 3) {
582 av_log(NULL
,AV_LOG_ERROR
,"JS mono Sound Unit id != 3.\n");
583 return AVERROR_INVALIDDATA
;
586 if (bitstream_read(bc
, 6) != 0x28) {
587 av_log(NULL
,AV_LOG_ERROR
,"Sound Unit id != 0x28.\n");
588 return AVERROR_INVALIDDATA
;
592 /* number of coded QMF bands */
593 snd
->bands_coded
= bitstream_read(bc
, 2);
595 ret
= decode_gain_control(bc
, gain2
, snd
->bands_coded
);
599 snd
->num_components
= decode_tonal_components(bc
, snd
->components
,
601 if (snd
->num_components
< 0)
602 return snd
->num_components
;
604 num_subbands
= decode_spectrum(bc
, snd
->spectrum
);
606 /* Merge the decoded spectrum and tonal components. */
607 last_tonal
= add_tonal_components(snd
->spectrum
, snd
->num_components
,
611 /* calculate number of used MLT/QMF bands according to the amount of coded
613 num_bands
= (subband_tab
[num_subbands
] - 1) >> 8;
615 num_bands
= FFMAX((last_tonal
+ 256) >> 8, num_bands
);
618 /* Reconstruct time domain samples. */
619 for (band
= 0; band
< 4; band
++) {
620 /* Perform the IMDCT step without overlapping. */
621 if (band
<= num_bands
)
622 imlt(q
, &snd
->spectrum
[band
* 256], snd
->imdct_buf
, band
& 1);
624 memset(snd
->imdct_buf
, 0, 512 * sizeof(*snd
->imdct_buf
));
626 /* gain compensation and overlapping */
627 ff_atrac_gain_compensation(&q
->gainc_ctx
, snd
->imdct_buf
,
628 &snd
->prev_frame
[band
* 256],
629 &gain1
->g_block
[band
], &gain2
->g_block
[band
],
630 256, &output
[band
* 256]);
633 /* Swap the gain control buffers for the next frame. */
634 snd
->gc_blk_switch
^= 1;
639 static int decode_frame(AVCodecContext
*avctx
, const uint8_t *databuf
,
642 ATRAC3Context
*q
= avctx
->priv_data
;
646 if (q
->coding_mode
== JOINT_STEREO
) {
647 /* channel coupling mode */
648 /* decode Sound Unit 1 */
649 bitstream_init8(&q
->bc
, databuf
, avctx
->block_align
);
651 ret
= decode_channel_sound_unit(q
, &q
->bc
, q
->units
, out_samples
[0], 0,
656 /* Framedata of the su2 in the joint-stereo mode is encoded in
657 * reverse byte order so we need to swap it first. */
658 if (databuf
== q
->decoded_bytes_buffer
) {
659 uint8_t *ptr2
= q
->decoded_bytes_buffer
+ avctx
->block_align
- 1;
660 ptr1
= q
->decoded_bytes_buffer
;
661 for (i
= 0; i
< avctx
->block_align
/ 2; i
++, ptr1
++, ptr2
--)
662 FFSWAP(uint8_t, *ptr1
, *ptr2
);
664 const uint8_t *ptr2
= databuf
+ avctx
->block_align
- 1;
665 for (i
= 0; i
< avctx
->block_align
; i
++)
666 q
->decoded_bytes_buffer
[i
] = *ptr2
--;
669 /* Skip the sync codes (0xF8). */
670 ptr1
= q
->decoded_bytes_buffer
;
671 for (i
= 4; *ptr1
== 0xF8; i
++, ptr1
++) {
672 if (i
>= avctx
->block_align
)
673 return AVERROR_INVALIDDATA
;
677 /* set the bitstream reader at the start of the second Sound Unit*/
678 bitstream_init8(&q
->bc
, ptr1
, avctx
->block_align
- i
);
680 /* Fill the Weighting coeffs delay buffer */
681 memmove(q
->weighting_delay
, &q
->weighting_delay
[2],
682 4 * sizeof(*q
->weighting_delay
));
683 q
->weighting_delay
[4] = bitstream_read_bit(&q
->bc
);
684 q
->weighting_delay
[5] = bitstream_read(&q
->bc
, 3);
686 for (i
= 0; i
< 4; i
++) {
687 q
->matrix_coeff_index_prev
[i
] = q
->matrix_coeff_index_now
[i
];
688 q
->matrix_coeff_index_now
[i
] = q
->matrix_coeff_index_next
[i
];
689 q
->matrix_coeff_index_next
[i
] = bitstream_read(&q
->bc
, 2);
692 /* Decode Sound Unit 2. */
693 ret
= decode_channel_sound_unit(q
, &q
->bc
, &q
->units
[1],
694 out_samples
[1], 1, JOINT_STEREO
);
698 /* Reconstruct the channel coefficients. */
699 reverse_matrixing(out_samples
[0], out_samples
[1],
700 q
->matrix_coeff_index_prev
,
701 q
->matrix_coeff_index_now
);
703 channel_weighting(out_samples
[0], out_samples
[1], q
->weighting_delay
);
705 /* normal stereo mode or mono */
706 /* Decode the channel sound units. */
707 for (i
= 0; i
< avctx
->channels
; i
++) {
708 /* Set the bitstream reader at the start of a channel sound unit. */
709 bitstream_init8(&q
->bc
,
710 databuf
+ i
* avctx
->block_align
/ avctx
->channels
,
711 avctx
->block_align
/ avctx
->channels
);
713 ret
= decode_channel_sound_unit(q
, &q
->bc
, &q
->units
[i
],
714 out_samples
[i
], i
, q
->coding_mode
);
720 /* Apply the iQMF synthesis filter. */
721 for (i
= 0; i
< avctx
->channels
; i
++) {
722 float *p1
= out_samples
[i
];
723 float *p2
= p1
+ 256;
724 float *p3
= p2
+ 256;
725 float *p4
= p3
+ 256;
726 ff_atrac_iqmf(p1
, p2
, 256, p1
, q
->units
[i
].delay_buf1
, q
->temp_buf
);
727 ff_atrac_iqmf(p4
, p3
, 256, p3
, q
->units
[i
].delay_buf2
, q
->temp_buf
);
728 ff_atrac_iqmf(p1
, p3
, 512, p1
, q
->units
[i
].delay_buf3
, q
->temp_buf
);
734 static int atrac3_decode_frame(AVCodecContext
*avctx
, void *data
,
735 int *got_frame_ptr
, AVPacket
*avpkt
)
737 AVFrame
*frame
= data
;
738 const uint8_t *buf
= avpkt
->data
;
739 int buf_size
= avpkt
->size
;
740 ATRAC3Context
*q
= avctx
->priv_data
;
742 const uint8_t *databuf
;
744 if (buf_size
< avctx
->block_align
) {
745 av_log(avctx
, AV_LOG_ERROR
,
746 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
747 return AVERROR_INVALIDDATA
;
750 /* get output buffer */
751 frame
->nb_samples
= SAMPLES_PER_FRAME
;
752 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0) {
753 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
757 /* Check if we need to descramble and what buffer to pass on. */
758 if (q
->scrambled_stream
) {
759 decode_bytes(buf
, q
->decoded_bytes_buffer
, avctx
->block_align
);
760 databuf
= q
->decoded_bytes_buffer
;
765 ret
= decode_frame(avctx
, databuf
, (float **)frame
->extended_data
);
767 av_log(NULL
, AV_LOG_ERROR
, "Frame decoding error!\n");
773 return avctx
->block_align
;
776 static av_cold
void atrac3_init_static_data(AVCodec
*codec
)
781 ff_atrac_generate_tables();
783 /* Initialize the VLC tables. */
784 for (i
= 0; i
< 7; i
++) {
785 spectral_coeff_tab
[i
].table
= &atrac3_vlc_table
[atrac3_vlc_offs
[i
]];
786 spectral_coeff_tab
[i
].table_allocated
= atrac3_vlc_offs
[i
+ 1] -
788 init_vlc(&spectral_coeff_tab
[i
], 9, huff_tab_sizes
[i
],
790 huff_codes
[i
], 1, 1, INIT_VLC_USE_NEW_STATIC
);
794 static av_cold
int atrac3_decode_init(AVCodecContext
*avctx
)
797 int version
, delay
, samples_per_frame
, frame_factor
;
798 const uint8_t *edata_ptr
= avctx
->extradata
;
799 ATRAC3Context
*q
= avctx
->priv_data
;
801 if (avctx
->channels
<= 0 || avctx
->channels
> 2) {
802 av_log(avctx
, AV_LOG_ERROR
, "Channel configuration error!\n");
803 return AVERROR(EINVAL
);
806 /* Take care of the codec-specific extradata. */
807 if (avctx
->extradata_size
== 14) {
808 /* Parse the extradata, WAV format */
809 av_log(avctx
, AV_LOG_DEBUG
, "[0-1] %d\n",
810 bytestream_get_le16(&edata_ptr
)); // Unknown value always 1
811 edata_ptr
+= 4; // samples per channel
812 q
->coding_mode
= bytestream_get_le16(&edata_ptr
);
813 av_log(avctx
, AV_LOG_DEBUG
,"[8-9] %d\n",
814 bytestream_get_le16(&edata_ptr
)); //Dupe of coding mode
815 frame_factor
= bytestream_get_le16(&edata_ptr
); // Unknown always 1
816 av_log(avctx
, AV_LOG_DEBUG
,"[12-13] %d\n",
817 bytestream_get_le16(&edata_ptr
)); // Unknown always 0
820 samples_per_frame
= SAMPLES_PER_FRAME
* avctx
->channels
;
823 q
->coding_mode
= q
->coding_mode
? JOINT_STEREO
: STEREO
;
824 q
->scrambled_stream
= 0;
826 if (avctx
->block_align
!= 96 * avctx
->channels
* frame_factor
&&
827 avctx
->block_align
!= 152 * avctx
->channels
* frame_factor
&&
828 avctx
->block_align
!= 192 * avctx
->channels
* frame_factor
) {
829 av_log(avctx
, AV_LOG_ERROR
, "Unknown frame/channel/frame_factor "
830 "configuration %d/%d/%d\n", avctx
->block_align
,
831 avctx
->channels
, frame_factor
);
832 return AVERROR_INVALIDDATA
;
834 } else if (avctx
->extradata_size
== 10) {
835 /* Parse the extradata, RM format. */
836 version
= bytestream_get_be32(&edata_ptr
);
837 samples_per_frame
= bytestream_get_be16(&edata_ptr
);
838 delay
= bytestream_get_be16(&edata_ptr
);
839 q
->coding_mode
= bytestream_get_be16(&edata_ptr
);
840 q
->scrambled_stream
= 1;
843 av_log(NULL
, AV_LOG_ERROR
, "Unknown extradata size %d.\n",
844 avctx
->extradata_size
);
845 return AVERROR(EINVAL
);
848 /* Check the extradata */
851 av_log(avctx
, AV_LOG_ERROR
, "Version %d != 4.\n", version
);
852 return AVERROR_INVALIDDATA
;
855 if (samples_per_frame
!= SAMPLES_PER_FRAME
&&
856 samples_per_frame
!= SAMPLES_PER_FRAME
* 2) {
857 av_log(avctx
, AV_LOG_ERROR
, "Unknown amount of samples per frame %d.\n",
859 return AVERROR_INVALIDDATA
;
862 if (delay
!= 0x88E) {
863 av_log(avctx
, AV_LOG_ERROR
, "Unknown amount of delay %x != 0x88E.\n",
865 return AVERROR_INVALIDDATA
;
868 if (q
->coding_mode
== STEREO
)
869 av_log(avctx
, AV_LOG_DEBUG
, "Normal stereo detected.\n");
870 else if (q
->coding_mode
== JOINT_STEREO
) {
871 if (avctx
->channels
!= 2)
872 return AVERROR_INVALIDDATA
;
873 av_log(avctx
, AV_LOG_DEBUG
, "Joint stereo detected.\n");
875 av_log(avctx
, AV_LOG_ERROR
, "Unknown channel coding mode %x!\n",
877 return AVERROR_INVALIDDATA
;
880 if (avctx
->block_align
>= UINT_MAX
/ 2)
881 return AVERROR(EINVAL
);
883 q
->decoded_bytes_buffer
= av_mallocz(FFALIGN(avctx
->block_align
, 4) +
884 AV_INPUT_BUFFER_PADDING_SIZE
);
885 if (!q
->decoded_bytes_buffer
)
886 return AVERROR(ENOMEM
);
888 avctx
->sample_fmt
= AV_SAMPLE_FMT_FLTP
;
890 /* initialize the MDCT transform */
891 if ((ret
= ff_mdct_init(&q
->mdct_ctx
, 9, 1, 1.0 / 32768)) < 0) {
892 av_log(avctx
, AV_LOG_ERROR
, "Error initializing MDCT\n");
893 av_freep(&q
->decoded_bytes_buffer
);
897 /* init the joint-stereo decoding data */
898 q
->weighting_delay
[0] = 0;
899 q
->weighting_delay
[1] = 7;
900 q
->weighting_delay
[2] = 0;
901 q
->weighting_delay
[3] = 7;
902 q
->weighting_delay
[4] = 0;
903 q
->weighting_delay
[5] = 7;
905 for (i
= 0; i
< 4; i
++) {
906 q
->matrix_coeff_index_prev
[i
] = 3;
907 q
->matrix_coeff_index_now
[i
] = 3;
908 q
->matrix_coeff_index_next
[i
] = 3;
911 ff_atrac_init_gain_compensation(&q
->gainc_ctx
, 4, 3);
912 avpriv_float_dsp_init(&q
->fdsp
, avctx
->flags
& AV_CODEC_FLAG_BITEXACT
);
914 q
->units
= av_mallocz(sizeof(*q
->units
) * avctx
->channels
);
916 atrac3_decode_close(avctx
);
917 return AVERROR(ENOMEM
);
923 AVCodec ff_atrac3_decoder
= {
925 .long_name
= NULL_IF_CONFIG_SMALL("ATRAC3 (Adaptive TRansform Acoustic Coding 3)"),
926 .type
= AVMEDIA_TYPE_AUDIO
,
927 .id
= AV_CODEC_ID_ATRAC3
,
928 .priv_data_size
= sizeof(ATRAC3Context
),
929 .init
= atrac3_decode_init
,
930 .init_static_data
= atrac3_init_static_data
,
931 .close
= atrac3_decode_close
,
932 .decode
= atrac3_decode_frame
,
933 .capabilities
= AV_CODEC_CAP_SUBFRAMES
| AV_CODEC_CAP_DR1
,
934 .sample_fmts
= (const enum AVSampleFormat
[]) { AV_SAMPLE_FMT_FLTP
,
935 AV_SAMPLE_FMT_NONE
},