[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