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

Chen, Wenbin wenbin.chen at intel.com
Mon Jul 4 09:33:49 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?

The usage of AVVideoEncParams relates to the "qp" variable in mfxEncodeCtrl which is passed
to MFXVideoENCODE_encoderFrameAsync(). This variable in qsv is for per-frame QP
configuration.
There are other parameter changing supports I want to add besides QP, for
example, gop_size, max_frame_size, intra_refresh. These parameter configurations are not
all included in mfxEncodeCtrl, so I choose to use MFXVideoENCODE_Reset() to do this. This
code changes the encoding parameters which means these changes are applied to all
the following frames, but AVVideoEncParams is per-frame configuration, so I think
AVVideoEncParams is not suitable for this.

> 
> Frame metadata should not be used in encoders at all. Longer term it
> should not be used at all by anything.
> 
> --
> Anton Khirnov
> _______________________________________________
> 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".


More information about the ffmpeg-devel mailing list