[FFmpeg-devel] [PATCH v3] libavcodec/qsvenc: Enable fixed QP configure in qsv CQP runtime

Anton Khirnov anton at khirnov.net
Sat Jul 2 12:39:09 EEST 2022


Quoting Wenbin Chen (2022-06-23 07:32:42)
> From: Yue Heng <yue.heng at intel.com>
> 
> Enable dynamic QP configuration in runtime on qsv encoder. Through
> AVFrame->metadata, we can set key "qsv_config_qp" to change QP
> configuration when we encode video in CQP mode.
> 
> Signed-off-by: Yue Heng <yue.heng at intel.com>
> Signed-off-by: Wenbin Chen <wenbin.chen at intel.com>
> ---
>  doc/encoders.texi   | 10 +++++
>  libavcodec/qsvenc.c | 89 +++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 99 insertions(+)
> 
> diff --git a/doc/encoders.texi b/doc/encoders.texi
> index 1850c99fe9..02a91ffe96 100644
> --- a/doc/encoders.texi
> +++ b/doc/encoders.texi
> @@ -3333,6 +3333,16 @@ Forcing I frames as IDR frames.
>  For encoders set this flag to ON to reduce power consumption and GPU usage.
>  @end table
>  
> + at subsection Runtime Options
> +Following options can be used durning qsv encoding.
> +
> + at table @option
> + at item @var{qsv_config_qp}
> +Supported in h264_qsv and hevc_qsv.
> +This option can be set in per-frame metadata. QP parameter can be dynamically
> +changed when encoding in CQP mode.
> + at end table
> +
>  @subsection H264 options
>  These options are used by h264_qsv
>  
> diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
> index 902bada55b..2382c2f5f7 100644
> --- a/libavcodec/qsvenc.c
> +++ b/libavcodec/qsvenc.c
> @@ -146,6 +146,14 @@ static const struct {
>      { MFX_RATECONTROL_QVBR,    "QVBR" },
>  };
>  
> +#define UPDATE_PARAM(a, b)  \
> +do {                        \
> +    if ((a) != (b)) {       \
> +        a = b;              \
> +        updated = 1;        \
> +    }                       \
> +} while (0)                 \
> +
>  static const char *print_ratecontrol(mfxU16 rc_mode)
>  {
>      int i;
> @@ -1613,6 +1621,83 @@ static int set_roi_encode_ctrl(AVCodecContext *avctx, const AVFrame *frame,
>      return 0;
>  }
>  
> +static int update_qp(AVCodecContext *avctx, QSVEncContext *q,
> +                     const AVFrame *frame)
> +{
> +    int updated = 0, qp = 0, new_qp;
> +    char *tail;
> +    AVDictionaryEntry *entry = NULL;
> +
> +    if (avctx->codec_id != AV_CODEC_ID_H264 && avctx->codec_id != AV_CODEC_ID_HEVC)
> +        return 0;
> +
> +    entry = av_dict_get(frame->metadata, "qsv_config_qp", NULL, 0);

Why is this using frame metadata rather than the AVVideoEncParams side
data?

Frame metadata should not be used in encoders at all. Longer term it
should not be used at all by anything.

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list