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

Reimar Döffinger Reimar.Doeffinger at gmx.de
Fri Feb 26 22:25:21 CET 2016


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;
+        }
+    }
 
 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];
 
-- 
2.7.0



More information about the ffmpeg-devel mailing list