Mercurial > libavcodec.hg
annotate atrac1.c @ 11060:daff45175333 libavcodec
Make the jump-table section-relative for x86_64 with PIC enabled.
This allows to get rid of the macho64 specific hack that moves them
to rodata (with worse cache behaviour) and avoids textrels which
e.g. Gentoo does not allow for x86_64 libraries.
author | reimar |
---|---|
date | Sat, 30 Jan 2010 19:26:47 +0000 |
parents | 34a65026fa06 |
children | 98970e51365a |
rev | line source |
---|---|
10157 | 1 /* |
2 * Atrac 1 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 libavcodec/atrac1.c | |
25 * Atrac 1 compatible decoder. | |
10225
d884c0b7af2f
Mention SDDS so search engines will pick it up for when someone
banan
parents:
10224
diff
changeset
|
26 * This decoder handles raw ATRAC1 data and probably SDDS data. |
10157 | 27 */ |
28 | |
29 /* Many thanks to Tim Craig for all the help! */ | |
30 | |
31 #include <math.h> | |
32 #include <stddef.h> | |
33 #include <stdio.h> | |
34 | |
35 #include "avcodec.h" | |
36 #include "get_bits.h" | |
37 #include "dsputil.h" | |
38 | |
39 #include "atrac.h" | |
40 #include "atrac1data.h" | |
41 | |
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 | |
48 | |
49 #define AT1_QMF_BANDS 3 | |
50 #define IDX_LOW_BAND 0 | |
51 #define IDX_MID_BAND 1 | |
52 #define IDX_HIGH_BAND 2 | |
53 | |
54 /** | |
55 * Sound unit struct, one unit is used per channel | |
56 */ | |
57 typedef struct { | |
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 float* spectrum[2]; | |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
61 DECLARE_ALIGNED_16(float, spec1)[AT1_SU_SAMPLES]; ///< mdct buffer |
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
62 DECLARE_ALIGNED_16(float, spec2)[AT1_SU_SAMPLES]; ///< mdct buffer |
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
63 DECLARE_ALIGNED_16(float, fst_qmf_delay)[46]; ///< delay line for the 1st stacked QMF filter |
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
64 DECLARE_ALIGNED_16(float, snd_qmf_delay)[46]; ///< delay line for the 2nd stacked QMF filter |
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
65 DECLARE_ALIGNED_16(float, last_qmf_delay)[256+23]; ///< delay line for the last stacked QMF filter |
10157 | 66 } AT1SUCtx; |
67 | |
68 /** | |
69 * The atrac1 context, holds all needed parameters for decoding | |
70 */ | |
71 typedef struct { | |
72 AT1SUCtx SUs[AT1_MAX_CHANNELS]; ///< channel sound unit | |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
73 DECLARE_ALIGNED_16(float, spec)[AT1_SU_SAMPLES]; ///< the mdct spectrum buffer |
10185 | 74 |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
75 DECLARE_ALIGNED_16(float, low)[256]; |
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
76 DECLARE_ALIGNED_16(float, mid)[256]; |
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
77 DECLARE_ALIGNED_16(float, high)[512]; |
10157 | 78 float* bands[3]; |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10827
diff
changeset
|
79 DECLARE_ALIGNED_16(float, out_samples)[AT1_MAX_CHANNELS][AT1_SU_SAMPLES]; |
10199 | 80 FFTContext mdct_ctx[3]; |
10157 | 81 int channels; |
82 DSPContext dsp; | |
83 } AT1Ctx; | |
84 | |
85 /** size of the transform in samples in the long mode for each QMF band */ | |
86 static const uint16_t samples_per_band[3] = {128, 128, 256}; | |
87 static const uint8_t mdct_long_nbits[3] = {7, 7, 8}; | |
88 | |
89 | |
10170 | 90 static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits, |
91 int rev_spec) | |
10157 | 92 { |
10216 | 93 FFTContext* mdct_context = &q->mdct_ctx[nbits - 5 - (nbits > 6)]; |
10157 | 94 int transf_size = 1 << nbits; |
95 | |
96 if (rev_spec) { | |
97 int i; | |
10197 | 98 for (i = 0; i < transf_size / 2; i++) |
10170 | 99 FFSWAP(float, spec[i], spec[transf_size - 1 - i]); |
10157 | 100 } |
10170 | 101 ff_imdct_half(mdct_context, out, spec); |
10157 | 102 } |
103 | |
104 | |
105 static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q) | |
106 { | |
10197 | 107 int band_num, band_samples, log2_block_count, nbits, num_blocks, block_size; |
10198
78af613fc316
Fix embarassing typo in last commit: Restore mistakenly removed ','.
diego
parents:
10197
diff
changeset
|
108 unsigned int start_pos, ref_pos = 0, pos = 0; |
10157 | 109 |
10197 | 110 for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) { |
10266 | 111 float *prev_buf; |
112 int j; | |
113 | |
10157 | 114 band_samples = samples_per_band[band_num]; |
115 log2_block_count = su->log2_block_count[band_num]; | |
116 | |
117 /* number of mdct blocks in the current QMF band: 1 - for long mode */ | |
118 /* 4 for short mode(low/middle bands) and 8 for short mode(high band)*/ | |
119 num_blocks = 1 << log2_block_count; | |
120 | |
10266 | 121 if (num_blocks == 1) { |
10267 | 122 /* mdct block size in samples: 128 (long mode, low & mid bands), */ |
123 /* 256 (long mode, high band) and 32 (short mode, all bands) */ | |
124 block_size = band_samples >> log2_block_count; | |
10157 | 125 |
10267 | 126 /* calc transform size in bits according to the block_size_mode */ |
127 nbits = mdct_long_nbits[band_num] - log2_block_count; | |
10157 | 128 |
10267 | 129 if (nbits != 5 && nbits != 7 && nbits != 8) |
130 return -1; | |
10266 | 131 } else { |
132 block_size = 32; | |
133 nbits = 5; | |
134 } | |
10185 | 135 |
10267 | 136 start_pos = 0; |
137 prev_buf = &su->spectrum[1][ref_pos + band_samples - 16]; | |
138 for (j=0; j < num_blocks; j++) { | |
139 at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos + start_pos], nbits, band_num); | |
10157 | 140 |
10267 | 141 /* overlap and window */ |
142 q->dsp.vector_fmul_window(&q->bands[band_num][start_pos], prev_buf, | |
143 &su->spectrum[0][ref_pos + start_pos], ff_sine_32, 0, 16); | |
10185 | 144 |
10267 | 145 prev_buf = &su->spectrum[0][ref_pos+start_pos + 16]; |
146 start_pos += block_size; | |
147 pos += block_size; | |
148 } | |
10266 | 149 |
150 if (num_blocks == 1) | |
151 memcpy(q->bands[band_num] + 32, &su->spectrum[0][ref_pos + 16], 240 * sizeof(float)); | |
152 | |
10157 | 153 ref_pos += band_samples; |
154 } | |
155 | |
156 /* Swap buffers so the mdct overlap works */ | |
157 FFSWAP(float*, su->spectrum[0], su->spectrum[1]); | |
158 | |
159 return 0; | |
160 } | |
161 | |
10170 | 162 /** |
163 * Parse the block size mode byte | |
164 */ | |
10157 | 165 |
10170 | 166 static int at1_parse_bsm(GetBitContext* gb, int log2_block_cnt[AT1_QMF_BANDS]) |
10157 | 167 { |
168 int log2_block_count_tmp, i; | |
169 | |
10197 | 170 for (i = 0; i < 2; i++) { |
10157 | 171 /* low and mid band */ |
172 log2_block_count_tmp = get_bits(gb, 2); | |
173 if (log2_block_count_tmp & 1) | |
174 return -1; | |
10170 | 175 log2_block_cnt[i] = 2 - log2_block_count_tmp; |
10157 | 176 } |
177 | |
178 /* high band */ | |
179 log2_block_count_tmp = get_bits(gb, 2); | |
180 if (log2_block_count_tmp != 0 && log2_block_count_tmp != 3) | |
181 return -1; | |
10170 | 182 log2_block_cnt[IDX_HIGH_BAND] = 3 - log2_block_count_tmp; |
10157 | 183 |
184 skip_bits(gb, 2); | |
185 return 0; | |
186 } | |
187 | |
188 | |
10170 | 189 static int at1_unpack_dequant(GetBitContext* gb, AT1SUCtx* su, |
190 float spec[AT1_SU_SAMPLES]) | |
10157 | 191 { |
192 int bits_used, band_num, bfu_num, i; | |
10215
a43faa684a20
Move the scale factor and word length indexes to the stack.
banan
parents:
10199
diff
changeset
|
193 uint8_t idwls[AT1_MAX_BFU]; ///< the word length indexes for each BFU |
a43faa684a20
Move the scale factor and word length indexes to the stack.
banan
parents:
10199
diff
changeset
|
194 uint8_t idsfs[AT1_MAX_BFU]; ///< the scalefactor indexes for each BFU |
10157 | 195 |
196 /* parse the info byte (2nd byte) telling how much BFUs were coded */ | |
197 su->num_bfus = bfu_amount_tab1[get_bits(gb, 3)]; | |
198 | |
199 /* calc number of consumed bits: | |
200 num_BFUs * (idwl(4bits) + idsf(6bits)) + log2_block_count(8bits) + info_byte(8bits) | |
201 + info_byte_copy(8bits) + log2_block_count_copy(8bits) */ | |
202 bits_used = su->num_bfus * 10 + 32 + | |
203 bfu_amount_tab2[get_bits(gb, 2)] + | |
204 (bfu_amount_tab3[get_bits(gb, 3)] << 1); | |
205 | |
206 /* get word length index (idwl) for each BFU */ | |
10197 | 207 for (i = 0; i < su->num_bfus; i++) |
10215
a43faa684a20
Move the scale factor and word length indexes to the stack.
banan
parents:
10199
diff
changeset
|
208 idwls[i] = get_bits(gb, 4); |
10157 | 209 |
210 /* get scalefactor index (idsf) for each BFU */ | |
10197 | 211 for (i = 0; i < su->num_bfus; i++) |
10215
a43faa684a20
Move the scale factor and word length indexes to the stack.
banan
parents:
10199
diff
changeset
|
212 idsfs[i] = get_bits(gb, 6); |
10157 | 213 |
214 /* zero idwl/idsf for empty BFUs */ | |
215 for (i = su->num_bfus; i < AT1_MAX_BFU; i++) | |
10215
a43faa684a20
Move the scale factor and word length indexes to the stack.
banan
parents:
10199
diff
changeset
|
216 idwls[i] = idsfs[i] = 0; |
10157 | 217 |
218 /* read in the spectral data and reconstruct MDCT spectrum of this channel */ | |
10197 | 219 for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) { |
220 for (bfu_num = bfu_bands_t[band_num]; bfu_num < bfu_bands_t[band_num+1]; bfu_num++) { | |
10157 | 221 int pos; |
222 | |
223 int num_specs = specs_per_bfu[bfu_num]; | |
10215
a43faa684a20
Move the scale factor and word length indexes to the stack.
banan
parents:
10199
diff
changeset
|
224 int word_len = !!idwls[bfu_num] + idwls[bfu_num]; |
a43faa684a20
Move the scale factor and word length indexes to the stack.
banan
parents:
10199
diff
changeset
|
225 float scale_factor = sf_table[idsfs[bfu_num]]; |
10217 | 226 bits_used += word_len * num_specs; /* add number of bits consumed by current BFU */ |
10157 | 227 |
228 /* check for bitstream overflow */ | |
229 if (bits_used > AT1_SU_MAX_BITS) | |
230 return -1; | |
231 | |
232 /* get the position of the 1st spec according to the block size mode */ | |
233 pos = su->log2_block_count[band_num] ? bfu_start_short[bfu_num] : bfu_start_long[bfu_num]; | |
234 | |
235 if (word_len) { | |
10170 | 236 float max_quant = 1.0 / (float)((1 << (word_len - 1)) - 1); |
10157 | 237 |
10197 | 238 for (i = 0; i < num_specs; i++) { |
10157 | 239 /* read in a quantized spec and convert it to |
240 * signed int and then inverse quantization | |
241 */ | |
242 spec[pos+i] = get_sbits(gb, word_len) * scale_factor * max_quant; | |
243 } | |
244 } else { /* word_len = 0 -> empty BFU, zero all specs in the emty BFU */ | |
10197 | 245 memset(&spec[pos], 0, num_specs * sizeof(float)); |
10157 | 246 } |
247 } | |
248 } | |
249 | |
250 return 0; | |
251 } | |
252 | |
253 | |
254 void at1_subband_synthesis(AT1Ctx *q, AT1SUCtx* su, float *pOut) | |
255 { | |
10197 | 256 float temp[256]; |
257 float iqmf_temp[512 + 46]; | |
10157 | 258 |
259 /* combine low and middle bands */ | |
260 atrac_iqmf(q->bands[0], q->bands[1], 128, temp, su->fst_qmf_delay, iqmf_temp); | |
261 | |
262 /* delay the signal of the high band by 23 samples */ | |
10197 | 263 memcpy( su->last_qmf_delay, &su->last_qmf_delay[256], sizeof(float) * 23); |
264 memcpy(&su->last_qmf_delay[23], q->bands[2], sizeof(float) * 256); | |
10157 | 265 |
266 /* combine (low + middle) and high bands */ | |
267 atrac_iqmf(temp, su->last_qmf_delay, 256, pOut, su->snd_qmf_delay, iqmf_temp); | |
268 } | |
269 | |
270 | |
10170 | 271 static int atrac1_decode_frame(AVCodecContext *avctx, void *data, |
272 int *data_size, AVPacket *avpkt) | |
10157 | 273 { |
274 const uint8_t *buf = avpkt->data; | |
10170 | 275 int buf_size = avpkt->size; |
276 AT1Ctx *q = avctx->priv_data; | |
10157 | 277 int ch, ret, i; |
278 GetBitContext gb; | |
279 float* samples = data; | |
280 | |
281 | |
282 if (buf_size < 212 * q->channels) { | |
283 av_log(q,AV_LOG_ERROR,"Not enought data to decode!\n"); | |
284 return -1; | |
285 } | |
286 | |
10197 | 287 for (ch = 0; ch < q->channels; ch++) { |
10157 | 288 AT1SUCtx* su = &q->SUs[ch]; |
289 | |
10197 | 290 init_get_bits(&gb, &buf[212 * ch], 212 * 8); |
10157 | 291 |
292 /* parse block_size_mode, 1st byte */ | |
10170 | 293 ret = at1_parse_bsm(&gb, su->log2_block_count); |
10157 | 294 if (ret < 0) |
295 return ret; | |
296 | |
297 ret = at1_unpack_dequant(&gb, su, q->spec); | |
298 if (ret < 0) | |
299 return ret; | |
300 | |
301 ret = at1_imdct_block(su, q); | |
302 if (ret < 0) | |
303 return ret; | |
304 at1_subband_synthesis(q, su, q->out_samples[ch]); | |
305 } | |
306 | |
307 /* round, convert to 16bit and interleave */ | |
308 if (q->channels == 1) { | |
309 /* mono */ | |
10197 | 310 q->dsp.vector_clipf(samples, q->out_samples[0], -32700.0 / (1 << 15), |
311 32700.0 / (1 << 15), AT1_SU_SAMPLES); | |
10157 | 312 } else { |
313 /* stereo */ | |
314 for (i = 0; i < AT1_SU_SAMPLES; i++) { | |
10197 | 315 samples[i * 2] = av_clipf(q->out_samples[0][i], |
316 -32700.0 / (1 << 15), | |
317 32700.0 / (1 << 15)); | |
318 samples[i * 2 + 1] = av_clipf(q->out_samples[1][i], | |
319 -32700.0 / (1 << 15), | |
320 32700.0 / (1 << 15)); | |
10157 | 321 } |
322 } | |
323 | |
324 *data_size = q->channels * AT1_SU_SAMPLES * sizeof(*samples); | |
325 return avctx->block_align; | |
326 } | |
327 | |
328 | |
329 static av_cold int atrac1_decode_init(AVCodecContext *avctx) | |
330 { | |
331 AT1Ctx *q = avctx->priv_data; | |
332 | |
333 avctx->sample_fmt = SAMPLE_FMT_FLT; | |
334 | |
335 q->channels = avctx->channels; | |
336 | |
337 /* Init the mdct transforms */ | |
10197 | 338 ff_mdct_init(&q->mdct_ctx[0], 6, 1, -1.0/ (1 << 15)); |
339 ff_mdct_init(&q->mdct_ctx[1], 8, 1, -1.0/ (1 << 15)); | |
340 ff_mdct_init(&q->mdct_ctx[2], 9, 1, -1.0/ (1 << 15)); | |
10185 | 341 |
10827
3d011a01a6a0
Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents:
10267
diff
changeset
|
342 ff_init_ff_sine_windows(5); |
10157 | 343 |
344 atrac_generate_tables(); | |
345 | |
346 dsputil_init(&q->dsp, avctx); | |
347 | |
348 q->bands[0] = q->low; | |
349 q->bands[1] = q->mid; | |
350 q->bands[2] = q->high; | |
351 | |
352 /* Prepare the mdct overlap buffers */ | |
353 q->SUs[0].spectrum[0] = q->SUs[0].spec1; | |
354 q->SUs[0].spectrum[1] = q->SUs[0].spec2; | |
355 q->SUs[1].spectrum[0] = q->SUs[1].spec1; | |
356 q->SUs[1].spectrum[1] = q->SUs[1].spec2; | |
357 | |
358 return 0; | |
359 } | |
360 | |
10218 | 361 |
362 static av_cold int atrac1_decode_end(AVCodecContext * avctx) { | |
363 AT1Ctx *q = avctx->priv_data; | |
364 | |
365 ff_mdct_end(&q->mdct_ctx[0]); | |
366 ff_mdct_end(&q->mdct_ctx[1]); | |
367 ff_mdct_end(&q->mdct_ctx[2]); | |
368 return 0; | |
369 } | |
370 | |
371 | |
10157 | 372 AVCodec atrac1_decoder = { |
373 .name = "atrac1", | |
374 .type = CODEC_TYPE_AUDIO, | |
375 .id = CODEC_ID_ATRAC1, | |
376 .priv_data_size = sizeof(AT1Ctx), | |
377 .init = atrac1_decode_init, | |
10218 | 378 .close = atrac1_decode_end, |
10157 | 379 .decode = atrac1_decode_frame, |
380 .long_name = NULL_IF_CONFIG_SMALL("Atrac 1 (Adaptive TRansform Acoustic Coding)"), | |
381 }; |