diff --git a/Install/Install.bat b/Install/Install.bat index de17dd2..7c76195 100644 --- a/Install/Install.bat +++ b/Install/Install.bat @@ -23,6 +23,6 @@ if '%errorlevel%' NEQ '0' ( :gotAdmin pushd "%CD%" CD /D "%~dp0" - regsvr32 "UnityCaptureFilter32bit.dll" - regsvr32 "UnityCaptureFilter64bit.dll" + regsvr32 "UnityCaptureFilter32.dll" + regsvr32 "UnityCaptureFilter64.dll" :-------------------------------------- diff --git a/Install/InstallCustomName.bat b/Install/InstallCustomName.bat index 528f41c..cc186d2 100644 --- a/Install/InstallCustomName.bat +++ b/Install/InstallCustomName.bat @@ -25,7 +25,7 @@ if '%errorlevel%' NEQ '0' ( CD /D "%~dp0" set /P "UCCAPNAME=Enter a custom filter name to register as (default is 'Unity Video Capture'): " echo Installing capture device named '%UCCAPNAME%' ... - regsvr32 "UnityCaptureFilter32bit.dll" "/i:UnityCaptureName=%UCCAPNAME%" - regsvr32 "UnityCaptureFilter64bit.dll" "/i:UnityCaptureName=%UCCAPNAME%" + regsvr32 "UnityCaptureFilter32.dll" "/i:UnityCaptureName=%UCCAPNAME%" + regsvr32 "UnityCaptureFilter64.dll" "/i:UnityCaptureName=%UCCAPNAME%" echo "Done" :-------------------------------------- diff --git a/Install/InstallMultipleDevices.bat b/Install/InstallMultipleDevices.bat index 13cfa28..069c3e3 100644 --- a/Install/InstallMultipleDevices.bat +++ b/Install/InstallMultipleDevices.bat @@ -25,7 +25,7 @@ if '%errorlevel%' NEQ '0' ( CD /D "%~dp0" set /P "UCNUMCAP=Enter number of capture devices you want to register: " echo "Installing %UCNUMCAP% capture devices ..." - regsvr32 "UnityCaptureFilter32bit.dll" "/i:UnityCaptureDevices=%UCNUMCAP%" - regsvr32 "UnityCaptureFilter64bit.dll" "/i:UnityCaptureDevices=%UCNUMCAP%" + regsvr32 "UnityCaptureFilter32.dll" "/i:UnityCaptureDevices=%UCNUMCAP%" + regsvr32 "UnityCaptureFilter64.dll" "/i:UnityCaptureDevices=%UCNUMCAP%" echo "Done" :-------------------------------------- diff --git a/Install/Uninstall.bat b/Install/Uninstall.bat index 838dce7..291f8a9 100644 --- a/Install/Uninstall.bat +++ b/Install/Uninstall.bat @@ -23,6 +23,6 @@ if '%errorlevel%' NEQ '0' ( :gotAdmin pushd "%CD%" CD /D "%~dp0" - regsvr32 /u "UnityCaptureFilter32bit.dll" - regsvr32 /u "UnityCaptureFilter64bit.dll" + regsvr32 /u "UnityCaptureFilter32.dll" + regsvr32 /u "UnityCaptureFilter64.dll" :-------------------------------------- diff --git a/Install/UnityCaptureFilter32bit.dll b/Install/UnityCaptureFilter32.dll similarity index 72% rename from Install/UnityCaptureFilter32bit.dll rename to Install/UnityCaptureFilter32.dll index 8a66ab7..da0b410 100644 Binary files a/Install/UnityCaptureFilter32bit.dll and b/Install/UnityCaptureFilter32.dll differ diff --git a/Install/UnityCaptureFilter64bit.dll b/Install/UnityCaptureFilter64.dll similarity index 56% rename from Install/UnityCaptureFilter64bit.dll rename to Install/UnityCaptureFilter64.dll index 84b5bf8..cd6d7de 100644 Binary files a/Install/UnityCaptureFilter64bit.dll and b/Install/UnityCaptureFilter64.dll differ diff --git a/README.md b/README.md index 86c822e..8268e62 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,11 @@ The script `Install.bat` registers just a single capture device usable for captu capture multiple cameras simultaneously you can instead run the `InstallMultipleDevices.bat` script which prompts for a number of capture devices you wish to register. +### Update + +When updating from a version from before April 2023 it is recommended to uninstall the old version first. +The old version is available [`here`](../../archive/7a3278dcefe37544370226e92bdfd60140434045.zip). + ## Test in Unity diff --git a/Source/UnityCaptureFilter.cpp b/Source/UnityCaptureFilter.cpp index d437d63..cef64c3 100644 --- a/Source/UnityCaptureFilter.cpp +++ b/Source/UnityCaptureFilter.cpp @@ -397,6 +397,10 @@ class CCaptureStream : CSourceStream, IKsPropertySet, IAMStreamConfig, IAMStream { WorkersRunning = 0; for (size_t i = 0; i != WORKERCOUNT; i++) NewJobSemaphore.Post(); //wake up all threads + for (size_t i = 0; i != WORKERCOUNT; i++) + { + Threads[i].Stop(); + } } void StartNewJob(ProcessJob NewJob) @@ -423,9 +427,80 @@ class CCaptureStream : CSourceStream, IKsPropertySet, IAMStreamConfig, IAMStream private: //Wrapper objects for Windows concurrency objects (thread, mutex, semaphore) - struct sThread { typedef DWORD (WINAPI *FUNC_t)(LPVOID); sThread() : h(0) {} sThread(FUNC_t f, void* p = NULL) : h(0) { Start(f, p); } void Start(FUNC_t f, void* p = NULL) { if (h) this->~sThread(); h = CreateThread(0,0,f,p,0,0); } ~sThread() { if (h) { WaitForSingleObject(h, INFINITE); CloseHandle(h); } } private:HANDLE h;sThread(const sThread&);sThread& operator=(const sThread&);}; - struct sMutex { sMutex() : h(CreateMutexA(0,0,0)) {} ~sMutex() { CloseHandle(h); } __inline void Lock() { WaitForSingleObject(h,INFINITE); } __inline void Unlock() { ReleaseMutex(h); } private:HANDLE h;sMutex(const sMutex&);sMutex& operator=(const sMutex&);}; - struct sSemaphore { sSemaphore() : h(CreateSemaphoreA(0,0,32768,0)) {} ~sSemaphore() { CloseHandle(h); } __inline void Post() { ReleaseSemaphore(h, 1, 0); } __inline bool WaitForPost() { return WaitForSingleObject(h,INFINITE) == WAIT_OBJECT_0; } private:HANDLE h;sSemaphore(const sSemaphore&);sSemaphore& operator=(const sSemaphore&);}; + struct sThread + { + typedef DWORD(WINAPI* FUNC_t)(LPVOID); + sThread() : h(0) + { + } + sThread(FUNC_t f, void* p = NULL) : h(0) + { + Start(f, p); + } + void Start(FUNC_t f, void* p = NULL) + { + if (h) + this->~sThread(); + h = CreateThread(0, 0, f, p, 0, 0); + } + void Stop() + { + if (h) + { + WaitForSingleObject(h, INFINITE); + CloseHandle(h); + h = 0; + } + } + ~sThread() + { + if (h) + { + WaitForSingleObject(h, INFINITE); + CloseHandle(h); + } + } + private: + HANDLE h; + sThread(const sThread&); + sThread& operator=(const sThread&); + }; + + struct sMutex + { + sMutex() : h(CreateMutexA(0, 0, 0)) {} + ~sMutex() { CloseHandle(h); } + __inline void Lock() + { + WaitForSingleObject(h, INFINITE); + } + __inline void Unlock() + { + ReleaseMutex(h); + } + private: + HANDLE h; + sMutex(const sMutex&); + sMutex& operator=(const sMutex&); + }; + + struct sSemaphore + { + sSemaphore() : h(CreateSemaphoreA(0, 0, 32768, 0)) {} + ~sSemaphore() { CloseHandle(h); } + __inline void Post() + { + ReleaseSemaphore(h, 1, 0); + } + __inline bool WaitForPost() + { + return WaitForSingleObject(h, INFINITE) == WAIT_OBJECT_0; + } + private: + HANDLE h; + sSemaphore(const sSemaphore&); + sSemaphore& operator=(const sSemaphore&); + }; enum { WORKERCOUNT = 3 }; sMutex JobsMutex; diff --git a/Source/UnityCaptureFilter.vcxproj b/Source/UnityCaptureFilter.vcxproj index 6a34208..4181b30 100644 --- a/Source/UnityCaptureFilter.vcxproj +++ b/Source/UnityCaptureFilter.vcxproj @@ -40,8 +40,8 @@ - UnityCaptureFilter64bit - UnityCaptureFilter32bit + UnityCaptureFilter64 + UnityCaptureFilter32 Build\$(Configuration)-$(TargetName)\ $(OutDir) false diff --git a/UnityCaptureSample/Assets/UnityCapture/Plugins/x86/UnityCapturePlugin.dll b/UnityCaptureSample/Assets/UnityCapture/Plugins/x86/UnityCapturePlugin.dll index 2d32876..a2fabbe 100644 Binary files a/UnityCaptureSample/Assets/UnityCapture/Plugins/x86/UnityCapturePlugin.dll and b/UnityCaptureSample/Assets/UnityCapture/Plugins/x86/UnityCapturePlugin.dll differ diff --git a/UnityCaptureSample/Assets/UnityCapture/Plugins/x86_64/UnityCapturePlugin.dll b/UnityCaptureSample/Assets/UnityCapture/Plugins/x86_64/UnityCapturePlugin.dll index 6f43280..adc1655 100644 Binary files a/UnityCaptureSample/Assets/UnityCapture/Plugins/x86_64/UnityCapturePlugin.dll and b/UnityCaptureSample/Assets/UnityCapture/Plugins/x86_64/UnityCapturePlugin.dll differ