Message ID | 20200424145219.54067-3-artem.galin@gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,v3,1/4] fftools/qsv: enabling d3d11va/dxva2 device selection | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
On 24/04/2020 15:52, artem.galin@gmail.com wrote: > 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 | 66 +++++++++++++++++++++++++++++++-------- > libavcodec/qsv_internal.h | 1 + > 2 files changed, 54 insertions(+), 13 deletions(-) > > diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c > index db98c75073..35e62417f6 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 > @@ -221,8 +223,15 @@ 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 CONFIG_VAAPI > if (mid->handle == frame->surface.Data.MemId) > return i; > +#else > + mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId; > + if ((mid->handle_pair.first == pair->first) && > + (mid->handle_pair.second == pair->second)) > + return i; > +#endif Is there any reason not to pass around an mfxHDLPair on Linux as well? All the #ifdefs you're adding here are not fun. > } > return AVERROR_BUG; > } > @@ -362,7 +371,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; Does that still do the right thing on systems where only D3D9 works? > ... - Mark
On Sun, Apr 26, 2020 at 8:31 PM Mark Thompson <sw@jkqxz.net> wrote: > On 24/04/2020 15:52, artem.galin@gmail.com wrote: > > 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 | 66 +++++++++++++++++++++++++++++++-------- > > libavcodec/qsv_internal.h | 1 + > > 2 files changed, 54 insertions(+), 13 deletions(-) > > > > diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c > > index db98c75073..35e62417f6 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 > > @@ -221,8 +223,15 @@ 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 CONFIG_VAAPI > > if (mid->handle == frame->surface.Data.MemId) > > return i; > > +#else > > + mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId; > > + if ((mid->handle_pair.first == pair->first) && > > + (mid->handle_pair.second == pair->second)) > > + return i; > > +#endif > > Is there any reason not to pass around an mfxHDLPair on Linux as well? > All the #ifdefs you're adding here are not fun. > > Linux doesnt rely on .second field the same as DX11 > > } > > return AVERROR_BUG; > > } > > @@ -362,7 +371,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; > > Does that still do the right thing on systems where only D3D9 works? > > yes, it is only a hint for D11 when possible. > > ... > > - Mark > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". and thanks for reviews, Mark regards Max
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index db98c75073..35e62417f6 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 @@ -221,8 +223,15 @@ 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 CONFIG_VAAPI if (mid->handle == frame->surface.Data.MemId) return i; +#else + mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId; + if ((mid->handle_pair.first == pair->first) && + (mid->handle_pair.second == pair->second)) + return i; +#endif } return AVERROR_BUG; } @@ -362,7 +371,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 }; @@ -449,11 +462,19 @@ static AVBufferRef *qsv_create_mids(AVBufferRef *hw_frames_ref) return NULL; } +#if CONFIG_VAAPI for (i = 0; i < nb_surfaces; i++) { QSVMid *mid = &mids[i]; mid->handle = frames_hwctx->surfaces[i].Data.MemId; mid->hw_frames_ref = hw_frames_ref1; } +#else + for (i = 0; i < nb_surfaces; i++) { + QSVMid *mid = &mids[i]; + mid->handle_pair = *((mfxHDLPair*)frames_hwctx->surfaces[i].Data.MemId); + mid->hw_frames_ref = hw_frames_ref1; + } +#endif return mids_buf; } @@ -628,7 +649,11 @@ static mfxStatus qsv_frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) goto fail; qsv_mid->surf.Info = hw_frames_hwctx->surfaces[0].Info; +#if CONFIG_VAAPI qsv_mid->surf.Data.MemId = qsv_mid->handle; +#else + qsv_mid->surf.Data.MemId = &qsv_mid->handle_pair; +#endif /* map the data to the system memory */ ret = av_hwframe_map(qsv_mid->locked_frame, qsv_mid->hw_frame, @@ -661,7 +686,17 @@ 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; +#if CONFIG_VAAPI *hdl = qsv_mid->handle; +#else + 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; +#endif return MFX_ERR_NONE; } @@ -669,24 +704,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) @@ -695,13 +725,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..7a4a66e9d6 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -61,6 +61,7 @@ typedef struct QSVMid { AVBufferRef *hw_frames_ref; mfxHDL handle; + mfxHDLPair handle_pair; AVFrame *locked_frame; AVFrame *hw_frame;