[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