[FFmpeg-cvslog] hwframe: Allow hwaccel frame allocators to align surface sizes

Anton Khirnov git at videolan.org
Tue Jun 27 19:06:30 EEST 2017


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Thu Jun 22 20:05:12 2017 +0200| [d14179e3d49eb0f2533db16151e01abb0018b165] | committer: wm4

hwframe: Allow hwaccel frame allocators to align surface sizes

Hardware accelerated decoding generally uses AVHWFramesContext for pool
allocation of hardware surfaces. These are setup to allocate surfaces
aligned to hardware and hwaccel API requirements. Due to the
architecture, av_hwframe_get_buffer() will return AVFrames with
the dimensions set to the aligned sizes.

This causes some decoders (like hevc) return these aligned size as
final frame size, instead of cropping them to the video's actual
dimensions. To make sure this doesn't happen, crop the frame to the
size the decoder expects when ff_get_buffer() is called.

Merges Libav commit 3fdf50f9e864c88da2139cf066832944de81acaa.

Signed-off-by: Luca Barbato <lu_zero at gentoo.org>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d14179e3d49eb0f2533db16151e01abb0018b165
---

 libavcodec/decode.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index dccce01402..052f93d82f 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1528,8 +1528,12 @@ int avcodec_default_get_buffer2(AVCodecContext *avctx, AVFrame *frame, int flags
 {
     int ret;
 
-    if (avctx->hw_frames_ctx)
-        return av_hwframe_get_buffer(avctx->hw_frames_ctx, frame, 0);
+    if (avctx->hw_frames_ctx) {
+        ret = av_hwframe_get_buffer(avctx->hw_frames_ctx, frame, 0);
+        frame->width  = avctx->coded_width;
+        frame->height = avctx->coded_height;
+        return ret;
+    }
 
     if ((ret = update_frame_pool(avctx, frame)) < 0)
         return ret;



More information about the ffmpeg-cvslog mailing list