[FFmpeg-devel] [PATCH] frame: Simplify the video allocation

James Almer jamrial at gmail.com
Mon Sep 3 03:34:23 EEST 2018


From: Luca Barbato <lu_zero at gentoo.org>

Merged-by: James Almer <jamrial at gmail.com>
---
This is the next merge in the queue. It's a critical part of the AVFrame API,
so even if FATE passes I'd rather have others look at it and test in case
something breaks.

The only difference compared to the libav commit is the "32 - 1" padding per
plane when allocating the buffer, which was only in our tree.

 libavutil/frame.c | 28 +++++++++++-----------------
 1 file changed, 11 insertions(+), 17 deletions(-)

diff --git a/libavutil/frame.c b/libavutil/frame.c
index deb9b6f334..f072baa916 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -211,7 +211,7 @@ void av_frame_free(AVFrame **frame)
 static int get_video_buffer(AVFrame *frame, int align)
 {
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
-    int ret, i;
+    int ret, i, padded_height;
 
     if (!desc)
         return AVERROR(EINVAL);
@@ -236,24 +236,18 @@ static int get_video_buffer(AVFrame *frame, int align)
             frame->linesize[i] = FFALIGN(frame->linesize[i], align);
     }
 
-    for (i = 0; i < 4 && frame->linesize[i]; i++) {
-        int h = FFALIGN(frame->height, 32);
-        if (i == 1 || i == 2)
-            h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
+    padded_height = FFALIGN(frame->height, 32) + 32 /* STRIDE_ALIGN */ - 1;
+    if ((ret = av_image_fill_pointers(frame->data, frame->format, padded_height,
+                                      NULL, frame->linesize)) < 0)
+        return ret;
 
-        frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h + 16 + 16/*STRIDE_ALIGN*/ - 1);
-        if (!frame->buf[i])
-            goto fail;
+    frame->buf[0] = av_buffer_alloc(ret);
+    if (!frame->buf[0])
+        goto fail;
 
-        frame->data[i] = frame->buf[i]->data;
-    }
-    if (desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & FF_PSEUDOPAL) {
-        av_buffer_unref(&frame->buf[1]);
-        frame->buf[1] = av_buffer_alloc(AVPALETTE_SIZE);
-        if (!frame->buf[1])
-            goto fail;
-        frame->data[1] = frame->buf[1]->data;
-    }
+    if (av_image_fill_pointers(frame->data, frame->format, padded_height,
+                               frame->buf[0]->data, frame->linesize) < 0)
+        goto fail;
 
     frame->extended_data = frame->data;
 
-- 
2.18.0



More information about the ffmpeg-devel mailing list