annotate ffmpeg/libavcodec/atrac1.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Atrac 1 compatible decoder
yading@10 3 * Copyright (c) 2009 Maxim Poliakovski
yading@10 4 * Copyright (c) 2009 Benjamin Larsson
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22
yading@10 23 /**
yading@10 24 * @file
yading@10 25 * Atrac 1 compatible decoder.
yading@10 26 * This decoder handles raw ATRAC1 data and probably SDDS data.
yading@10 27 */
yading@10 28
yading@10 29 /* Many thanks to Tim Craig for all the help! */
yading@10 30
yading@10 31 #include <math.h>
yading@10 32 #include <stddef.h>
yading@10 33 #include <stdio.h>
yading@10 34
yading@10 35 #include "libavutil/float_dsp.h"
yading@10 36 #include "avcodec.h"
yading@10 37 #include "get_bits.h"
yading@10 38 #include "fft.h"
yading@10 39 #include "internal.h"
yading@10 40 #include "sinewin.h"
yading@10 41
yading@10 42 #include "atrac.h"
yading@10 43 #include "atrac1data.h"
yading@10 44
yading@10 45 #define AT1_MAX_BFU 52 ///< max number of block floating units in a sound unit
yading@10 46 #define AT1_SU_SIZE 212 ///< number of bytes in a sound unit
yading@10 47 #define AT1_SU_SAMPLES 512 ///< number of samples in a sound unit
yading@10 48 #define AT1_FRAME_SIZE AT1_SU_SIZE * 2
yading@10 49 #define AT1_SU_MAX_BITS AT1_SU_SIZE * 8
yading@10 50 #define AT1_MAX_CHANNELS 2
yading@10 51
yading@10 52 #define AT1_QMF_BANDS 3
yading@10 53 #define IDX_LOW_BAND 0
yading@10 54 #define IDX_MID_BAND 1
yading@10 55 #define IDX_HIGH_BAND 2
yading@10 56
yading@10 57 /**
yading@10 58 * Sound unit struct, one unit is used per channel
yading@10 59 */
yading@10 60 typedef struct {
yading@10 61 int log2_block_count[AT1_QMF_BANDS]; ///< log2 number of blocks in a band
yading@10 62 int num_bfus; ///< number of Block Floating Units
yading@10 63 float* spectrum[2];
yading@10 64 DECLARE_ALIGNED(32, float, spec1)[AT1_SU_SAMPLES]; ///< mdct buffer
yading@10 65 DECLARE_ALIGNED(32, float, spec2)[AT1_SU_SAMPLES]; ///< mdct buffer
yading@10 66 DECLARE_ALIGNED(32, float, fst_qmf_delay)[46]; ///< delay line for the 1st stacked QMF filter
yading@10 67 DECLARE_ALIGNED(32, float, snd_qmf_delay)[46]; ///< delay line for the 2nd stacked QMF filter
yading@10 68 DECLARE_ALIGNED(32, float, last_qmf_delay)[256+23]; ///< delay line for the last stacked QMF filter
yading@10 69 } AT1SUCtx;
yading@10 70
yading@10 71 /**
yading@10 72 * The atrac1 context, holds all needed parameters for decoding
yading@10 73 */
yading@10 74 typedef struct {
yading@10 75 AT1SUCtx SUs[AT1_MAX_CHANNELS]; ///< channel sound unit
yading@10 76 DECLARE_ALIGNED(32, float, spec)[AT1_SU_SAMPLES]; ///< the mdct spectrum buffer
yading@10 77
yading@10 78 DECLARE_ALIGNED(32, float, low)[256];
yading@10 79 DECLARE_ALIGNED(32, float, mid)[256];
yading@10 80 DECLARE_ALIGNED(32, float, high)[512];
yading@10 81 float* bands[3];
yading@10 82 FFTContext mdct_ctx[3];
yading@10 83 AVFloatDSPContext fdsp;
yading@10 84 } AT1Ctx;
yading@10 85
yading@10 86 /** size of the transform in samples in the long mode for each QMF band */
yading@10 87 static const uint16_t samples_per_band[3] = {128, 128, 256};
yading@10 88 static const uint8_t mdct_long_nbits[3] = {7, 7, 8};
yading@10 89
yading@10 90
yading@10 91 static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits,
yading@10 92 int rev_spec)
yading@10 93 {
yading@10 94 FFTContext* mdct_context = &q->mdct_ctx[nbits - 5 - (nbits > 6)];
yading@10 95 int transf_size = 1 << nbits;
yading@10 96
yading@10 97 if (rev_spec) {
yading@10 98 int i;
yading@10 99 for (i = 0; i < transf_size / 2; i++)
yading@10 100 FFSWAP(float, spec[i], spec[transf_size - 1 - i]);
yading@10 101 }
yading@10 102 mdct_context->imdct_half(mdct_context, out, spec);
yading@10 103 }
yading@10 104
yading@10 105
yading@10 106 static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q)
yading@10 107 {
yading@10 108 int band_num, band_samples, log2_block_count, nbits, num_blocks, block_size;
yading@10 109 unsigned int start_pos, ref_pos = 0, pos = 0;
yading@10 110
yading@10 111 for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) {
yading@10 112 float *prev_buf;
yading@10 113 int j;
yading@10 114
yading@10 115 band_samples = samples_per_band[band_num];
yading@10 116 log2_block_count = su->log2_block_count[band_num];
yading@10 117
yading@10 118 /* number of mdct blocks in the current QMF band: 1 - for long mode */
yading@10 119 /* 4 for short mode(low/middle bands) and 8 for short mode(high band)*/
yading@10 120 num_blocks = 1 << log2_block_count;
yading@10 121
yading@10 122 if (num_blocks == 1) {
yading@10 123 /* mdct block size in samples: 128 (long mode, low & mid bands), */
yading@10 124 /* 256 (long mode, high band) and 32 (short mode, all bands) */
yading@10 125 block_size = band_samples >> log2_block_count;
yading@10 126
yading@10 127 /* calc transform size in bits according to the block_size_mode */
yading@10 128 nbits = mdct_long_nbits[band_num] - log2_block_count;
yading@10 129
yading@10 130 if (nbits != 5 && nbits != 7 && nbits != 8)
yading@10 131 return AVERROR_INVALIDDATA;
yading@10 132 } else {
yading@10 133 block_size = 32;
yading@10 134 nbits = 5;
yading@10 135 }
yading@10 136
yading@10 137 start_pos = 0;
yading@10 138 prev_buf = &su->spectrum[1][ref_pos + band_samples - 16];
yading@10 139 for (j=0; j < num_blocks; j++) {
yading@10 140 at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos + start_pos], nbits, band_num);
yading@10 141
yading@10 142 /* overlap and window */
yading@10 143 q->fdsp.vector_fmul_window(&q->bands[band_num][start_pos], prev_buf,
yading@10 144 &su->spectrum[0][ref_pos + start_pos], ff_sine_32, 16);
yading@10 145
yading@10 146 prev_buf = &su->spectrum[0][ref_pos+start_pos + 16];
yading@10 147 start_pos += block_size;
yading@10 148 pos += block_size;
yading@10 149 }
yading@10 150
yading@10 151 if (num_blocks == 1)
yading@10 152 memcpy(q->bands[band_num] + 32, &su->spectrum[0][ref_pos + 16], 240 * sizeof(float));
yading@10 153
yading@10 154 ref_pos += band_samples;
yading@10 155 }
yading@10 156
yading@10 157 /* Swap buffers so the mdct overlap works */
yading@10 158 FFSWAP(float*, su->spectrum[0], su->spectrum[1]);
yading@10 159
yading@10 160 return 0;
yading@10 161 }
yading@10 162
yading@10 163 /**
yading@10 164 * Parse the block size mode byte
yading@10 165 */
yading@10 166
yading@10 167 static int at1_parse_bsm(GetBitContext* gb, int log2_block_cnt[AT1_QMF_BANDS])
yading@10 168 {
yading@10 169 int log2_block_count_tmp, i;
yading@10 170
yading@10 171 for (i = 0; i < 2; i++) {
yading@10 172 /* low and mid band */
yading@10 173 log2_block_count_tmp = get_bits(gb, 2);
yading@10 174 if (log2_block_count_tmp & 1)
yading@10 175 return AVERROR_INVALIDDATA;
yading@10 176 log2_block_cnt[i] = 2 - log2_block_count_tmp;
yading@10 177 }
yading@10 178
yading@10 179 /* high band */
yading@10 180 log2_block_count_tmp = get_bits(gb, 2);
yading@10 181 if (log2_block_count_tmp != 0 && log2_block_count_tmp != 3)
yading@10 182 return AVERROR_INVALIDDATA;
yading@10 183 log2_block_cnt[IDX_HIGH_BAND] = 3 - log2_block_count_tmp;
yading@10 184
yading@10 185 skip_bits(gb, 2);
yading@10 186 return 0;
yading@10 187 }
yading@10 188
yading@10 189
yading@10 190 static int at1_unpack_dequant(GetBitContext* gb, AT1SUCtx* su,
yading@10 191 float spec[AT1_SU_SAMPLES])
yading@10 192 {
yading@10 193 int bits_used, band_num, bfu_num, i;
yading@10 194 uint8_t idwls[AT1_MAX_BFU]; ///< the word length indexes for each BFU
yading@10 195 uint8_t idsfs[AT1_MAX_BFU]; ///< the scalefactor indexes for each BFU
yading@10 196
yading@10 197 /* parse the info byte (2nd byte) telling how much BFUs were coded */
yading@10 198 su->num_bfus = bfu_amount_tab1[get_bits(gb, 3)];
yading@10 199
yading@10 200 /* calc number of consumed bits:
yading@10 201 num_BFUs * (idwl(4bits) + idsf(6bits)) + log2_block_count(8bits) + info_byte(8bits)
yading@10 202 + info_byte_copy(8bits) + log2_block_count_copy(8bits) */
yading@10 203 bits_used = su->num_bfus * 10 + 32 +
yading@10 204 bfu_amount_tab2[get_bits(gb, 2)] +
yading@10 205 (bfu_amount_tab3[get_bits(gb, 3)] << 1);
yading@10 206
yading@10 207 /* get word length index (idwl) for each BFU */
yading@10 208 for (i = 0; i < su->num_bfus; i++)
yading@10 209 idwls[i] = get_bits(gb, 4);
yading@10 210
yading@10 211 /* get scalefactor index (idsf) for each BFU */
yading@10 212 for (i = 0; i < su->num_bfus; i++)
yading@10 213 idsfs[i] = get_bits(gb, 6);
yading@10 214
yading@10 215 /* zero idwl/idsf for empty BFUs */
yading@10 216 for (i = su->num_bfus; i < AT1_MAX_BFU; i++)
yading@10 217 idwls[i] = idsfs[i] = 0;
yading@10 218
yading@10 219 /* read in the spectral data and reconstruct MDCT spectrum of this channel */
yading@10 220 for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) {
yading@10 221 for (bfu_num = bfu_bands_t[band_num]; bfu_num < bfu_bands_t[band_num+1]; bfu_num++) {
yading@10 222 int pos;
yading@10 223
yading@10 224 int num_specs = specs_per_bfu[bfu_num];
yading@10 225 int word_len = !!idwls[bfu_num] + idwls[bfu_num];
yading@10 226 float scale_factor = ff_atrac_sf_table[idsfs[bfu_num]];
yading@10 227 bits_used += word_len * num_specs; /* add number of bits consumed by current BFU */
yading@10 228
yading@10 229 /* check for bitstream overflow */
yading@10 230 if (bits_used > AT1_SU_MAX_BITS)
yading@10 231 return AVERROR_INVALIDDATA;
yading@10 232
yading@10 233 /* get the position of the 1st spec according to the block size mode */
yading@10 234 pos = su->log2_block_count[band_num] ? bfu_start_short[bfu_num] : bfu_start_long[bfu_num];
yading@10 235
yading@10 236 if (word_len) {
yading@10 237 float max_quant = 1.0 / (float)((1 << (word_len - 1)) - 1);
yading@10 238
yading@10 239 for (i = 0; i < num_specs; i++) {
yading@10 240 /* read in a quantized spec and convert it to
yading@10 241 * signed int and then inverse quantization
yading@10 242 */
yading@10 243 spec[pos+i] = get_sbits(gb, word_len) * scale_factor * max_quant;
yading@10 244 }
yading@10 245 } else { /* word_len = 0 -> empty BFU, zero all specs in the empty BFU */
yading@10 246 memset(&spec[pos], 0, num_specs * sizeof(float));
yading@10 247 }
yading@10 248 }
yading@10 249 }
yading@10 250
yading@10 251 return 0;
yading@10 252 }
yading@10 253
yading@10 254
yading@10 255 static void at1_subband_synthesis(AT1Ctx *q, AT1SUCtx* su, float *pOut)
yading@10 256 {
yading@10 257 float temp[256];
yading@10 258 float iqmf_temp[512 + 46];
yading@10 259
yading@10 260 /* combine low and middle bands */
yading@10 261 ff_atrac_iqmf(q->bands[0], q->bands[1], 128, temp, su->fst_qmf_delay, iqmf_temp);
yading@10 262
yading@10 263 /* delay the signal of the high band by 23 samples */
yading@10 264 memcpy( su->last_qmf_delay, &su->last_qmf_delay[256], sizeof(float) * 23);
yading@10 265 memcpy(&su->last_qmf_delay[23], q->bands[2], sizeof(float) * 256);
yading@10 266
yading@10 267 /* combine (low + middle) and high bands */
yading@10 268 ff_atrac_iqmf(temp, su->last_qmf_delay, 256, pOut, su->snd_qmf_delay, iqmf_temp);
yading@10 269 }
yading@10 270
yading@10 271
yading@10 272 static int atrac1_decode_frame(AVCodecContext *avctx, void *data,
yading@10 273 int *got_frame_ptr, AVPacket *avpkt)
yading@10 274 {
yading@10 275 AVFrame *frame = data;
yading@10 276 const uint8_t *buf = avpkt->data;
yading@10 277 int buf_size = avpkt->size;
yading@10 278 AT1Ctx *q = avctx->priv_data;
yading@10 279 int ch, ret;
yading@10 280 GetBitContext gb;
yading@10 281
yading@10 282
yading@10 283 if (buf_size < 212 * avctx->channels) {
yading@10 284 av_log(avctx, AV_LOG_ERROR, "Not enough data to decode!\n");
yading@10 285 return AVERROR_INVALIDDATA;
yading@10 286 }
yading@10 287
yading@10 288 /* get output buffer */
yading@10 289 frame->nb_samples = AT1_SU_SAMPLES;
yading@10 290 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
yading@10 291 return ret;
yading@10 292
yading@10 293 for (ch = 0; ch < avctx->channels; ch++) {
yading@10 294 AT1SUCtx* su = &q->SUs[ch];
yading@10 295
yading@10 296 init_get_bits(&gb, &buf[212 * ch], 212 * 8);
yading@10 297
yading@10 298 /* parse block_size_mode, 1st byte */
yading@10 299 ret = at1_parse_bsm(&gb, su->log2_block_count);
yading@10 300 if (ret < 0)
yading@10 301 return ret;
yading@10 302
yading@10 303 ret = at1_unpack_dequant(&gb, su, q->spec);
yading@10 304 if (ret < 0)
yading@10 305 return ret;
yading@10 306
yading@10 307 ret = at1_imdct_block(su, q);
yading@10 308 if (ret < 0)
yading@10 309 return ret;
yading@10 310 at1_subband_synthesis(q, su, (float *)frame->extended_data[ch]);
yading@10 311 }
yading@10 312
yading@10 313 *got_frame_ptr = 1;
yading@10 314
yading@10 315 return avctx->block_align;
yading@10 316 }
yading@10 317
yading@10 318
yading@10 319 static av_cold int atrac1_decode_end(AVCodecContext * avctx)
yading@10 320 {
yading@10 321 AT1Ctx *q = avctx->priv_data;
yading@10 322
yading@10 323 ff_mdct_end(&q->mdct_ctx[0]);
yading@10 324 ff_mdct_end(&q->mdct_ctx[1]);
yading@10 325 ff_mdct_end(&q->mdct_ctx[2]);
yading@10 326
yading@10 327 return 0;
yading@10 328 }
yading@10 329
yading@10 330
yading@10 331 static av_cold int atrac1_decode_init(AVCodecContext *avctx)
yading@10 332 {
yading@10 333 AT1Ctx *q = avctx->priv_data;
yading@10 334 int ret;
yading@10 335
yading@10 336 avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
yading@10 337
yading@10 338 if (avctx->channels < 1 || avctx->channels > AT1_MAX_CHANNELS) {
yading@10 339 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n",
yading@10 340 avctx->channels);
yading@10 341 return AVERROR(EINVAL);
yading@10 342 }
yading@10 343
yading@10 344 if (avctx->block_align <= 0) {
yading@10 345 av_log(avctx, AV_LOG_ERROR, "Unsupported block align.");
yading@10 346 return AVERROR_PATCHWELCOME;
yading@10 347 }
yading@10 348
yading@10 349 /* Init the mdct transforms */
yading@10 350 if ((ret = ff_mdct_init(&q->mdct_ctx[0], 6, 1, -1.0/ (1 << 15))) ||
yading@10 351 (ret = ff_mdct_init(&q->mdct_ctx[1], 8, 1, -1.0/ (1 << 15))) ||
yading@10 352 (ret = ff_mdct_init(&q->mdct_ctx[2], 9, 1, -1.0/ (1 << 15)))) {
yading@10 353 av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n");
yading@10 354 atrac1_decode_end(avctx);
yading@10 355 return ret;
yading@10 356 }
yading@10 357
yading@10 358 ff_init_ff_sine_windows(5);
yading@10 359
yading@10 360 ff_atrac_generate_tables();
yading@10 361
yading@10 362 avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
yading@10 363
yading@10 364 q->bands[0] = q->low;
yading@10 365 q->bands[1] = q->mid;
yading@10 366 q->bands[2] = q->high;
yading@10 367
yading@10 368 /* Prepare the mdct overlap buffers */
yading@10 369 q->SUs[0].spectrum[0] = q->SUs[0].spec1;
yading@10 370 q->SUs[0].spectrum[1] = q->SUs[0].spec2;
yading@10 371 q->SUs[1].spectrum[0] = q->SUs[1].spec1;
yading@10 372 q->SUs[1].spectrum[1] = q->SUs[1].spec2;
yading@10 373
yading@10 374 return 0;
yading@10 375 }
yading@10 376
yading@10 377
yading@10 378 AVCodec ff_atrac1_decoder = {
yading@10 379 .name = "atrac1",
yading@10 380 .type = AVMEDIA_TYPE_AUDIO,
yading@10 381 .id = AV_CODEC_ID_ATRAC1,
yading@10 382 .priv_data_size = sizeof(AT1Ctx),
yading@10 383 .init = atrac1_decode_init,
yading@10 384 .close = atrac1_decode_end,
yading@10 385 .decode = atrac1_decode_frame,
yading@10 386 .capabilities = CODEC_CAP_DR1,
yading@10 387 .long_name = NULL_IF_CONFIG_SMALL("Atrac 1 (Adaptive TRansform Acoustic Coding)"),
yading@10 388 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
yading@10 389 AV_SAMPLE_FMT_NONE },
yading@10 390 };