From 6ad34274262572ce682b56e02dac180a9d68ca90 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Thu, 25 Sep 2014 11:42:07 +0200 Subject: [PATCH 1/6] Fixed compilation errors under VS 2010 and Win 7 Applied in PR3240 to 2.4 branch. --- modules/videoio/src/cap_msmf.cpp | 4 +++- modules/videoio/src/cap_msmf.hpp | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/videoio/src/cap_msmf.cpp b/modules/videoio/src/cap_msmf.cpp index 2a9ee20a9b..2ef4ac236b 100644 --- a/modules/videoio/src/cap_msmf.cpp +++ b/modules/videoio/src/cap_msmf.cpp @@ -1509,11 +1509,13 @@ HRESULT ImageGrabber::startGrabbing(void) DebugPrintOut(L"IMAGEGRABBER VIDEODEVICE %i: MESessionStopped \n", ig_DeviceID); break; } +#if (WINVER >= 0x0602) // Available since Win 8 if (met == MEVideoCaptureDeviceRemoved) { DebugPrintOut(L"IMAGEGRABBER VIDEODEVICE %i: MEVideoCaptureDeviceRemoved \n", ig_DeviceID); break; } +#endif if ((met == MEError) || (met == MENonFatalError)) { pEvent->GetStatus(&hrStatus); @@ -4112,7 +4114,7 @@ const GUID CvVideoWriter_MSMF::FourCC2GUID(int fourcc) return MFVideoFormat_DVSD; break; case CV_FOURCC_MACRO('d', 'v', 's', 'l'): return MFVideoFormat_DVSL; break; -#if (WINVER >= _WIN32_WINNT_WIN8) +#if (WINVER >= 0x0602) case CV_FOURCC_MACRO('H', '2', '6', '3'): // Available only for Win 8 target. return MFVideoFormat_H263; break; #endif diff --git a/modules/videoio/src/cap_msmf.hpp b/modules/videoio/src/cap_msmf.hpp index 38dea5340c..f9e413abb8 100644 --- a/modules/videoio/src/cap_msmf.hpp +++ b/modules/videoio/src/cap_msmf.hpp @@ -333,6 +333,7 @@ MAKE_ENUM(MediaEventType) MediaEventTypePairs[] = { MAKE_ENUM_PAIR(MediaEventType, MEAudioSessionDisconnected), MAKE_ENUM_PAIR(MediaEventType, MEAudioSessionExclusiveModeOverride), MAKE_ENUM_PAIR(MediaEventType, MESinkV1Anchor), +#if (WINVER >= 0x0602) // Available since Win 8 MAKE_ENUM_PAIR(MediaEventType, MECaptureAudioSessionVolumeChanged), MAKE_ENUM_PAIR(MediaEventType, MECaptureAudioSessionDeviceRemoved), MAKE_ENUM_PAIR(MediaEventType, MECaptureAudioSessionFormatChanged), @@ -340,6 +341,7 @@ MAKE_ENUM(MediaEventType) MediaEventTypePairs[] = { MAKE_ENUM_PAIR(MediaEventType, MECaptureAudioSessionExclusiveModeOverride), MAKE_ENUM_PAIR(MediaEventType, MECaptureAudioSessionServerShutdown), MAKE_ENUM_PAIR(MediaEventType, MESinkV2Anchor), +#endif MAKE_ENUM_PAIR(MediaEventType, METrustUnknown), MAKE_ENUM_PAIR(MediaEventType, MEPolicyChanged), MAKE_ENUM_PAIR(MediaEventType, MEContentProtectionMessage), @@ -361,9 +363,11 @@ MAKE_ENUM(MediaEventType) MediaEventTypePairs[] = { MAKE_ENUM_PAIR(MediaEventType, METransformHaveOutput), MAKE_ENUM_PAIR(MediaEventType, METransformDrainComplete), MAKE_ENUM_PAIR(MediaEventType, METransformMarker), +#if (WINVER >= 0x0602) // Available since Win 8 MAKE_ENUM_PAIR(MediaEventType, MEByteStreamCharacteristicsChanged), MAKE_ENUM_PAIR(MediaEventType, MEVideoCaptureDeviceRemoved), MAKE_ENUM_PAIR(MediaEventType, MEVideoCaptureDevicePreempted), +#endif MAKE_ENUM_PAIR(MediaEventType, MEReservedMax) }; MAKE_MAP(MediaEventType) MediaEventTypeMap(MediaEventTypePairs, MediaEventTypePairs + sizeof(MediaEventTypePairs) / sizeof(MediaEventTypePairs[0])); @@ -1044,7 +1048,11 @@ class StreamSink : { public: // IUnknown methods +#if defined(_MSC_VER) && _MSC_VER >= 1700 // '_Outptr_result_nullonfailure_' SAL is avaialable since VS 2012 STDMETHOD(QueryInterface)(REFIID riid, _Outptr_result_nullonfailure_ void **ppv) +#else + STDMETHOD(QueryInterface)(REFIID riid, void **ppv) +#endif { if (ppv == nullptr) { return E_POINTER; @@ -2383,7 +2391,11 @@ public: } return cRef; } +#if defined(_MSC_VER) && _MSC_VER >= 1700 // '_Outptr_result_nullonfailure_' SAL is avaialable since VS 2012 STDMETHOD(QueryInterface)(REFIID riid, _Outptr_result_nullonfailure_ void **ppv) +#else + STDMETHOD(QueryInterface)(REFIID riid, void **ppv) +#endif { if (ppv == nullptr) { return E_POINTER; From 25cf51637d0eaaab4843d050fd3aad271d60f5d2 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Thu, 25 Sep 2014 11:45:11 +0200 Subject: [PATCH 2/6] Fix linking error under Win 7 - do not import MinCore_Downlevel.lib if target is Win 7 or earlier. Applied in PR3243 to 2.4 branch. --- modules/videoio/src/cap_msmf.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/videoio/src/cap_msmf.cpp b/modules/videoio/src/cap_msmf.cpp index 2ef4ac236b..2c7f0ea879 100644 --- a/modules/videoio/src/cap_msmf.cpp +++ b/modules/videoio/src/cap_msmf.cpp @@ -78,7 +78,9 @@ #pragma comment(lib, "mfuuid") #pragma comment(lib, "Strmiids") #pragma comment(lib, "Mfreadwrite") +#if (WINVER >= 0x0602) // Available since Win 8 #pragma comment(lib, "MinCore_Downlevel") +#endif #include From 7c00b170856a98d5e98caca017da3a0e53133570 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Thu, 25 Sep 2014 11:49:31 +0200 Subject: [PATCH 3/6] Fixed MSMF video capture initialization Applied in PR3251 to 2.4 branch. --- modules/videoio/src/cap_msmf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoio/src/cap_msmf.cpp b/modules/videoio/src/cap_msmf.cpp index 2c7f0ea879..a18417fb6a 100644 --- a/modules/videoio/src/cap_msmf.cpp +++ b/modules/videoio/src/cap_msmf.cpp @@ -2459,7 +2459,7 @@ int videoDevice::findType(unsigned int size, unsigned int frameRate) fmt = vd_CaptureFormats.find(size); if( fmt != vd_CaptureFormats.end() ) FRM = fmt->second; - else + else if( !vd_CaptureFormats.empty() ) FRM = vd_CaptureFormats.rbegin()->second; if( FRM.empty() ) From 8f334b4e41e12457fd1d6c720783b5a85cbb15e7 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Thu, 25 Sep 2014 11:51:31 +0200 Subject: [PATCH 4/6] Fixed assertion warning in MSMF frame grabber Applied in PR3251 to 2.4 branch --- modules/videoio/src/cap_msmf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoio/src/cap_msmf.cpp b/modules/videoio/src/cap_msmf.cpp index a18417fb6a..a92e8d7b55 100644 --- a/modules/videoio/src/cap_msmf.cpp +++ b/modules/videoio/src/cap_msmf.cpp @@ -1471,7 +1471,6 @@ void ImageGrabber::stopGrabbing() HRESULT ImageGrabber::startGrabbing(void) { - _ComPtr pEvent = NULL; PROPVARIANT var; PropVariantInit(&var); HRESULT hr = ig_pSession->SetTopology(0, ig_pTopology); @@ -1479,6 +1478,7 @@ HRESULT ImageGrabber::startGrabbing(void) hr = ig_pSession->Start(&GUID_NULL, &var); for(;;) { + _ComPtr pEvent = NULL; HRESULT hrStatus = S_OK; MediaEventType met; if(!ig_pSession) break; From b91bd6716c7251cfc634b3b5559bed520cad526c Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Thu, 25 Sep 2014 11:54:15 +0200 Subject: [PATCH 5/6] Fixed MSMF file capture error while opening the file containing unsupported video stream format Applied in PR3260 to 2.4 branch --- modules/videoio/src/cap_msmf.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/modules/videoio/src/cap_msmf.cpp b/modules/videoio/src/cap_msmf.cpp index a92e8d7b55..96c06aeb8f 100644 --- a/modules/videoio/src/cap_msmf.cpp +++ b/modules/videoio/src/cap_msmf.cpp @@ -3848,18 +3848,25 @@ bool CvCaptureFile_MSMF::open(const char* filename) hr = enumerateCaptureFormats(videoFileSource); } - if (SUCCEEDED(hr)) + if( captureFormats.empty() ) { - hr = ImageGrabberThread::CreateInstance(&grabberThread, videoFileSource, (unsigned int)-2, true); + isOpened = false; + } + else + { + if (SUCCEEDED(hr)) + { + hr = ImageGrabberThread::CreateInstance(&grabberThread, videoFileSource, (unsigned int)-2, true); + } + + isOpened = SUCCEEDED(hr); } - if (SUCCEEDED(hr)) + if (isOpened) { grabberThread->start(); } - isOpened = SUCCEEDED(hr); - return isOpened; } @@ -3991,7 +3998,9 @@ HRESULT CvCaptureFile_MSMF::enumerateCaptureFormats(IMFMediaSource *pSource) goto done; } MediaType MT = FormatReader::Read(pType.Get()); - captureFormats.push_back(MT); + // We can capture only RGB video. + if( MT.MF_MT_SUBTYPE == MFVideoFormat_RGB24 ) + captureFormats.push_back(MT); } done: From 302b138aa7c821f8d1b9ee66cfdf14e3af798cc8 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Thu, 25 Sep 2014 12:05:54 +0200 Subject: [PATCH 6/6] CMake configuration for MSMF capture Applied in PR3247 to 2.4 branch. --- cmake/OpenCVFindLibsVideo.cmake | 1 + modules/videoio/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake index fec7be4d84..6d6ca62e86 100644 --- a/cmake/OpenCVFindLibsVideo.cmake +++ b/cmake/OpenCVFindLibsVideo.cmake @@ -254,6 +254,7 @@ if(WITH_DSHOW) endif(WITH_DSHOW) # --- VideoInput/Microsoft Media Foundation --- +ocv_clear_vars(HAVE_MSMF) if(WITH_MSMF) check_include_file(Mfapi.h HAVE_MSMF) endif(WITH_MSMF) diff --git a/modules/videoio/CMakeLists.txt b/modules/videoio/CMakeLists.txt index 3a031a9fea..67fd9816ed 100644 --- a/modules/videoio/CMakeLists.txt +++ b/modules/videoio/CMakeLists.txt @@ -42,6 +42,7 @@ if (WIN32 AND HAVE_DSHOW) endif() if (WIN32 AND HAVE_MSMF) + list(APPEND videoio_srcs ${CMAKE_CURRENT_LIST_DIR}/src/cap_msmf.hpp) list(APPEND videoio_srcs ${CMAKE_CURRENT_LIST_DIR}/src/cap_msmf.cpp) endif()