diff options
author | Wenbin Chen <wenbin.chen-at-intel.com@ffmpeg.org> | 2022-09-06 17:22:56 +0800 |
---|---|---|
committer | Haihao Xiang <haihao.xiang@intel.com> | 2022-09-09 09:39:44 +0800 |
commit | 9155ec096b0076bf5090c22c8c2f0f67bd8ee086 (patch) | |
tree | 49c5f1f97b2cac12bec8a944485b606ccace0b42 | |
parent | f3ba1458b6787484978e9a8f1560dcabfefba92d (diff) | |
download | ffmpeg-9155ec096b0076bf5090c22c8c2f0f67bd8ee086.tar.gz |
libavcodec/qsvenc: Add intra refresh reset support to qsvenc
Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
-rw-r--r-- | doc/encoders.texi | 7 | ||||
-rw-r--r-- | libavcodec/qsvenc.c | 33 | ||||
-rw-r--r-- | libavcodec/qsvenc.h | 5 |
3 files changed, 45 insertions, 0 deletions
diff --git a/doc/encoders.texi b/doc/encoders.texi index 333a47d2a7..f2fef0deab 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -3338,6 +3338,13 @@ Change this value to reset qsv codec's MaxFrameSize configuration. @item @var{gop_size} Change this value to reset qsv codec's gop configuration. + +@item @var{int_ref_type} +@item @var{int_ref_cycle_size} +@item @var{int_ref_qp_delta} +@item @var{int_ref_cycle_dist} +Supported in h264_qsv and hevc_qsv. +Change these value to reset qsv codec's Intra Refresh configuration. @end table @subsection H264 options diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index 58b6284b30..4ed73e7817 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -831,10 +831,13 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) q->old_max_frame_size = q->max_frame_size; if (q->int_ref_type >= 0) q->extco2.IntRefType = q->int_ref_type; + q->old_int_ref_type = q->int_ref_type; if (q->int_ref_cycle_size >= 0) q->extco2.IntRefCycleSize = q->int_ref_cycle_size; + q->old_int_ref_cycle_size = q->int_ref_cycle_size; if (q->int_ref_qp_delta != INT16_MIN) q->extco2.IntRefQPDelta = q->int_ref_qp_delta; + q->old_int_ref_qp_delta = q->int_ref_qp_delta; if (q->max_slice_size >= 0) q->extco2.MaxSliceSize = q->max_slice_size; q->extco2.DisableDeblockingIdc = q->dblk_idc; @@ -923,6 +926,7 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) } if (q->int_ref_cycle_dist >= 0) q->extco3.IntRefCycleDist = q->int_ref_cycle_dist; + q->old_int_ref_cycle_dist = q->int_ref_cycle_dist; if (q->low_delay_brc >= 0) q->extco3.LowDelayBRC = q->low_delay_brc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF; if (q->max_frame_size_i >= 0) @@ -1712,6 +1716,34 @@ static int update_gop_size(AVCodecContext *avctx, QSVEncContext *q) return updated; } +static int update_rir(AVCodecContext *avctx, QSVEncContext *q) +{ + int updated = 0; + + if (avctx->codec_id != AV_CODEC_ID_H264 && avctx->codec_id != AV_CODEC_ID_HEVC) + return 0; + + UPDATE_PARAM(q->old_int_ref_type, q->int_ref_type); + UPDATE_PARAM(q->old_int_ref_cycle_size, q->int_ref_cycle_size); + UPDATE_PARAM(q->old_int_ref_qp_delta, q->int_ref_qp_delta); + UPDATE_PARAM(q->old_int_ref_cycle_dist, q->int_ref_cycle_dist); + if (!updated) + return 0; + + q->extco2.IntRefType = FFMAX(0, q->int_ref_type); + q->extco2.IntRefCycleSize = FFMAX(0, q->int_ref_cycle_size); + q->extco2.IntRefQPDelta = + q->int_ref_qp_delta != INT16_MIN ? q->int_ref_qp_delta : 0; + q->extco3.IntRefCycleDist = FFMAX(0, q->int_ref_cycle_dist); + av_log(avctx, AV_LOG_DEBUG, + "Reset IntRefType: %d; IntRefCycleSize: %d; " + "IntRefQPDelta: %d; IntRefCycleDist: %d\n", + q->extco2.IntRefType, q->extco2.IntRefCycleSize, + q->extco2.IntRefQPDelta, q->extco3.IntRefCycleDist); + + return updated; +} + static int update_parameters(AVCodecContext *avctx, QSVEncContext *q, const AVFrame *frame) { @@ -1723,6 +1755,7 @@ static int update_parameters(AVCodecContext *avctx, QSVEncContext *q, needReset = update_qp(avctx, q); needReset |= update_max_frame_size(avctx, q); needReset |= update_gop_size(avctx, q); + needReset |= update_rir(avctx, q); if (!needReset) return 0; diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h index ead790fd2c..3ec8608e67 100644 --- a/libavcodec/qsvenc.h +++ b/libavcodec/qsvenc.h @@ -255,6 +255,11 @@ typedef struct QSVEncContext { int old_max_frame_size; // This is used for gop reset int old_gop_size; + // These are used for intra refresh reset + int old_int_ref_type; + int old_int_ref_cycle_size; + int old_int_ref_qp_delta; + int old_int_ref_cycle_dist; } QSVEncContext; int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q); |