[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