| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- cmake_minimum_required(VERSION 3.28...3.30)
- option(ENABLE_VIRTUALCAM "Enable Windows Virtual Camera" ON)
- if(NOT ENABLE_VIRTUALCAM)
- target_disable_feature(obs-virtualcam-module "Virtual Camera Support")
- target_disable(obs-virtualcam-module)
- return()
- endif()
- if(NOT VIRTUALCAM_GUID)
- set(VIRTUALCAM_GUID "" CACHE STRING "Virtual Camera GUID" FORCE)
- mark_as_advanced(VIRTUALCAM_GUID)
- message(WARNING "Empty Virtual Camera GUID set.")
- target_disable_feature(obs-virtualcam-module "Virtual Camera Support (empty GUID)")
- return()
- else()
- set(VALID_GUID FALSE)
- check_uuid(${VIRTUALCAM_GUID} VALID_GUID)
- if(NOT VALID_GUID)
- message(WARNING "Invalid Virtual Camera GUID set.")
- target_disable_feature(obs-virtualcam-module "Virtual Camera Support (invalid GUID)")
- return()
- endif()
- # DirectShow API requires separate GUID tokens
- string(REPLACE "-" ";" GUID_VALS ${VIRTUALCAM_GUID})
- 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)
- 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)
- endif()
- if(NOT TARGET OBS::winhandle)
- add_subdirectory("${CMAKE_SOURCE_DIR}/libobs" "${CMAKE_BINARY_DIR}/libobs")
- endif()
- if(NOT TARGET OBS::threading-windows)
- add_subdirectory("${CMAKE_SOURCE_DIR}/libobs" "${CMAKE_BINARY_DIR}/libobs")
- endif()
- if(NOT TARGET OBS::tiny-nv12-scale)
- add_subdirectory("${CMAKE_SOURCE_DIR}/shared/obs-tiny-nv12-scale" obs-tiny-nv12-scale)
- endif()
- if(NOT TARGET OBS::shared-memory-queue)
- add_subdirectory("${CMAKE_SOURCE_DIR}/shared/obs-shared-memory-queue" obs-shared-memory-queue)
- endif()
- if(NOT TARGET OBS::libdshowcapture)
- add_subdirectory("${CMAKE_SOURCE_DIR}/deps/libdshowcapture" libdshowcapture)
- endif()
- add_library(obs-virtualcam-guid INTERFACE)
- add_library(OBS::virtualcam-guid ALIAS obs-virtualcam-guid)
- configure_file(virtualcam-guid.h.in virtualcam-guid.h)
- target_sources(obs-virtualcam-guid INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-guid.h")
- target_include_directories(obs-virtualcam-guid INTERFACE "${CMAKE_CURRENT_BINARY_DIR}")
- add_library(obs-virtualcam-module MODULE)
- add_library(OBS::virtualcam ALIAS obs-virtualcam-module)
- configure_file(cmake/windows/obs-module.rc.in virtualcam-module.rc)
- target_sources(
- obs-virtualcam-module
- PRIVATE
- ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.rc
- placeholder.cpp
- sleepto.c
- sleepto.h
- virtualcam-filter.cpp
- virtualcam-filter.hpp
- virtualcam-module.cpp
- )
- target_include_directories(obs-virtualcam-module PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
- target_compile_definitions(obs-virtualcam-module PRIVATE VIRTUALCAM_AVAILABLE)
- target_link_libraries(
- obs-virtualcam-module
- PRIVATE
- OBS::tiny-nv12-scale
- OBS::shared-memory-queue
- OBS::virtualcam-guid
- OBS::libdshowcapture
- OBS::winhandle
- OBS::threading-windows
- gdiplus
- strmiids
- winmm
- )
- if(OBS_PARENT_ARCHITECTURE STREQUAL CMAKE_VS_PLATFORM_NAME)
- if(CMAKE_VS_PLATFORM_NAME STREQUAL ARM64)
- add_custom_command(
- TARGET obs-virtualcam-module
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_SOURCE_DIR}/build_x64 --config $<CONFIG> -t obs-virtualcam-module
- COMMENT "Build x64 obs-virtualcam-module"
- )
- endif()
- if(CMAKE_VS_PLATFORM_NAME MATCHES "(ARM64|x64)")
- add_custom_command(
- TARGET obs-virtualcam-module
- POST_BUILD
- COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_SOURCE_DIR}/build_x86 --config $<CONFIG> -t obs-virtualcam-module
- COMMENT "Build x86 obs-virtualcam-module"
- )
- endif()
- add_dependencies(win-dshow obs-virtualcam-module)
- endif()
- if(CMAKE_VS_PLATFORM_NAME STREQUAL ARM64)
- set(_OUTPUT_NAME virtualcam-module-arm64)
- elseif(CMAKE_VS_PLATFORM_NAME STREQUAL x64)
- set(_OUTPUT_NAME virtualcam-module64)
- else()
- set(_OUTPUT_NAME virtualcam-module32)
- endif()
- target_sources(obs-virtualcam-module PRIVATE cmake/windows/${_OUTPUT_NAME}.def)
- configure_file(virtualcam-install.bat.in virtualcam-install.bat)
- target_add_resource(obs-virtualcam-module "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat"
- "${OBS_DATA_DESTINATION}/obs-plugins/win-dshow"
- )
- configure_file(virtualcam-uninstall.bat.in virtualcam-uninstall.bat)
- target_add_resource(obs-virtualcam-module "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat"
- "${OBS_DATA_DESTINATION}/obs-plugins/win-dshow"
- )
- set_target_properties_obs(
- obs-virtualcam-module PROPERTIES
- FOLDER plugins/win-dshow
- OUTPUT_NAME obs-${_OUTPUT_NAME}
- MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"
- )
|