diff options
author | Alexander Alekhin <alexander.a.alekhin@gmail.com> | 2018-06-30 04:50:30 +0000 |
---|---|---|
committer | Alexander Alekhin <alexander.a.alekhin@gmail.com> | 2018-06-30 04:50:31 +0000 |
commit | 86885c5ed02603753efe98a967a62afc5ae88a86 (patch) | |
tree | 96bf9a24521c6373916b6f012b45da2f91db6a91 | |
parent | 9be3f7d41a918a1ef2fd2fd2ebe87da3fdde611a (diff) | |
parent | 7a2448672c9f2ccfd8d00f798cac5219dbcf271c (diff) | |
download | opencv-86885c5ed02603753efe98a967a62afc5ae88a86.tar.gz opencv-86885c5ed02603753efe98a967a62afc5ae88a86.tar.bz2 opencv-86885c5ed02603753efe98a967a62afc5ae88a86.zip |
Merge pull request #11859 from alalek:fix_videoio_msmf_win7
-rw-r--r-- | modules/videoio/src/cap_msmf.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/modules/videoio/src/cap_msmf.cpp b/modules/videoio/src/cap_msmf.cpp index 8e1a60a00b..338cf587c9 100644 --- a/modules/videoio/src/cap_msmf.cpp +++ b/modules/videoio/src/cap_msmf.cpp @@ -83,6 +83,21 @@ #pragma comment(lib, "Mfreadwrite") #ifdef HAVE_DXVA #pragma comment(lib, "d3d11") +// MFCreateDXGIDeviceManager() is available since Win8 only. +// To avoid OpenCV loading failure on Win7 use dynamic detection of this symbol. +// Details: https://github.com/opencv/opencv/issues/11858 +typedef HRESULT (*FN_MFCreateDXGIDeviceManager)(UINT *resetToken, IMFDXGIDeviceManager **ppDeviceManager); +static bool pMFCreateDXGIDeviceManager_initialized = false; +static FN_MFCreateDXGIDeviceManager pMFCreateDXGIDeviceManager = NULL; +static void init_MFCreateDXGIDeviceManager() +{ + HMODULE h = LoadLibraryA("mfplat.dll"); + if (h) + { + pMFCreateDXGIDeviceManager = (FN_MFCreateDXGIDeviceManager)GetProcAddress(h, "MFCreateDXGIDeviceManager"); + } + pMFCreateDXGIDeviceManager_initialized = true; +} #endif #if (WINVER >= 0x0602) // Available since Win 8 #pragma comment(lib, "MinCore_Downlevel") @@ -768,6 +783,10 @@ bool CvCapture_MSMF::configureHW(bool enable) #ifdef HAVE_DXVA if ((enable && D3DMgr && D3DDev) || (!enable && !D3DMgr && !D3DDev)) return true; + if (!pMFCreateDXGIDeviceManager_initialized) + init_MFCreateDXGIDeviceManager(); + if (enable && !pMFCreateDXGIDeviceManager) + return false; bool reopen = isOpen; int prevcam = camid; @@ -788,7 +807,7 @@ bool CvCapture_MSMF::configureHW(bool enable) { D3DDevMT->SetMultithreadProtected(TRUE); D3DDevMT.Release(); - if (SUCCEEDED(MFCreateDXGIDeviceManager(&mgrRToken, &D3DMgr))) + if (SUCCEEDED(pMFCreateDXGIDeviceManager(&mgrRToken, &D3DMgr))) { if (SUCCEEDED(D3DMgr->ResetDevice(D3DDev.Get(), mgrRToken))) { |