From 80801e570566976195f515216de4403cdcf4f7a3 Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Thu, 13 Jan 2022 13:45:25 +0800 Subject: lavc/qsvenc: add tile encoding support for VP9 Add -tile_rows and -tile_cols options to specify the number of tile rows and columns Signed-off-by: Haihao Xiang --- doc/encoders.texi | 6 ++++++ libavcodec/qsvenc.c | 4 ++++ libavcodec/qsvenc.h | 1 + libavcodec/qsvenc_vp9.c | 10 ++++++++++ 4 files changed, 21 insertions(+) diff --git a/doc/encoders.texi b/doc/encoders.texi index 4e35e50e4d..bfb6c7eef6 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -3512,6 +3512,12 @@ These options are used by vp9_qsv @item profile2 @item profile3 @end table + +@item @var{tile_cols} +Number of columns for tiled encoding (requires libmfx >= 1.29). + +@item @var{tile_rows} +Number of rows for tiled encoding (requires libmfx >= 1.29). @end table @section snow diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index 84ad056f32..ef8213097e 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -1004,6 +1004,10 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) q->extvp9param.Header.BufferId = MFX_EXTBUFF_VP9_PARAM; q->extvp9param.Header.BufferSz = sizeof(q->extvp9param); q->extvp9param.WriteIVFHeaders = MFX_CODINGOPTION_OFF; +#if QSV_HAVE_EXT_VP9_TILES + q->extvp9param.NumTileColumns = q->tile_cols; + q->extvp9param.NumTileRows = q->tile_rows; +#endif q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extvp9param; } #endif diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h index 5fa0b6f5ba..41619f9b3e 100644 --- a/libavcodec/qsvenc.h +++ b/libavcodec/qsvenc.h @@ -41,6 +41,7 @@ #define QSV_HAVE_EXT_HEVC_TILES QSV_VERSION_ATLEAST(1, 13) #define QSV_HAVE_EXT_VP9_PARAM QSV_VERSION_ATLEAST(1, 26) +#define QSV_HAVE_EXT_VP9_TILES QSV_VERSION_ATLEAST(1, 29) #define QSV_HAVE_TRELLIS QSV_VERSION_ATLEAST(1, 8) #define QSV_HAVE_MAX_SLICE_SIZE QSV_VERSION_ATLEAST(1, 9) diff --git a/libavcodec/qsvenc_vp9.c b/libavcodec/qsvenc_vp9.c index 9329990d11..1168ddda0e 100644 --- a/libavcodec/qsvenc_vp9.c +++ b/libavcodec/qsvenc_vp9.c @@ -73,6 +73,16 @@ static const AVOption options[] = { { "profile2", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_VP9_2 }, INT_MIN, INT_MAX, VE, "profile" }, { "profile3", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_VP9_3 }, INT_MIN, INT_MAX, VE, "profile" }, +#if QSV_HAVE_EXT_VP9_TILES + /* The minimum tile width in luma pixels is 256, set maximum tile_cols to 32 for 8K video */ + { "tile_cols", "Number of columns for tiled encoding", OFFSET(qsv.tile_cols), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 32, VE }, + /* Set maximum tile_rows to 4 per VP9 spec */ + { "tile_rows", "Number of rows for tiled encoding", OFFSET(qsv.tile_rows), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 4, VE }, +#else + { "tile_cols", "(not supported)", OFFSET(qsv.tile_cols), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0, VE }, + { "tile_rows", "(not supported)", OFFSET(qsv.tile_rows), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0, VE }, +#endif + { NULL }, }; -- cgit v1.2.3