X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fatrac3.c;h=150f20171c2d012aa15213d67cadd1485f4f33d4;hb=080ce9071dc1d05fcfd40629eeb6d4a163abd840;hp=bdb8a8a8d4db22fc991de6008ab5f373d2a3298b;hpb=e05c8d068203c7cba9afdffe851aa1732bb8a809;p=ffmpeg diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c index bdb8a8a8d4d..150f20171c2 100644 --- a/libavcodec/atrac3.c +++ b/libavcodec/atrac3.c @@ -21,7 +21,7 @@ */ /** - * @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]; ///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,7 +817,9 @@ 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; @@ -931,6 +872,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; @@ -1021,17 +964,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++) @@ -1070,7 +1016,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) AVCodec 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,