[FFmpeg-devel] [PATCH v3 3/4] libavcodec/qsv: enabling d3d11va support, added mfxhdlpair
artem.galin at gmail.com
artem.galin at gmail.com
Fri Apr 24 17:52:18 EEST 2020
From: Artem Galin <artem.galin at 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 at 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
}
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;
--
2.26.0
More information about the ffmpeg-devel
mailing list