| 
					
				 | 
			
			
				@@ -104,40 +104,20 @@ VCamFilter::VCamFilter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* ---------------------------------------- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	AddRef(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void VCamFilter::ActuallyStart() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (th.joinable()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ResetEvent(thread_stop); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	th = std::thread([this] { Thread(); }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	SetEvent(thread_start); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void VCamFilter::ActuallyStop() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (!th.joinable()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	SetEvent(thread_stop); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	th.join(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	AddRef(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 VCamFilter::~VCamFilter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ActuallyStop(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	SetEvent(thread_stop); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (th.joinable()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		th.join(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	video_queue_close(vq); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (placeholder.scaled_data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (placeholder.scaled_data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		free(placeholder.scaled_data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		placeholder.scaled_data = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const wchar_t *VCamFilter::FilterName() const 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -154,29 +134,7 @@ STDMETHODIMP VCamFilter::Pause() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return hr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ActuallyStart(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return S_OK; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-STDMETHODIMP VCamFilter::Run(REFERENCE_TIME tStart) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	HRESULT hr = OutputFilter::Run(tStart); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (FAILED(hr)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return hr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ActuallyStart(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return S_OK; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-STDMETHODIMP VCamFilter::Stop() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	HRESULT hr = OutputFilter::Stop(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (FAILED(hr)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return hr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ActuallyStop(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	SetEvent(thread_start); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return S_OK; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -210,11 +168,6 @@ void VCamFilter::Thread() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* ---------------------------------------- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/* load placeholder image                   */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (placeholder.scaled_data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		free(placeholder.scaled_data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		placeholder.scaled_data = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (initialize_placeholder()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		placeholder.source_data = get_placeholder_ptr(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		get_placeholder_size(&placeholder.cx, &placeholder.cy); 
			 |