[FFmpeg-devel] [PATCH v1] avfilter/vf_vpp_qsv: add scale mode option

Linjie Fu linjie.justin.fu at gmail.com
Tue Aug 3 17:43:57 EEST 2021


On Wed, Mar 24, 2021 at 2:15 PM Wang, Fei W <fei.w.wang at intel.com> wrote:

> On Mon, 2021-03-22 at 20:12 +0800, Linjie Fu wrote:
> > On Wed, Feb 24, 2021 at 9:44 AM Fei Wang <fei.w.wang at intel.com>
> > wrote:
> > >
> > > The option allow user to set diffenent scaling mode from
> > > auto/low-power/high-quality.
> > >
> > > More details:
> > >
>
> https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#mfxExtVPPScaling
> > >
> > > Signed-off-by: Fei Wang <fei.w.wang at intel.com>
> > > ---
> > >  libavfilter/vf_vpp_qsv.c | 25 +++++++++++++++++++++++--
> > >  1 file changed, 23 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c
> > > index 5d57707455..effc459d3b 100644
> > > --- a/libavfilter/vf_vpp_qsv.c
> > > +++ b/libavfilter/vf_vpp_qsv.c
> > > @@ -43,8 +43,9 @@
> > >
> > >  /* number of video enhancement filters */
> > >  #define ENH_FILTERS_COUNT (7)
> > > -#define QSV_HAVE_ROTATION  QSV_VERSION_ATLEAST(1, 17)
> > > -#define QSV_HAVE_MIRRORING QSV_VERSION_ATLEAST(1, 19)
> > > +#define QSV_HAVE_ROTATION       QSV_VERSION_ATLEAST(1, 17)
> > > +#define QSV_HAVE_MIRRORING      QSV_VERSION_ATLEAST(1, 19)
> > > +#define QSV_HAVE_SCALING_CONFIG QSV_VERSION_ATLEAST(1, 19)
> > >
> > >  typedef struct VPPContext{
> > >      const AVClass *class;
> > > @@ -59,6 +60,9 @@ typedef struct VPPContext{
> > >      mfxExtVPPProcAmp procamp_conf;
> > >      mfxExtVPPRotation rotation_conf;
> > >      mfxExtVPPMirroring mirroring_conf;
> > > +#ifdef QSV_HAVE_SCALING_CONFIG
> > > +    mfxExtVPPScaling scale_conf;
> > > +#endif
> > >
> > >      int out_width;
> > >      int out_height;
> > > @@ -83,6 +87,8 @@ typedef struct VPPContext{
> > >      int rotate;                 /* rotate angle : [0, 90, 180,
> > > 270] */
> > >      int hflip;                  /* flip mode : 0 = off, 1 =
> > > HORIZONTAL flip */
> > >
> > > +    int scale_mode;             /* scale mode : 0 = auto, 1 = low
> > > power, 2 = high quality */
> > > +
> > >      /* param for the procamp */
> > >      int    procamp;            /* enable procamp */
> > >      float  hue;
> > > @@ -128,6 +134,7 @@ static const AVOption options[] = {
> > >      { "h",      "Output video height", OFFSET(oh),
> > > AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
> > >      { "height", "Output video height", OFFSET(oh),
> > > AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
> > >      { "format", "Output pixel format", OFFSET(output_format_str),
> > > AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
> > > +    { "scale_mode", "scale mode: 0=auto, 1=low power, 2=high
> > > quality", OFFSET(scale_mode), AV_OPT_TYPE_INT, { .i64 =
> > > MFX_SCALING_MODE_DEFAULT }, MFX_SCALING_MODE_DEFAULT,
> > > MFX_SCALING_MODE_QUALITY, .flags = FLAGS, "scale mode" },
> > >
> > >      { NULL }
> > >  };
> > > @@ -454,6 +461,20 @@ static int config_output(AVFilterLink
> > > *outlink)
> > >  #endif
> > >      }
> > >
> > > +    if (inlink->w != outlink->w || inlink->h != outlink->h) {
> > > +#ifdef QSV_HAVE_SCALING_CONFIG
> > > +        memset(&vpp->scale_conf, 0, sizeof(mfxExtVPPScaling));
> > > +        vpp->scale_conf.Header.BufferId    =
> > > MFX_EXTBUFF_VPP_SCALING;
> > > +        vpp->scale_conf.Header.BufferSz    =
> > > sizeof(mfxExtVPPScaling);
> > > +        vpp->scale_conf.ScalingMode        = vpp->scale_mode;
> > > +
> > > +        param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp-
> > > >scale_conf;
> > > +#else
> > > +        av_log(ctx, AV_LOG_WARNING, "The QSV VPP Scale option is "
> > > +            "not supported with this MSDK version.\n");
> > > +#endif
> > > +    }
> > > +
> > >      if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp-
> > > >denoise ||
> > >          vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip
> > > ||
> > >          inlink->w != outlink->w || inlink->h != outlink->h ||
> > > in_format != vpp->out_format)
> > > --
> > > 2.17.1
> > >
> >
> > Looks reasonable, and it seems the default behaviour is QUALITY mode
> > on all platforms except for APL:
>
> That's right. If scale_mode is set to auto, MSDK will choose different
> mode(high-quality/low-power) on different platform.
>

Applied, thx.

- linjie


More information about the ffmpeg-devel mailing list