[FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder

Xiang, Haihao haihao.xiang at intel.com
Wed Aug 3 06:20:11 EEST 2022


On Tue, 2022-08-02 at 13:29 +0200, Anton Khirnov wrote:
> Quoting Xiang, Haihao (2022-08-02 09:56:01)
> > From: Haihao Xiang <haihao.xiang at intel.com>
> > 
> > Usually a HW decoder is expected when user specifies a HW acceleration
> > method via -hwaccel option, however the current implementation doesn't
> > take HW acceleration method into account, it is possible to select a SW
> > decoder.
> > 
> > For example:
> > $ ffmpeg -hwaccel vaapi -i av1.mp4 -f null -
> > $ ffmpeg -hwaccel nvdec -i av1.mp4 -f null -
> > $ ffmpeg -hwaccel vdpau -i av1.mp4 -f null -
> > [...]
> > Stream #0:0 -> #0:0 (av1 (libdav1d) -> wrapped_avframe (native))
> > 
> > libdav1d is selected in this case even if vaapi, nvdec or vdpau is
> > specified.
> > 
> > After applying this patch, the native av1 decoder (with vaapi, nvdec or
> > vdpau support) is selected for decoding(libdav1d is still used for
> > probing format).
> > $ ffmpeg -hwaccel vaapi -i av1.mp4 -f null -
> > $ ffmpeg -hwaccel nvdec -i av1.mp4 -f null -
> > $ ffmpeg -hwaccel vdpau -i av1.mp4 -f null -
> > [...]
> > Stream #0:0 -> #0:0 (av1 (native) -> wrapped_avframe (native))
> > 
> > Tested-by: Mario Roy <marioeroy at gmail.com>
> > Signed-off-by: Haihao Xiang <haihao.xiang at intel.com>
> > ---
> >  fftools/ffmpeg_opt.c | 31 +++++++++++++++++++++++++++----
> >  1 file changed, 27 insertions(+), 4 deletions(-)
> > 
> > diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
> > index cf0c31bdc2..db51cca66d 100644
> > --- a/fftools/ffmpeg_opt.c
> > +++ b/fftools/ffmpeg_opt.c
> > @@ -857,7 +857,9 @@ static const AVCodec *find_codec_or_die(const char
> > *name, enum AVMediaType type,
> >      return codec;
> >  }
> >  
> > -static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s,
> > AVStream *st)
> > +static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s,
> > AVStream *st,
> > +                                     enum HWAccelID hwaccel_id, enum
> > AVHWDeviceType hwaccel_device_type)
> > +
> >  {
> >      char *codec_name = NULL;
> >  
> > @@ -868,8 +870,29 @@ static const AVCodec *choose_decoder(OptionsContext *o,
> > AVFormatContext *s, AVSt
> >          if (recast_media && st->codecpar->codec_type != codec->type)
> >              st->codecpar->codec_type = codec->type;
> >          return codec;
> > -    } else
> > +    } else {
> > +        if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
> > +            hwaccel_id == HWACCEL_GENERIC &&
> > +            hwaccel_device_type != AV_HWDEVICE_TYPE_NONE) {
> > +            const AVCodec *c;
> > +            void *i = NULL;
> > +
> > +            while ((c = av_codec_iterate(&i))) {
> > +                const AVCodecHWConfig *config;
> > +
> > +                if (c->id != st->codecpar->codec_id ||
> > +                    !av_codec_is_decoder(c))
> > +                    continue;
> > +
> > +                for (int j = 0; config = avcodec_get_hw_config(c, j); j++)
> > {
> > +                    if (config->device_type == hwaccel_device_type)
> > +                        return c;
> 
> Maybe a verbose-level log message like
> 
> "Selecting decoder '%s' because of requested hwaccel method %s\n",
> c->name, av_hwdevice_get_type_name(hwaccel_device_type)
> 
> would be appropriate. No need to send a new patch, just add it (or not,
> as you like) and push.

Added log and applied patches, thx

-Haihao

> 


More information about the ffmpeg-devel mailing list