diff --git a/doc/encoders.texi b/doc/encoders.texi index 4e35e50e4d20f..bfb6c7eef6ab2 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 84ad056f32bef..ef8213097e0e2 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 5fa0b6f5ba04d..41619f9b3e4c2 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 9329990d11d6f..1168ddda0e9fc 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 }, };