Browse Source

win-dshow: Use cmake-based GUID for virtualcam

jp9000 5 years ago
parent
commit
da8192544b

+ 72 - 8
plugins/win-dshow/CMakeLists.txt

@@ -13,7 +13,67 @@ set(win-dshow_HEADERS
 	ffmpeg-decode.h)
 
 set(MODULE_DESCRIPTION "OBS DirectShow module")
+
+set(VIRTUALCAM_GUID "" CACHE STRING "VirtualCam GUID")
+
+set(VIRTUALCAM_ENABLED FALSE)
+if(VIRTUALCAM_GUID STREQUAL "")
+	message(STATUS "VirtualCam GUID not set! VirtualCam disabled.")
+else()
+	set(INVALID_GUID TRUE)
+
+	string(REPLACE "-" ";" GUID_VALS ${VIRTUALCAM_GUID})
+
+	list(LENGTH GUID_VALS GUID_VAL_COUNT)
+	if(GUID_VAL_COUNT EQUAL 5)
+		string(REPLACE ";" "0" GUID_HEX ${GUID_VALS})
+		string(REGEX MATCH "[0-9a-fA-F]+" GUID_ACTUAL_HEX ${GUID_HEX})
+		if(GUID_ACTUAL_HEX STREQUAL GUID_HEX)
+			list(GET GUID_VALS 0 GUID_VALS_DATA1)
+			list(GET GUID_VALS 1 GUID_VALS_DATA2)
+			list(GET GUID_VALS 2 GUID_VALS_DATA3)
+			list(GET GUID_VALS 3 GUID_VALS_DATA4)
+			list(GET GUID_VALS 4 GUID_VALS_DATA5)
+			string(LENGTH ${GUID_VALS_DATA1} GUID_VALS_DATA1_LENGTH)
+			string(LENGTH ${GUID_VALS_DATA2} GUID_VALS_DATA2_LENGTH)
+			string(LENGTH ${GUID_VALS_DATA3} GUID_VALS_DATA3_LENGTH)
+			string(LENGTH ${GUID_VALS_DATA4} GUID_VALS_DATA4_LENGTH)
+			string(LENGTH ${GUID_VALS_DATA5} GUID_VALS_DATA5_LENGTH)
+			if(GUID_VALS_DATA1_LENGTH EQUAL 8 AND
+			   GUID_VALS_DATA2_LENGTH EQUAL 4 AND
+			   GUID_VALS_DATA3_LENGTH EQUAL 4 AND
+			   GUID_VALS_DATA4_LENGTH EQUAL 4 AND
+			   GUID_VALS_DATA5_LENGTH EQUAL 12)
+				set(GUID_VAL01 ${GUID_VALS_DATA1})
+				set(GUID_VAL02 ${GUID_VALS_DATA2})
+				set(GUID_VAL03 ${GUID_VALS_DATA3})
+				string(SUBSTRING ${GUID_VALS_DATA4} 0 2 GUID_VAL04)
+				string(SUBSTRING ${GUID_VALS_DATA4} 2 2 GUID_VAL05)
+				string(SUBSTRING ${GUID_VALS_DATA5} 0 2 GUID_VAL06)
+				string(SUBSTRING ${GUID_VALS_DATA5} 2 2 GUID_VAL07)
+				string(SUBSTRING ${GUID_VALS_DATA5} 4 2 GUID_VAL08)
+				string(SUBSTRING ${GUID_VALS_DATA5} 6 2 GUID_VAL09)
+				string(SUBSTRING ${GUID_VALS_DATA5} 8 2 GUID_VAL10)
+				string(SUBSTRING ${GUID_VALS_DATA5} 10 2 GUID_VAL11)
+				set(VIRTUALCAM_ENABLED TRUE)
+				set(INVALID_GUID FALSE)
+			endif()
+		endif()
+	endif()
+endif()
+
+if(INVALID_GUID)
+	message(WARNING "Invalid VirtualCam GUID! VirtualCam disabled.")
+endif()
+
+if(VIRTUALCAM_ENABLED)
+	add_definitions(-DVIRTUALCAM_ENABLED)
+endif()
+
 configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-dshow.rc)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-guid.h.in ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-guid.h)
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
 set(win-dshow_SOURCES
 	win-dshow.cpp
 	win-dshow-encoder.cpp
@@ -21,13 +81,15 @@ set(win-dshow_SOURCES
 	ffmpeg-decode.c
 	win-dshow.rc)
 
-set(virtualcam-output_SOURCES
-	tiny-nv12-scale.c
-	shared-memory-queue.c
-	virtualcam.c)
-set(virtualcam-output_HEADERS
-	tiny-nv12-scale.h
-	shared-memory-queue.h)
+if(VIRTUALCAM_ENABLED)
+	set(virtualcam-output_SOURCES
+		tiny-nv12-scale.c
+		shared-memory-queue.c
+		virtualcam.c)
+	set(virtualcam-output_HEADERS
+		tiny-nv12-scale.h
+		shared-memory-queue.h)
+endif()
 
 set(libdshowcapture_SOURCES
 	libdshowcapture/source/capture-filter.cpp
@@ -80,4 +142,6 @@ source_group("libdshowcapture\\Header Files" FILES ${libdshowcapture_HEADERS})
 
 install_obs_plugin_with_data(win-dshow data)
 
-add_subdirectory(virtualcam-module)
+if(VIRTUALCAM_ENABLED)
+	add_subdirectory(virtualcam-module)
+endif()

+ 6 - 0
plugins/win-dshow/dshow-plugin.cpp

@@ -13,6 +13,7 @@ MODULE_EXPORT const char *obs_module_description(void)
 extern void RegisterDShowSource();
 extern void RegisterDShowEncoders();
 
+#ifdef VIRTUALCAM_ENABLED
 extern "C" struct obs_output_info virtualcam_info;
 
 static bool vcam_installed(bool b64)
@@ -35,14 +36,19 @@ static bool vcam_installed(bool b64)
 	RegCloseKey(key);
 	return true;
 }
+#endif
 
 bool obs_module_load(void)
 {
 	RegisterDShowSource();
 	RegisterDShowEncoders();
+#ifdef VIRTUALCAM_ENABLED
 	obs_register_output(&virtualcam_info);
 
 	bool installed = vcam_installed(false);
+#else
+	bool installed = false;
+#endif
 
 	obs_data_t *obs_settings = obs_data_create();
 	obs_data_set_bool(obs_settings, "vcamEnabled", installed);

+ 0 - 8
plugins/win-dshow/virtualcam-guid.h

@@ -1,8 +0,0 @@
-#pragma once
-
-#include <windows.h>
-#include <initguid.h>
-
-// {A3FCE0F5-3493-419F-958A-ABA1250EC20B}
-DEFINE_GUID(CLSID_OBS_VirtualVideo, 0xa3fce0f5, 0x3493, 0x419f, 0x95, 0x8a,
-	    0xab, 0xa1, 0x25, 0xe, 0xc2, 0xb);

+ 19 - 0
plugins/win-dshow/virtualcam-guid.h.in

@@ -0,0 +1,19 @@
+#pragma once
+
+#include <windows.h>
+#include <initguid.h>
+
+#ifdef VIRTUALCAM_ENABLED
+DEFINE_GUID(CLSID_OBS_VirtualVideo,
+            0x@GUID_VAL01@,
+            0x@GUID_VAL02@,
+            0x@GUID_VAL03@,
+            0x@GUID_VAL04@,
+            0x@GUID_VAL05@,
+            0x@GUID_VAL06@,
+            0x@GUID_VAL07@,
+            0x@GUID_VAL08@,
+            0x@GUID_VAL09@,
+            0x@GUID_VAL10@,
+            0x@GUID_VAL11@);
+#endif

+ 2 - 0
plugins/win-dshow/virtualcam-module/CMakeLists.txt

@@ -14,6 +14,8 @@ configure_file(
 set(MODULE_DESCRIPTION "OBS Virtual Camera output module")
 configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in virtualcam-module.rc)
 
+include_directories(${CMAKE_CURRENT_BINARY_DIR}/..)
+
 set(libdshowcapture_SOURCES
 	../libdshowcapture/source/log.cpp
 	../libdshowcapture/source/dshow-base.cpp

+ 1 - 1
plugins/win-dshow/virtualcam-module/virtualcam-module.cpp

@@ -1,5 +1,5 @@
 #include "virtualcam-filter.hpp"
-#include "../virtualcam-guid.h"
+#include "virtualcam-guid.h"
 
 /* ========================================================================= */