[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