Commit 86885c5e authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #11859 from alalek:fix_videoio_msmf_win7

parents 9be3f7d4 7a244867
...@@ -83,6 +83,21 @@ ...@@ -83,6 +83,21 @@
#pragma comment(lib, "Mfreadwrite") #pragma comment(lib, "Mfreadwrite")
#ifdef HAVE_DXVA #ifdef HAVE_DXVA
#pragma comment(lib, "d3d11") #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 #endif
#if (WINVER >= 0x0602) // Available since Win 8 #if (WINVER >= 0x0602) // Available since Win 8
#pragma comment(lib, "MinCore_Downlevel") #pragma comment(lib, "MinCore_Downlevel")
...@@ -768,6 +783,10 @@ bool CvCapture_MSMF::configureHW(bool enable) ...@@ -768,6 +783,10 @@ bool CvCapture_MSMF::configureHW(bool enable)
#ifdef HAVE_DXVA #ifdef HAVE_DXVA
if ((enable && D3DMgr && D3DDev) || (!enable && !D3DMgr && !D3DDev)) if ((enable && D3DMgr && D3DDev) || (!enable && !D3DMgr && !D3DDev))
return true; return true;
if (!pMFCreateDXGIDeviceManager_initialized)
init_MFCreateDXGIDeviceManager();
if (enable && !pMFCreateDXGIDeviceManager)
return false;
bool reopen = isOpen; bool reopen = isOpen;
int prevcam = camid; int prevcam = camid;
...@@ -788,7 +807,7 @@ bool CvCapture_MSMF::configureHW(bool enable) ...@@ -788,7 +807,7 @@ bool CvCapture_MSMF::configureHW(bool enable)
{ {
D3DDevMT->SetMultithreadProtected(TRUE); D3DDevMT->SetMultithreadProtected(TRUE);
D3DDevMT.Release(); D3DDevMT.Release();
if (SUCCEEDED(MFCreateDXGIDeviceManager(&mgrRToken, &D3DMgr))) if (SUCCEEDED(pMFCreateDXGIDeviceManager(&mgrRToken, &D3DMgr)))
{ {
if (SUCCEEDED(D3DMgr->ResetDevice(D3DDev.Get(), mgrRToken))) if (SUCCEEDED(D3DMgr->ResetDevice(D3DDev.Get(), mgrRToken)))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment