[FFmpeg-devel] [PATCH 3/3] scale_qsv frame crop support
Koushik Dutta
koushd at gmail.com
Tue Dec 3 21:20:48 EET 2024
I am embedding ffmpeg and running a dynamic number of filters passes
per frame. The standard crop filter supports commands that allow
updating the crop region on an existing filter. The vpp filter must be
recreated for any change.
My other changes (cuda and vt) implement the correct crop
functionality in other hardware contexts, and they do not have
dedicated crop filters like vpp. So for consistency I implemented it
for qsv as well, and it would simplify my use case.
Is there anything else necessary to get this merged?
Koush
On Thu, Sep 12, 2024 at 12:17 AM Wang, Fei W <fei.w.wang at intel.com> wrote:
>
> On Tue, 2024-09-10 at 11:10 -0700, Koushik Dutta wrote:
> > The crop filter has no effect on scale_qsv:
> >
> > -vf crop=100:100,scale_qsv=300x300
> >
>
> How about to use vpp_qsv filter directly? It support both scale and
> crop via its options which is much more easy to use.
>
> Thanks
> Fei
>
> > Hardware frames (AV_PIX_FMT_FLAG_HWACCEL) are expected to use the
> > crop_* properties,
> > as seen in the implementation vf_crop.c.
> >
> > This patch is slightly different from the previously submitted
> > patches
> > since qsv supports frame crop via the vpp_qsv filter. If no explicit
> > crop
> > is detected via that filter, AVFrame.crop_* will be used instead.
> > Removal of vpp_qsv's crop argument may be warranted.
> > ---
> > libavfilter/qsvvpp.c | 10 ++++++++++
> > 1 file changed, 10 insertions(+)
> >
> > diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c
> > index 0818ada117..05ce387bc3 100644
> > --- a/libavfilter/qsvvpp.c
> > +++ b/libavfilter/qsvvpp.c
> > @@ -467,6 +467,16 @@ static QSVFrame *submit_frame(QSVVPPContext *s,
> > AVFilterLink *inlink, AVFrame *p
> > else if (qsv_frame->frame->repeat_pict == 4)
> > qsv_frame->surface.Info.PicStruct |=
> > MFX_PICSTRUCT_FRAME_TRIPLING;
> >
> > + // if crop arguments are not present from the vpp_qsv filter,
> > use the provided AVFrame
> > + // crop_* members instead.
> > + if (!qsv_frame->surface.Info.CropX && !qsv_frame-
> > >surface.Info.CropY
> > + && qsv_frame->surface.Info.CropW == picref->width &&
> > qsv_frame->surface.Info.CropH == picref->height) {
> > + qsv_frame->surface.Info.CropW = (mfxU16)((picref->width -
> > picref->crop_right) - picref->crop_left);
> > + qsv_frame->surface.Info.CropH = (mfxU16)((picref->height -
> > picref->crop_bottom) - picref->crop_top);
> > + qsv_frame->surface.Info.CropX = (mfxU16)picref->crop_left;
> > + qsv_frame->surface.Info.CropY = (mfxU16)picref->crop_top;
> > + }
> > +
> > return qsv_frame;
> > }
> >
>
More information about the ffmpeg-devel
mailing list