[FFmpeg-devel] [PATCH] avcodec/utils: Allocate dummy codec_frame for video encoders which do not allocate one

wm4 nfxjfg at googlemail.com
Mon Feb 23 18:15:15 CET 2015


On Mon, 23 Feb 2015 17:19:16 +0100
Michael Niedermayer <michaelni at gmx.at> wrote:

> This should allow simplifying many encoders
> 
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
>  libavcodec/utils.c |   12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index c5e6300..c6d588a 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -1695,6 +1695,16 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
>          av_assert0(*(const AVClass **)avctx->priv_data == codec->priv_class);
>      }
>  
> +    if (av_codec_is_encoder(avctx->codec) &&
> +        avctx->codec_type == AVMEDIA_TYPE_VIDEO &&
> +        !avctx->coded_frame) {
> +        avctx->coded_frame = av_frame_alloc();
> +        if (avctx->coded_frame) {
> +            av_assert0(avctx->coded_frame->key_frame);
> +            avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
> +        }
> +    }
> +
>  end:
>      ff_unlock_avcodec();
>      if (options) {
> @@ -2852,6 +2862,8 @@ av_cold int avcodec_close(AVCodecContext *avctx)
>          av_freep(&avctx->internal->hwaccel_priv_data);
>  
>          av_freep(&avctx->internal);
> +        if (av_codec_is_encoder(avctx->codec))
> +            av_frame_free(&avctx->coded_frame);

This isn't the same condition. You might free the frame, even if you
didn't allocate it.

What's the value in allocating the frame anyway? Seems like it
increases the memory management pain levels by 200%.

>      }
>  
>      if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)



More information about the ffmpeg-devel mailing list