frame: Simplify the video allocation
authorLuca Barbato <lu_zero@gentoo.org>
Fri, 27 Jul 2018 06:34:08 +0000 (08:34 +0200)
committerLuca Barbato <lu_zero@gentoo.org>
Sun, 5 Aug 2018 20:45:08 +0000 (22:45 +0200)
libavutil/frame.c

index db3897c..fa62459 100644 (file)
@@ -89,12 +89,8 @@ 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;
 
-    if (!desc)
-        return AVERROR(EINVAL);
-
     if ((ret = av_image_check_size(frame->width, frame->height, 0, NULL)) < 0)
         return ret;
 
@@ -111,24 +107,17 @@ 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 = frame->height;
-        if (i == 1 || i == 2)
-            h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
+    if ((ret = av_image_fill_pointers(frame->data, frame->format, frame->height,
+                                      NULL, frame->linesize)) < 0)
+        return ret;
 
-        frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h);
-        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 & AV_PIX_FMT_FLAG_PSEUDOPAL) {
-        av_buffer_unref(&frame->buf[1]);
-        frame->buf[1] = av_buffer_alloc(1024);
-        if (!frame->buf[1])
-            goto fail;
-        frame->data[1] = frame->buf[1]->data;
-    }
+    if (av_image_fill_pointers(frame->data, frame->format, frame->height,
+                               frame->buf[0]->data, frame->linesize) < 0)
+        goto fail;
 
     frame->extended_data = frame->data;