From a2561ee0cdc551e502fcd06b04e193521e8eac27 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Wed, 3 Apr 2013 03:48:23 -0700 Subject: [PATCH] Code review notes fixed. --- CMakeLists.txt | 2 +- cmake/OpenCVDetectCUDA.cmake | 2 +- cmake/OpenCVLegacyOptions.cmake | 1 + cmake/{ => checks}/OpenCVDetectCudaArch.cu | 0 modules/core/include/opencv2/core/internal.hpp | 1 + modules/highgui/src/cap_msmf.cpp | 1116 +++--------------------- platforms/winrt/arm.winrt.toolchain.cmake | 1 + 7 files changed, 107 insertions(+), 1016 deletions(-) rename cmake/{ => checks}/OpenCVDetectCudaArch.cu (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9bf394f..21922e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,7 +141,7 @@ OCV_OPTION(WITH_TIFF "Include TIFF support" ON OCV_OPTION(WITH_UNICAP "Include Unicap support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) ) OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT ANDROID) ) OCV_OPTION(WITH_DSHOW "Build HighGUI with DirectShow support" ON IF (WIN32 AND NOT ARM) ) -OCV_OPTION(WITH_MSMF "Build HighGUI with Media Foundation support" OFF ) +OCV_OPTION(WITH_MSMF "Build HighGUI with Media Foundation support" OFF IF WIN32 ) OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF IF (NOT ANDROID AND NOT APPLE) ) OCV_OPTION(WITH_XINE "Include Xine support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) ) OCV_OPTION(WITH_OPENCL "Include OpenCL Runtime support" OFF IF (NOT ANDROID AND NOT IOS) ) diff --git a/cmake/OpenCVDetectCUDA.cmake b/cmake/OpenCVDetectCUDA.cmake index e853a8d..91cf150 100644 --- a/cmake/OpenCVDetectCUDA.cmake +++ b/cmake/OpenCVDetectCUDA.cmake @@ -57,7 +57,7 @@ if(CUDA_FOUND) elseif(CUDA_GENERATION STREQUAL "Kepler") set(__cuda_arch_bin "3.0") elseif(CUDA_GENERATION STREQUAL "Auto") - execute_process( COMMAND "${CUDA_NVCC_EXECUTABLE}" "${OpenCV_SOURCE_DIR}/cmake/OpenCVDetectCudaArch.cu" "--run" + execute_process( COMMAND "${CUDA_NVCC_EXECUTABLE}" "${OpenCV_SOURCE_DIR}/cmake/checks/OpenCVDetectCudaArch.cu" "--run" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/" RESULT_VARIABLE _nvcc_res OUTPUT_VARIABLE _nvcc_out ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) diff --git a/cmake/OpenCVLegacyOptions.cmake b/cmake/OpenCVLegacyOptions.cmake index a34c9e5..e05ad4c 100644 --- a/cmake/OpenCVLegacyOptions.cmake +++ b/cmake/OpenCVLegacyOptions.cmake @@ -12,6 +12,7 @@ endmacro() ocv_legacy_option(BUILD_NEW_PYTHON_SUPPORT BUILD_opencv_python) ocv_legacy_option(BUILD_JAVA_SUPPORT BUILD_opencv_java) ocv_legacy_option(WITH_ANDROID_CAMERA BUILD_opencv_androidcamera) +ocv_legacy_option(WITH_VIDEOINPUT WITH_DSHOW) if(DEFINED OPENCV_BUILD_3RDPARTY_LIBS) set(BUILD_ZLIB ${OPENCV_BUILD_3RDPARTY_LIBS} CACHE BOOL "Set via depricated OPENCV_BUILD_3RDPARTY_LIBS" FORCE) diff --git a/cmake/OpenCVDetectCudaArch.cu b/cmake/checks/OpenCVDetectCudaArch.cu similarity index 100% rename from cmake/OpenCVDetectCudaArch.cu rename to cmake/checks/OpenCVDetectCudaArch.cu diff --git a/modules/core/include/opencv2/core/internal.hpp b/modules/core/include/opencv2/core/internal.hpp index 8902e69..5335fa0 100644 --- a/modules/core/include/opencv2/core/internal.hpp +++ b/modules/core/include/opencv2/core/internal.hpp @@ -136,6 +136,7 @@ CV_INLINE IppiSize ippiSize(int width, int height) #ifdef __ARM_NEON__ # include # define CV_NEON 1 +# define CPU_HAS_NEON_FEATURE (true) #endif #ifndef CV_SSE diff --git a/modules/highgui/src/cap_msmf.cpp b/modules/highgui/src/cap_msmf.cpp index dbbad6f..52b7804 100644 --- a/modules/highgui/src/cap_msmf.cpp +++ b/modules/highgui/src/cap_msmf.cpp @@ -38,20 +38,15 @@ // the use of this software, even if advised of the possibility of such damage. // //M*/ - #include "precomp.hpp" - #if (defined WIN32 || defined _WIN32) && defined HAVE_MSMF - /* Media Foundation-based Video Capturing module is based on videoInput library by Evgeny Pereguda: http://www.codeproject.com/Articles/559437/Capturing-of-video-from-web-camera-on-Windows-7-an - Originaly licensed under The Code Project Open License (CPOL) 1.02: http://www.codeproject.com/info/cpol10.aspx */ - #include #include #include @@ -59,32 +54,25 @@ #include #include #include "Strsafe.h" - #include #include #include #include - #include #include #include - #pragma warning(disable:4503) - #pragma comment(lib, "mfplat") #pragma comment(lib, "mf") #pragma comment(lib, "mfuuid") #pragma comment(lib, "Strmiids") #pragma comment(lib, "MinCore_Downlevel") - struct IMFMediaType; struct IMFActivate; struct IMFMediaSource; struct IMFAttributes; - namespace { - template void SafeRelease(T **ppT) { if (*ppT) @@ -93,7 +81,6 @@ template void SafeRelease(T **ppT) *ppT = NULL; } } - /// Class for printing info into consol class DebugPrintOut { @@ -103,72 +90,43 @@ public: void printOut(const wchar_t *format, ...); void setVerbose(bool state); bool verbose; - -private: - DebugPrintOut(void); +private: + DebugPrintOut(void); }; - // Structure for collecting info about types of video, which are supported by current video device struct MediaType { unsigned int MF_MT_FRAME_SIZE; - unsigned int height; - unsigned int width; - unsigned int MF_MT_YUV_MATRIX; - unsigned int MF_MT_VIDEO_LIGHTING; - unsigned int MF_MT_DEFAULT_STRIDE; - unsigned int MF_MT_VIDEO_CHROMA_SITING; - GUID MF_MT_AM_FORMAT_TYPE; - wchar_t *pMF_MT_AM_FORMAT_TYPEName; - unsigned int MF_MT_FIXED_SIZE_SAMPLES; - unsigned int MF_MT_VIDEO_NOMINAL_RANGE; - unsigned int MF_MT_FRAME_RATE; - unsigned int MF_MT_FRAME_RATE_low; - unsigned int MF_MT_PIXEL_ASPECT_RATIO; - unsigned int MF_MT_PIXEL_ASPECT_RATIO_low; - unsigned int MF_MT_ALL_SAMPLES_INDEPENDENT; - unsigned int MF_MT_FRAME_RATE_RANGE_MIN; - unsigned int MF_MT_FRAME_RATE_RANGE_MIN_low; - unsigned int MF_MT_SAMPLE_SIZE; - unsigned int MF_MT_VIDEO_PRIMARIES; - unsigned int MF_MT_INTERLACE_MODE; - unsigned int MF_MT_FRAME_RATE_RANGE_MAX; - unsigned int MF_MT_FRAME_RATE_RANGE_MAX_low; - GUID MF_MT_MAJOR_TYPE; - GUID MF_MT_SUBTYPE; - wchar_t *pMF_MT_MAJOR_TYPEName; wchar_t *pMF_MT_SUBTYPEName; - MediaType(); ~MediaType(); void Clear(); }; - /// Class for parsing info from IMFMediaType into the local MediaType class FormatReader { @@ -178,102 +136,71 @@ public: private: FormatReader(void); }; - DWORD WINAPI MainThreadFunction( LPVOID lpParam ); - typedef void(*emergensyStopEventCallback)(int, void *); - typedef unsigned char BYTE; - class RawImage { public: ~RawImage(void); // Function of creation of the instance of the class static long CreateInstance(RawImage **ppRImage,unsigned int size); - void setCopy(const BYTE * pSampleBuffer); void fastCopy(const BYTE * pSampleBuffer); unsigned char * getpPixels(); bool isNew(); unsigned int getSize(); - private: - bool ri_new; unsigned int ri_size; unsigned char *ri_pixels; RawImage(unsigned int size); }; - // Class for grabbing image from video stream class ImageGrabber : public IMFSampleGrabberSinkCallback { public: ~ImageGrabber(void); - HRESULT initImageGrabber(IMFMediaSource *pSource, GUID VideoFormat); - HRESULT startGrabbing(void); - void stopGrabbing(); - RawImage *getRawImage(); - // Function of creation of the instance of the class static HRESULT CreateInstance(ImageGrabber **ppIG,unsigned int deviceID); - private: - bool ig_RIE; - bool ig_Close; - long m_cRef; - unsigned int ig_DeviceID; - IMFMediaSource *ig_pSource; - IMFMediaSession *ig_pSession; - IMFTopology *ig_pTopology; - RawImage *ig_RIFirst; - RawImage *ig_RISecond; - RawImage *ig_RIOut; - ImageGrabber(unsigned int deviceID); - HRESULT CreateTopology(IMFMediaSource *pSource, IMFActivate *pSinkActivate, IMFTopology **ppTopo); - HRESULT AddSourceNode( - IMFTopology *pTopology, - IMFMediaSource *pSource, - IMFPresentationDescriptor *pPD, - IMFStreamDescriptor *pSD, + IMFTopology *pTopology, + IMFMediaSource *pSource, + IMFPresentationDescriptor *pPD, + IMFStreamDescriptor *pSD, IMFTopologyNode **ppNode); - HRESULT AddOutputNode( - IMFTopology *pTopology, - IMFActivate *pActivate, - DWORD dwId, + IMFTopology *pTopology, + IMFActivate *pActivate, + DWORD dwId, IMFTopologyNode **ppNode); - // IUnknown methods STDMETHODIMP QueryInterface(REFIID iid, void** ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); - // IMFClockStateSink methods STDMETHODIMP OnClockStart(MFTIME hnsSystemTime, LONGLONG llClockStartOffset); STDMETHODIMP OnClockStop(MFTIME hnsSystemTime); STDMETHODIMP OnClockPause(MFTIME hnsSystemTime); STDMETHODIMP OnClockRestart(MFTIME hnsSystemTime); STDMETHODIMP OnClockSetRate(MFTIME hnsSystemTime, float flRate); - // IMFSampleGrabberSinkCallback methods STDMETHODIMP OnSetPresentationClock(IMFPresentationClock* pClock); STDMETHODIMP OnProcessSample(REFGUID guidMajorMediaType, DWORD dwSampleFlags, @@ -281,66 +208,40 @@ private: DWORD dwSampleSize); STDMETHODIMP OnShutdown(); }; - /// Class for controlling of thread of the grabbing raw data from video device class ImageGrabberThread { friend DWORD WINAPI MainThreadFunction( LPVOID lpParam ); - public: ~ImageGrabberThread(void); - static HRESULT CreateInstance(ImageGrabberThread **ppIGT, IMFMediaSource *pSource, unsigned int deviceID); - void start(); - void stop(); - void setEmergencyStopEvent(void *userData, void(*func)(int, void *)); - ImageGrabber *getImageGrabber(); - protected: - virtual void run(); - private: - ImageGrabberThread(IMFMediaSource *pSource, unsigned int deviceID); - HANDLE igt_Handle; - DWORD igt_ThreadIdArray; - ImageGrabber *igt_pImageGrabber; - emergensyStopEventCallback igt_func; - void *igt_userData; - bool igt_stop; - unsigned int igt_DeviceID; }; - // Structure for collecting info about one parametr of current video device struct Parametr { long CurrentValue; - long Min; - long Max; - long Step; - long Default; - long Flag; - Parametr(); }; - // Structure for collecting info about 17 parametrs of current video device struct CamParametrs { @@ -354,7 +255,6 @@ struct CamParametrs Parametr WhiteBalance; Parametr BacklightCompensation; Parametr Gain; - Parametr Pan; Parametr Tilt; Parametr Roll; @@ -363,138 +263,77 @@ struct CamParametrs Parametr Iris; Parametr Focus; }; - typedef std::wstring String; - typedef std::vector vectorNum; - typedef std::map SUBTYPEMap; - typedef std::map FrameRateMap; - typedef void(*emergensyStopEventCallback)(int, void *); - /// Class for controlling of video device class videoDevice { - public: videoDevice(void); ~videoDevice(void); - void closeDevice(); - CamParametrs getParametrs(); - void setParametrs(CamParametrs parametrs); - void setEmergencyStopEvent(void *userData, void(*func)(int, void *)); - long readInfoOfDevice(IMFActivate *pActivate, unsigned int Num); - wchar_t *getName(); - int getCountFormats(); - unsigned int getWidth(); - unsigned int getHeight(); - MediaType getFormat(unsigned int id); - bool setupDevice(unsigned int w, unsigned int h, unsigned int idealFramerate = 0); - bool setupDevice(unsigned int id); - bool isDeviceSetup(); - bool isDeviceMediaSource(); - bool isDeviceRawDataSource(); - bool isFrameNew(); - IMFMediaSource *getMediaSource(); - RawImage *getRawImageOut(); - private: - enum typeLock { MediaSourceLock, - RawDataLock, - OpenLock - } vd_LockOut; - wchar_t *vd_pFriendlyName; - ImageGrabberThread *vd_pImGrTh; - CamParametrs vd_PrevParametrs; - unsigned int vd_Width; - unsigned int vd_Height; - unsigned int vd_CurrentNumber; - bool vd_IsSetuped; - std::map vd_CaptureFormats; - std::vector vd_CurrentFormats; - IMFMediaSource *vd_pSource; - emergensyStopEventCallback vd_func; - void *vd_userData; - long enumerateCaptureFormats(IMFMediaSource *pSource); - long setDeviceFormat(IMFMediaSource *pSource, unsigned long dwFormatIndex); - void buildLibraryofTypes(); - int findType(unsigned int size, unsigned int frameRate = 0); - long resetDevice(IMFActivate *pActivate); - long initDevice(); - long checkDevice(IMFAttributes *pAttributes, IMFActivate **pDevice); }; - - /// Class for managing of list of video devices class videoDevices { public: ~videoDevices(void); - long initDevices(IMFAttributes *pAttributes); - static videoDevices& getInstance(); - videoDevice *getDevice(unsigned int i); - unsigned int getCount(); - void clearDevices(); - private: - UINT32 count; - std::vector vds_Devices; - videoDevices(void); }; - // Class for creating of Media Foundation context class Media_Foundation { @@ -502,212 +341,146 @@ public: virtual ~Media_Foundation(void); static Media_Foundation& getInstance(); bool buildListOfDevices(); - private: Media_Foundation(void); - }; - /// The only visiable class for controlling of video devices in format singelton class videoInput { public: virtual ~videoInput(void); - // Getting of static instance of videoInput class static videoInput& getInstance(); - // Closing video device with deviceID void closeDevice(int deviceID); - // Setting callback function for emergency events(for example: removing video device with deviceID) with userData void setEmergencyStopEvent(int deviceID, void *userData, void(*func)(int, void *)); - // Closing all devices void closeAllDevices(); - // Getting of parametrs of video device with deviceID CamParametrs getParametrs(int deviceID); - // Setting of parametrs of video device with deviceID void setParametrs(int deviceID, CamParametrs parametrs); - // Getting numbers of existence videodevices with listing in consol unsigned int listDevices(bool silent = false); - // Getting numbers of formats, which are supported by videodevice with deviceID unsigned int getCountFormats(int deviceID); - // Getting width of image, which is getting from videodevice with deviceID unsigned int getWidth(int deviceID); - // Getting height of image, which is getting from videodevice with deviceID unsigned int getHeight(int deviceID); - // Getting name of videodevice with deviceID wchar_t *getNameVideoDevice(int deviceID); - // Getting interface MediaSource for Media Foundation from videodevice with deviceID IMFMediaSource *getMediaSource(int deviceID); - - // Getting format with id, which is supported by videodevice with deviceID + // Getting format with id, which is supported by videodevice with deviceID MediaType getFormat(int deviceID, int unsigned id); - // Checking of existence of the suitable video devices bool isDevicesAcceable(); - // Checking of using the videodevice with deviceID bool isDeviceSetup(int deviceID); - // Checking of using MediaSource from videodevice with deviceID bool isDeviceMediaSource(int deviceID); - // Checking of using Raw Data of pixels from videodevice with deviceID bool isDeviceRawDataSource(int deviceID); - // Setting of the state of outprinting info in console static void setVerbose(bool state); - // Initialization of video device with deviceID by media type with id bool setupDevice(int deviceID, unsigned int id = 0); - // Initialization of video device with deviceID by wisth w, height h and fps idealFramerate bool setupDevice(int deviceID, unsigned int w, unsigned int h, unsigned int idealFramerate = 30); - - // Checking of recivig of new frame from video device with deviceID + // Checking of recivig of new frame from video device with deviceID bool isFrameNew(int deviceID); - // Writing of Raw Data pixels from video device with deviceID with correction of RedAndBlue flipping flipRedAndBlue and vertical flipping flipImage bool getPixels(int deviceID, unsigned char * pixels, bool flipRedAndBlue = false, bool flipImage = false); - -private: - +private: bool accessToDevices; - videoInput(void); - void processPixels(unsigned char * src, unsigned char * dst, unsigned int width, unsigned int height, unsigned int bpp, bool bRGB, bool bFlip); - void updateListOfDevices(); }; - DebugPrintOut::DebugPrintOut(void):verbose(true) { } - DebugPrintOut::~DebugPrintOut(void) { } - DebugPrintOut& DebugPrintOut::getInstance() { static DebugPrintOut instance; - return instance; } - void DebugPrintOut::printOut(const wchar_t *format, ...) { if(verbose) { int i = 0; - wchar_t *p = NULL; - va_list args; - va_start(args, format); - if(wcscmp(format, L"%i")) { i = va_arg (args, int); } - if(wcscmp(format, L"%s")) { p = va_arg (args, wchar_t *); } - wprintf(format, i,p); - va_end (args); } } - void DebugPrintOut::setVerbose(bool state) { verbose = state; } - LPCWSTR GetGUIDNameConstNew(const GUID& guid); HRESULT GetGUIDNameNew(const GUID& guid, WCHAR **ppwsz); - HRESULT LogAttributeValueByIndexNew(IMFAttributes *pAttr, DWORD index); HRESULT SpecialCaseAttributeValueNew(GUID guid, const PROPVARIANT& var, MediaType &out); - unsigned int *GetParametr(GUID guid, MediaType &out) { - if(guid == MF_MT_YUV_MATRIX) + if(guid == MF_MT_YUV_MATRIX) return &(out.MF_MT_YUV_MATRIX); - - if(guid == MF_MT_VIDEO_LIGHTING) + if(guid == MF_MT_VIDEO_LIGHTING) return &(out.MF_MT_VIDEO_LIGHTING); - - if(guid == MF_MT_DEFAULT_STRIDE) + if(guid == MF_MT_DEFAULT_STRIDE) return &(out.MF_MT_DEFAULT_STRIDE); - - if(guid == MF_MT_VIDEO_CHROMA_SITING) + if(guid == MF_MT_VIDEO_CHROMA_SITING) return &(out.MF_MT_VIDEO_CHROMA_SITING); - - if(guid == MF_MT_VIDEO_NOMINAL_RANGE) + if(guid == MF_MT_VIDEO_NOMINAL_RANGE) return &(out.MF_MT_VIDEO_NOMINAL_RANGE); - - if(guid == MF_MT_ALL_SAMPLES_INDEPENDENT) + if(guid == MF_MT_ALL_SAMPLES_INDEPENDENT) return &(out.MF_MT_ALL_SAMPLES_INDEPENDENT); - - if(guid == MF_MT_FIXED_SIZE_SAMPLES) + if(guid == MF_MT_FIXED_SIZE_SAMPLES) return &(out.MF_MT_FIXED_SIZE_SAMPLES); - - if(guid == MF_MT_SAMPLE_SIZE) + if(guid == MF_MT_SAMPLE_SIZE) return &(out.MF_MT_SAMPLE_SIZE); - - if(guid == MF_MT_VIDEO_PRIMARIES) + if(guid == MF_MT_VIDEO_PRIMARIES) return &(out.MF_MT_VIDEO_PRIMARIES); - - if(guid == MF_MT_INTERLACE_MODE) + if(guid == MF_MT_INTERLACE_MODE) return &(out.MF_MT_INTERLACE_MODE); - return NULL; } - HRESULT LogAttributeValueByIndexNew(IMFAttributes *pAttr, DWORD index, MediaType &out) { WCHAR *pGuidName = NULL; WCHAR *pGuidValName = NULL; - GUID guid = { 0 }; - PROPVARIANT var; PropVariantInit(&var); - HRESULT hr = pAttr->GetItemByIndex(index, &guid, &var); - if (FAILED(hr)) { goto done; } - hr = GetGUIDNameNew(guid, &pGuidName); - if (FAILED(hr)) { goto done; } - hr = SpecialCaseAttributeValueNew(guid, var, out); - unsigned int *p; - if (FAILED(hr)) { goto done; @@ -717,118 +490,83 @@ HRESULT LogAttributeValueByIndexNew(IMFAttributes *pAttr, DWORD index, MediaType switch (var.vt) { case VT_UI4: - p = GetParametr(guid, out); - - if(p) + if(p) { *p = var.ulVal; } - break; - case VT_UI8: - break; - case VT_R8: - break; - case VT_CLSID: if(guid == MF_MT_AM_FORMAT_TYPE) { hr = GetGUIDNameNew(*var.puuid, &pGuidValName); - if (SUCCEEDED(hr)) { out.MF_MT_AM_FORMAT_TYPE = MF_MT_AM_FORMAT_TYPE; - out.pMF_MT_AM_FORMAT_TYPEName = pGuidValName; - pGuidValName = NULL; } } - if(guid == MF_MT_MAJOR_TYPE) { hr = GetGUIDNameNew(*var.puuid, &pGuidValName); - if (SUCCEEDED(hr)) { out.MF_MT_MAJOR_TYPE = MF_MT_MAJOR_TYPE; - out.pMF_MT_MAJOR_TYPEName = pGuidValName; - pGuidValName = NULL; } } - if(guid == MF_MT_SUBTYPE) { hr = GetGUIDNameNew(*var.puuid, &pGuidValName); - if (SUCCEEDED(hr)) { out.MF_MT_SUBTYPE = MF_MT_SUBTYPE; - out.pMF_MT_SUBTYPEName = pGuidValName; - pGuidValName = NULL; } } - break; - case VT_LPWSTR: - break; - case VT_VECTOR | VT_UI1: - break; - case VT_UNKNOWN: - break; - default: - break; } } - done: CoTaskMemFree(pGuidName); CoTaskMemFree(pGuidValName); PropVariantClear(&var); return hr; } - HRESULT GetGUIDNameNew(const GUID& guid, WCHAR **ppwsz) { HRESULT hr = S_OK; WCHAR *pName = NULL; - LPCWSTR pcwsz = GetGUIDNameConstNew(guid); if (pcwsz) { size_t cchLength = 0; - hr = StringCchLengthW(pcwsz, STRSAFE_MAX_CCH, &cchLength); if (FAILED(hr)) { goto done; } - pName = (WCHAR*)CoTaskMemAlloc((cchLength + 1) * sizeof(WCHAR)); - if (pName == NULL) { hr = E_OUTOFMEMORY; goto done; } - hr = StringCchCopyW(pName, cchLength + 1, pcwsz); if (FAILED(hr)) { @@ -839,7 +577,6 @@ HRESULT GetGUIDNameNew(const GUID& guid, WCHAR **ppwsz) { hr = StringFromCLSID(guid, &pName); } - done: if (FAILED(hr)) { @@ -852,97 +589,73 @@ done: } return hr; } - void LogUINT32AsUINT64New(const PROPVARIANT& var, UINT32 &uHigh, UINT32 &uLow) { Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow); - } - float OffsetToFloatNew(const MFOffset& offset) { return offset.value + (static_cast(offset.fract) / 65536.0f); } - HRESULT LogVideoAreaNew(const PROPVARIANT& var) { if (var.caub.cElems < sizeof(MFVideoArea)) { return S_OK; } - return S_OK; } - HRESULT SpecialCaseAttributeValueNew(GUID guid, const PROPVARIANT& var, MediaType &out) { if (guid == MF_MT_FRAME_SIZE) { UINT32 uHigh = 0, uLow = 0; - LogUINT32AsUINT64New(var, uHigh, uLow); - out.width = uHigh; - out.height = uLow; - out.MF_MT_FRAME_SIZE = out.width * out.height; } else if (guid == MF_MT_FRAME_RATE) { UINT32 uHigh = 0, uLow = 0; - LogUINT32AsUINT64New(var, uHigh, uLow); - out.MF_MT_FRAME_RATE = uHigh; - out.MF_MT_FRAME_RATE_low = uLow; } else if (guid == MF_MT_FRAME_RATE_RANGE_MAX) { UINT32 uHigh = 0, uLow = 0; - LogUINT32AsUINT64New(var, uHigh, uLow); - out.MF_MT_FRAME_RATE_RANGE_MAX = uHigh; - out.MF_MT_FRAME_RATE_RANGE_MAX_low = uLow; } else if (guid == MF_MT_FRAME_RATE_RANGE_MIN) { UINT32 uHigh = 0, uLow = 0; - LogUINT32AsUINT64New(var, uHigh, uLow); - out.MF_MT_FRAME_RATE_RANGE_MIN = uHigh; - out.MF_MT_FRAME_RATE_RANGE_MIN_low = uLow; } else if (guid == MF_MT_PIXEL_ASPECT_RATIO) { UINT32 uHigh = 0, uLow = 0; - LogUINT32AsUINT64New(var, uHigh, uLow); - out.MF_MT_PIXEL_ASPECT_RATIO = uHigh; - out.MF_MT_PIXEL_ASPECT_RATIO_low = uLow; - } + } else { return S_FALSE; } return S_OK; } - #ifndef IF_EQUAL_RETURN #define IF_EQUAL_RETURN(param, val) if(val == param) return L#val #endif - LPCWSTR GetGUIDNameConstNew(const GUID& guid) { IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE); @@ -1010,14 +723,12 @@ LPCWSTR GetGUIDNameConstNew(const GUID& guid) IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_CTRL_PACK); IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_HEADER); IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_FORMAT); - IF_EQUAL_RETURN(guid, MF_MT_IMAGE_LOSS_TOLERANT); + IF_EQUAL_RETURN(guid, MF_MT_IMAGE_LOSS_TOLERANT); IF_EQUAL_RETURN(guid, MF_MT_MPEG4_SAMPLE_DESCRIPTION); IF_EQUAL_RETURN(guid, MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY); - IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_4CC); + IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_4CC); IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_WAVE_FORMAT_TAG); - // Media types - IF_EQUAL_RETURN(guid, MFMediaType_Audio); IF_EQUAL_RETURN(guid, MFMediaType_Video); IF_EQUAL_RETURN(guid, MFMediaType_Protected); @@ -1027,9 +738,8 @@ LPCWSTR GetGUIDNameConstNew(const GUID& guid) IF_EQUAL_RETURN(guid, MFMediaType_HTML); IF_EQUAL_RETURN(guid, MFMediaType_Binary); IF_EQUAL_RETURN(guid, MFMediaType_FileTransfer); - IF_EQUAL_RETURN(guid, MFVideoFormat_AI44); // FCC('AI44') - IF_EQUAL_RETURN(guid, MFVideoFormat_ARGB32); // D3DFMT_A8R8G8B8 + IF_EQUAL_RETURN(guid, MFVideoFormat_ARGB32); // D3DFMT_A8R8G8B8 IF_EQUAL_RETURN(guid, MFVideoFormat_AYUV); // FCC('AYUV') IF_EQUAL_RETURN(guid, MFVideoFormat_DV25); // FCC('dv25') IF_EQUAL_RETURN(guid, MFVideoFormat_DV50); // FCC('dv50') @@ -1053,10 +763,10 @@ LPCWSTR GetGUIDNameConstNew(const GUID& guid) IF_EQUAL_RETURN(guid, MFVideoFormat_P016); // FCC('P016') IF_EQUAL_RETURN(guid, MFVideoFormat_P210); // FCC('P210') IF_EQUAL_RETURN(guid, MFVideoFormat_P216); // FCC('P216') - IF_EQUAL_RETURN(guid, MFVideoFormat_RGB24); // D3DFMT_R8G8B8 - IF_EQUAL_RETURN(guid, MFVideoFormat_RGB32); // D3DFMT_X8R8G8B8 - IF_EQUAL_RETURN(guid, MFVideoFormat_RGB555); // D3DFMT_X1R5G5B5 - IF_EQUAL_RETURN(guid, MFVideoFormat_RGB565); // D3DFMT_R5G6B5 + IF_EQUAL_RETURN(guid, MFVideoFormat_RGB24); // D3DFMT_R8G8B8 + IF_EQUAL_RETURN(guid, MFVideoFormat_RGB32); // D3DFMT_X8R8G8B8 + IF_EQUAL_RETURN(guid, MFVideoFormat_RGB555); // D3DFMT_X1R5G5B5 + IF_EQUAL_RETURN(guid, MFVideoFormat_RGB565); // D3DFMT_R5G6B5 IF_EQUAL_RETURN(guid, MFVideoFormat_RGB8); IF_EQUAL_RETURN(guid, MFVideoFormat_UYVY); // FCC('UYVY') IF_EQUAL_RETURN(guid, MFVideoFormat_v210); // FCC('v210') @@ -1074,162 +784,118 @@ LPCWSTR GetGUIDNameConstNew(const GUID& guid) IF_EQUAL_RETURN(guid, MFVideoFormat_YUY2); // FCC('YUY2') IF_EQUAL_RETURN(guid, MFVideoFormat_YV12); // FCC('YV12') IF_EQUAL_RETURN(guid, MFVideoFormat_YVYU); - - IF_EQUAL_RETURN(guid, MFAudioFormat_PCM); // WAVE_FORMAT_PCM - IF_EQUAL_RETURN(guid, MFAudioFormat_Float); // WAVE_FORMAT_IEEE_FLOAT - IF_EQUAL_RETURN(guid, MFAudioFormat_DTS); // WAVE_FORMAT_DTS - IF_EQUAL_RETURN(guid, MFAudioFormat_Dolby_AC3_SPDIF); // WAVE_FORMAT_DOLBY_AC3_SPDIF - IF_EQUAL_RETURN(guid, MFAudioFormat_DRM); // WAVE_FORMAT_DRM - IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV8); // WAVE_FORMAT_WMAUDIO2 - IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV9); // WAVE_FORMAT_WMAUDIO3 - IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudio_Lossless); // WAVE_FORMAT_WMAUDIO_LOSSLESS - IF_EQUAL_RETURN(guid, MFAudioFormat_WMASPDIF); // WAVE_FORMAT_WMASPDIF - IF_EQUAL_RETURN(guid, MFAudioFormat_MSP1); // WAVE_FORMAT_WMAVOICE9 - IF_EQUAL_RETURN(guid, MFAudioFormat_MP3); // WAVE_FORMAT_MPEGLAYER3 - IF_EQUAL_RETURN(guid, MFAudioFormat_MPEG); // WAVE_FORMAT_MPEG - IF_EQUAL_RETURN(guid, MFAudioFormat_AAC); // WAVE_FORMAT_MPEG_HEAAC - IF_EQUAL_RETURN(guid, MFAudioFormat_ADTS); // WAVE_FORMAT_MPEG_ADTS_AAC - + IF_EQUAL_RETURN(guid, MFAudioFormat_PCM); // WAVE_FORMAT_PCM + IF_EQUAL_RETURN(guid, MFAudioFormat_Float); // WAVE_FORMAT_IEEE_FLOAT + IF_EQUAL_RETURN(guid, MFAudioFormat_DTS); // WAVE_FORMAT_DTS + IF_EQUAL_RETURN(guid, MFAudioFormat_Dolby_AC3_SPDIF); // WAVE_FORMAT_DOLBY_AC3_SPDIF + IF_EQUAL_RETURN(guid, MFAudioFormat_DRM); // WAVE_FORMAT_DRM + IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV8); // WAVE_FORMAT_WMAUDIO2 + IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV9); // WAVE_FORMAT_WMAUDIO3 + IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudio_Lossless); // WAVE_FORMAT_WMAUDIO_LOSSLESS + IF_EQUAL_RETURN(guid, MFAudioFormat_WMASPDIF); // WAVE_FORMAT_WMASPDIF + IF_EQUAL_RETURN(guid, MFAudioFormat_MSP1); // WAVE_FORMAT_WMAVOICE9 + IF_EQUAL_RETURN(guid, MFAudioFormat_MP3); // WAVE_FORMAT_MPEGLAYER3 + IF_EQUAL_RETURN(guid, MFAudioFormat_MPEG); // WAVE_FORMAT_MPEG + IF_EQUAL_RETURN(guid, MFAudioFormat_AAC); // WAVE_FORMAT_MPEG_HEAAC + IF_EQUAL_RETURN(guid, MFAudioFormat_ADTS); // WAVE_FORMAT_MPEG_ADTS_AAC return NULL; } - FormatReader::FormatReader(void) { } - MediaType FormatReader::Read(IMFMediaType *pType) { UINT32 count = 0; - HRESULT hr = S_OK; - MediaType out; - hr = pType->LockStore(); - if (FAILED(hr)) { return out; } - hr = pType->GetCount(&count); - if (FAILED(hr)) { return out; } - for (UINT32 i = 0; i < count; i++) { hr = LogAttributeValueByIndexNew(pType, i, out); - if (FAILED(hr)) { break; } } - hr = pType->UnlockStore(); - if (FAILED(hr)) { return out; } - return out; } - FormatReader::~FormatReader(void) { } - #define CHECK_HR(x) if (FAILED(x)) { goto done; } - ImageGrabber::ImageGrabber(unsigned int deviceID): m_cRef(1), ig_DeviceID(deviceID), ig_pSource(NULL), ig_pSession(NULL), ig_pTopology(NULL), ig_RIE(true), ig_Close(false) { } - - ImageGrabber::~ImageGrabber(void) { if (ig_pSession) { ig_pSession->Shutdown(); } - //SafeRelease(&ig_pSession); - //SafeRelease(&ig_pTopology); - DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Destroing instance of the ImageGrabber class \n", ig_DeviceID); - } - HRESULT ImageGrabber::initImageGrabber(IMFMediaSource *pSource, GUID VideoFormat) { IMFActivate *pSinkActivate = NULL; IMFMediaType *pType = NULL; - IMFPresentationDescriptor *pPD = NULL; IMFStreamDescriptor *pSD = NULL; IMFMediaTypeHandler *pHandler = NULL; IMFMediaType *pCurrentType = NULL; - HRESULT hr = S_OK; MediaType MT; - // Clean up. if (ig_pSession) { ig_pSession->Shutdown(); } - SafeRelease(&ig_pSession); SafeRelease(&ig_pTopology); - ig_pSource = pSource; - - - - hr = pSource->CreatePresentationDescriptor(&pPD); if (FAILED(hr)) goto err; - BOOL fSelected; hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD); if (FAILED(hr)) goto err; - hr = pSD->GetMediaTypeHandler(&pHandler); if (FAILED(hr)) goto err; - DWORD cTypes = 0; hr = pHandler->GetMediaTypeCount(&cTypes); if (FAILED(hr)) goto err; - if(cTypes > 0) { hr = pHandler->GetCurrentMediaType(&pCurrentType); - if (FAILED(hr)) goto err; - MT = FormatReader::Read(pCurrentType); } - err: SafeRelease(&pPD); SafeRelease(&pSD); SafeRelease(&pHandler); SafeRelease(&pCurrentType); - unsigned int sizeRawImage = 0; - if(VideoFormat == MFVideoFormat_RGB24) { sizeRawImage = MT.MF_MT_FRAME_SIZE * 3; @@ -1238,151 +904,103 @@ err: { sizeRawImage = MT.MF_MT_FRAME_SIZE * 4; } - CHECK_HR(hr = RawImage::CreateInstance(&ig_RIFirst, sizeRawImage)); - CHECK_HR(hr = RawImage::CreateInstance(&ig_RISecond, sizeRawImage)); - ig_RIOut = ig_RISecond; - - // Configure the media type that the Sample Grabber will receive. // Setting the major and subtype is usually enough for the topology loader // to resolve the topology. - CHECK_HR(hr = MFCreateMediaType(&pType)); CHECK_HR(hr = pType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); CHECK_HR(hr = pType->SetGUID(MF_MT_SUBTYPE, VideoFormat)); - // Create the sample grabber sink. CHECK_HR(hr = MFCreateSampleGrabberSinkActivate(pType, this, &pSinkActivate)); - // To run as fast as possible, set this attribute (requires Windows 7): CHECK_HR(hr = pSinkActivate->SetUINT32(MF_SAMPLEGRABBERSINK_IGNORE_CLOCK, TRUE)); - // Create the Media Session. - CHECK_HR(hr = MFCreateMediaSession(NULL, &ig_pSession)); - // Create the topology. CHECK_HR(hr = CreateTopology(pSource, pSinkActivate, &ig_pTopology)); - done: - // Clean up. if (FAILED(hr)) - { + { if (ig_pSession) { ig_pSession->Shutdown(); } - SafeRelease(&ig_pSession); SafeRelease(&ig_pTopology); } - SafeRelease(&pSinkActivate); SafeRelease(&pType); - return hr; } - void ImageGrabber::stopGrabbing() { if(ig_pSession) ig_pSession->Stop(); - - - DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Stopping of of grabbing of images\n", ig_DeviceID); } - HRESULT ImageGrabber::startGrabbing(void) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - IMFMediaEvent *pEvent = NULL; - PROPVARIANT var; PropVariantInit(&var); - HRESULT hr = S_OK; CHECK_HR(hr = ig_pSession->SetTopology(0, ig_pTopology)); CHECK_HR(hr = ig_pSession->Start(&GUID_NULL, &var)); - DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Start Grabbing of the images\n", ig_DeviceID); - for(;;) { - HRESULT hrStatus = S_OK; MediaEventType met; - if(!ig_pSession) break; hr = ig_pSession->GetEvent(0, &pEvent); if(!SUCCEEDED(hr)) { hr = S_OK; - goto done; } - hr = pEvent->GetStatus(&hrStatus); if(!SUCCEEDED(hr)) { hr = S_OK; - goto done; } - hr = pEvent->GetType(&met); if(!SUCCEEDED(hr)) { hr = S_OK; - goto done; } - if (met == MESessionEnded) - { + { DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: MESessionEnded \n", ig_DeviceID); - ig_pSession->Stop(); - break; } - if (met == MESessionStopped) { DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: MESessionStopped \n", ig_DeviceID); - break; } - - if (met == MEVideoCaptureDeviceRemoved) { DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: MEVideoCaptureDeviceRemoved \n", ig_DeviceID); - - break; + break; } - SafeRelease(&pEvent); } - DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Finish startGrabbing \n", ig_DeviceID); - done: SafeRelease(&pEvent); - SafeRelease(&ig_pSession); - SafeRelease(&ig_pTopology); return hr; } - HRESULT ImageGrabber::CreateTopology(IMFMediaSource *pSource, IMFActivate *pSinkActivate, IMFTopology **ppTopo) { IMFTopology *pTopology = NULL; @@ -1391,25 +1009,19 @@ HRESULT ImageGrabber::CreateTopology(IMFMediaSource *pSource, IMFActivate *pSink IMFMediaTypeHandler *pHandler = NULL; IMFTopologyNode *pNode1 = NULL; IMFTopologyNode *pNode2 = NULL; - HRESULT hr = S_OK; DWORD cStreams = 0; - CHECK_HR(hr = MFCreateTopology(&pTopology)); CHECK_HR(hr = pSource->CreatePresentationDescriptor(&pPD)); CHECK_HR(hr = pPD->GetStreamDescriptorCount(&cStreams)); - for (DWORD i = 0; i < cStreams; i++) { // In this example, we look for audio streams and connect them to the sink. - BOOL fSelected = FALSE; GUID majorType; - CHECK_HR(hr = pPD->GetStreamDescriptorByIndex(i, &fSelected, &pSD)); CHECK_HR(hr = pSD->GetMediaTypeHandler(&pHandler)); CHECK_HR(hr = pHandler->GetMajorType(&majorType)); - if (majorType == MFMediaType_Video && fSelected) { CHECK_HR(hr = AddSourceNode(pTopology, pSource, pPD, pSD, &pNode1)); @@ -1424,10 +1036,8 @@ HRESULT ImageGrabber::CreateTopology(IMFMediaSource *pSource, IMFActivate *pSink SafeRelease(&pSD); SafeRelease(&pHandler); } - *ppTopo = pTopology; (*ppTopo)->AddRef(); - done: SafeRelease(&pTopology); SafeRelease(&pNode1); @@ -1437,7 +1047,6 @@ done: SafeRelease(&pHandler); return hr; } - HRESULT ImageGrabber::AddSourceNode( IMFTopology *pTopology, // Topology. IMFMediaSource *pSource, // Media source. @@ -1446,23 +1055,19 @@ HRESULT ImageGrabber::AddSourceNode( IMFTopologyNode **ppNode) // Receives the node pointer. { IMFTopologyNode *pNode = NULL; - HRESULT hr = S_OK; CHECK_HR(hr = MFCreateTopologyNode(MF_TOPOLOGY_SOURCESTREAM_NODE, &pNode)); CHECK_HR(hr = pNode->SetUnknown(MF_TOPONODE_SOURCE, pSource)); CHECK_HR(hr = pNode->SetUnknown(MF_TOPONODE_PRESENTATION_DESCRIPTOR, pPD)); CHECK_HR(hr = pNode->SetUnknown(MF_TOPONODE_STREAM_DESCRIPTOR, pSD)); CHECK_HR(hr = pTopology->AddNode(pNode)); - // Return the pointer to the caller. *ppNode = pNode; (*ppNode)->AddRef(); - done: SafeRelease(&pNode); return hr; } - HRESULT ImageGrabber::AddOutputNode( IMFTopology *pTopology, // Topology. IMFActivate *pActivate, // Media sink activation object. @@ -1470,71 +1075,54 @@ HRESULT ImageGrabber::AddOutputNode( IMFTopologyNode **ppNode) // Receives the node pointer. { IMFTopologyNode *pNode = NULL; - HRESULT hr = S_OK; CHECK_HR(hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pNode)); CHECK_HR(hr = pNode->SetObject(pActivate)); CHECK_HR(hr = pNode->SetUINT32(MF_TOPONODE_STREAMID, dwId)); CHECK_HR(hr = pNode->SetUINT32(MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, FALSE)); CHECK_HR(hr = pTopology->AddNode(pNode)); - // Return the pointer to the caller. *ppNode = pNode; (*ppNode)->AddRef(); - done: SafeRelease(&pNode); return hr; } - - - HRESULT ImageGrabber::CreateInstance(ImageGrabber **ppIG, unsigned int deviceID) { *ppIG = new (std::nothrow) ImageGrabber(deviceID); - if (ppIG == NULL) { return E_OUTOFMEMORY; } - DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Creating instance of ImageGrabber\n", deviceID); - return S_OK; } - STDMETHODIMP ImageGrabber::QueryInterface(REFIID riid, void** ppv) { HRESULT hr = E_NOINTERFACE; *ppv = NULL; - if(riid == IID_IUnknown || riid == IID_IMFSampleGrabberSinkCallback) { *ppv = static_cast(this); hr = S_OK; } - if(riid == IID_IMFClockStateSink) { *ppv = static_cast(this); hr = S_OK; } - if(SUCCEEDED(hr)) { reinterpret_cast(*ppv)->AddRef(); } - return hr; } - STDMETHODIMP_(ULONG) ImageGrabber::AddRef() { return InterlockedIncrement(&m_cRef); } - STDMETHODIMP_(ULONG) ImageGrabber::Release() { ULONG cRef = InterlockedDecrement(&m_cRef); @@ -1544,45 +1132,38 @@ STDMETHODIMP_(ULONG) ImageGrabber::Release() } return cRef; } - STDMETHODIMP ImageGrabber::OnClockStart(MFTIME hnsSystemTime, LONGLONG llClockStartOffset) { (void)hnsSystemTime; (void)llClockStartOffset; return S_OK; } - STDMETHODIMP ImageGrabber::OnClockStop(MFTIME hnsSystemTime) { (void)hnsSystemTime; return S_OK; } - STDMETHODIMP ImageGrabber::OnClockPause(MFTIME hnsSystemTime) { (void)hnsSystemTime; return S_OK; } - STDMETHODIMP ImageGrabber::OnClockRestart(MFTIME hnsSystemTime) { (void)hnsSystemTime; return S_OK; } - STDMETHODIMP ImageGrabber::OnClockSetRate(MFTIME hnsSystemTime, float flRate) { (void)flRate; (void)hnsSystemTime; return S_OK; } - STDMETHODIMP ImageGrabber::OnSetPresentationClock(IMFPresentationClock* pClock) { (void)pClock; return S_OK; } - STDMETHODIMP ImageGrabber::OnProcessSample(REFGUID guidMajorMediaType, DWORD dwSampleFlags, LONGLONG llSampleTime, LONGLONG llSampleDuration, const BYTE * pSampleBuffer, DWORD dwSampleSize) @@ -1592,74 +1173,54 @@ STDMETHODIMP ImageGrabber::OnProcessSample(REFGUID guidMajorMediaType, DWORD dwS (void)dwSampleFlags; (void)llSampleDuration; (void)dwSampleSize; - if(ig_RIE) { ig_RIFirst->fastCopy(pSampleBuffer); - ig_RIOut = ig_RIFirst; } else { ig_RISecond->fastCopy(pSampleBuffer); - ig_RIOut = ig_RISecond; } - ig_RIE = !ig_RIE; - return S_OK; } - STDMETHODIMP ImageGrabber::OnShutdown() { return S_OK; } - RawImage *ImageGrabber::getRawImage() { return ig_RIOut; } - DWORD WINAPI MainThreadFunction( LPVOID lpParam ) { ImageGrabberThread *pIGT = (ImageGrabberThread *)lpParam; - pIGT->run(); - - return 0; + return 0; } - HRESULT ImageGrabberThread::CreateInstance(ImageGrabberThread **ppIGT, IMFMediaSource *pSource, unsigned int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - *ppIGT = new (std::nothrow) ImageGrabberThread(pSource, deviceID); - if (ppIGT == NULL) { DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Memory cannot be allocated\n", deviceID); - return E_OUTOFMEMORY; } else DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Creating of the instance of ImageGrabberThread\n", deviceID); - return S_OK; } - ImageGrabberThread::ImageGrabberThread(IMFMediaSource *pSource, unsigned int deviceID): igt_Handle(NULL), igt_stop(false) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - HRESULT hr = ImageGrabber::CreateInstance(&igt_pImageGrabber, deviceID); - igt_DeviceID = deviceID; - if(SUCCEEDED(hr)) { hr = igt_pImageGrabber->initImageGrabber(pSource, MFVideoFormat_RGB24); - if(!SUCCEEDED(hr)) { DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: There is a problem with initialization of the instance of the ImageGrabber class\n", deviceID); @@ -1674,73 +1235,57 @@ ImageGrabberThread::ImageGrabberThread(IMFMediaSource *pSource, unsigned int dev DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i There is a problem with creation of the instance of the ImageGrabber class\n", deviceID); } } - void ImageGrabberThread::setEmergencyStopEvent(void *userData, void(*func)(int, void *)) { if(func) { igt_func = func; - igt_userData = userData; } } - ImageGrabberThread::~ImageGrabberThread(void) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Destroing ImageGrabberThread\n", igt_DeviceID); - delete igt_pImageGrabber; } - void ImageGrabberThread::stop() { igt_stop = true; - if(igt_pImageGrabber) { igt_pImageGrabber->stopGrabbing(); } } - void ImageGrabberThread::start() { - igt_Handle = CreateThread( + igt_Handle = CreateThread( NULL, // default security attributes - 0, // use default stack size + 0, // use default stack size MainThreadFunction, // thread function name - this, // argument to thread function - 0, // use default creation flags - &igt_ThreadIdArray); // returns the thread identifier + this, // argument to thread function + 0, // use default creation flags + &igt_ThreadIdArray); // returns the thread identifier } - void ImageGrabberThread::run() { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if(igt_pImageGrabber) { DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Thread for grabbing images is started\n", igt_DeviceID); - HRESULT hr = igt_pImageGrabber->startGrabbing(); - - if(!SUCCEEDED(hr)) + if(!SUCCEEDED(hr)) { DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: There is a problem with starting the process of grabbing\n", igt_DeviceID); } - } else { DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i The thread is finished without execution of grabbing\n", igt_DeviceID); } - - if(!igt_stop) { DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Emergency Stop thread\n", igt_DeviceID); - if(igt_func) { igt_func(igt_DeviceID, igt_userData); @@ -1749,46 +1294,34 @@ void ImageGrabberThread::run() else DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Finish thread\n", igt_DeviceID); } - ImageGrabber *ImageGrabberThread::getImageGrabber() { return igt_pImageGrabber; } - Media_Foundation::Media_Foundation(void) { HRESULT hr = MFStartup(MF_VERSION); - if(!SUCCEEDED(hr)) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"MEDIA FOUNDATION: It cannot be created!!!\n"); } } - Media_Foundation::~Media_Foundation(void) { HRESULT hr = MFShutdown(); - if(!SUCCEEDED(hr)) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"MEDIA FOUNDATION: Resources cannot be released\n"); } } - bool Media_Foundation::buildListOfDevices() { HRESULT hr = S_OK; - IMFAttributes *pAttributes = NULL; - CoInitialize(NULL); - hr = MFCreateAttributes(&pAttributes, 1); - if (SUCCEEDED(hr)) { hr = pAttributes->SetGUID( @@ -1796,7 +1329,6 @@ bool Media_Foundation::buildListOfDevices() MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID ); } - if (SUCCEEDED(hr)) { videoDevices *vDs = &videoDevices::getInstance(); @@ -1807,80 +1339,61 @@ bool Media_Foundation::buildListOfDevices() DebugPrintOut *DPO = &DebugPrintOut::getInstance(); DPO->printOut(L"MEDIA FOUNDATION: The access to the video cameras denied\n"); } - SafeRelease(&pAttributes); - return (SUCCEEDED(hr)); } - Media_Foundation& Media_Foundation::getInstance() { static Media_Foundation instance; - return instance; } - RawImage::RawImage(unsigned int size): ri_new(false), ri_pixels(NULL) { ri_size = size; - ri_pixels = new unsigned char[size]; - memset((void *)ri_pixels,0,ri_size); } - bool RawImage::isNew() { return ri_new; } - unsigned int RawImage::getSize() { return ri_size; } - RawImage::~RawImage(void) { delete []ri_pixels; - ri_pixels = NULL; } - long RawImage::CreateInstance(RawImage **ppRImage,unsigned int size) { *ppRImage = new (std::nothrow) RawImage(size); - if (ppRImage == NULL) { return E_OUTOFMEMORY; } return S_OK; } - void RawImage::setCopy(const BYTE * pSampleBuffer) { memcpy(ri_pixels, pSampleBuffer, ri_size); - ri_new = true; } - void RawImage::fastCopy(const BYTE * pSampleBuffer) { memcpy(ri_pixels, pSampleBuffer, ri_size); ri_new = true; } - unsigned char * RawImage::getpPixels() { ri_new = false; return ri_pixels; } - videoDevice::videoDevice(void): vd_IsSetuped(false), vd_LockOut(OpenLock), vd_pFriendlyName(NULL), vd_Width(0), vd_Height(0), vd_pSource(NULL), vd_func(NULL), vd_userData(NULL) { } - void videoDevice::setParametrs(CamParametrs parametrs) { if(vd_IsSetuped) @@ -1888,198 +1401,145 @@ void videoDevice::setParametrs(CamParametrs parametrs) if(vd_pSource) { Parametr *pParametr = (Parametr *)(¶metrs); - Parametr *pPrevParametr = (Parametr *)(&vd_PrevParametrs); - IAMVideoProcAmp *pProcAmp = NULL; HRESULT hr = vd_pSource->QueryInterface(IID_PPV_ARGS(&pProcAmp)); - if (SUCCEEDED(hr)) { for(unsigned int i = 0; i < 10; i++) { if(pPrevParametr[i].CurrentValue != pParametr[i].CurrentValue || pPrevParametr[i].Flag != pParametr[i].Flag) hr = pProcAmp->Set(VideoProcAmp_Brightness + i, pParametr[i].CurrentValue, pParametr[i].Flag); - } - pProcAmp->Release(); } - IAMCameraControl *pProcControl = NULL; hr = vd_pSource->QueryInterface(IID_PPV_ARGS(&pProcControl)); - if (SUCCEEDED(hr)) { for(unsigned int i = 0; i < 7; i++) { if(pPrevParametr[10 + i].CurrentValue != pParametr[10 + i].CurrentValue || pPrevParametr[10 + i].Flag != pParametr[10 + i].Flag) - hr = pProcControl->Set(CameraControl_Pan+i, pParametr[10 + i].CurrentValue, pParametr[10 + i].Flag); + hr = pProcControl->Set(CameraControl_Pan+i, pParametr[10 + i].CurrentValue, pParametr[10 + i].Flag); } - pProcControl->Release(); } - vd_PrevParametrs = parametrs; } } } - CamParametrs videoDevice::getParametrs() { CamParametrs out; - if(vd_IsSetuped) { if(vd_pSource) { Parametr *pParametr = (Parametr *)(&out); - IAMVideoProcAmp *pProcAmp = NULL; HRESULT hr = vd_pSource->QueryInterface(IID_PPV_ARGS(&pProcAmp)); - if (SUCCEEDED(hr)) { for(unsigned int i = 0; i < 10; i++) { Parametr temp; - hr = pProcAmp->GetRange(VideoProcAmp_Brightness+i, &temp.Min, &temp.Max, &temp.Step, &temp.Default, &temp.Flag); - if (SUCCEEDED(hr)) { temp.CurrentValue = temp.Default; - pParametr[i] = temp; } } - pProcAmp->Release(); } - IAMCameraControl *pProcControl = NULL; hr = vd_pSource->QueryInterface(IID_PPV_ARGS(&pProcControl)); - if (SUCCEEDED(hr)) { for(unsigned int i = 0; i < 7; i++) { Parametr temp; - hr = pProcControl->GetRange(CameraControl_Pan+i, &temp.Min, &temp.Max, &temp.Step, &temp.Default, &temp.Flag); - if (SUCCEEDED(hr)) { temp.CurrentValue = temp.Default; - pParametr[10 + i] = temp; } } - pProcControl->Release(); } } } - return out; } - long videoDevice::resetDevice(IMFActivate *pActivate) { HRESULT hr = -1; - vd_CurrentFormats.clear(); - if(vd_pFriendlyName) CoTaskMemFree(vd_pFriendlyName); - vd_pFriendlyName = NULL; - if(pActivate) - { + { IMFMediaSource *pSource = NULL; - hr = pActivate->GetAllocatedString( MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &vd_pFriendlyName, NULL ); - hr = pActivate->ActivateObject( __uuidof(IMFMediaSource), (void**)&pSource ); - enumerateCaptureFormats(pSource); - buildLibraryofTypes(); - SafeRelease(&pSource); - - if(FAILED(hr)) - { + if(FAILED(hr)) + { vd_pFriendlyName = NULL; - DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"VIDEODEVICE %i: IMFMediaSource interface cannot be created \n", vd_CurrentNumber); } } - return hr; } - long videoDevice::readInfoOfDevice(IMFActivate *pActivate, unsigned int Num) { HRESULT hr = -1; - vd_CurrentNumber = Num; - hr = resetDevice(pActivate); - return hr; } - long videoDevice::checkDevice(IMFAttributes *pAttributes, IMFActivate **pDevice) { HRESULT hr = S_OK; - IMFActivate **ppDevices = NULL; - DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - UINT32 count; - wchar_t *newFriendlyName = NULL; - hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count); - if (SUCCEEDED(hr)) { if(count > 0) { if(count > vd_CurrentNumber) - { + { hr = ppDevices[vd_CurrentNumber]->GetAllocatedString( MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &newFriendlyName, NULL ); - if (SUCCEEDED(hr)) { if(wcscmp(newFriendlyName, vd_pFriendlyName) != 0) { DPO->printOut(L"VIDEODEVICE %i: Chosen device cannot be found \n", vd_CurrentNumber); - hr = -1; - pDevice = NULL; } else { *pDevice = ppDevices[vd_CurrentNumber]; - (*pDevice)->AddRef(); } } @@ -2087,20 +1547,16 @@ long videoDevice::checkDevice(IMFAttributes *pAttributes, IMFActivate **pDevice) { DPO->printOut(L"VIDEODEVICE %i: Name of device cannot be gotten \n", vd_CurrentNumber); } - } else { DPO->printOut(L"VIDEODEVICE %i: Number of devices more than corrent number of the device \n", vd_CurrentNumber); - hr = -1; } - for(UINT32 i = 0; i < count; i++) { SafeRelease(&ppDevices[i]); } - SafeRelease(ppDevices); } else @@ -2110,69 +1566,50 @@ long videoDevice::checkDevice(IMFAttributes *pAttributes, IMFActivate **pDevice) { DPO->printOut(L"VIDEODEVICE %i: List of DeviceSources cannot be enumerated \n", vd_CurrentNumber); } - return hr; } - long videoDevice::initDevice() { HRESULT hr = -1; - IMFAttributes *pAttributes = NULL; - IMFActivate * vd_pActivate= NULL; - DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - CoInitialize(NULL); - hr = MFCreateAttributes(&pAttributes, 1); - if (SUCCEEDED(hr)) { hr = pAttributes->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID ); - } - + } if (SUCCEEDED(hr)) { hr = checkDevice(pAttributes, &vd_pActivate); - if (SUCCEEDED(hr) && vd_pActivate) { SafeRelease(&vd_pSource); - hr = vd_pActivate->ActivateObject( __uuidof(IMFMediaSource), (void**)&vd_pSource ); - if (SUCCEEDED(hr)) { - } - SafeRelease(&vd_pActivate); } else { DPO->printOut(L"VIDEODEVICE %i: Device there is not \n", vd_CurrentNumber); } - } + } else { - DPO->printOut(L"VIDEODEVICE %i: The attribute of video cameras cannot be getting \n", vd_CurrentNumber); - } - SafeRelease(&pAttributes); - return hr; } - MediaType videoDevice::getFormat(unsigned int id) { if(id < vd_CurrentFormats.size()) @@ -2180,49 +1617,35 @@ MediaType videoDevice::getFormat(unsigned int id) return vd_CurrentFormats[id]; } else return MediaType(); - } - int videoDevice::getCountFormats() { return vd_CurrentFormats.size(); } - void videoDevice::setEmergencyStopEvent(void *userData, void(*func)(int, void *)) { vd_func = func; - vd_userData = userData; } - void videoDevice::closeDevice() -{ +{ if(vd_IsSetuped) { vd_IsSetuped = false; - vd_pSource->Stop(); - SafeRelease(&vd_pSource); - if(vd_LockOut == RawDataLock) { vd_pImGrTh->stop(); - Sleep(500); - delete vd_pImGrTh; } - vd_pImGrTh = NULL; - - vd_LockOut = OpenLock; - + vd_LockOut = OpenLock; DebugPrintOut *DPO = &DebugPrintOut::getInstance(); DPO->printOut(L"VIDEODEVICE %i: Device is stopped \n", vd_CurrentNumber); } } - unsigned int videoDevice::getWidth() { if(vd_IsSetuped) @@ -2230,60 +1653,46 @@ unsigned int videoDevice::getWidth() else return 0; } - unsigned int videoDevice::getHeight() { if(vd_IsSetuped) return vd_Height; - else + else return 0; } - IMFMediaSource *videoDevice::getMediaSource() { IMFMediaSource *out = NULL; - if(vd_LockOut == OpenLock) { - vd_LockOut = MediaSourceLock; - + vd_LockOut = MediaSourceLock; out = vd_pSource; } - return out; } - int videoDevice::findType(unsigned int size, unsigned int frameRate) -{ +{ if(vd_CaptureFormats.size() == 0) return 0; - FrameRateMap FRM = vd_CaptureFormats[size]; - if(FRM.size() == 0) return 0; - UINT64 frameRateMax = 0; SUBTYPEMap STMMax; - if(frameRate == 0) { std::map::iterator f = FRM.begin(); - for(; f != FRM.end(); f++) { if((*f).first >= frameRateMax) { frameRateMax = (*f).first; - STMMax = (*f).second; } - } - + } } else { std::map::iterator f = FRM.begin(); - for(; f != FRM.end(); f++) { if((*f).first >= frameRateMax) @@ -2291,98 +1700,68 @@ int videoDevice::findType(unsigned int size, unsigned int frameRate) if(frameRate > (*f).first) { frameRateMax = (*f).first; - STMMax = (*f).second; } } } } - if(STMMax.size() == 0) return 0; - - std::map::iterator S = STMMax.begin(); - vectorNum VN = (*S).second; - if(VN.size() == 0) return 0; - return VN[0]; - } - void videoDevice::buildLibraryofTypes() { unsigned int size; - unsigned int framerate; - std::vector::iterator i = vd_CurrentFormats.begin(); - int count = 0; - for(; i != vd_CurrentFormats.end(); i++) { size = (*i).MF_MT_FRAME_SIZE; - framerate = (*i).MF_MT_FRAME_RATE; - FrameRateMap FRM = vd_CaptureFormats[size]; - SUBTYPEMap STM = FRM[framerate]; - String subType((*i).pMF_MT_SUBTYPEName); - vectorNum VN = STM[subType]; - VN.push_back(count); - STM[subType] = VN; - FRM[framerate] = STM; - vd_CaptureFormats[size] = FRM; - count++; } } - long videoDevice::setDeviceFormat(IMFMediaSource *pSource, unsigned long dwFormatIndex) { IMFPresentationDescriptor *pPD = NULL; IMFStreamDescriptor *pSD = NULL; IMFMediaTypeHandler *pHandler = NULL; IMFMediaType *pType = NULL; - HRESULT hr = pSource->CreatePresentationDescriptor(&pPD); if (FAILED(hr)) { goto done; } - BOOL fSelected; hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD); if (FAILED(hr)) { goto done; } - hr = pSD->GetMediaTypeHandler(&pHandler); if (FAILED(hr)) { goto done; } - hr = pHandler->GetMediaTypeByIndex((DWORD)dwFormatIndex, &pType); if (FAILED(hr)) { goto done; } - hr = pHandler->SetCurrentMediaType(pType); - done: SafeRelease(&pPD); SafeRelease(&pSD); @@ -2390,243 +1769,179 @@ done: SafeRelease(&pType); return hr; } - bool videoDevice::isDeviceSetup() { return vd_IsSetuped; } - RawImage * videoDevice::getRawImageOut() { if(!vd_IsSetuped) return NULL; - if(vd_pImGrTh) - return vd_pImGrTh->getImageGrabber()->getRawImage(); + return vd_pImGrTh->getImageGrabber()->getRawImage(); else { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"VIDEODEVICE %i: The instance of ImageGrabberThread class does not exist \n", vd_CurrentNumber); } return NULL; } - bool videoDevice::isFrameNew() { if(!vd_IsSetuped) return false; - - if(vd_LockOut == RawDataLock || vd_LockOut == OpenLock) + if(vd_LockOut == RawDataLock || vd_LockOut == OpenLock) { if(vd_LockOut == OpenLock) { vd_LockOut = RawDataLock; - HRESULT hr = ImageGrabberThread::CreateInstance(&vd_pImGrTh, vd_pSource, vd_CurrentNumber); - if(FAILED(hr)) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"VIDEODEVICE %i: The instance of ImageGrabberThread class cannot be created.\n", vd_CurrentNumber); - return false; } - vd_pImGrTh->setEmergencyStopEvent(vd_userData, vd_func); - vd_pImGrTh->start(); - return true; } - if(vd_pImGrTh) - return vd_pImGrTh->getImageGrabber()->getRawImage()->isNew(); - + return vd_pImGrTh->getImageGrabber()->getRawImage()->isNew(); } - return false; } - bool videoDevice::isDeviceMediaSource() { if(vd_LockOut == MediaSourceLock) return true; - return false; } - bool videoDevice::isDeviceRawDataSource() { if(vd_LockOut == RawDataLock) return true; - return false; } - bool videoDevice::setupDevice(unsigned int id) -{ +{ DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if(!vd_IsSetuped) { HRESULT hr = -1; - hr = initDevice(); - if(SUCCEEDED(hr)) - { - vd_Width = vd_CurrentFormats[id].width; - + { + vd_Width = vd_CurrentFormats[id].width; vd_Height = vd_CurrentFormats[id].height; - hr = setDeviceFormat(vd_pSource, (DWORD) id); - vd_IsSetuped = (SUCCEEDED(hr)); - if(vd_IsSetuped) DPO->printOut(L"\n\nVIDEODEVICE %i: Device is setuped \n", vd_CurrentNumber); - vd_PrevParametrs = getParametrs(); - return vd_IsSetuped; } else { DPO->printOut(L"VIDEODEVICE %i: Interface IMFMediaSource cannot be got \n", vd_CurrentNumber); - return false; } } else { DPO->printOut(L"VIDEODEVICE %i: Device is setuped already \n", vd_CurrentNumber); - return false; - } + } } - bool videoDevice::setupDevice(unsigned int w, unsigned int h, unsigned int idealFramerate) -{ +{ unsigned int id = findType(w * h, idealFramerate); - return setupDevice(id); } - wchar_t *videoDevice::getName() { return vd_pFriendlyName; } - videoDevice::~videoDevice(void) -{ +{ closeDevice(); - SafeRelease(&vd_pSource); - if(vd_pFriendlyName) CoTaskMemFree(vd_pFriendlyName); } - long videoDevice::enumerateCaptureFormats(IMFMediaSource *pSource) { IMFPresentationDescriptor *pPD = NULL; IMFStreamDescriptor *pSD = NULL; IMFMediaTypeHandler *pHandler = NULL; IMFMediaType *pType = NULL; - HRESULT hr = pSource->CreatePresentationDescriptor(&pPD); if (FAILED(hr)) { goto done; } - BOOL fSelected; hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD); if (FAILED(hr)) { goto done; } - hr = pSD->GetMediaTypeHandler(&pHandler); if (FAILED(hr)) { goto done; } - DWORD cTypes = 0; hr = pHandler->GetMediaTypeCount(&cTypes); if (FAILED(hr)) { goto done; } - for (DWORD i = 0; i < cTypes; i++) { hr = pHandler->GetMediaTypeByIndex(i, &pType); - if (FAILED(hr)) { goto done; } - MediaType MT = FormatReader::Read(pType); - vd_CurrentFormats.push_back(MT); - SafeRelease(&pType); } - done: SafeRelease(&pPD); SafeRelease(&pSD); SafeRelease(&pHandler); SafeRelease(&pType); - return hr; } - - videoDevices::videoDevices(void): count(0) {} - void videoDevices::clearDevices() { std::vector::iterator i = vds_Devices.begin(); - for(; i != vds_Devices.end(); ++i) delete (*i); - vds_Devices.clear(); } - videoDevices::~videoDevices(void) -{ +{ clearDevices(); } - videoDevice * videoDevices::getDevice(unsigned int i) { if(i >= vds_Devices.size()) { return NULL; } - if(i < 0) { return NULL; } - return vds_Devices[i]; } - long videoDevices::initDevices(IMFAttributes *pAttributes) { HRESULT hr = S_OK; - IMFActivate **ppDevices = NULL; - clearDevices(); - hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count); - if (SUCCEEDED(hr)) { if(count > 0) @@ -2636,7 +1951,6 @@ long videoDevices::initDevices(IMFAttributes *pAttributes) videoDevice *vd = new videoDevice; vd->readInfoOfDevice(ppDevices[i], i); vds_Devices.push_back(vd); - SafeRelease(&ppDevices[i]); } SafeRelease(ppDevices); @@ -2647,154 +1961,99 @@ long videoDevices::initDevices(IMFAttributes *pAttributes) else { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"VIDEODEVICES: The instances of the videoDevice class cannot be created\n"); } - return hr; } - size_t videoDevices::getCount() { return vds_Devices.size(); } - -videoDevices& videoDevices::getInstance() +videoDevices& videoDevices::getInstance() { static videoDevices instance; - return instance; } - Parametr::Parametr() { CurrentValue = 0; - Min = 0; - Max = 0; - Step = 0; - - Default = 0; - + Default = 0; Flag = 0; } - MediaType::MediaType() { pMF_MT_AM_FORMAT_TYPEName = NULL; - pMF_MT_MAJOR_TYPEName = NULL; - pMF_MT_SUBTYPEName = NULL; - Clear(); } - MediaType::~MediaType() { Clear(); } - void MediaType::Clear() { - MF_MT_FRAME_SIZE = 0; - height = 0; - width = 0; - MF_MT_YUV_MATRIX = 0; - MF_MT_VIDEO_LIGHTING = 0; - MF_MT_DEFAULT_STRIDE = 0; - MF_MT_VIDEO_CHROMA_SITING = 0; - MF_MT_FIXED_SIZE_SAMPLES = 0; - MF_MT_VIDEO_NOMINAL_RANGE = 0; - MF_MT_FRAME_RATE = 0; - MF_MT_FRAME_RATE_low = 0; - MF_MT_PIXEL_ASPECT_RATIO = 0; - MF_MT_PIXEL_ASPECT_RATIO_low = 0; - MF_MT_ALL_SAMPLES_INDEPENDENT = 0; - MF_MT_FRAME_RATE_RANGE_MIN = 0; - MF_MT_FRAME_RATE_RANGE_MIN_low = 0; - MF_MT_SAMPLE_SIZE = 0; - MF_MT_VIDEO_PRIMARIES = 0; - MF_MT_INTERLACE_MODE = 0; - MF_MT_FRAME_RATE_RANGE_MAX = 0; - MF_MT_FRAME_RATE_RANGE_MAX_low = 0; - memset(&MF_MT_MAJOR_TYPE, 0, sizeof(GUID)); - memset(&MF_MT_AM_FORMAT_TYPE, 0, sizeof(GUID)); - memset(&MF_MT_SUBTYPE, 0, sizeof(GUID)); } - videoInput::videoInput(void): accessToDevices(false) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"\n***** VIDEOINPUT LIBRARY - 2013 (Author: Evgeny Pereguda) *****\n\n"); - updateListOfDevices(); if(!accessToDevices) DPO->printOut(L"INITIALIZATION: Ther is not any suitable video device\n"); } - void videoInput::updateListOfDevices() { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - Media_Foundation *MF = &Media_Foundation::getInstance(); accessToDevices = MF->buildListOfDevices(); - if(!accessToDevices) DPO->printOut(L"UPDATING: Ther is not any suitable video device\n"); } - videoInput::~videoInput(void) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->printOut(L"\n***** CLOSE VIDEOINPUT LIBRARY - 2013 *****\n\n"); } - IMFMediaSource *videoInput::getMediaSource(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) { IMFMediaSource *out = VD->getMediaSource(); - if(!out) DPO->printOut(L"VideoDevice %i: There is not any suitable IMFMediaSource interface\n", deviceID); - return out; } } @@ -2802,33 +2061,25 @@ IMFMediaSource *videoInput::getMediaSource(int deviceID) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return NULL; } - bool videoInput::setupDevice(int deviceID, unsigned int id) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0 ) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return false; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) { bool out = VD->setupDevice(id); - if(!out) DPO->printOut(L"VIDEODEVICE %i: This device cannot be started\n", deviceID); - return out; } } @@ -2836,33 +2087,25 @@ bool videoInput::setupDevice(int deviceID, unsigned int id) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return false; } - bool videoInput::setupDevice(int deviceID, unsigned int w, unsigned int h, unsigned int idealFramerate) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0 ) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return false; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) { bool out = VD->setupDevice(w, h, idealFramerate); - if(!out) DPO->printOut(L"VIDEODEVICE %i: this device cannot be started\n", deviceID); - return out; } } @@ -2870,53 +2113,41 @@ bool videoInput::setupDevice(int deviceID, unsigned int w, unsigned int h, unsig { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n", deviceID); } - return false; } - MediaType videoInput::getFormat(int deviceID, unsigned int id) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return MediaType(); } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - - if(VD) + if(VD) return VD->getFormat(id); } else { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return MediaType(); } - bool videoInput::isDeviceSetup(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return false; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) return VD->isDeviceSetup(); } @@ -2924,26 +2155,20 @@ bool videoInput::isDeviceSetup(int deviceID) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return false; } - bool videoInput::isDeviceMediaSource(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return false; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) return VD->isDeviceMediaSource(); } @@ -2951,26 +2176,20 @@ bool videoInput::isDeviceMediaSource(int deviceID) { DPO->printOut(L"Device(s): There is not any suitable video device\n"); } - return false; } - bool videoInput::isDeviceRawDataSource(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return false; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) { bool isRaw = VD->isDeviceRawDataSource(); @@ -2981,20 +2200,16 @@ bool videoInput::isDeviceRawDataSource(int deviceID) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return false; } - bool videoInput::isFrameNew(int deviceID) -{ +{ DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return false; } - if(accessToDevices) { if(!isDeviceSetup(deviceID)) @@ -3002,11 +2217,8 @@ bool videoInput::isFrameNew(int deviceID) if(isDeviceMediaSource(deviceID)) return false; } - videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) { return VD->isFrameNew(); @@ -3016,26 +2228,20 @@ bool videoInput::isFrameNew(int deviceID) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return false; } - unsigned int videoInput::getCountFormats(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return 0; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) return VD->getCountFormats(); } @@ -3043,34 +2249,26 @@ unsigned int videoInput::getCountFormats(int deviceID) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return 0; } - void videoInput::closeAllDevices() { videoDevices *VDS = &videoDevices::getInstance(); - for(unsigned int i = 0; i < VDS->getCount(); i++) closeDevice(i); } - void videoInput::setParametrs(int deviceID, CamParametrs parametrs) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice *VD = VDS->getDevice(deviceID); - if(VD) VD->setParametrs(parametrs); } @@ -3079,24 +2277,19 @@ void videoInput::setParametrs(int deviceID, CamParametrs parametrs) DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } } - CamParametrs videoInput::getParametrs(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); CamParametrs out; - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return out; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice *VD = VDS->getDevice(deviceID); - if(VD) out = VD->getParametrs(); } @@ -3104,26 +2297,20 @@ CamParametrs videoInput::getParametrs(int deviceID) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return out; } - void videoInput::closeDevice(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice *VD = VDS->getDevice(deviceID); - if(VD) VD->closeDevice(); } @@ -3132,50 +2319,39 @@ void videoInput::closeDevice(int deviceID) DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } } - unsigned int videoInput::getWidth(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return 0; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - - if(VD) + if(VD) return VD->getWidth(); } else { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return 0; } - unsigned int videoInput::getHeight(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return 0; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) return VD->getHeight(); } @@ -3183,26 +2359,20 @@ unsigned int videoInput::getHeight(int deviceID) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return 0; } - wchar_t *videoInput::getNameVideoDevice(int deviceID) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return NULL; } - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - if(VD) return VD->getName(); } @@ -3210,81 +2380,60 @@ wchar_t *videoInput::getNameVideoDevice(int deviceID) { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return L"Empty"; } - unsigned int videoInput::listDevices(bool silent) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - int out = 0; - if(accessToDevices) { videoDevices *VDS = &videoDevices::getInstance(); - out = VDS->getCount(); - DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if(!silent)DPO->printOut(L"\nVIDEOINPUT SPY MODE!\n\n"); - if(!silent)DPO->printOut(L"SETUP: Looking For Capture Devices\n"); - for(int i = 0; i < out; i++) { if(!silent)DPO->printOut(L"SETUP: %i) %s \n",i, getNameVideoDevice(i)); } - if(!silent)DPO->printOut(L"SETUP: %i Device(s) found\n\n", out); - } else { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return out; } - -videoInput& videoInput::getInstance() +videoInput& videoInput::getInstance() { static videoInput instance; - return instance; } - bool videoInput::isDevicesAcceable() { return accessToDevices; } - void videoInput::setVerbose(bool state) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - DPO->setVerbose(state); + DPO->setVerbose(state); } - void videoInput::setEmergencyStopEvent(int deviceID, void *userData, void(*func)(int, void *)) { DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return; } - if(accessToDevices) { if(func) { videoDevices *VDS = &videoDevices::getInstance(); - videoDevice * VD = VDS->getDevice(deviceID); - - if(VD) + if(VD) VD->setEmergencyStopEvent(userData, func); } } @@ -3293,19 +2442,16 @@ void videoInput::setEmergencyStopEvent(int deviceID, void *userData, void(*func) DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } } - bool videoInput::getPixels(int deviceID, unsigned char * dstBuffer, bool flipRedAndBlue, bool flipImage) { bool success = false; unsigned int bytes = 3; DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - if (deviceID < 0) { DPO->printOut(L"VIDEODEVICE %i: Invalid device ID\n", deviceID); return success; } - if(accessToDevices) { bool isRaw = isDeviceRawDataSource(deviceID); @@ -3313,18 +2459,14 @@ bool videoInput::getPixels(int deviceID, unsigned char * dstBuffer, bool flipRed { videoDevices *VDS = &videoDevices::getInstance(); DebugPrintOut *DPO = &DebugPrintOut::getInstance(); - RawImage *RIOut = VDS->getDevice(deviceID)->getRawImageOut(); - if(RIOut) { unsigned int height = VDS->getDevice(deviceID)->getHeight(); - unsigned int width = VDS->getDevice(deviceID)->getWidth(); - + unsigned int width = VDS->getDevice(deviceID)->getWidth(); unsigned int size = bytes * width * height; - if(size == RIOut->getSize()) - { + { processPixels(RIOut->getpPixels(), dstBuffer, width, height, bytes, flipRedAndBlue, flipImage); success = true; } @@ -3336,7 +2478,7 @@ bool videoInput::getPixels(int deviceID, unsigned char * dstBuffer, bool flipRed else { DPO->printOut(L"ERROR: GetPixels() - Unable to grab frame for device %i\n", deviceID); - } + } } else { @@ -3347,19 +2489,16 @@ bool videoInput::getPixels(int deviceID, unsigned char * dstBuffer, bool flipRed { DPO->printOut(L"VIDEODEVICE(s): There is not any suitable video device\n"); } - return success; } - -void videoInput::processPixels(unsigned char * src, unsigned char * dst, unsigned int width, +void videoInput::processPixels(unsigned char * src, unsigned char * dst, unsigned int width, unsigned int height, unsigned int bpp, bool bRGB, bool bFlip) -{ +{ unsigned int widthInBytes = width * bpp; unsigned int numBytes = widthInBytes * height; int *dstInt, *srcInt; - if(!bRGB) - { + { if(bFlip) { for(unsigned int y = 0; y < height; y++) @@ -3368,7 +2507,6 @@ void videoInput::processPixels(unsigned char * src, unsigned char * dst, unsigne srcInt = (int *)(src + ( (height -y -1) * widthInBytes)); memcpy(dstInt, srcInt, widthInBytes); } - } else { @@ -3379,11 +2517,9 @@ void videoInput::processPixels(unsigned char * src, unsigned char * dst, unsigne { if(bFlip) { - unsigned int x = 0; unsigned int y = (height - 1) * widthInBytes; src += y; - for(unsigned int i = 0; i < numBytes; i+=3) { if(x >= width) @@ -3391,49 +2527,38 @@ void videoInput::processPixels(unsigned char * src, unsigned char * dst, unsigne x = 0; src -= widthInBytes*2; } - *dst = *(src+2); dst++; - *dst = *(src+1); - dst++; - + dst++; *dst = *src; - dst++; - - src+=3; - x++; + dst++; + src+=3; + x++; } } else - { + { for(unsigned int i = 0; i < numBytes; i+=3) { *dst = *(src+2); dst++; - *dst = *(src+1); - dst++; - + dst++; *dst = *src; - dst++; - - src+=3; + dst++; + src+=3; } } } } - } - /******* Capturing video from camera via Microsoft Media Foundation **********/ - class CvCaptureCAM_MSMF : public CvCapture { public: CvCaptureCAM_MSMF(); virtual ~CvCaptureCAM_MSMF(); - virtual bool open( int index ); virtual void close(); virtual double getProperty(int); @@ -3441,23 +2566,18 @@ public: virtual bool grabFrame(); virtual IplImage* retrieveFrame(int); virtual int getCaptureDomain() { return CV_CAP_MSMF; } // Return the type of the capture object: CV_CAP_VFW, etc... - protected: void init(); - int index, width, height,fourcc; int widthSet, heightSet; IplImage* frame; videoInput VI; }; - struct SuppressVideoInputMessages { SuppressVideoInputMessages() { videoInput::setVerbose(true); } }; - static SuppressVideoInputMessages do_it; - CvCaptureCAM_MSMF::CvCaptureCAM_MSMF(): index(-1), width(-1), @@ -3470,13 +2590,11 @@ CvCaptureCAM_MSMF::CvCaptureCAM_MSMF(): { CoInitialize(0); } - CvCaptureCAM_MSMF::~CvCaptureCAM_MSMF() { close(); CoUninitialize(); } - void CvCaptureCAM_MSMF::close() { if( index >= 0 ) @@ -3487,13 +2605,11 @@ void CvCaptureCAM_MSMF::close() } widthSet = heightSet = width = height = -1; } - // Initialize camera input bool CvCaptureCAM_MSMF::open( int _index ) { int try_index = _index; int devices = 0; - close(); devices = VI.listDevices(true); if (devices == 0) @@ -3505,13 +2621,10 @@ bool CvCaptureCAM_MSMF::open( int _index ) index = try_index; return true; } - bool CvCaptureCAM_MSMF::grabFrame() { return true; } - - IplImage* CvCaptureCAM_MSMF::retrieveFrame(int) { if( !frame || (int)VI.getWidth(index) != frame->width || (int)VI.getHeight(index) != frame->height ) @@ -3521,12 +2634,9 @@ IplImage* CvCaptureCAM_MSMF::retrieveFrame(int) unsigned int w = VI.getWidth(index), h = VI.getHeight(index); frame = cvCreateImage( cvSize(w,h), 8, 3 ); } - VI.getPixels( index, (uchar*)frame->imageData, false, true ); - return frame; } - double CvCaptureCAM_MSMF::getProperty( int property_id ) { // image format proprrties @@ -3534,21 +2644,17 @@ double CvCaptureCAM_MSMF::getProperty( int property_id ) { case CV_CAP_PROP_FRAME_WIDTH: return VI.getWidth(index); - case CV_CAP_PROP_FRAME_HEIGHT: return VI.getHeight(index); - case CV_CAP_PROP_FOURCC: // FIXME: implement method in VideoInput back end //return VI.getFourcc(index); ; - case CV_CAP_PROP_FPS: - // FIXME: implement method in VideoInput back end + // FIXME: implement method in VideoInput back end //return VI.getFPS(index); ; } - // video filter properties switch( property_id ) { @@ -3568,7 +2674,6 @@ double CvCaptureCAM_MSMF::getProperty( int property_id ) // return (double)current_value; return 0.; } - // camera properties switch( property_id ) { @@ -3584,11 +2689,9 @@ double CvCaptureCAM_MSMF::getProperty( int property_id ) // max_value,stepping_delta,current_value,flags,defaultValue) ) return (double)current_value; return 0.; } - // unknown parameter or value not available return -1; } - bool CvCaptureCAM_MSMF::setProperty( int property_id, double value ) { // image capture properties @@ -3599,12 +2702,10 @@ bool CvCaptureCAM_MSMF::setProperty( int property_id, double value ) width = cvRound(value); handled = true; break; - case CV_CAP_PROP_FRAME_HEIGHT: height = cvRound(value); handled = true; break; - case CV_CAP_PROP_FOURCC: fourcc = (int)(unsigned long)(value); if ( fourcc == -1 ) { @@ -3613,7 +2714,6 @@ bool CvCaptureCAM_MSMF::setProperty( int property_id, double value ) } handled = true; break; - case CV_CAP_PROP_FPS: // FIXME: implement method in VideoInput back end // int fps = cvRound(value); @@ -3628,9 +2728,7 @@ bool CvCaptureCAM_MSMF::setProperty( int property_id, double value ) // } // return VI.isDeviceSetup(index); ; - } - if ( handled ) { // a stream setting if( width > 0 && height > 0 ) @@ -3643,7 +2741,6 @@ bool CvCaptureCAM_MSMF::setProperty( int property_id, double value ) // VI.setIdealFramerate(index, fps); // VI.setupDeviceFourcc(index, width, height, fourcc); } - bool success = VI.isDeviceSetup(index); if (success) { @@ -3655,14 +2752,12 @@ bool CvCaptureCAM_MSMF::setProperty( int property_id, double value ) } return true; } - // show video/camera filter dialog // FIXME: implement method in VideoInput back end // if ( property_id == CV_CAP_PROP_SETTINGS ) { // VI.showSettingsWindow(index); // return true; // } - //video Filter properties switch( property_id ) { @@ -3680,7 +2775,6 @@ bool CvCaptureCAM_MSMF::setProperty( int property_id, double value ) //return VI.setVideoSettingFilter(index,VI.getVideoPropertyFromCV(property_id),(long)value); ; } - //camera properties switch( property_id ) { @@ -3695,15 +2789,11 @@ bool CvCaptureCAM_MSMF::setProperty( int property_id, double value ) //return VI.setVideoSettingCamera(index,VI.getCameraPropertyFromCV(property_id),(long)value); ; } - return false; } - - CvCapture* cvCreateCameraCapture_MSMF( int index ) { CvCaptureCAM_MSMF* capture = new CvCaptureCAM_MSMF; - try { if( capture->open( index )) @@ -3714,9 +2804,7 @@ CvCapture* cvCreateCameraCapture_MSMF( int index ) delete capture; throw; } - delete capture; return 0; } - -#endif +#endif \ No newline at end of file diff --git a/platforms/winrt/arm.winrt.toolchain.cmake b/platforms/winrt/arm.winrt.toolchain.cmake index e8767f2..b34056c 100644 --- a/platforms/winrt/arm.winrt.toolchain.cmake +++ b/platforms/winrt/arm.winrt.toolchain.cmake @@ -1,5 +1,6 @@ set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR "arm-v7a") +set(CMAKE_FIND_ROOT_PATH "${CMAKE_SOURCE_DIR}/platforms/winrt") set(CMAKE_REQUIRED_DEFINITIONS -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE) add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE) \ No newline at end of file -- 2.7.4