summaryrefslogtreecommitdiff
path: root/libavcodec/atrac3.c
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2010-07-20 15:08:54 +0000
committerVitor Sessak <vitor1001@gmail.com>2010-07-20 15:08:54 +0000
commita28cccf6d62dc770757491510c248ed632a836ce (patch)
tree4993a4011c6cad934db89b7b0674971d5e595a1b /libavcodec/atrac3.c
parentcbbb10810c7a72fa7742c89459866aad942f7070 (diff)
Fix memory leak in ATRAC3 decoder
Originally committed as revision 24361 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/atrac3.c')
-rw-r--r--libavcodec/atrac3.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c
index c29fb19252..3ac747ccfd 100644
--- a/libavcodec/atrac3.c
+++ b/libavcodec/atrac3.c
@@ -118,13 +118,14 @@ typedef struct {
int scrambled_stream;
int frame_factor;
//@}
+
+ FFTContext mdct_ctx;
} ATRAC3Context;
static DECLARE_ALIGNED(16, float,mdct_window)[512];
static VLC spectral_coeff_tab[7];
static float gain_tab1[16];
static float gain_tab2[31];
-static FFTContext mdct_ctx;
static DSPContext dsp;
@@ -137,7 +138,7 @@ static DSPContext dsp;
* @param odd_band 1 if the band is an odd band
*/
-static void IMLT(float *pInput, float *pOutput, int odd_band)
+static void IMLT(ATRAC3Context *q, float *pInput, float *pOutput, int odd_band)
{
int i;
@@ -155,7 +156,7 @@ static void IMLT(float *pInput, float *pOutput, int odd_band)
FFSWAP(float, pInput[i], pInput[255-i]);
}
- ff_imdct_calc(&mdct_ctx,pOutput,pInput);
+ ff_imdct_calc(&q->mdct_ctx,pOutput,pInput);
/* Perform windowing on the output. */
dsp.vector_fmul(pOutput,mdct_window,512);
@@ -207,7 +208,7 @@ static av_cold void init_atrac3_transforms(ATRAC3Context *q) {
}
/* Initialize the MDCT transform. */
- ff_mdct_init(&mdct_ctx, 9, 1, 1.0);
+ ff_mdct_init(&q->mdct_ctx, 9, 1, 1.0);
}
/**
@@ -220,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;
}
@@ -694,7 +696,7 @@ static int decodeChannelSoundUnit (ATRAC3Context *q, GetBitContext *gb, channel_
for (band=0; band<4; band++) {
/* Perform the IMDCT step without overlapping. */
if (band <= numBands) {
- IMLT(&(pSnd->spectrum[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));