[Ffmpeg-devel] [PATCH] Fix DV memory leak and allow multiple instances

Roman Shaposhnik Roman.Shaposhnick
Mon Dec 19 23:43:02 CET 2005


Guys,

I'm still catching up with 1000+ emails in my INBOX, hence
the question -- has anybody already taken care of this one?

Thanks,
Roman.

On Tue, Dec 13, 2005 at 10:37:58PM +0100, plaum at ipf.uni-stuttgart.de wrote:
> Hi,
> 
> this patch fixes 2 memory leaks in the DV codec and allows multiple
> codec instances by moving the global variable "dv_anchor" to the
> per codec data.
> 
> Cheers
> 
> Burkhard
> 

> ? dv_memleak_patch.txt
> Index: libavcodec/dv.c
> ===================================================================
> RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/dv.c,v
> retrieving revision 1.65
> diff -u -r1.65 dv.c
> --- libavcodec/dv.c	2 Sep 2005 08:30:26 -0000	1.65
> +++ libavcodec/dv.c	13 Dec 2005 21:25:08 -0000
> @@ -49,6 +49,9 @@
>      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 @@
>  #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 @@
>  	    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 @@
>          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 @@
>      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 @@
>      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 @@
>      sizeof(DVVideoContext),
>      dvvideo_init,
>      dvvideo_encode_frame,
> -    NULL,
> +    dvvideo_close,
>      NULL,
>      CODEC_CAP_DR1,
>      NULL
> @@ -997,7 +1007,7 @@
>      sizeof(DVVideoContext),
>      dvvideo_init,
>      NULL,
> -    NULL,
> +    dvvideo_close,
>      dvvideo_decode_frame,
>      CODEC_CAP_DR1,
>      NULL
> 

> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at mplayerhq.hu
> http://mplayerhq.hu/mailman/listinfo/ffmpeg-devel





More information about the ffmpeg-devel mailing list