aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/dv.c
diff options
context:
space:
mode:
authorBurkhard Plaum <plaum@ipf.uni-stuttgart.de>2005-12-25 22:38:21 +0000
committerMichael Niedermayer <michaelni@gmx.at>2005-12-25 22:38:21 +0000
commitc842aa378db6c9da156bd245b8f8d05d889e3d7e (patch)
tree5a1d12be5d38243b4a7c6bd528df6ca4750eb97e /libavcodec/dv.c
parente8501c93b58d93505adaaaaf6d99595a9f33949c (diff)
downloadffmpeg-c842aa378db6c9da156bd245b8f8d05d889e3d7e.tar.gz
Fix DV memory leak and allow multiple instances patch by (Burkhard Plaum?)
approved by Roman Shaposhnik Originally committed as revision 4777 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/dv.c')
-rw-r--r--libavcodec/dv.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/libavcodec/dv.c b/libavcodec/dv.c
index dae7fdd9eb..db3178c4c0 100644
--- a/libavcodec/dv.c
+++ b/libavcodec/dv.c
@@ -49,6 +49,9 @@ typedef struct DVVideoContext {
void (*get_pixels)(DCTELEM *block, const uint8_t *pixels, int line_size);
void (*fdct[2])(DCTELEM *block);
void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block);
+
+ /* MultiThreading */
+ uint8_t** dv_anchor;
} DVVideoContext;
#define TEX_VLC_BITS 9
@@ -61,9 +64,6 @@ typedef struct DVVideoContext {
#define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check
#endif
-/* MultiThreading */
-static uint8_t** dv_anchor;
-
/* XXX: also include quantization */
static RL_VLC_ELEM *dv_rl_vlc;
/* VLC encoding lookup table */
@@ -118,12 +118,12 @@ static int dvvideo_init(AVCodecContext *avctx)
return -ENOMEM;
/* dv_anchor lets each thread know its Id */
- dv_anchor = av_malloc(12*27*sizeof(void*));
- if (!dv_anchor) {
+ s->dv_anchor = av_malloc(12*27*sizeof(void*));
+ if (!s->dv_anchor) {
return -ENOMEM;
}
for (i=0; i<12*27; i++)
- dv_anchor[i] = (void*)(size_t)i;
+ s->dv_anchor[i] = (void*)(size_t)i;
/* it's faster to include sign bit in a generic VLC parsing scheme */
for (i=0, j=0; i<NB_DV_VLC; i++, j++) {
@@ -149,9 +149,9 @@ static int dvvideo_init(AVCodecContext *avctx)
init_vlc(&dv_vlc, TEX_VLC_BITS, j,
new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0);
- dv_rl_vlc = av_malloc(dv_vlc.table_size * sizeof(RL_VLC_ELEM));
+ dv_rl_vlc = av_mallocz_static(dv_vlc.table_size * sizeof(RL_VLC_ELEM));
if (!dv_rl_vlc) {
- av_free(dv_anchor);
+ av_free(s->dv_anchor);
return -ENOMEM;
}
for(i = 0; i < dv_vlc.table_size; i++){
@@ -939,7 +939,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
s->picture.top_field_first = 0;
s->buf = buf;
- avctx->execute(avctx, dv_decode_mt, (void**)&dv_anchor[0], NULL,
+ avctx->execute(avctx, dv_decode_mt, (void**)&s->dv_anchor[0], NULL,
s->sys->difseg_size * 27);
emms_c();
@@ -968,13 +968,23 @@ static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
s->picture.pict_type = FF_I_TYPE;
s->buf = buf;
- c->execute(c, dv_encode_mt, (void**)&dv_anchor[0], NULL,
+ c->execute(c, dv_encode_mt, (void**)&s->dv_anchor[0], NULL,
s->sys->difseg_size * 27);
emms_c();
return s->sys->frame_size;
}
+static int dvvideo_close(AVCodecContext *c)
+{
+ DVVideoContext *s = c->priv_data;
+
+ av_free(s->dv_anchor);
+
+ return 0;
+}
+
+
#ifdef CONFIG_DVVIDEO_ENCODER
AVCodec dvvideo_encoder = {
"dvvideo",
@@ -983,7 +993,7 @@ AVCodec dvvideo_encoder = {
sizeof(DVVideoContext),
dvvideo_init,
dvvideo_encode_frame,
- NULL,
+ dvvideo_close,
NULL,
CODEC_CAP_DR1,
NULL
@@ -997,7 +1007,7 @@ AVCodec dvvideo_decoder = {
sizeof(DVVideoContext),
dvvideo_init,
NULL,
- NULL,
+ dvvideo_close,
dvvideo_decode_frame,
CODEC_CAP_DR1,
NULL