[FFmpeg-devel] [PATCH] lavc/qsvenc: add Tiles encode support for HEVC
mypopy at gmail.com
mypopy at gmail.com
Fri Nov 29 07:02:40 EET 2019
On Tue, Nov 26, 2019 at 12:04 PM Linjie Fu <linjie.fu at intel.com> wrote:
>
> Add -tile_rows and -tile_cols option to specify the number of tile rows
> and columns for ICL+ (gen 11) platform.
>
> A tile must wholly contain all the slices within it. Slices cannot cross
> tile boundaries. So the slice number would be implicitly resized to the
> max(nSlice, nTile).
>
> Example:
> ffmpeg -v verbose -hwaccel qsv -init_hw_device qsv=hw
> -filter_hw_device hw -f rawvideo -s:v 1920x1080 -i ./input.nv12 -vf
> format=nv12,hwupload=extra_hw_frames=64 -c:v hevc_qsv -tile_rows 2
> -tile_cols 2 -slices 4 -y output.h265
>
> Also dump the actual quantity of encoded tiled rows and columns in run
> time.
>
> Fix the enhancement #8400.
>
> Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> ---
> libavcodec/qsvenc.c | 32 +++++++++++++++++++++++++++++++-
> libavcodec/qsvenc.h | 7 +++++++
> libavcodec/qsvenc_hevc.c | 3 +++
> 3 files changed, 41 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
> index e176d57..64814fc 100644
> --- a/libavcodec/qsvenc.c
> +++ b/libavcodec/qsvenc.c
> @@ -139,6 +139,9 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q,
> #if QSV_HAVE_CO3
> mfxExtCodingOption3 *co3 = (mfxExtCodingOption3*)coding_opts[2];
> #endif
> +#if QSV_HAVE_EXT_HEVC_TILES
> + mfxExtHEVCTiles *exthevctiles = (mfxExtHEVCTiles *)coding_opts[3 + QSV_HAVE_CO_VPS];
> +#endif
>
> av_log(avctx, AV_LOG_VERBOSE, "profile: %s; level: %"PRIu16"\n",
> print_profile(info->CodecProfile), info->CodecLevel);
> @@ -204,6 +207,12 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q,
> av_log(avctx, AV_LOG_VERBOSE, "RateDistortionOpt: %s\n",
> print_threestate(co->RateDistortionOpt));
>
> +#if QSV_HAVE_EXT_HEVC_TILES
> + if (avctx->codec_id == AV_CODEC_ID_HEVC)
> + av_log(avctx, AV_LOG_VERBOSE, "NumTileColumns: %"PRIu16"; NumTileRows: %"PRIu16"\n",
> + exthevctiles->NumTileColumns, exthevctiles->NumTileRows);
> +#endif
> +
> #if QSV_HAVE_CO2
> av_log(avctx, AV_LOG_VERBOSE,
> "RecoveryPointSEI: %s IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
> @@ -771,6 +780,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
> }
> #endif
>
> +#if QSV_HAVE_EXT_HEVC_TILES
> + if (avctx->codec_id == AV_CODEC_ID_HEVC) {
> + q->exthevctiles.Header.BufferId = MFX_EXTBUFF_HEVC_TILES;
> + q->exthevctiles.Header.BufferSz = sizeof(q->exthevctiles);
> + q->exthevctiles.NumTileColumns = q->tile_cols;
> + q->exthevctiles.NumTileRows = q->tile_rows;
Is it have any other limition for the number of tile columns/rows ?
> + q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->exthevctiles;
> + }
> +#endif
> +
> if (!check_enc_param(avctx,q)) {
> av_log(avctx, AV_LOG_ERROR,
> "some encoding parameters are not supported by the QSV "
> @@ -887,7 +906,14 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
> };
> #endif
>
> - mfxExtBuffer *ext_buffers[2 + QSV_HAVE_CO2 + QSV_HAVE_CO3 + QSV_HAVE_CO_VPS];
> +#if QSV_HAVE_EXT_HEVC_TILES
> + mfxExtHEVCTiles hevc_tile_buf = {
> + .Header.BufferId = MFX_EXTBUFF_HEVC_TILES,
> + .Header.BufferSz = sizeof(hevc_tile_buf),
> + };
> +#endif
> +
> + mfxExtBuffer *ext_buffers[2 + QSV_HAVE_CO2 + QSV_HAVE_CO3 + QSV_HAVE_CO_VPS + QSV_HAVE_EXT_HEVC_TILES];
>
> int need_pps = avctx->codec_id != AV_CODEC_ID_MPEG2VIDEO;
> int ret, ext_buf_num = 0, extradata_offset = 0;
> @@ -905,6 +931,10 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
> if (q->hevc_vps)
> ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&extradata_vps;
> #endif
> +#if QSV_HAVE_EXT_HEVC_TILES
> + if (avctx->codec_id == AV_CODEC_ID_HEVC)
> + ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&hevc_tile_buf;
> +#endif
>
> q->param.ExtParam = ext_buffers;
> q->param.NumExtParam = ext_buf_num;
> diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
> index ee35582..6609171 100644
> --- a/libavcodec/qsvenc.h
> +++ b/libavcodec/qsvenc.h
> @@ -38,6 +38,7 @@
> #define QSV_HAVE_CO3 QSV_VERSION_ATLEAST(1, 11)
> #define QSV_HAVE_CO_VPS QSV_VERSION_ATLEAST(1, 17)
>
> +#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_TRELLIS QSV_VERSION_ATLEAST(1, 8)
> @@ -124,6 +125,9 @@ typedef struct QSVEncContext {
> mfxExtMultiFrameParam extmfp;
> mfxExtMultiFrameControl extmfc;
> #endif
> +#if QSV_HAVE_EXT_HEVC_TILES
> + mfxExtHEVCTiles exthevctiles;
> +#endif
> #if QSV_HAVE_EXT_VP9_PARAM
> mfxExtVP9Param extvp9param;
> #endif
> @@ -161,6 +165,9 @@ typedef struct QSVEncContext {
> int max_frame_size;
> int max_slice_size;
>
> + int tile_cols;
> + int tile_rows;
> +
> int aud;
>
> int single_sei_nal_unit;
> diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c
> index da64b4c..27e2232 100644
> --- a/libavcodec/qsvenc_hevc.c
> +++ b/libavcodec/qsvenc_hevc.c
> @@ -243,6 +243,9 @@ static const AVOption options[] = {
>
> { "gpb", "1: GPB (generalized P/B frame); 0: regular P frame", OFFSET(qsv.gpb), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE},
>
> + { "tile_cols", "Number of columns for tiled encoding", OFFSET(qsv.tile_cols), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, UINT16_MAX, VE },
> + { "tile_rows", "Number of rows for tiled encoding", OFFSET(qsv.tile_rows), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, UINT16_MAX, VE },
> +
> { NULL },
> };
>
> --
> 2.7.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
--
=======================================
Jun zhao/赵军
+++++++++++++++++++++++++++++++++++++++
More information about the ffmpeg-devel
mailing list