mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-26 01:02:33 +00:00
lavc/qsvenc: add Tiles encode support for HEVC
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@intel.com>
This commit is contained in:
parent
0ceed513d5
commit
8446318502
@ -139,6 +139,9 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q,
|
|||||||
#if QSV_HAVE_CO3
|
#if QSV_HAVE_CO3
|
||||||
mfxExtCodingOption3 *co3 = (mfxExtCodingOption3*)coding_opts[2];
|
mfxExtCodingOption3 *co3 = (mfxExtCodingOption3*)coding_opts[2];
|
||||||
#endif
|
#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",
|
av_log(avctx, AV_LOG_VERBOSE, "profile: %s; level: %"PRIu16"\n",
|
||||||
print_profile(info->CodecProfile), info->CodecLevel);
|
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",
|
av_log(avctx, AV_LOG_VERBOSE, "RateDistortionOpt: %s\n",
|
||||||
print_threestate(co->RateDistortionOpt));
|
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
|
#if QSV_HAVE_CO2
|
||||||
av_log(avctx, AV_LOG_VERBOSE,
|
av_log(avctx, AV_LOG_VERBOSE,
|
||||||
"RecoveryPointSEI: %s IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
|
"RecoveryPointSEI: %s IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
|
||||||
@ -771,6 +780,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||||||
}
|
}
|
||||||
#endif
|
#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;
|
||||||
|
q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->exthevctiles;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!check_enc_param(avctx,q)) {
|
if (!check_enc_param(avctx,q)) {
|
||||||
av_log(avctx, AV_LOG_ERROR,
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
"some encoding parameters are not supported by the QSV "
|
"some encoding parameters are not supported by the QSV "
|
||||||
@ -889,7 +908,14 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
|
|||||||
};
|
};
|
||||||
#endif
|
#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 need_pps = avctx->codec_id != AV_CODEC_ID_MPEG2VIDEO;
|
||||||
int ret, ext_buf_num = 0, extradata_offset = 0;
|
int ret, ext_buf_num = 0, extradata_offset = 0;
|
||||||
@ -907,6 +933,10 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
|
|||||||
if (q->hevc_vps)
|
if (q->hevc_vps)
|
||||||
ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&extradata_vps;
|
ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&extradata_vps;
|
||||||
#endif
|
#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.ExtParam = ext_buffers;
|
||||||
q->param.NumExtParam = ext_buf_num;
|
q->param.NumExtParam = ext_buf_num;
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#define QSV_HAVE_CO3 QSV_VERSION_ATLEAST(1, 11)
|
#define QSV_HAVE_CO3 QSV_VERSION_ATLEAST(1, 11)
|
||||||
#define QSV_HAVE_CO_VPS QSV_VERSION_ATLEAST(1, 17)
|
#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_EXT_VP9_PARAM QSV_VERSION_ATLEAST(1, 26)
|
||||||
|
|
||||||
#define QSV_HAVE_TRELLIS QSV_VERSION_ATLEAST(1, 8)
|
#define QSV_HAVE_TRELLIS QSV_VERSION_ATLEAST(1, 8)
|
||||||
@ -124,6 +125,9 @@ typedef struct QSVEncContext {
|
|||||||
mfxExtMultiFrameParam extmfp;
|
mfxExtMultiFrameParam extmfp;
|
||||||
mfxExtMultiFrameControl extmfc;
|
mfxExtMultiFrameControl extmfc;
|
||||||
#endif
|
#endif
|
||||||
|
#if QSV_HAVE_EXT_HEVC_TILES
|
||||||
|
mfxExtHEVCTiles exthevctiles;
|
||||||
|
#endif
|
||||||
#if QSV_HAVE_EXT_VP9_PARAM
|
#if QSV_HAVE_EXT_VP9_PARAM
|
||||||
mfxExtVP9Param extvp9param;
|
mfxExtVP9Param extvp9param;
|
||||||
#endif
|
#endif
|
||||||
@ -161,6 +165,9 @@ typedef struct QSVEncContext {
|
|||||||
int max_frame_size;
|
int max_frame_size;
|
||||||
int max_slice_size;
|
int max_slice_size;
|
||||||
|
|
||||||
|
int tile_cols;
|
||||||
|
int tile_rows;
|
||||||
|
|
||||||
int aud;
|
int aud;
|
||||||
|
|
||||||
int single_sei_nal_unit;
|
int single_sei_nal_unit;
|
||||||
|
@ -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},
|
{ "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 },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user