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