summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaihao Xiang <haihao.xiang-at-intel.com@ffmpeg.org>2022-01-13 13:45:25 +0800
committerHaihao Xiang <haihao.xiang@intel.com>2022-01-29 12:02:52 +0800
commit80801e570566976195f515216de4403cdcf4f7a3 (patch)
tree952b16b58b456dab066a10d5a6c50d4f1bb57a20
parent4cc7239d8bf812387200dd54c0d1120ff68c2bce (diff)
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 <haihao.xiang@intel.com>
-rw-r--r--doc/encoders.texi6
-rw-r--r--libavcodec/qsvenc.c4
-rw-r--r--libavcodec/qsvenc.h1
-rw-r--r--libavcodec/qsvenc_vp9.c10
4 files changed, 21 insertions, 0 deletions
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 },
};