[FFmpeg-cvslog] Merge commit 'f89ec87afaf0d1abb6d450253b0b348fd554533b'
James Almer
git at videolan.org
Tue Sep 11 19:09:48 EEST 2018
ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Tue Sep 11 11:48:38 2018 -0300| [8822e2b9543bb02fb2889dff627b6db023053253] | committer: James Almer
Merge commit 'f89ec87afaf0d1abb6d450253b0b348fd554533b'
* commit 'f89ec87afaf0d1abb6d450253b0b348fd554533b':
frame: Simplify the video allocation
Merged-by: James Almer <jamrial at gmail.com>
Padding-Remixed-by: Michael Niedermayer <michael at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8822e2b9543bb02fb2889dff627b6db023053253
---
libavutil/frame.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index deb9b6f334..6c2c28f18f 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -211,7 +211,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;
+ int ret, i, padded_height;
+ int plane_padding = FFMAX(16 + 16/*STRIDE_ALIGN*/, align);
if (!desc)
return AVERROR(EINVAL);
@@ -236,23 +237,22 @@ 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);
+ 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 + 4*plane_padding);
+ 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;
+
+ for (i = 1; i < 4; i++) {
+ if (frame->data[i])
+ frame->data[i] += i * plane_padding;
}
frame->extended_data = frame->data;
======================================================================
diff --cc libavutil/frame.c
index deb9b6f334,fa6245914e..6c2c28f18f
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@@ -210,11 -89,7 +210,12 @@@ void av_frame_free(AVFrame **frame
static int get_video_buffer(AVFrame *frame, int align)
{
- int ret, i;
+ const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
- int ret, i;
++ int ret, i, padded_height;
++ int plane_padding = FFMAX(16 + 16/*STRIDE_ALIGN*/, align);
+
+ if (!desc)
+ return AVERROR(EINVAL);
if ((ret = av_image_check_size(frame->width, frame->height, 0, NULL)) < 0)
return ret;
@@@ -236,25 -107,18 +237,24 @@@
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);
- if ((ret = av_image_fill_pointers(frame->data, frame->format, frame->height,
++ padded_height = FFALIGN(frame->height, 32);
++ if ((ret = av_image_fill_pointers(frame->data, frame->format, padded_height,
+ NULL, frame->linesize)) < 0)
+ return ret;
+
- frame->buf[0] = av_buffer_alloc(ret);
++ frame->buf[0] = av_buffer_alloc(ret + 4*plane_padding);
+ if (!frame->buf[0])
+ goto fail;
- frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h + 16 + 16/*STRIDE_ALIGN*/ - 1);
- if (!frame->buf[i])
- goto fail;
- if (av_image_fill_pointers(frame->data, frame->format, frame->height,
++ if (av_image_fill_pointers(frame->data, frame->format, padded_height,
+ frame->buf[0]->data, frame->linesize) < 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;
++ for (i = 1; i < 4; i++) {
++ if (frame->data[i])
++ frame->data[i] += i * plane_padding;
+ }
+
frame->extended_data = frame->data;
return 0;
More information about the ffmpeg-cvslog
mailing list