| 
					
				 | 
			
			
				@@ -59,10 +59,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "QSV_Encoder.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "QSV_Encoder_Internal.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <obs-module.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <string> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <mutex> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define do_log(level, format, ...) \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	blog(level, "[qsv encoder: '%s'] " format, \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"msdk_impl", ##__VA_ARGS__) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 mfxIMPL              impl = MFX_IMPL_HARDWARE_ANY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 mfxVersion           ver = {{0, 1}}; // for backward compatibility 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+std::mutex           active_mutex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void qsv_encoder_version(unsigned short *major, unsigned short *minor) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -72,10 +79,18 @@ void qsv_encoder_version(unsigned short *major, unsigned short *minor) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 qsv_t *qsv_encoder_open(qsv_param_t *pParams) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!active_mutex.try_lock()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		do_log(LOG_ERROR, "Cannot have more than one encoder " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				"active at a time"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	QSV_Encoder_Internal *pEncoder = new QSV_Encoder_Internal(impl, ver); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	mfxStatus sts = pEncoder->Open(pParams); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (sts != MFX_ERR_NONE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		delete pEncoder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (pEncoder) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			active_mutex.unlock(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -115,6 +130,9 @@ int qsv_encoder_close(qsv_t *pContext) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	QSV_Encoder_Internal *pEncoder = (QSV_Encoder_Internal *)pContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	delete pEncoder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (pEncoder) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		active_mutex.unlock(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |