summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorWenbin Chen <wenbin.chen-at-intel.com@ffmpeg.org>2022-04-06 16:48:04 +0800
committerHaihao Xiang <haihao.xiang@intel.com>2022-04-06 17:12:26 +0800
commitfb8880906375a2a17ed94c2ef7b9048fd25a75ec (patch)
treeb99da59bab3de309624f426157c3f6d4c59a58a3 /libavcodec
parente0ae810da3ed0b4489d0dc35c40aa239ba213ec6 (diff)
libavcodec/qsvenc: Add more pixel format support to qsvenc
Qsv encoder only support input P010 and nv12 format directly from system memory. For other format, we need to upload frame to device memory and input qsv format to encoder. Now add other system memory format support to qsv encoder. Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/qsvenc.c30
-rw-r--r--libavcodec/qsvenc_hevc.c2
2 files changed, 6 insertions, 26 deletions
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index d7441ac447..2514d5b256 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -1623,32 +1623,10 @@ static int submit_frame(QSVEncContext *q, const AVFrame *frame,
else if (frame->repeat_pict == 4)
qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FRAME_TRIPLING;
- 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;
-
- case AV_PIX_FMT_X2RGB10:
- case AV_PIX_FMT_BGRA:
- qf->surface.Data.B = qf->frame->data[0];
- qf->surface.Data.G = qf->frame->data[0] + 1;
- qf->surface.Data.R = qf->frame->data[0] + 2;
- qf->surface.Data.A = qf->frame->data[0] + 3;
- break;
-
- default:
- /* should not reach here */
- av_assert0(0);
- break;
+ ret = ff_qsv_map_frame_to_surface(qf->frame, &qf->surface);
+ if (ret < 0) {
+ av_log(q->avctx, AV_LOG_ERROR, "map frame to surface failed.\n");
+ return ret;
}
}
qf->surface.Data.TimeStamp = av_rescale_q(frame->pts, q->avctx->time_base, (AVRational){1, 90000});
diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c
index 36c2d484ad..3a2d50e332 100644
--- a/libavcodec/qsvenc_hevc.c
+++ b/libavcodec/qsvenc_hevc.c
@@ -303,6 +303,8 @@ const FFCodec ff_hevc_qsv_encoder = {
.p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
.p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
AV_PIX_FMT_P010,
+ AV_PIX_FMT_YUYV422,
+ AV_PIX_FMT_Y210,
AV_PIX_FMT_QSV,
#if QSV_VERSION_ATLEAST(1, 17)
AV_PIX_FMT_BGRA,