[FFmpeg-devel] [PATCH 1/2] Fix crash on resolution change (issue 2393).

Janne Grunau janne-ffmpeg
Sat Jan 22 18:21:21 CET 2011


On Sat, Jan 22, 2011 at 10:42:56AM -0500, Ronald S. Bultje wrote:
> Don't free RBSP tables (containing decoded NAL units) on resolution
> change, because we actually need this data to decode the frame after
> reiniting (with new resolution). Fixed issue 2393.
> ---
>  libavcodec/h264.c |   10 ++++++----
>  1 files changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
> index 40dc276..2c8ed33 100644
> --- a/libavcodec/h264.c
> +++ b/libavcodec/h264.c
> @@ -614,7 +614,7 @@ static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t
>  }
>  
>  
> -static void free_tables(H264Context *h){
> +static void free_tables(H264Context *h, int free_rbsp){
>      int i;
>      H264Context *hx;
>      av_freep(&h->intra4x4_pred_mode);
> @@ -637,10 +637,12 @@ static void free_tables(H264Context *h){
>          av_freep(&hx->top_borders[1]);
>          av_freep(&hx->top_borders[0]);
>          av_freep(&hx->s.obmc_scratchpad);
> +        if (free_rbsp){
>          av_freep(&hx->rbsp_buffer[1]);
>          av_freep(&hx->rbsp_buffer[0]);
>          hx->rbsp_buffer_size[0] = 0;
>          hx->rbsp_buffer_size[1] = 0;
> +        }
>          if (i) av_freep(&h->thread_context[i]);
>      }
>  }
> @@ -748,7 +750,7 @@ int ff_h264_alloc_tables(H264Context *h){
>  
>      return 0;
>  fail:
> -    free_tables(h);
> +    free_tables(h, 1);
>      return -1;
>  }
>  
> @@ -1776,7 +1778,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
>              || av_cmp_q(h->sps.sar, s->avctx->sample_aspect_ratio))) {
>          if(h != h0)
>              return -1;   // width / height changed during parallelized decoding
> -        free_tables(h);
> +        free_tables(h, 0);
>          flush_dpb(s->avctx);
>          MPV_common_end(s);
>      }
> @@ -3331,7 +3333,7 @@ av_cold void ff_h264_free_context(H264Context *h)
>  {
>      int i;
>  
> -    free_tables(h); //FIXME cleanup init stuff perhaps
> +    free_tables(h, 1); //FIXME cleanup init stuff perhaps
>  
>      for(i = 0; i < MAX_SPS_COUNT; i++)
>          av_freep(h->sps_buffers + i);

ok, reindenting is of course also ok and could be folded into single
patch. I'll queue both for patchwork.

Janne



More information about the ffmpeg-devel mailing list