X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fatrac3.c;h=accaae3d65e6fd27561a1593afe53e2353023e09;hb=f4e043ff63935a71b98a36bc98b501c36ceadb92;hp=811dc4fe0c416d2da0cfd6f141ce27ad0f856d16;hpb=7a00bbad2100367481240e62876b941b5c4befdc;p=ffmpeg diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c index 811dc4fe0c4..accaae3d65e 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(32, float, spectrum)[1024]; + DECLARE_ALIGNED(32, 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){ @@ -232,13 +180,13 @@ static int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ 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]; if (off) - av_log(NULL,AV_LOG_DEBUG,"Offset of %d not handled, post sample on ffmpeg-dev.\n",off); + av_log_ask_for_sample(NULL, "Offset of %d not handled.\n", off); return off; } @@ -246,7 +194,6 @@ static int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ 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,15 +207,8 @@ static av_cold 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); } /** @@ -281,6 +221,7 @@ static av_cold int atrac3_decode_close(AVCodecContext *avctx) 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; } @@ -886,8 +827,12 @@ static int atrac3_decode_frame(AVCodecContext *avctx, 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) { @@ -933,6 +878,8 @@ 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; @@ -1023,17 +970,20 @@ static av_cold 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++) @@ -1064,15 +1014,15 @@ static av_cold 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,