mirror of
https://github.com/opencv/opencv.git
synced 2025-06-11 11:45:30 +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")
|
||||
#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)))
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user