summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>2018-06-30 04:50:30 +0000
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>2018-06-30 04:50:31 +0000
commit86885c5ed02603753efe98a967a62afc5ae88a86 (patch)
tree96bf9a24521c6373916b6f012b45da2f91db6a91
parent9be3f7d41a918a1ef2fd2fd2ebe87da3fdde611a (diff)
parent7a2448672c9f2ccfd8d00f798cac5219dbcf271c (diff)
downloadopencv-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.cpp21
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)))
{