aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2017-06-22 20:05:12 +0200
committerLuca Barbato <lu_zero@gentoo.org>2017-06-27 00:23:12 +0200
commit3fdf50f9e864c88da2139cf066832944de81acaa (patch)
treebcdd61cda070435f842a6f824acf84f04cde1b1f
parent068eaa534e7ddb2155e2830818d5c3f1069c68d8 (diff)
downloadffmpeg-3fdf50f9e864c88da2139cf066832944de81acaa.tar.gz
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. Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
-rw-r--r--libavcodec/decode.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index ae2c715677..175a6fae4c 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1006,8 +1006,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;