From: Haihao Xiang <haihao.xi...@intel.com> 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.xi...@intel.com> --- 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); -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".