[FFmpeg-devel] [PATCH 7/7] hwcontext_qsv: Try to select a matching VAAPI device by default
Li, Zhong
zhong.li at intel.com
Tue May 21 08:41:31 EEST 2019
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Mark Thompson
> Sent: Monday, May 6, 2019 10:49 PM
> To: ffmpeg-devel at ffmpeg.org
> Subject: [FFmpeg-devel] [PATCH 7/7] hwcontext_qsv: Try to select a
> matching VAAPI device by default
>
> Tries to find a device backed by the i915 kernel driver and loads the iHD
> VAAPI driver to use with it. This reduces confusion on machines with
> multiple DRM devices and removes the surprising requirement to set the
> LIBVA_DRIVER_NAME environment variable to use libmfx at all.
> ---
> libavutil/hwcontext_qsv.c | 15 ++++++++++++---
> 1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index
> 49b5952cef..59e4ed9157 100644
> --- a/libavutil/hwcontext_qsv.c
> +++ b/libavutil/hwcontext_qsv.c
> @@ -1206,6 +1206,7 @@ static int qsv_device_create(AVHWDeviceContext
> *ctx, const char *device,
> QSVDevicePriv *priv;
> enum AVHWDeviceType child_device_type;
> AVHWDeviceContext *child_device;
> + AVDictionary *child_device_opts;
> AVDictionaryEntry *e;
>
> mfxIMPL impl;
> @@ -1220,9 +1221,17 @@ static int
> qsv_device_create(AVHWDeviceContext *ctx, const char *device,
>
> e = av_dict_get(opts, "child_device", NULL, 0);
>
> - if (CONFIG_VAAPI)
> + child_device_opts = NULL;
> + if (CONFIG_VAAPI) {
> child_device_type = AV_HWDEVICE_TYPE_VAAPI;
> - else if (CONFIG_DXVA2)
> + // libmfx does not actually implement VAAPI properly, rather it
> + // depends on the specific behaviour of a matching iHD driver
> when
> + // used on recent Intel hardware. Set options to the VAAPI
> device
> + // creation so that we should pick a usable setup by default if
> + // possible, even when multiple devices and drivers are available.
> + av_dict_set(&child_device_opts, "kernel_driver", "i915", 0);
> + av_dict_set(&child_device_opts, "driver", "iHD", 0);
> + } else if (CONFIG_DXVA2)
> child_device_type = AV_HWDEVICE_TYPE_DXVA2;
> else {
> av_log(ctx, AV_LOG_ERROR, "No supported child device type is
> enabled\n"); @@ -1230,7 +1239,7 @@ static int
> qsv_device_create(AVHWDeviceContext *ctx, const char *device,
> }
>
> ret = av_hwdevice_ctx_create(&priv->child_device_ctx,
> child_device_type,
> - e ? e->value : NULL, NULL, 0);
> + e ? e->value : NULL,
> + child_device_opts, 0);
> if (ret < 0)
> return ret;
>
> --
> 2.20.1
LGTM and tested. Thanks!
More information about the ffmpeg-devel
mailing list