X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fatrac3.c;h=563352094dfcd353bf2557bf700d7a9a5b54f94d;hb=cf39b461d31a213261cb7dab21e8aeb0bb1673d5;hp=f4390076d6e64791fd00812bba02affce42ed35a;hpb=bad5537e2c2caeb5deb1ff9d771ea01058b8010c;p=ffmpeg diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c index f4390076d6e..563352094df 100644 --- a/libavcodec/atrac3.c +++ b/libavcodec/atrac3.c @@ -3,25 +3,25 @@ * Copyright (c) 2006-2008 Maxim Poliakovski * Copyright (c) 2006-2008 Benjamin Larsson * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file libavcodec/atrac3.c + * @file * Atrac 3 compatible decoder. * This decoder handles Sony's ATRAC3 data. * @@ -37,10 +37,12 @@ #include #include "avcodec.h" -#include "bitstream.h" +#include "get_bits.h" #include "dsputil.h" #include "bytestream.h" +#include "fft.h" +#include "atrac.h" #include "atrac3data.h" #define JOINT_STEREO 0x12 @@ -72,8 +74,8 @@ typedef struct { int gcBlkSwitch; gain_block gainBlock[2]; - DECLARE_ALIGNED_16(float, spectrum[1024]); - DECLARE_ALIGNED_16(float, IMDCT_buf[1024]); + DECLARE_ALIGNED(16, float, spectrum)[1024]; + DECLARE_ALIGNED(16, float, IMDCT_buf)[1024]; float delayBuf1[46]; ///mdct_ctx.imdct_calc(&q->mdct_ctx,pOutput,pInput); /* Perform windowing on the output. */ - dsp.vector_fmul(pOutput,mdct_window,512); + dsp.vector_fmul(pOutput, pOutput, mdct_window, 512); } @@ -219,9 +167,9 @@ static void IMLT(float *pInput, float *pOutput, int odd_band) /** * Atrac 3 indata descrambling, only used for data coming from the rm container * - * @param in pointer to 8 bit array of indata - * @param bits amount of bits + * @param inbuffer pointer to 8 bit array of indata * @param out pointer to 8 bit array of outdata + * @param bytes amount of bytes */ static int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ @@ -230,9 +178,9 @@ static int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ const uint32_t* buf; uint32_t* obuf = (uint32_t*) out; - off = (int)((long)inbuffer & 3); + off = (intptr_t)inbuffer & 3; buf = (const uint32_t*) (inbuffer - off); - c = be2me_32((0x537F6103 >> (off*8)) | (0x537F6103 << (32-(off*8)))); + c = av_be2ne32((0x537F6103 >> (off*8)) | (0x537F6103 << (32-(off*8)))); bytes += 3 + off; for (i = 0; i < bytes/4; i++) obuf[i] = c ^ buf[i]; @@ -244,9 +192,8 @@ static int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ } -static void init_atrac3_transforms(ATRAC3Context *q) { +static av_cold void init_atrac3_transforms(ATRAC3Context *q) { float enc_window[256]; - float s; int i; /* Generate the mdct window, for details see @@ -260,27 +207,21 @@ static void init_atrac3_transforms(ATRAC3Context *q) { mdct_window[511-i] = mdct_window[i]; } - /* Generate the QMF window. */ - for (i=0 ; i<24; i++) { - s = qmf_48tap_half[i] * 2.0; - qmf_window[i] = s; - qmf_window[47 - i] = s; - } - /* Initialize the MDCT transform. */ - ff_mdct_init(&mdct_ctx, 9, 1); + ff_mdct_init(&q->mdct_ctx, 9, 1, 1.0); } /** * Atrac3 uninit, free all allocated memory */ -static int atrac3_decode_close(AVCodecContext *avctx) +static av_cold int atrac3_decode_close(AVCodecContext *avctx) { ATRAC3Context *q = avctx->priv_data; av_free(q->pUnits); av_free(q->decoded_bytes_buffer); + ff_mdct_end(&q->mdct_ctx); return 0; } @@ -386,7 +327,7 @@ static int decodeSpectrum (GetBitContext *gb, float *pOut) readQuantSpectralCoeffs (gb, subband_vlc_index[cnt], codingMode, mantissas, subbWidth); /* Decode the scale factor for this subband. */ - SF = SFTable[SF_idxs[cnt]] * iMaxQuant[subband_vlc_index[cnt]]; + SF = ff_atrac_sf_table[SF_idxs[cnt]] * iMaxQuant[subband_vlc_index[cnt]]; /* Inverse quantize the coefficients. */ for (pIn=mantissas ; firstspectrum[band*256]), pSnd->IMDCT_buf, band&1); + IMLT(q, &(pSnd->spectrum[band*256]), pSnd->IMDCT_buf, band&1); } else memset(pSnd->IMDCT_buf, 0, 512 * sizeof(float)); @@ -860,9 +801,9 @@ static int decodeFrame(ATRAC3Context *q, const uint8_t* databuf) p2= p1+256; p3= p2+256; p4= p3+256; - iqmf (p1, p2, 256, p1, q->pUnits[i].delayBuf1, q->tempBuf); - iqmf (p4, p3, 256, p3, q->pUnits[i].delayBuf2, q->tempBuf); - iqmf (p1, p3, 512, p1, q->pUnits[i].delayBuf3, q->tempBuf); + atrac_iqmf (p1, p2, 256, p1, q->pUnits[i].delayBuf1, q->tempBuf); + atrac_iqmf (p4, p3, 256, p3, q->pUnits[i].delayBuf2, q->tempBuf); + atrac_iqmf (p1, p3, 512, p1, q->pUnits[i].delayBuf3, q->tempBuf); p1 +=1024; } @@ -878,14 +819,20 @@ static int decodeFrame(ATRAC3Context *q, const uint8_t* databuf) static int atrac3_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - const uint8_t *buf, int buf_size) { + AVPacket *avpkt) { + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; ATRAC3Context *q = avctx->priv_data; int result = 0, i; const uint8_t* databuf; int16_t* samples = data; - if (buf_size < avctx->block_align) + if (buf_size < avctx->block_align) { + av_log(avctx, AV_LOG_ERROR, + "Frame too small (%d bytes). Truncated file?\n", buf_size); + *data_size = 0; return buf_size; + } /* Check if we need to descramble and what buffer to pass on. */ if (q->scrambled_stream) { @@ -926,11 +873,13 @@ static int atrac3_decode_frame(AVCodecContext *avctx, * @param avctx pointer to the AVCodecContext */ -static int atrac3_decode_init(AVCodecContext *avctx) +static av_cold int atrac3_decode_init(AVCodecContext *avctx) { int i; const uint8_t *edata_ptr = avctx->extradata; ATRAC3Context *q = avctx->priv_data; + static VLC_TYPE atrac3_vlc_table[4096][2]; + static int vlcs_initialized = 0; /* Take data from the AVCodecContext (RM container). */ q->sample_rate = avctx->sample_rate; @@ -1021,17 +970,20 @@ static int atrac3_decode_init(AVCodecContext *avctx) /* Initialize the VLC tables. */ - for (i=0 ; i<7 ; i++) { - init_vlc (&spectral_coeff_tab[i], 9, huff_tab_sizes[i], - huff_bits[i], 1, 1, - huff_codes[i], 1, 1, INIT_VLC_USE_STATIC); + if (!vlcs_initialized) { + for (i=0 ; i<7 ; i++) { + spectral_coeff_tab[i].table = &atrac3_vlc_table[atrac3_vlc_offs[i]]; + spectral_coeff_tab[i].table_allocated = atrac3_vlc_offs[i + 1] - atrac3_vlc_offs[i]; + init_vlc (&spectral_coeff_tab[i], 9, huff_tab_sizes[i], + huff_bits[i], 1, 1, + huff_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); + } + vlcs_initialized = 1; } init_atrac3_transforms(q); - /* Generate the scale factors. */ - for (i=0 ; i<64 ; i++) - SFTable[i] = pow(2.0, (i - 15) / 3.0); + atrac_generate_tables(); /* Generate gain tables. */ for (i=0 ; i<16 ; i++) @@ -1062,15 +1014,15 @@ static int atrac3_decode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); } - avctx->sample_fmt = SAMPLE_FMT_S16; + avctx->sample_fmt = AV_SAMPLE_FMT_S16; return 0; } -AVCodec atrac3_decoder = +AVCodec ff_atrac3_decoder = { .name = "atrac3", - .type = CODEC_TYPE_AUDIO, + .type = AVMEDIA_TYPE_AUDIO, .id = CODEC_ID_ATRAC3, .priv_data_size = sizeof(ATRAC3Context), .init = atrac3_decode_init,