ffmpeg | branch: master | James Almer <jamr...@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 <jamr...@gmail.com> Padding-Remixed-by: Michael Niedermayer <mich...@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; _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog