1 /*
2 * ATRAC1 compatible decoder
3 * Copyright (c) 2009 Maxim Poliakovski
4 * Copyright (c) 2009 Benjamin Larsson
5 *
6 * This file is part of FFmpeg.
7 *
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.
12 *
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.
17 *
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
21 */
22
23 /**
24 * @file
25 * ATRAC1 compatible decoder.
26 * This decoder handles raw ATRAC1 data and probably SDDS data.
27 */
28
29 /* Many thanks to Tim Craig for all the help! */
30
32 #include <stddef.h>
33 #include <stdio.h>
34
41
44
45 #define AT1_MAX_BFU 52 ///< max number of block floating units in a sound unit
46 #define AT1_SU_SIZE 212
///< number of bytes in a sound unit
47 #define AT1_SU_SAMPLES 512
///< number of samples in a sound unit
48 #define AT1_FRAME_SIZE AT1_SU_SIZE * 2
49 #define AT1_SU_MAX_BITS AT1_SU_SIZE * 8
50 #define AT1_MAX_CHANNELS 2
51
52 #define AT1_QMF_BANDS 3
53 #define IDX_LOW_BAND 0
54 #define IDX_MID_BAND 1
55 #define IDX_HIGH_BAND 2
56
57 /**
58 * Sound unit struct, one unit is used per channel
59 */
62 int num_bfus;
///< number of Block Floating Units
70
71 /**
72 * The atrac1 context, holds all needed parameters for decoding
73 */
77
85
86 /** size of the transform in samples in the long mode for each QMF band */
89
90
92 int rev_spec)
93 {
95 int transf_size = 1 << nbits;
96
97 if (rev_spec) {
98 int i;
99 for (i = 0; i < transf_size / 2; i++)
100 FFSWAP(
float, spec[i], spec[transf_size - 1 - i]);
101 }
102 mdct_context->
imdct_half(mdct_context, out, spec);
103 }
104
105
107 {
108 int band_num, band_samples, log2_block_count, nbits, num_blocks, block_size;
109 unsigned int start_pos, ref_pos = 0, pos = 0;
110
112 float *prev_buf;
113 int j;
114
117
118 /* number of mdct blocks in the current QMF band: 1 - for long mode */
119 /* 4 for short mode(low/middle bands) and 8 for short mode(high band)*/
120 num_blocks = 1 << log2_block_count;
121
122 if (num_blocks == 1) {
123 /* mdct block size in samples: 128 (long mode, low & mid bands), */
124 /* 256 (long mode, high band) and 32 (short mode, all bands) */
125 block_size = band_samples >> log2_block_count;
126
127 /* calc transform size in bits according to the block_size_mode */
129
130 if (nbits != 5 && nbits != 7 && nbits != 8)
132 } else {
133 block_size = 32;
134 nbits = 5;
135 }
136
137 start_pos = 0;
138 prev_buf = &su->
spectrum[1][ref_pos + band_samples - 16];
139 for (j=0; j < num_blocks; j++) {
141
142 /* overlap and window */
144 &su->
spectrum[0][ref_pos + start_pos], ff_sine_32, 16);
145
146 prev_buf = &su->
spectrum[0][ref_pos+start_pos + 16];
147 start_pos += block_size;
148 pos += block_size;
149 }
150
151 if (num_blocks == 1)
152 memcpy(q->
bands[band_num] + 32, &su->
spectrum[0][ref_pos + 16], 240 *
sizeof(
float));
153
154 ref_pos += band_samples;
155 }
156
157 /* Swap buffers so the mdct overlap works */
159
160 return 0;
161 }
162
163 /**
164 * Parse the block size mode byte
165 */
166
168 {
169 int log2_block_count_tmp, i;
170
171 for (i = 0; i < 2; i++) {
172 /* low and mid band */
173 log2_block_count_tmp =
get_bits(gb, 2);
174 if (log2_block_count_tmp & 1)
176 log2_block_cnt[i] = 2 - log2_block_count_tmp;
177 }
178
179 /* high band */
180 log2_block_count_tmp =
get_bits(gb, 2);
181 if (log2_block_count_tmp != 0 && log2_block_count_tmp != 3)
184
186 return 0;
187 }
188
189
192 {
193 int bits_used, band_num, bfu_num, i;
196
197 /* parse the info byte (2nd byte) telling how much BFUs were coded */
199
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 +
206
207 /* get word length index (idwl) for each BFU */
210
211 /* get scalefactor index (idsf) for each BFU */
214
215 /* zero idwl/idsf for empty BFUs */
217 idwls[i] = idsfs[i] = 0;
218
219 /* read in the spectral data and reconstruct MDCT spectrum of this channel */
222 int pos;
223
225 int word_len = !!idwls[bfu_num] + idwls[bfu_num];
227 bits_used += word_len * num_specs; /* add number of bits consumed by current BFU */
228
229 /* check for bitstream overflow */
232
233 /* get the position of the 1st spec according to the block size mode */
235
236 if (word_len) {
237 float max_quant = 1.0 / (float)((1 << (word_len - 1)) - 1);
238
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
242 */
243 spec[pos+i] =
get_sbits(gb, word_len) * scale_factor * max_quant;
244 }
245 } else { /* word_len = 0 -> empty BFU, zero all specs in the empty BFU */
246 memset(&spec[pos], 0, num_specs * sizeof(float));
247 }
248 }
249 }
250
251 return 0;
252 }
253
254
256 {
258 float iqmf_temp[512 + 46];
259
260 /* combine low and middle bands */
262
263 /* delay the signal of the high band by 39 samples */
266
267 /* combine (low + middle) and high bands */
269 }
270
271
273 int *got_frame_ptr,
AVPacket *avpkt)
274 {
277 int buf_size = avpkt->
size;
281
282
283 if (buf_size < 212 * avctx->
channels) {
286 }
287
288 /* get output buffer */
291 return ret;
292
293 for (ch = 0; ch < avctx->
channels; ch++) {
295
297
298 /* parse block_size_mode, 1st byte */
300 if (ret < 0)
301 return ret;
302
304 if (ret < 0)
305 return ret;
306
308 if (ret < 0)
309 return ret;
311 }
312
313 *got_frame_ptr = 1;
314
316 }
317
318
320 {
322
326
328
329 return 0;
330 }
331
332
334 {
336 int ret;
337
339
344 }
345
349 }
350
351 /* Init the mdct transforms */
357 return ret;
358 }
359
361
363
365
369
370 /* Prepare the mdct overlap buffers */
375
376 return 0;
377 }
378
379
385 .priv_data_size =
sizeof(
AT1Ctx),
392 };
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
float snd_qmf_delay[46]
delay line for the 2nd stacked QMF filter
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
AVCodec ff_atrac1_decoder
Sound unit struct, one unit is used per channel.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int at1_unpack_dequant(GetBitContext *gb, AT1SUCtx *su, float spec[AT1_SU_SAMPLES])
AT1SUCtx SUs[AT1_MAX_CHANNELS]
channel sound unit
static av_cold int init(AVCodecContext *avctx)
static av_cold int atrac1_decode_init(AVCodecContext *avctx)
static av_cold int atrac1_decode_end(AVCodecContext *avctx)
static const uint8_t bfu_amount_tab2[4]
void ff_atrac_iqmf(float *inlo, float *inhi, unsigned int nIn, float *pOut, float *delayBuf, float *temp)
Quadrature mirror synthesis filter.
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
static int get_sbits(GetBitContext *s, int n)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static void at1_subband_synthesis(AT1Ctx *q, AT1SUCtx *su, float *pOut)
static const uint8_t specs_per_bfu[52]
number of spectral lines in each BFU block floating unit = group of spectral frequencies having the s...
float ff_atrac_sf_table[64]
void(* vector_fmul_window)(float *dst, const float *src0, const float *src1, const float *win, int len)
Overlap/add with window function.
enum AVSampleFormat sample_fmt
audio sample format
static const uint16_t samples_per_band[3]
size of the transform in samples in the long mode for each QMF band
The atrac1 context, holds all needed parameters for decoding.
float spec2[AT1_SU_SAMPLES]
mdct buffer
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
#define AT1_SU_SAMPLES
number of samples in a sound unit
bitstream reader API header.
static int at1_parse_bsm(GetBitContext *gb, int log2_block_cnt[AT1_QMF_BANDS])
Parse the block size mode byte.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits, int rev_spec)
static const uint16_t bfu_start_short[52]
start position of each BFU in the MDCT spectrum for the short mode
static const uint8_t bfu_amount_tab1[8]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
float spec1[AT1_SU_SAMPLES]
mdct buffer
int log2_block_count[AT1_QMF_BANDS]
log2 number of blocks in a band
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Libavcodec external API header.
AVSampleFormat
Audio sample formats.
float fst_qmf_delay[46]
delay line for the 1st stacked QMF filter
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
void(* imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input)
static int atrac1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static const uint8_t mdct_long_nbits[3]
#define AT1_MAX_BFU
max number of block floating units in a sound unit
static const uint8_t bfu_bands_t[4]
number of BFUs in each QMF band
float spec[AT1_SU_SAMPLES]
the mdct spectrum buffer
common internal api header.
ATRAC1 compatible decoder data.
float last_qmf_delay[256+39]
delay line for the last stacked QMF filter
int channels
number of audio channels
av_cold void ff_atrac_generate_tables(void)
Generate common tables.
static enum AVSampleFormat sample_fmts[]
#define FFSWAP(type, a, b)
uint8_t ** extended_data
pointers to the data planes/channels.
This structure stores compressed data.
static const uint8_t bfu_amount_tab3[8]
int nb_samples
number of audio samples (per channel) described by this frame
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
int num_bfus
number of Block Floating Units
static int at1_imdct_block(AT1SUCtx *su, AT1Ctx *q)
void AAC_RENAME() ff_init_ff_sine_windows(int index)
initialize the specified entry of ff_sine_windows
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(constuint8_t *) pi-0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(constint16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(constint32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(constint64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64,*(constint64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64,*(constint64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(constfloat *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(constdouble *) pi *(INT64_C(1)<< 63)))#defineFMT_PAIR_FUNC(out, in) staticconv_func_type *constfmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64),};staticvoidcpy1(uint8_t **dst, constuint8_t **src, intlen){memcpy(*dst,*src, len);}staticvoidcpy2(uint8_t **dst, constuint8_t **src, intlen){memcpy(*dst,*src, 2 *len);}staticvoidcpy4(uint8_t **dst, constuint8_t **src, intlen){memcpy(*dst,*src, 4 *len);}staticvoidcpy8(uint8_t **dst, constuint8_t **src, intlen){memcpy(*dst,*src, 8 *len);}AudioConvert *swri_audio_convert_alloc(enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, constint *ch_map, intflags){AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) returnNULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) returnNULL;if(channels==1){in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);}ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map){switch(av_get_bytes_per_sample(in_fmt)){case1:ctx->simd_f=cpy1;break;case2:ctx->simd_f=cpy2;break;case4:ctx->simd_f=cpy4;break;case8:ctx->simd_f=cpy8;break;}}if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);returnctx;}voidswri_audio_convert_free(AudioConvert **ctx){av_freep(ctx);}intswri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, intlen){intch;intoff=0;constintos=(out->planar?1:out->ch_count)*out->bps;unsignedmisaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask){intplanes=in->planar?in->ch_count:1;unsignedm=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;}if(ctx->out_simd_align_mask){intplanes=out->planar?out->ch_count:1;unsignedm=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;}if(ctx->simd_f &&!ctx->ch_map &&!misaligned){off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){if(out->planar==in->planar){intplanes=out->planar?out->ch_count:1;for(ch=0;ch< planes;ch++){ctx->simd_f(out-> ch ch
static const uint16_t bfu_start_long[52]
start position of each BFU in the MDCT spectrum for the long mode