From 0d82613b7dcdbe9e51b77f06baa72d5715343b8f Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Mon, 13 Dec 2021 14:40:55 +0800 Subject: lavc/qsvenc: set base address for V plane The SDK checks Data.V when using system memory for VP9 encoding. This fixed the error below: $ ffmpeg -qsv_device /dev/dri/renderD129 -f lavfi -i yuvtestsrc -c:v vp9_qsv -f null - [vp9_qsv @ 0x55b8387cbe90] Error during encoding: NULL pointer (-2) Video encoding failed Signed-off-by: Haihao Xiang --- libavcodec/qsvenc.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'libavcodec/qsvenc.c') diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index db6d397068..602436da63 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -1535,8 +1535,23 @@ static int submit_frame(QSVEncContext *q, const AVFrame *frame, qf->surface.Data.PitchLow = qf->frame->linesize[0]; qf->surface.Data.Y = qf->frame->data[0]; qf->surface.Data.UV = qf->frame->data[1]; - } + /* The SDK checks Data.V when using system memory for VP9 encoding */ + switch (frame->format) { + case AV_PIX_FMT_NV12: + qf->surface.Data.V = qf->surface.Data.UV + 1; + break; + + case AV_PIX_FMT_P010: + qf->surface.Data.V = qf->surface.Data.UV + 2; + break; + + default: + /* should not reach here */ + av_assert0(0); + break; + } + } qf->surface.Data.TimeStamp = av_rescale_q(frame->pts, q->avctx->time_base, (AVRational){1, 90000}); *new_frame = qf; -- cgit v1.2.3