2 * Atrac 1 compatible decoder
3 * Copyright (c) 2009 Maxim Poliakovski
4 * Copyright (c) 2009 Benjamin Larsson
6 * This file is part of FFmpeg.
8 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * @file libavcodec/atrac1.c
25 * Atrac 1 compatible decoder.
26 * This decoder handles raw ATRAC1 data.
29 /* Many thanks to Tim Craig for all the help! */
40 #include "atrac1data.h"
42 #define AT1_MAX_BFU 52 ///< max number of block floating units in a sound unit
43 #define AT1_SU_SIZE 212 ///< number of bytes in a sound unit
44 #define AT1_SU_SAMPLES 512 ///< number of samples in a sound unit
45 #define AT1_FRAME_SIZE AT1_SU_SIZE * 2
46 #define AT1_SU_MAX_BITS AT1_SU_SIZE * 8
47 #define AT1_MAX_CHANNELS 2
49 #define AT1_QMF_BANDS 3
50 #define IDX_LOW_BAND 0
51 #define IDX_MID_BAND 1
52 #define IDX_HIGH_BAND 2
55 * Sound unit struct, one unit is used per channel
58 int log2_block_count
[AT1_QMF_BANDS
]; ///< log2 number of blocks in a band
59 int num_bfus
; ///< number of Block Floating Units
60 int idwls
[AT1_MAX_BFU
]; ///< the word length indexes for each BFU
61 int idsfs
[AT1_MAX_BFU
]; ///< the scalefactor indexes for each BFU
63 DECLARE_ALIGNED_16(float,spec1
[AT1_SU_SAMPLES
]); ///< mdct buffer
64 DECLARE_ALIGNED_16(float,spec2
[AT1_SU_SAMPLES
]); ///< mdct buffer
65 DECLARE_ALIGNED_16(float,fst_qmf_delay
[46]); ///< delay line for the 1st stacked QMF filter
66 DECLARE_ALIGNED_16(float,snd_qmf_delay
[46]); ///< delay line for the 2nd stacked QMF filter
67 DECLARE_ALIGNED_16(float,last_qmf_delay
[256+23]); ///< delay line for the last stacked QMF filter
71 * The atrac1 context, holds all needed parameters for decoding
74 AT1SUCtx SUs
[AT1_MAX_CHANNELS
]; ///< channel sound unit
75 DECLARE_ALIGNED_16(float,spec
[AT1_SU_SAMPLES
]); ///< the mdct spectrum buffer
76 DECLARE_ALIGNED_16(float,short_buf
[64]); ///< buffer for the short mode
77 DECLARE_ALIGNED_16(float, low
[256]);
78 DECLARE_ALIGNED_16(float, mid
[256]);
79 DECLARE_ALIGNED_16(float,high
[512]);
81 float out_samples
[AT1_MAX_CHANNELS
][AT1_SU_SAMPLES
];
82 MDCTContext mdct_ctx
[3];
87 static float *short_window
;
88 static float *mid_window
;
89 DECLARE_ALIGNED_16(static float, long_window
[256]);
90 static float *window_per_band
[3];
92 /** size of the transform in samples in the long mode for each QMF band */
93 static const uint16_t samples_per_band
[3] = {128, 128, 256};
94 static const uint8_t mdct_long_nbits
[3] = {7, 7, 8};
97 static void at1_imdct(AT1Ctx
*q
, float *spec
, float *out
, int nbits
, int rev_spec
)
99 MDCTContext
* mdct_context
;
100 int transf_size
= 1 << nbits
;
102 mdct_context
= &q
->mdct_ctx
[nbits
- 5 - (nbits
>6)];
106 for (i
=0 ; i
<transf_size
/2 ; i
++)
107 FFSWAP(float, spec
[i
], spec
[transf_size
-1-i
]);
109 ff_imdct_half(mdct_context
,out
,spec
);
113 static int at1_imdct_block(AT1SUCtx
* su
, AT1Ctx
*q
)
115 int band_num
, band_samples
, log2_block_count
, nbits
, num_blocks
, block_size
;
116 unsigned int start_pos
, ref_pos
=0, pos
= 0;
118 for (band_num
=0 ; band_num
<AT1_QMF_BANDS
; band_num
++) {
119 band_samples
= samples_per_band
[band_num
];
120 log2_block_count
= su
->log2_block_count
[band_num
];
122 /* number of mdct blocks in the current QMF band: 1 - for long mode */
123 /* 4 for short mode(low/middle bands) and 8 for short mode(high band)*/
124 num_blocks
= 1 << log2_block_count
;
126 /* mdct block size in samples: 128 (long mode, low & mid bands), */
127 /* 256 (long mode, high band) and 32 (short mode, all bands) */
128 block_size
= band_samples
>> log2_block_count
;
130 /* calc transform size in bits according to the block_size_mode */
131 nbits
= mdct_long_nbits
[band_num
] - log2_block_count
;
133 if (nbits
!=5 && nbits
!=7 && nbits
!=8)
136 if (num_blocks
== 1) {
137 at1_imdct(q
, &q
->spec
[pos
], &su
->spectrum
[0][ref_pos
], nbits
, band_num
);
138 pos
+= block_size
; // move to the next mdct block in the spectrum
140 /* calc start position for the 1st short block: 96(128) or 112(256) */
141 start_pos
= (band_samples
* (num_blocks
- 1)) >> (log2_block_count
+ 1);
142 memset(&su
->spectrum
[0][ref_pos
], 0, sizeof(float) * (band_samples
* 2));
144 for (; num_blocks
!=0 ; num_blocks
--) {
145 /* use hardcoded nbits for the short mode */
146 at1_imdct(q
, &q
->spec
[pos
], q
->short_buf
, 5, band_num
);
148 /* overlap and window between short blocks */
149 q
->dsp
.vector_fmul_window(&su
->spectrum
[0][ref_pos
+start_pos
],
150 &su
->spectrum
[0][ref_pos
+start_pos
],q
->short_buf
,short_window
, 0, 16);
151 start_pos
+= 32; // use hardcoded block_size
156 /* overlap and window with the previous frame and output the result */
157 q
->dsp
.vector_fmul_window(q
->bands
[band_num
], &su
->spectrum
[1][ref_pos
+band_samples
/2],
158 &su
->spectrum
[0][ref_pos
], window_per_band
[band_num
], 0, band_samples
/2);
160 ref_pos
+= band_samples
;
163 /* Swap buffers so the mdct overlap works */
164 FFSWAP(float*, su
->spectrum
[0], su
->spectrum
[1]);
170 static int at1_parse_block_size_mode(GetBitContext
* gb
, int log2_block_count
[AT1_QMF_BANDS
])
172 int log2_block_count_tmp
, i
;
174 for(i
=0 ; i
<2 ; i
++) {
175 /* low and mid band */
176 log2_block_count_tmp
= get_bits(gb
, 2);
177 if (log2_block_count_tmp
& 1)
179 log2_block_count
[i
] = 2 - log2_block_count_tmp
;
183 log2_block_count_tmp
= get_bits(gb
, 2);
184 if (log2_block_count_tmp
!= 0 && log2_block_count_tmp
!= 3)
186 log2_block_count
[IDX_HIGH_BAND
] = 3 - log2_block_count_tmp
;
193 static int at1_unpack_dequant(GetBitContext
* gb
, AT1SUCtx
* su
, float spec
[AT1_SU_SAMPLES
])
195 int bits_used
, band_num
, bfu_num
, i
;
197 /* parse the info byte (2nd byte) telling how much BFUs were coded */
198 su
->num_bfus
= bfu_amount_tab1
[get_bits(gb
, 3)];
200 /* calc number of consumed bits:
201 num_BFUs * (idwl(4bits) + idsf(6bits)) + log2_block_count(8bits) + info_byte(8bits)
202 + info_byte_copy(8bits) + log2_block_count_copy(8bits) */
203 bits_used
= su
->num_bfus
* 10 + 32 +
204 bfu_amount_tab2
[get_bits(gb
, 2)] +
205 (bfu_amount_tab3
[get_bits(gb
, 3)] << 1);
207 /* get word length index (idwl) for each BFU */
208 for (i
=0 ; i
<su
->num_bfus
; i
++)
209 su
->idwls
[i
] = get_bits(gb
, 4);
211 /* get scalefactor index (idsf) for each BFU */
212 for (i
=0 ; i
<su
->num_bfus
; i
++)
213 su
->idsfs
[i
] = get_bits(gb
, 6);
215 /* zero idwl/idsf for empty BFUs */
216 for (i
= su
->num_bfus
; i
< AT1_MAX_BFU
; i
++)
217 su
->idwls
[i
] = su
->idsfs
[i
] = 0;
219 /* read in the spectral data and reconstruct MDCT spectrum of this channel */
220 for (band_num
=0 ; band_num
<AT1_QMF_BANDS
; band_num
++) {
221 for (bfu_num
=bfu_bands_t
[band_num
] ; bfu_num
<bfu_bands_t
[band_num
+1] ; bfu_num
++) {
224 int num_specs
= specs_per_bfu
[bfu_num
];
225 int word_len
= !!su
->idwls
[bfu_num
] + su
->idwls
[bfu_num
];
226 float scale_factor
= sf_table
[su
->idsfs
[bfu_num
]];
227 bits_used
+= word_len
* num_specs
; /* add number of bits consumed by current BFU */
229 /* check for bitstream overflow */
230 if (bits_used
> AT1_SU_MAX_BITS
)
233 /* get the position of the 1st spec according to the block size mode */
234 pos
= su
->log2_block_count
[band_num
] ? bfu_start_short
[bfu_num
] : bfu_start_long
[bfu_num
];
237 float max_quant
= 1.0/(float)((1 << (word_len
- 1)) - 1);
239 for (i
=0 ; i
<num_specs
; i
++) {
240 /* read in a quantized spec and convert it to
241 * signed int and then inverse quantization
243 spec
[pos
+i
] = get_sbits(gb
, word_len
) * scale_factor
* max_quant
;
245 } else { /* word_len = 0 -> empty BFU, zero all specs in the emty BFU */
246 memset(&spec
[pos
], 0, num_specs
*sizeof(float));
255 void at1_subband_synthesis(AT1Ctx
*q
, AT1SUCtx
* su
, float *pOut
)
258 float iqmf_temp
[512 + 46];
260 /* combine low and middle bands */
261 atrac_iqmf(q
->bands
[0], q
->bands
[1], 128, temp
, su
->fst_qmf_delay
, iqmf_temp
);
263 /* delay the signal of the high band by 23 samples */
264 memcpy( su
->last_qmf_delay
, &su
->last_qmf_delay
[256], sizeof(float)*23);
265 memcpy(&su
->last_qmf_delay
[23], q
->bands
[2], sizeof(float)*256);
267 /* combine (low + middle) and high bands */
268 atrac_iqmf(temp
, su
->last_qmf_delay
, 256, pOut
, su
->snd_qmf_delay
, iqmf_temp
);
272 static int atrac1_decode_frame(AVCodecContext
*avctx
,
273 void *data
, int *data_size
,
276 const uint8_t *buf
= avpkt
->data
;
277 int buf_size
= avpkt
->size
;
278 AT1Ctx
*q
= avctx
->priv_data
;
281 float* samples
= data
;
284 if (buf_size
< 212 * q
->channels
) {
285 av_log(q
,AV_LOG_ERROR
,"Not enought data to decode!\n");
289 for (ch
=0 ; ch
<q
->channels
; ch
++) {
290 AT1SUCtx
* su
= &q
->SUs
[ch
];
292 init_get_bits(&gb
, &buf
[212*ch
], 212*8);
294 /* parse block_size_mode, 1st byte */
295 ret
= at1_parse_block_size_mode(&gb
, su
->log2_block_count
);
299 ret
= at1_unpack_dequant(&gb
, su
, q
->spec
);
303 ret
= at1_imdct_block(su
, q
);
306 at1_subband_synthesis(q
, su
, q
->out_samples
[ch
]);
309 /* round, convert to 16bit and interleave */
310 if (q
->channels
== 1) {
312 q
->dsp
.vector_clipf(samples
, q
->out_samples
[0], -32700./(1<<15), 32700./(1<<15), AT1_SU_SAMPLES
);
315 for (i
= 0; i
< AT1_SU_SAMPLES
; i
++) {
316 samples
[i
*2] = av_clipf(q
->out_samples
[0][i
], -32700./(1<<15), 32700./(1<<15));
317 samples
[i
*2+1] = av_clipf(q
->out_samples
[1][i
], -32700./(1<<15), 32700./(1<<15));
321 *data_size
= q
->channels
* AT1_SU_SAMPLES
* sizeof(*samples
);
322 return avctx
->block_align
;
326 static av_cold
void init_mdct_windows(void)
330 /** The mid and long windows uses the same sine window splitted
331 * in the middle and wrapped into zero/one regions as follows:
342 * The mid and short windows are subsets of the long window.
345 /* Build "zero" region */
346 memset(long_window
, 0, sizeof(long_window
));
347 /* Build sine window region */
348 short_window
= &long_window
[112];
349 ff_sine_window_init(short_window
,32);
350 /* Build "ones" region */
351 for (i
= 0; i
< 112; i
++)
352 long_window
[144 + i
] = 1.0f
;
353 /* Save the mid window subset start */
354 mid_window
= &long_window
[64];
356 /* Prepare the window table */
357 window_per_band
[0] = mid_window
;
358 window_per_band
[1] = mid_window
;
359 window_per_band
[2] = long_window
;
362 static av_cold
int atrac1_decode_init(AVCodecContext
*avctx
)
364 AT1Ctx
*q
= avctx
->priv_data
;
366 avctx
->sample_fmt
= SAMPLE_FMT_FLT
;
368 q
->channels
= avctx
->channels
;
370 /* Init the mdct transforms */
371 ff_mdct_init(&q
->mdct_ctx
[0], 6, 1, -1.0/ (1<<15));
372 ff_mdct_init(&q
->mdct_ctx
[1], 8, 1, -1.0/ (1<<15));
373 ff_mdct_init(&q
->mdct_ctx
[2], 9, 1, -1.0/ (1<<15));
376 atrac_generate_tables();
378 dsputil_init(&q
->dsp
, avctx
);
380 q
->bands
[0] = q
->low
;
381 q
->bands
[1] = q
->mid
;
382 q
->bands
[2] = q
->high
;
384 /* Prepare the mdct overlap buffers */
385 q
->SUs
[0].spectrum
[0] = q
->SUs
[0].spec1
;
386 q
->SUs
[0].spectrum
[1] = q
->SUs
[0].spec2
;
387 q
->SUs
[1].spectrum
[0] = q
->SUs
[1].spec1
;
388 q
->SUs
[1].spectrum
[1] = q
->SUs
[1].spec2
;
393 AVCodec atrac1_decoder
= {
395 .type
= CODEC_TYPE_AUDIO
,
396 .id
= CODEC_ID_ATRAC1
,
397 .priv_data_size
= sizeof(AT1Ctx
),
398 .init
= atrac1_decode_init
,
400 .decode
= atrac1_decode_frame
,
401 .long_name
= NULL_IF_CONFIG_SMALL("Atrac 1 (Adaptive TRansform Acoustic Coding)"),