[FFmpeg-cvslog] lavc/qsv: fallback to the default mfx implementation for internal session on Windows

Haihao Xiang git at videolan.org
Thu May 25 04:06:22 EEST 2023


ffmpeg | branch: master | Haihao Xiang <haihao.xiang at intel.com> | Mon May 15 14:04:03 2023 +0800| [2b0fe529674e91bd55b52512f9a2bb0658ce0f7c] | committer: Haihao Xiang

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 at intel.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2b0fe529674e91bd55b52512f9a2bb0658ce0f7c
---

 libavcodec/qsv.c | 25 +++++++++++++++++++------
 1 file 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);



More information about the ffmpeg-cvslog mailing list