[FFmpeg-devel] [PATCH] lavc/vaapi_h26[45]: add crop info support in vaapi_h26[4, 5]
Jun Zhao
mypopydev at gmail.com
Wed Nov 30 04:20:54 EET 2016
From 20bedd18213420c77d5e8a26fbe741d8d204ac10 Mon Sep 17 00:00:00 2001
From: Jun Zhao <jun.zhao at 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.wang at intel.com>
Signed-off-by: Jun Zhao <jun.zhao at 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
More information about the ffmpeg-devel
mailing list