diff options
author | Haihao Xiang <haihao.xiang@intel.com> | 2023-05-15 14:04:03 +0800 |
---|---|---|
committer | Haihao Xiang <haihao.xiang@intel.com> | 2023-05-25 09:04:13 +0800 |
commit | 2b0fe529674e91bd55b52512f9a2bb0658ce0f7c (patch) | |
tree | 584431738a331bb949174ab6e915cd8d79ce6ba3 | |
parent | 0bce5590c3956184365d5600425e9c1dddb513ec (diff) | |
download | ffmpeg-2b0fe529674e91bd55b52512f9a2bb0658ce0f7c.tar.gz |
lavc/qsv: fallback to the default mfx implementation for internal session on Windows
The mfx implementation based on D3D11 is expected for an internal
session on Windows, however sometimes this implemntation is not
supported [1]. A fallback to the default mfx implementation is added in
this patch.
[1] https://github.com/intel/cartwheel-ffmpeg/issues/246
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
-rw-r--r-- | libavcodec/qsv.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index 8eabf46b45..7563625627 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -677,18 +677,31 @@ static int qsv_create_mfx_session(AVCodecContext *avctx, int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs, const char *load_plugins, int gpu_copy) { + mfxIMPL impls[] = { #if CONFIG_D3D11VA - mfxIMPL impl = MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11; -#else - mfxIMPL impl = MFX_IMPL_AUTO_ANY; + MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11, #endif + MFX_IMPL_AUTO_ANY + }; + mfxIMPL impl; mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } }; const char *desc; - int ret = qsv_create_mfx_session(avctx, impl, &ver, gpu_copy, &qs->session, + int ret; + + for (int i = 0; i < FF_ARRAY_ELEMS(impls); i++) { + ret = qsv_create_mfx_session(avctx, impls[i], &ver, gpu_copy, &qs->session, &qs->loader); - if (ret) - return ret; + + if (ret == 0) + break; + + if (i == FF_ARRAY_ELEMS(impls) - 1) + return ret; + else + av_log(avctx, AV_LOG_ERROR, "The current mfx implementation is not " + "supported, try next mfx implementation.\n"); + } #ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE ret = ff_qsv_set_display_handle(avctx, qs); |