On 08/21/2014 01:18 PM, Janne Grunau wrote:
> this has the same effect as setting MpegEncContext.context_initialized
> to 0 without the memory leaks.
>
> Janne
>
> ---8<---
> MpegEncContext based decoders are only fully initialized after the first
> ff_thread_get_buffer() call. The RV30/40 decoders may fail before a frame
> buffer was requested. ff_mpeg_update_thread_context() fails on half
> initialized MpegEncContexts. Since this can only happen before a the
> first frame was decoded there is no need to call
> ff_mpeg_update_thread_context().
>
> CC: [email protected]
> ---
>  libavcodec/rv34.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c
> index 0c36348..420fb64 100644
> --- a/libavcodec/rv34.c
> +++ b/libavcodec/rv34.c
> @@ -1553,16 +1553,18 @@ int 
> ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecConte
>              return err;
>      }
>  
> -    if ((err = ff_mpeg_update_thread_context(dst, src)))
> -        return err;
> -
>      r->cur_pts  = r1->cur_pts;
>      r->last_pts = r1->last_pts;
>      r->next_pts = r1->next_pts;
>  
>      memset(&r->si, 0, sizeof(r->si));
>  
> -    return 0;
> +    // Do no call ff_mpeg_update_thread_context on a partially initialized
> +    // decoder context.
> +    if (!s1->linesize)
> +        return 0;
> +
> +    return ff_mpeg_update_thread_context(dst, src);
>  }
>  
>  static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)

Fixes playback with my broken sample and valgrind says no leaks.

-- 
John      GnuPG fingerprint: D0EC B3DB C372 D1F1 0B01  83F0 49F1 D7B2 60D4 D0F7


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to