On Sun, 19 Feb 2017 18:46:35 +0000
Mark Thompson <[email protected]> wrote:

> ---
>  libavutil/hwcontext_qsv.c | 119 
> +++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 90 insertions(+), 29 deletions(-)
> 
> diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
> index 3409e9b97..4e393e630 100644
> --- a/libavutil/hwcontext_qsv.c
> +++ b/libavutil/hwcontext_qsv.c
> @@ -792,19 +792,100 @@ static mfxIMPL choose_implementation(const char 
> *device)
>      return impl;
>  }
>  
> -static int qsv_device_create(AVHWDeviceContext *ctx, const char *device,
> -                             AVDictionary *opts, int flags)
> +static int qsv_device_derive_from_child(AVHWDeviceContext *ctx,
> +                                        mfxIMPL implementation,
> +                                        AVHWDeviceContext *child_device_ctx,
> +                                        int flags)
>  {
>      AVQSVDeviceContext *hwctx = ctx->hwctx;
> -    QSVDevicePriv *priv;
> -    enum AVHWDeviceType child_device_type;
> -    AVDictionaryEntry *e;
> +    QSVDeviceContext       *s = ctx->internal->priv;
>  
>      mfxVersion    ver = { { 3, 1 } };
> -    mfxIMPL       impl;
>      mfxHDL        handle;
>      mfxHandleType handle_type;
>      mfxStatus     err;
> +    enum AVPixelFormat child_pix_fmt;
> +    int ret;
> +
> +    switch (child_device_ctx->type) {
> +#if CONFIG_VAAPI
> +    case AV_HWDEVICE_TYPE_VAAPI:
> +        {
> +            AVVAAPIDeviceContext *child_device_hwctx = 
> child_device_ctx->hwctx;
> +            handle_type = MFX_HANDLE_VA_DISPLAY;
> +            handle = (mfxHDL)child_device_hwctx->display;
> +            child_pix_fmt = AV_PIX_FMT_VAAPI;
> +        }
> +        break;
> +#endif
> +#if CONFIG_DXVA2
> +    case AV_HWDEVICE_TYPE_DXVA2:
> +        {
> +            AVDXVA2DeviceContext *child_device_hwctx = 
> child_device_ctx->hwctx;
> +            handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER;
> +            handle = (mfxHDL)child_device_hwctx->devmgr;
> +            child_pix_fmt = AV_PIX_FMT_DXVA2_VLD;
> +        }
> +        break;
> +#endif
> +    default:
> +        ret = AVERROR(ENOSYS);
> +        goto fail;
> +    }
> +
> +    err = MFXInit(implementation, &ver, &hwctx->session);
> +    if (err != MFX_ERR_NONE) {
> +        av_log(ctx, AV_LOG_ERROR, "Error initializing an MFX session\n");
> +        ret = AVERROR_UNKNOWN;
> +        goto fail;
> +    }
> +
> +    err = MFXVideoCORE_SetHandle(hwctx->session, handle_type, handle);
> +    if (err != MFX_ERR_NONE) {
> +        av_log(ctx, AV_LOG_ERROR, "Error setting child device handle\n");
> +        ret = AVERROR_UNKNOWN;
> +        goto fail;
> +    }
> +
> +    s->handle            = handle;
> +    s->handle_type       = handle_type;
> +    s->child_device_type = child_device_ctx->type;
> +    s->child_pix_fmt     = child_pix_fmt;
> +
> +    err = MFXQueryIMPL(hwctx->session, &s->impl);
> +    if (err == MFX_ERR_NONE)
> +        err = MFXQueryVersion(hwctx->session, &s->ver);
> +    if (err != MFX_ERR_NONE) {
> +        av_log(ctx, AV_LOG_ERROR, "Error querying the session attributes\n");
> +        ret = AVERROR_UNKNOWN;
> +        goto fail;
> +    }
> +
> +
> +    return 0;
> +
> +fail:
> +    if (hwctx->session)
> +        MFXClose(hwctx->session);
> +    return ret;
> +}
> +
> +static int qsv_device_derive(AVHWDeviceContext *ctx,
> +                             AVHWDeviceContext *child_device_ctx, int flags)
> +{
> +    return qsv_device_derive_from_child(ctx, MFX_IMPL_AUTO_ANY,
> +                                        child_device_ctx, flags);
> +}
> +
> +static int qsv_device_create(AVHWDeviceContext *ctx, const char *device,
> +                             AVDictionary *opts, int flags)
> +{
> +    QSVDevicePriv *priv;
> +    enum AVHWDeviceType child_device_type;
> +    AVHWDeviceContext *child_device;
> +    AVDictionaryEntry *e;
> +
> +    mfxIMPL impl;
>      int ret;
>  
>      priv = av_mallocz(sizeof(*priv));
> @@ -830,32 +911,11 @@ static int qsv_device_create(AVHWDeviceContext *ctx, 
> const char *device,
>      if (ret < 0)
>          return ret;
>  
> -    {
> -        AVHWDeviceContext      *child_device_ctx = 
> (AVHWDeviceContext*)priv->child_device_ctx->data;
> -#if CONFIG_VAAPI
> -        AVVAAPIDeviceContext *child_device_hwctx = child_device_ctx->hwctx;
> -        handle_type = MFX_HANDLE_VA_DISPLAY;
> -        handle = (mfxHDL)child_device_hwctx->display;
> -#elif CONFIG_DXVA2
> -        AVDXVA2DeviceContext *child_device_hwctx = child_device_ctx->hwctx;
> -        handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER;
> -        handle = (mfxHDL)child_device_hwctx->devmgr;
> -#endif
> -    }
> +    child_device = (AVHWDeviceContext*)priv->child_device_ctx->data;
>  
>      impl = choose_implementation(device);
>  
> -    err = MFXInit(impl, &ver, &hwctx->session);
> -    if (err != MFX_ERR_NONE) {
> -        av_log(ctx, AV_LOG_ERROR, "Error initializing an MFX session\n");
> -        return AVERROR_UNKNOWN;
> -    }
> -
> -    err = MFXVideoCORE_SetHandle(hwctx->session, handle_type, handle);
> -    if (err != MFX_ERR_NONE)
> -        return AVERROR_UNKNOWN;
> -
> -    return 0;
> +    return qsv_device_derive_from_child(ctx, impl, child_device, 0);
>  }
>  
>  const HWContextType ff_hwcontext_type_qsv = {
> @@ -868,6 +928,7 @@ const HWContextType ff_hwcontext_type_qsv = {
>      .frames_priv_size       = sizeof(QSVFramesContext),
>  
>      .device_create          = qsv_device_create,
> +    .device_derive          = qsv_device_derive,
>      .device_init            = qsv_device_init,
>      .frames_get_constraints = qsv_frames_get_constraints,
>      .frames_init            = qsv_frames_init,

Seems ok. Just exposes to the API what internally was already done.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to