From 20bedd18213420c77d5e8a26fbe741d8d204ac10 Mon Sep 17 00:00:00 2001 From: Jun Zhao <jun.z...@intel.com> Date: Tue, 29 Nov 2016 14:14:25 +0800 Subject: [PATCH] lavc/vaapi_h26[45]: add crop info support in vaapi_h26[4,5]
add crop information support in vaapi_h26[4,5] hwaccel decode, and align h264/hevc software decoder. After this fix, FATE test h264-conformance-cvfc1_sony_c/hevc-conformance-CONFWIN_A_Sony_1 will pass in i965/SKL. Signed-off-by: Wang, Yi A <yi.a.w...@intel.com> Signed-off-by: Jun Zhao <jun.z...@intel.com> --- libavcodec/h264dec.c | 13 +++++++++++++ libavcodec/hevc_refs.c | 7 +++++++ libavutil/hwcontext.h | 6 ++++++ libavutil/hwcontext_vaapi.c | 1 + 4 files changed, 27 insertions(+) diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index ed0b724..2e7692c 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -54,6 +54,7 @@ #include "rectangle.h" #include "thread.h" #include "vdpau_compat.h" +#include "libavutil/hwcontext.h" static int h264_decode_end(AVCodecContext *avctx); @@ -1012,6 +1013,18 @@ static int output_frame(H264Context *h, AVFrame *dst, H264Picture *srcp) (srcp->crop_top >> vshift) * dst->linesize[i]; dst->data[i] += off; } + + /* HWAccel always used data[0-3] in avframe */ + for (i = 0; i < 3; i++) { + if (dst->hw_frames_ctx) { + int hshift = (i > 0) ? desc->log2_chroma_w : 0; + int vshift = (i > 0) ? desc->log2_chroma_h : 0; + AVHWFramesContext *ctx = (AVHWFramesContext*)dst->hw_frames_ctx->data; + ctx->top_offset[i] = srcp->crop_top >> vshift; + ctx->left_offset[i] = (srcp->crop_left >> hshift) << h->pixel_shift; + } + } + return 0; } diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index 611ad45..a184de2 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -28,6 +28,7 @@ #include "thread.h" #include "hevc.h" +#include "libavutil/hwcontext.h" void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags) { /* frame->frame can be NULL if context init failed */ @@ -222,7 +223,13 @@ int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush) int off = ((frame->window.left_offset >> hshift) << pixel_shift) + (frame->window.top_offset >> vshift) * dst->linesize[i]; dst->data[i] += off; + if (out->hw_frames_ctx) { + AVHWFramesContext *ctx = (AVHWFramesContext*)out->hw_frames_ctx->data; + ctx->top_offset[i] = frame->window.top_offset >> vshift; + ctx->left_offset[i] = (frame->window.left_offset >> hshift) << pixel_shift; + } } + av_log(s->avctx, AV_LOG_DEBUG, "Output frame with POC %d.\n", frame->poc); return 1; diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h index 785da09..0d666c3 100644 --- a/libavutil/hwcontext.h +++ b/libavutil/hwcontext.h @@ -220,6 +220,12 @@ typedef struct AVHWFramesContext { * Must be set by the user before calling av_hwframe_ctx_init(). */ int width, height; + + /** + * The top and left offset of the frames + */ + int top_offset[AV_NUM_DATA_POINTERS]; + int left_offset[AV_NUM_DATA_POINTERS]; } AVHWFramesContext; /** diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index 6176bdc..fa026cc 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -781,6 +781,7 @@ static int vaapi_map_frame(AVHWFramesContext *hwfc, for (i = 0; i < map->image.num_planes; i++) { dst->data[i] = (uint8_t*)address + map->image.offsets[i]; dst->linesize[i] = map->image.pitches[i]; + dst->data[i] += hwfc->top_offset[i] * dst->linesize[i] + hwfc->left_offset[i]; } if ( #ifdef VA_FOURCC_YV16 -- 2.9.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel