mirror of
https://github.com/opencv/opencv.git
synced 2025-06-12 20:42:53 +08:00
videoio(MSMF): avoid OpenCV load failure on Win7 machines
OpenCV binaries are compiled on Win10 environment
This commit is contained in:
parent
9be3f7d41a
commit
7a2448672c
@ -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)
|
|||||||
#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)
|
|||||||
{
|
{
|
||||||
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)))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user