diff mbox series

[FFmpeg-devel,v6,2/9] libavcodec/qsv: enabling d3d11va support, added mfxhdlpair

Message ID 20200518202934.49601-2-artem.galin@gmail.com
State New
Headers show
Series [FFmpeg-devel,v6,1/9] fftools/qsv: add device initialization from string
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Artem Galin May 18, 2020, 8:29 p.m. UTC
From: Artem Galin <artem.galin@intel.com>

Adding DX11 relevant device type checks and adjusting callbacks with
proper MediaSDK pair type support.

Extending structure for proper MediaSDK pair type support.

Signed-off-by: Artem Galin <artem.galin@intel.com>
---
 libavcodec/qsv.c          | 53 ++++++++++++++++++++++++++-------------
 libavcodec/qsv_internal.h |  2 +-
 2 files changed, 37 insertions(+), 18 deletions(-)

Comments

Zhong Li May 19, 2020, 8:11 a.m. UTC | #1
<artem.galin@gmail.com> 于2020年5月19日周二 上午4:31写道:
>
> From: Artem Galin <artem.galin@intel.com>
>
> Adding DX11 relevant device type checks and adjusting callbacks with
> proper MediaSDK pair type support.
>
> Extending structure for proper MediaSDK pair type support.
>
> Signed-off-by: Artem Galin <artem.galin@intel.com>
> ---
>  libavcodec/qsv.c          | 53 ++++++++++++++++++++++++++-------------
>  libavcodec/qsv_internal.h |  2 +-
>  2 files changed, 37 insertions(+), 18 deletions(-)
>
> diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
> index 17720070f1..ef57b92a9f 100644
> --- a/libavcodec/qsv.c
> +++ b/libavcodec/qsv.c
> @@ -36,6 +36,8 @@
>  #include "avcodec.h"
>  #include "qsv_internal.h"
>
> +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl))
> +
>  #if QSV_VERSION_ATLEAST(1, 12)
>  #include "mfx/mfxvp8.h"
>  #endif
> @@ -239,7 +241,9 @@ int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame)
>      int i;
>      for (i = 0; i < ctx->nb_mids; i++) {
>          QSVMid *mid = &ctx->mids[i];
> -        if (mid->handle == frame->surface.Data.MemId)
> +        mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId;
> +        if ((mid->handle_pair.first == pair->first) &&
> +            (mid->handle_pair.second == pair->second))
>              return i;
>      }
>      return AVERROR_BUG;
> @@ -380,7 +384,11 @@ static int ff_qsv_set_display_handle(AVCodecContext *avctx, QSVSession *qs)
>  int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs,
>                                   const char *load_plugins, int gpu_copy)
>  {
> +#if CONFIG_D3D11VA
> +    mfxIMPL          impl = MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11;
> +#else
>      mfxIMPL          impl = MFX_IMPL_AUTO_ANY;
> +#endif
>      mfxVersion        ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
>      mfxInitParam init_par = { MFX_IMPL_AUTO_ANY };
>
> @@ -469,7 +477,7 @@ static AVBufferRef *qsv_create_mids(AVBufferRef *hw_frames_ref)
>
>      for (i = 0; i < nb_surfaces; i++) {
>          QSVMid *mid = &mids[i];
> -        mid->handle        = frames_hwctx->surfaces[i].Data.MemId;
> +        mid->handle_pair   = *((mfxHDLPair*)frames_hwctx->surfaces[i].Data.MemId);
>          mid->hw_frames_ref = hw_frames_ref1;
>      }
>
> @@ -646,7 +654,7 @@ static mfxStatus qsv_frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
>          goto fail;
>
>      qsv_mid->surf.Info = hw_frames_hwctx->surfaces[0].Info;
> -    qsv_mid->surf.Data.MemId = qsv_mid->handle;
> +    qsv_mid->surf.Data.MemId = &qsv_mid->handle_pair;
>
>      /* map the data to the system memory */
>      ret = av_hwframe_map(qsv_mid->locked_frame, qsv_mid->hw_frame,
> @@ -679,7 +687,13 @@ static mfxStatus qsv_frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
>  static mfxStatus qsv_frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
>  {
>      QSVMid *qsv_mid = (QSVMid*)mid;
> -    *hdl = qsv_mid->handle;
> +    mfxHDLPair *pair_dst = (mfxHDLPair*)hdl;
> +    mfxHDLPair *pair_src = (mfxHDLPair*)&qsv_mid->handle_pair;
> +
> +    pair_dst->first = pair_src->first;
> +
> +    if (pair_src->second != (mfxMemId)MFX_INFINITE)
> +        pair_dst->second = pair_src->second;
>      return MFX_ERR_NONE;
>  }
>
> @@ -687,24 +701,19 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
>                                 AVBufferRef *device_ref, const char *load_plugins,
>                                 int gpu_copy)
>  {
> -    static const mfxHandleType handle_types[] = {
> -        MFX_HANDLE_VA_DISPLAY,
> -        MFX_HANDLE_D3D9_DEVICE_MANAGER,
> -        MFX_HANDLE_D3D11_DEVICE,
> -    };
>      AVHWDeviceContext    *device_ctx = (AVHWDeviceContext*)device_ref->data;
>      AVQSVDeviceContext *device_hwctx = device_ctx->hwctx;
>      mfxSession        parent_session = device_hwctx->session;
>      mfxInitParam            init_par = { MFX_IMPL_AUTO_ANY };
>      mfxHDL                    handle = NULL;
> +    int          hw_handle_supported = 0;
>
>      mfxSession    session;
>      mfxVersion    ver;
>      mfxIMPL       impl;
>      mfxHandleType handle_type;
>      mfxStatus err;
> -
> -    int i, ret;
> +    int ret;
>
>      err = MFXQueryIMPL(parent_session, &impl);
>      if (err == MFX_ERR_NONE)
> @@ -713,13 +722,23 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
>          return ff_qsv_print_error(avctx, err,
>                                    "Error querying the session attributes");
>
> -    for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) {
> -        err = MFXVideoCORE_GetHandle(parent_session, handle_types[i], &handle);
> -        if (err == MFX_ERR_NONE) {
> -            handle_type = handle_types[i];
> -            break;
> +    if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) {
> +        handle_type = MFX_HANDLE_VA_DISPLAY;
> +        hw_handle_supported = 1;
> +    } else if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) {
> +        handle_type = MFX_HANDLE_D3D11_DEVICE;
> +        hw_handle_supported = 1;
> +    } else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) {
> +        handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER;
> +        hw_handle_supported = 1;
> +    }
> +
> +    if (hw_handle_supported) {
> +        err = MFXVideoCORE_GetHandle(parent_session, handle_type, &handle);
> +        if (err != MFX_ERR_NONE) {
> +            return ff_qsv_print_error(avctx, err,
> +                                  "Error getting handle session");
>          }
> -        handle = NULL;
>      }
>      if (!handle) {
>          av_log(avctx, AV_LOG_VERBOSE, "No supported hw handle could be retrieved "
> diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
> index 6489836a67..370ab464e7 100644
> --- a/libavcodec/qsv_internal.h
> +++ b/libavcodec/qsv_internal.h
> @@ -60,7 +60,7 @@
>
>  typedef struct QSVMid {
>      AVBufferRef *hw_frames_ref;
> -    mfxHDL handle;
> +    mfxHDLPair handle_pair;
>
>      AVFrame *locked_frame;
>      AVFrame *hw_frame;
> --
> 2.26.2
>

LGTM
Max Dmitrichenko May 26, 2020, 3:05 p.m. UTC | #2
On Tue, May 19, 2020 at 10:11 AM Zhong Li <lizhong1008@gmail.com> wrote:

> <artem.galin@gmail.com> 于2020年5月19日周二 上午4:31写道:
> >
> > From: Artem Galin <artem.galin@intel.com>
> >
> > Adding DX11 relevant device type checks and adjusting callbacks with
> > proper MediaSDK pair type support.
> >
> > Extending structure for proper MediaSDK pair type support.
> >
> > Signed-off-by: Artem Galin <artem.galin@intel.com>
> > ---
> >  libavcodec/qsv.c          | 53 ++++++++++++++++++++++++++-------------
> >  libavcodec/qsv_internal.h |  2 +-
> >  2 files changed, 37 insertions(+), 18 deletions(-)
> >
> > diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
> > index 17720070f1..ef57b92a9f 100644
> > --- a/libavcodec/qsv.c
> > +++ b/libavcodec/qsv.c
> > @@ -36,6 +36,8 @@
> >  #include "avcodec.h"
> >  #include "qsv_internal.h"
> >
> > +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl))
> > +
> >  #if QSV_VERSION_ATLEAST(1, 12)
> >  #include "mfx/mfxvp8.h"
> >  #endif
> > @@ -239,7 +241,9 @@ int ff_qsv_find_surface_idx(QSVFramesContext *ctx,
> QSVFrame *frame)
> >      int i;
> >      for (i = 0; i < ctx->nb_mids; i++) {
> >          QSVMid *mid = &ctx->mids[i];
> > -        if (mid->handle == frame->surface.Data.MemId)
> > +        mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId;
> > +        if ((mid->handle_pair.first == pair->first) &&
> > +            (mid->handle_pair.second == pair->second))
> >              return i;
> >      }
> >      return AVERROR_BUG;
> > @@ -380,7 +384,11 @@ static int ff_qsv_set_display_handle(AVCodecContext
> *avctx, QSVSession *qs)
> >  int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs,
> >                                   const char *load_plugins, int gpu_copy)
> >  {
> > +#if CONFIG_D3D11VA
> > +    mfxIMPL          impl = MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11;
> > +#else
> >      mfxIMPL          impl = MFX_IMPL_AUTO_ANY;
> > +#endif
> >      mfxVersion        ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR }
> };
> >      mfxInitParam init_par = { MFX_IMPL_AUTO_ANY };
> >
> > @@ -469,7 +477,7 @@ static AVBufferRef *qsv_create_mids(AVBufferRef
> *hw_frames_ref)
> >
> >      for (i = 0; i < nb_surfaces; i++) {
> >          QSVMid *mid = &mids[i];
> > -        mid->handle        = frames_hwctx->surfaces[i].Data.MemId;
> > +        mid->handle_pair   =
> *((mfxHDLPair*)frames_hwctx->surfaces[i].Data.MemId);
> >          mid->hw_frames_ref = hw_frames_ref1;
> >      }
> >
> > @@ -646,7 +654,7 @@ static mfxStatus qsv_frame_lock(mfxHDL pthis,
> mfxMemId mid, mfxFrameData *ptr)
> >          goto fail;
> >
> >      qsv_mid->surf.Info = hw_frames_hwctx->surfaces[0].Info;
> > -    qsv_mid->surf.Data.MemId = qsv_mid->handle;
> > +    qsv_mid->surf.Data.MemId = &qsv_mid->handle_pair;
> >
> >      /* map the data to the system memory */
> >      ret = av_hwframe_map(qsv_mid->locked_frame, qsv_mid->hw_frame,
> > @@ -679,7 +687,13 @@ static mfxStatus qsv_frame_unlock(mfxHDL pthis,
> mfxMemId mid, mfxFrameData *ptr)
> >  static mfxStatus qsv_frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL
> *hdl)
> >  {
> >      QSVMid *qsv_mid = (QSVMid*)mid;
> > -    *hdl = qsv_mid->handle;
> > +    mfxHDLPair *pair_dst = (mfxHDLPair*)hdl;
> > +    mfxHDLPair *pair_src = (mfxHDLPair*)&qsv_mid->handle_pair;
> > +
> > +    pair_dst->first = pair_src->first;
> > +
> > +    if (pair_src->second != (mfxMemId)MFX_INFINITE)
> > +        pair_dst->second = pair_src->second;
> >      return MFX_ERR_NONE;
> >  }
> >
> > @@ -687,24 +701,19 @@ int ff_qsv_init_session_device(AVCodecContext
> *avctx, mfxSession *psession,
> >                                 AVBufferRef *device_ref, const char
> *load_plugins,
> >                                 int gpu_copy)
> >  {
> > -    static const mfxHandleType handle_types[] = {
> > -        MFX_HANDLE_VA_DISPLAY,
> > -        MFX_HANDLE_D3D9_DEVICE_MANAGER,
> > -        MFX_HANDLE_D3D11_DEVICE,
> > -    };
> >      AVHWDeviceContext    *device_ctx =
> (AVHWDeviceContext*)device_ref->data;
> >      AVQSVDeviceContext *device_hwctx = device_ctx->hwctx;
> >      mfxSession        parent_session = device_hwctx->session;
> >      mfxInitParam            init_par = { MFX_IMPL_AUTO_ANY };
> >      mfxHDL                    handle = NULL;
> > +    int          hw_handle_supported = 0;
> >
> >      mfxSession    session;
> >      mfxVersion    ver;
> >      mfxIMPL       impl;
> >      mfxHandleType handle_type;
> >      mfxStatus err;
> > -
> > -    int i, ret;
> > +    int ret;
> >
> >      err = MFXQueryIMPL(parent_session, &impl);
> >      if (err == MFX_ERR_NONE)
> > @@ -713,13 +722,23 @@ int ff_qsv_init_session_device(AVCodecContext
> *avctx, mfxSession *psession,
> >          return ff_qsv_print_error(avctx, err,
> >                                    "Error querying the session
> attributes");
> >
> > -    for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) {
> > -        err = MFXVideoCORE_GetHandle(parent_session, handle_types[i],
> &handle);
> > -        if (err == MFX_ERR_NONE) {
> > -            handle_type = handle_types[i];
> > -            break;
> > +    if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) {
> > +        handle_type = MFX_HANDLE_VA_DISPLAY;
> > +        hw_handle_supported = 1;
> > +    } else if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) {
> > +        handle_type = MFX_HANDLE_D3D11_DEVICE;
> > +        hw_handle_supported = 1;
> > +    } else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) {
> > +        handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER;
> > +        hw_handle_supported = 1;
> > +    }
> > +
> > +    if (hw_handle_supported) {
> > +        err = MFXVideoCORE_GetHandle(parent_session, handle_type,
> &handle);
> > +        if (err != MFX_ERR_NONE) {
> > +            return ff_qsv_print_error(avctx, err,
> > +                                  "Error getting handle session");
> >          }
> > -        handle = NULL;
> >      }
> >      if (!handle) {
> >          av_log(avctx, AV_LOG_VERBOSE, "No supported hw handle could be
> retrieved "
> > diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
> > index 6489836a67..370ab464e7 100644
> > --- a/libavcodec/qsv_internal.h
> > +++ b/libavcodec/qsv_internal.h
> > @@ -60,7 +60,7 @@
> >
> >  typedef struct QSVMid {
> >      AVBufferRef *hw_frames_ref;
> > -    mfxHDL handle;
> > +    mfxHDLPair handle_pair;
> >
> >      AVFrame *locked_frame;
> >      AVFrame *hw_frame;
> > --
> > 2.26.2
> >
>
> LGTM
>
>
thanks,

are we close to the final decision about these patches?
just to move forward.

regards
Max
diff mbox series

Patch

diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 17720070f1..ef57b92a9f 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -36,6 +36,8 @@ 
 #include "avcodec.h"
 #include "qsv_internal.h"
 
+#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl))
+
 #if QSV_VERSION_ATLEAST(1, 12)
 #include "mfx/mfxvp8.h"
 #endif
@@ -239,7 +241,9 @@  int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame)
     int i;
     for (i = 0; i < ctx->nb_mids; i++) {
         QSVMid *mid = &ctx->mids[i];
-        if (mid->handle == frame->surface.Data.MemId)
+        mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId;
+        if ((mid->handle_pair.first == pair->first) &&
+            (mid->handle_pair.second == pair->second))
             return i;
     }
     return AVERROR_BUG;
@@ -380,7 +384,11 @@  static int ff_qsv_set_display_handle(AVCodecContext *avctx, QSVSession *qs)
 int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs,
                                  const char *load_plugins, int gpu_copy)
 {
+#if CONFIG_D3D11VA
+    mfxIMPL          impl = MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11;
+#else
     mfxIMPL          impl = MFX_IMPL_AUTO_ANY;
+#endif
     mfxVersion        ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
     mfxInitParam init_par = { MFX_IMPL_AUTO_ANY };
 
@@ -469,7 +477,7 @@  static AVBufferRef *qsv_create_mids(AVBufferRef *hw_frames_ref)
 
     for (i = 0; i < nb_surfaces; i++) {
         QSVMid *mid = &mids[i];
-        mid->handle        = frames_hwctx->surfaces[i].Data.MemId;
+        mid->handle_pair   = *((mfxHDLPair*)frames_hwctx->surfaces[i].Data.MemId);
         mid->hw_frames_ref = hw_frames_ref1;
     }
 
@@ -646,7 +654,7 @@  static mfxStatus qsv_frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
         goto fail;
 
     qsv_mid->surf.Info = hw_frames_hwctx->surfaces[0].Info;
-    qsv_mid->surf.Data.MemId = qsv_mid->handle;
+    qsv_mid->surf.Data.MemId = &qsv_mid->handle_pair;
 
     /* map the data to the system memory */
     ret = av_hwframe_map(qsv_mid->locked_frame, qsv_mid->hw_frame,
@@ -679,7 +687,13 @@  static mfxStatus qsv_frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
 static mfxStatus qsv_frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
 {
     QSVMid *qsv_mid = (QSVMid*)mid;
-    *hdl = qsv_mid->handle;
+    mfxHDLPair *pair_dst = (mfxHDLPair*)hdl;
+    mfxHDLPair *pair_src = (mfxHDLPair*)&qsv_mid->handle_pair;
+
+    pair_dst->first = pair_src->first;
+
+    if (pair_src->second != (mfxMemId)MFX_INFINITE)
+        pair_dst->second = pair_src->second;
     return MFX_ERR_NONE;
 }
 
@@ -687,24 +701,19 @@  int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
                                AVBufferRef *device_ref, const char *load_plugins,
                                int gpu_copy)
 {
-    static const mfxHandleType handle_types[] = {
-        MFX_HANDLE_VA_DISPLAY,
-        MFX_HANDLE_D3D9_DEVICE_MANAGER,
-        MFX_HANDLE_D3D11_DEVICE,
-    };
     AVHWDeviceContext    *device_ctx = (AVHWDeviceContext*)device_ref->data;
     AVQSVDeviceContext *device_hwctx = device_ctx->hwctx;
     mfxSession        parent_session = device_hwctx->session;
     mfxInitParam            init_par = { MFX_IMPL_AUTO_ANY };
     mfxHDL                    handle = NULL;
+    int          hw_handle_supported = 0;
 
     mfxSession    session;
     mfxVersion    ver;
     mfxIMPL       impl;
     mfxHandleType handle_type;
     mfxStatus err;
-
-    int i, ret;
+    int ret;
 
     err = MFXQueryIMPL(parent_session, &impl);
     if (err == MFX_ERR_NONE)
@@ -713,13 +722,23 @@  int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
         return ff_qsv_print_error(avctx, err,
                                   "Error querying the session attributes");
 
-    for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) {
-        err = MFXVideoCORE_GetHandle(parent_session, handle_types[i], &handle);
-        if (err == MFX_ERR_NONE) {
-            handle_type = handle_types[i];
-            break;
+    if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) {
+        handle_type = MFX_HANDLE_VA_DISPLAY;
+        hw_handle_supported = 1;
+    } else if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) {
+        handle_type = MFX_HANDLE_D3D11_DEVICE;
+        hw_handle_supported = 1;
+    } else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) {
+        handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER;
+        hw_handle_supported = 1;
+    }
+
+    if (hw_handle_supported) {
+        err = MFXVideoCORE_GetHandle(parent_session, handle_type, &handle);
+        if (err != MFX_ERR_NONE) {
+            return ff_qsv_print_error(avctx, err,
+                                  "Error getting handle session");
         }
-        handle = NULL;
     }
     if (!handle) {
         av_log(avctx, AV_LOG_VERBOSE, "No supported hw handle could be retrieved "
diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
index 6489836a67..370ab464e7 100644
--- a/libavcodec/qsv_internal.h
+++ b/libavcodec/qsv_internal.h
@@ -60,7 +60,7 @@ 
 
 typedef struct QSVMid {
     AVBufferRef *hw_frames_ref;
-    mfxHDL handle;
+    mfxHDLPair handle_pair;
 
     AVFrame *locked_frame;
     AVFrame *hw_frame;