[FFmpeg-devel] [PATCH] Document and validate AVFrame plane pointers.

wm4 nfxjfg at googlemail.com
Fri Feb 26 22:39:41 CET 2016


On Fri, 26 Feb 2016 22:25:21 +0100
Reimar Döffinger <Reimar.Doeffinger at gmx.de> wrote:

> Check that the required plane pointers and only
> those are set up.
> 
> Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
> ---
>  libavcodec/utils.c | 14 ++++++++++++++
>  libavutil/frame.h  |  3 +++
>  2 files changed, 17 insertions(+)
> 
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index af21cdd..af5ff93 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -885,6 +885,20 @@ static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
>          avctx->sw_pix_fmt = avctx->pix_fmt;
>  
>      ret = avctx->get_buffer2(avctx, frame, flags);
> +    if (ret >= 0 && avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        int i;
> +        int num_planes = av_pix_fmt_count_planes(frame->format);
> +        for (i = 0; i < num_planes; i++) {
> +            av_assert0(frame->data[i]);
> +        }
> +        // for formats without data like hwaccel allow
> +        // pointers to be non-NULL.
> +        for (i = num_planes; num_planes > 0 && i < num_planes; i++) {
> +            if (frame->data[i])
> +                av_log(avctx, AV_LOG_ERROR, "Buffer returned by get_buffer2() did not zero unused plane pointers\n");
> +            frame->data[i] = NULL;
> +        }
> +    }
>  

Can you move it to a separate function? Say, ff_verify_frame(). This
could get much more complicated too when checking AVBufferRef usage or
audio.

>  end:
>      if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions) {
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 56001a8..76a8123 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -187,6 +187,9 @@ typedef struct AVFrame {
>       * see avcodec_align_dimensions2(). Some filters and swscale can read
>       * up to 16 bytes beyond the planes, if these filters are to be used,
>       * then 16 extra bytes must be allocated.
> +     *
> +     * NOTE: Except for hwaccel formats, pointers not needed by the format
> +     * MUST be set to NULL.
>       */
>      uint8_t *data[AV_NUM_DATA_POINTERS];
>  



More information about the ffmpeg-devel mailing list