cmake: Add changes for CMake build framework 3.0

New code path only taken if OBS_CMAKE_VERSION is set to 3.0.0 or
greater, old functionality remains unchanged.
This commit is contained in:
PatTheMav
2023-03-28 19:50:59 +02:00
committed by Ryan Foster
parent 850976eba9
commit db895092ed
84 changed files with 1642 additions and 695 deletions
+28 -195
View File
@@ -1,215 +1,48 @@
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/dshowcapture.hpp")
obs_status(FATAL_ERROR "libdshowcapture submodule not found! Please fetch submodules. win-dshow plugin disabled.")
return()
cmake_minimum_required(VERSION 3.24...3.25)
if(OBS_CMAKE_VERSION VERSION_GREATER_EQUAL 3.0.0)
add_library(obs-virtualcam-interface INTERFACE)
add_library(OBS::virtualcam-interface ALIAS obs-virtualcam-interface)
target_sources(obs-virtualcam-interface INTERFACE shared-memory-queue.c shared-memory-queue.h tiny-nv12-scale.c
tiny-nv12-scale.h)
target_include_directories(obs-virtualcam-interface INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")
include(cmake/libdshowcapture.cmake)
add_subdirectory(virtualcam-module)
endif()
option(ENABLE_VIRTUALCAM "Enable building with Virtual Camera (Windows)" ON)
legacy_check()
if(NOT ENABLE_VIRTUALCAM)
obs_status(DISABLED "Windows Virtual Camera")
endif()
if(ENABLE_VIRTUALCAM AND NOT VIRTUALCAM_GUID)
set(VIRTUALCAM_GUID
""
CACHE STRING "Virtual Camera GUID" FORCE)
mark_as_advanced(VIRTUALCAM_GUID)
endif()
project(win-dshow)
find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil)
find_package(FFmpeg REQUIRED avcodec avutil)
add_library(win-dshow MODULE)
add_library(OBS::dshow ALIAS win-dshow)
target_sources(win-dshow PRIVATE encode-dstr.hpp win-dshow.cpp win-dshow-encoder.cpp dshow-plugin.cpp ffmpeg-decode.c
ffmpeg-decode.h)
add_library(libdshowcapture-external INTERFACE)
add_library(libdshowcapture INTERFACE)
add_library(OBS::libdshowcapture-external ALIAS libdshowcapture-external)
add_library(OBS::libdshowcapture ALIAS libdshowcapture)
target_sources(
libdshowcapture-external
INTERFACE libdshowcapture/external/capture-device-support/Library/EGAVResult.cpp
libdshowcapture/external/capture-device-support/Library/ElgatoUVCDevice.cpp
libdshowcapture/external/capture-device-support/Library/win/EGAVHIDImplementation.cpp
libdshowcapture/external/capture-device-support/SampleCode/DriverInterface.cpp)
target_sources(
libdshowcapture
INTERFACE libdshowcapture/dshowcapture.hpp
libdshowcapture/source/capture-filter.cpp
libdshowcapture/source/capture-filter.hpp
libdshowcapture/source/output-filter.cpp
libdshowcapture/source/output-filter.hpp
libdshowcapture/source/dshowcapture.cpp
libdshowcapture/source/dshowencode.cpp
libdshowcapture/source/device.cpp
libdshowcapture/source/device.hpp
libdshowcapture/source/device-vendor.cpp
libdshowcapture/source/encoder.cpp
libdshowcapture/source/encoder.hpp
libdshowcapture/source/dshow-base.cpp
libdshowcapture/source/dshow-base.hpp
libdshowcapture/source/dshow-demux.cpp
libdshowcapture/source/dshow-demux.hpp
libdshowcapture/source/dshow-device-defs.hpp
libdshowcapture/source/dshow-enum.cpp
libdshowcapture/source/dshow-enum.hpp
libdshowcapture/source/dshow-formats.cpp
libdshowcapture/source/dshow-formats.hpp
libdshowcapture/source/dshow-media-type.cpp
libdshowcapture/source/dshow-encoded-device.cpp
libdshowcapture/source/dshow-media-type.hpp
libdshowcapture/source/log.cpp
libdshowcapture/source/log.hpp
libdshowcapture/source/external/IVideoCaptureFilter.h)
target_include_directories(
libdshowcapture INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture
${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/external/capture-device-support/Library)
target_compile_definitions(libdshowcapture-external INTERFACE _UP_WINDOWS=1)
target_compile_definitions(libdshowcapture INTERFACE _UP_WINDOWS=1)
target_compile_options(libdshowcapture-external INTERFACE /wd4018)
set(MODULE_DESCRIPTION "OBS DirectShow module")
configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in win-dshow.rc)
target_sources(win-dshow PRIVATE dshow-plugin.cpp encode-dstr.hpp ffmpeg-decode.c ffmpeg-decode.h win-dshow-encoder.cpp
win-dshow.cpp)
configure_file(cmake/windows/obs-module.rc.in win-dshow.rc)
target_sources(win-dshow PRIVATE win-dshow.rc)
target_compile_definitions(win-dshow PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS)
set(VIRTUALCAM_AVAILABLE OFF)
if(ENABLE_VIRTUALCAM)
if(VIRTUALCAM_GUID STREQUAL "")
obs_status(WARNING "Windows Virtual Camera - GUID not set. Specify as 'VIRTUALCAM_GUID' to enable.")
else()
set(INVALID_GUID ON)
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_AVAILABLE ON)
set(INVALID_GUID OFF)
endif()
endif()
endif()
endif()
if(INVALID_GUID)
obs_status(WARNING "Windows Virtual Camera - invalid GUID supplied")
endif()
endif()
target_link_libraries(
win-dshow
PRIVATE OBS::libobs
OBS::w32-pthreads
OBS::libdshowcapture-external
OBS::libdshowcapture
setupapi
strmiids
ksuser
winmm
wmcodecdspuuid
FFmpeg::avcodec
FFmpeg::avutil)
source_group(
"libdshowcapture-external\\Source Files"
FILES libdshowcapture/external/capture-device-support/Library/EGAVResult.cpp
libdshowcapture/external/capture-device-support/Library/ElgatoUVCDevice.cpp
libdshowcapture/external/capture-device-support/Library/win/EGAVHIDImplementation.cpp
libdshowcapture/external/capture-device-support/SampleCode/DriverInterface.cpp)
source_group(
"libdshowcapture\\Source Files"
FILES libdshowcapture/source/capture-filter.cpp
libdshowcapture/source/output-filter.cpp
libdshowcapture/source/dshowcapture.cpp
libdshowcapture/source/dshowencode.cpp
libdshowcapture/source/device.cpp
libdshowcapture/source/device-vendor.cpp
libdshowcapture/source/encoder.cpp
libdshowcapture/source/dshow-base.cpp
libdshowcapture/source/dshow-demux.cpp
libdshowcapture/source/dshow-enum.cpp
libdshowcapture/source/dshow-formats.cpp
libdshowcapture/source/dshow-media-type.cpp
libdshowcapture/source/dshow-encoded-device.cpp
libdshowcapture/source/log.cpp)
source_group(
"libdshowcapture\\Header Files"
FILES libdshowcapture/dshowcapture.hpp
libdshowcapture/source/capture-filter.hpp
libdshowcapture/source/output-filter.hpp
libdshowcapture/source/device.hpp
libdshowcapture/source/encoder.hpp
libdshowcapture/source/dshow-base.hpp
libdshowcapture/source/dshow-demux.hpp
libdshowcapture/source/dshow-device-defs.hpp
libdshowcapture/source/dshow-enum.hpp
libdshowcapture/source/dshow-formats.hpp
libdshowcapture/source/dshow-media-type.hpp
libdshowcapture/source/log.hpp
libdshowcapture/source/external/IVideoCaptureFilter.h)
set_target_properties(win-dshow PROPERTIES FOLDER "plugins/win-dshow")
setup_plugin_target(win-dshow)
if(ENABLE_VIRTUALCAM AND VIRTUALCAM_AVAILABLE)
target_sources(win-dshow PRIVATE tiny-nv12-scale.c tiny-nv12-scale.h shared-memory-queue.c shared-memory-queue.h
virtualcam.c)
FFmpeg::avutil
strmiids
winmm)
if(TARGET OBS::virtualcam AND TARGET OBS::virtualcam-guid)
target_sources(win-dshow PRIVATE virtualcam.c)
target_link_libraries(win-dshow PRIVATE OBS::virtualcam-interface OBS::virtualcam-guid)
target_compile_definitions(win-dshow PRIVATE VIRTUALCAM_AVAILABLE)
target_include_directories(win-dshow PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-guid.h.in ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h)
target_sources(win-dshow PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h)
configure_file(virtualcam-install.bat.in "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat")
configure_file(virtualcam-uninstall.bat.in "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat")
add_target_resource(win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat" "obs-plugins/win-dshow/")
add_target_resource(win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat" "obs-plugins/win-dshow/")
add_subdirectory(virtualcam-module)
add_dependencies(win-dshow obs-virtualcam-module)
endif()
# cmake-format: off
set_target_properties_obs(win-dshow PROPERTIES FOLDER plugins/win-dshow PREFIX "")
# cmake-format: on
+216
View File
@@ -0,0 +1,216 @@
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/dshowcapture.hpp")
obs_status(FATAL_ERROR "libdshowcapture submodule not found! Please fetch submodules. win-dshow plugin disabled.")
return()
endif()
option(ENABLE_VIRTUALCAM "Enable building with Virtual Camera (Windows)" ON)
if(NOT ENABLE_VIRTUALCAM)
obs_status(DISABLED "Windows Virtual Camera")
endif()
if(ENABLE_VIRTUALCAM AND NOT VIRTUALCAM_GUID)
set(VIRTUALCAM_GUID
""
CACHE STRING "Virtual Camera GUID" FORCE)
mark_as_advanced(VIRTUALCAM_GUID)
endif()
project(win-dshow)
find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil)
add_library(win-dshow MODULE)
add_library(OBS::dshow ALIAS win-dshow)
target_sources(win-dshow PRIVATE encode-dstr.hpp win-dshow.cpp win-dshow-encoder.cpp dshow-plugin.cpp ffmpeg-decode.c
ffmpeg-decode.h)
add_library(libdshowcapture-external INTERFACE)
add_library(libdshowcapture INTERFACE)
add_library(OBS::libdshowcapture-external ALIAS libdshowcapture-external)
add_library(OBS::libdshowcapture ALIAS libdshowcapture)
target_sources(
libdshowcapture-external
INTERFACE libdshowcapture/external/capture-device-support/Library/EGAVResult.cpp
libdshowcapture/external/capture-device-support/Library/ElgatoUVCDevice.cpp
libdshowcapture/external/capture-device-support/Library/win/EGAVHIDImplementation.cpp
libdshowcapture/external/capture-device-support/SampleCode/DriverInterface.cpp)
target_sources(
libdshowcapture
INTERFACE libdshowcapture/dshowcapture.hpp
libdshowcapture/source/capture-filter.cpp
libdshowcapture/source/capture-filter.hpp
libdshowcapture/source/output-filter.cpp
libdshowcapture/source/output-filter.hpp
libdshowcapture/source/dshowcapture.cpp
libdshowcapture/source/dshowencode.cpp
libdshowcapture/source/device.cpp
libdshowcapture/source/device.hpp
libdshowcapture/source/device-vendor.cpp
libdshowcapture/source/encoder.cpp
libdshowcapture/source/encoder.hpp
libdshowcapture/source/dshow-base.cpp
libdshowcapture/source/dshow-base.hpp
libdshowcapture/source/dshow-demux.cpp
libdshowcapture/source/dshow-demux.hpp
libdshowcapture/source/dshow-device-defs.hpp
libdshowcapture/source/dshow-enum.cpp
libdshowcapture/source/dshow-enum.hpp
libdshowcapture/source/dshow-formats.cpp
libdshowcapture/source/dshow-formats.hpp
libdshowcapture/source/dshow-media-type.cpp
libdshowcapture/source/dshow-encoded-device.cpp
libdshowcapture/source/dshow-media-type.hpp
libdshowcapture/source/log.cpp
libdshowcapture/source/log.hpp
libdshowcapture/source/external/IVideoCaptureFilter.h)
target_include_directories(
libdshowcapture INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture
${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/external/capture-device-support/Library)
target_compile_definitions(libdshowcapture-external INTERFACE _UP_WINDOWS=1)
target_compile_definitions(libdshowcapture INTERFACE _UP_WINDOWS=1)
target_compile_options(libdshowcapture-external INTERFACE /wd4018)
set(MODULE_DESCRIPTION "OBS DirectShow module")
configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in win-dshow.rc)
target_sources(win-dshow PRIVATE win-dshow.rc)
target_compile_definitions(win-dshow PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS
OBS_LEGACY)
set(VIRTUALCAM_AVAILABLE OFF)
if(ENABLE_VIRTUALCAM)
if(VIRTUALCAM_GUID STREQUAL "")
obs_status(WARNING "Windows Virtual Camera - GUID not set. Specify as 'VIRTUALCAM_GUID' to enable.")
else()
set(INVALID_GUID ON)
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_AVAILABLE ON)
set(INVALID_GUID OFF)
endif()
endif()
endif()
endif()
if(INVALID_GUID)
obs_status(WARNING "Windows Virtual Camera - invalid GUID supplied")
endif()
endif()
target_link_libraries(
win-dshow
PRIVATE OBS::libobs
OBS::w32-pthreads
OBS::libdshowcapture-external
OBS::libdshowcapture
setupapi
strmiids
ksuser
winmm
wmcodecdspuuid
FFmpeg::avcodec
FFmpeg::avutil)
source_group(
"libdshowcapture-external\\Source Files"
FILES libdshowcapture/external/capture-device-support/Library/EGAVResult.cpp
libdshowcapture/external/capture-device-support/Library/ElgatoUVCDevice.cpp
libdshowcapture/external/capture-device-support/Library/win/EGAVHIDImplementation.cpp
libdshowcapture/external/capture-device-support/SampleCode/DriverInterface.cpp)
source_group(
"libdshowcapture\\Source Files"
FILES libdshowcapture/source/capture-filter.cpp
libdshowcapture/source/output-filter.cpp
libdshowcapture/source/dshowcapture.cpp
libdshowcapture/source/dshowencode.cpp
libdshowcapture/source/device.cpp
libdshowcapture/source/device-vendor.cpp
libdshowcapture/source/encoder.cpp
libdshowcapture/source/dshow-base.cpp
libdshowcapture/source/dshow-demux.cpp
libdshowcapture/source/dshow-enum.cpp
libdshowcapture/source/dshow-formats.cpp
libdshowcapture/source/dshow-media-type.cpp
libdshowcapture/source/dshow-encoded-device.cpp
libdshowcapture/source/log.cpp)
source_group(
"libdshowcapture\\Header Files"
FILES libdshowcapture/dshowcapture.hpp
libdshowcapture/source/capture-filter.hpp
libdshowcapture/source/output-filter.hpp
libdshowcapture/source/device.hpp
libdshowcapture/source/encoder.hpp
libdshowcapture/source/dshow-base.hpp
libdshowcapture/source/dshow-demux.hpp
libdshowcapture/source/dshow-device-defs.hpp
libdshowcapture/source/dshow-enum.hpp
libdshowcapture/source/dshow-formats.hpp
libdshowcapture/source/dshow-media-type.hpp
libdshowcapture/source/log.hpp
libdshowcapture/source/external/IVideoCaptureFilter.h)
set_target_properties(win-dshow PROPERTIES FOLDER "plugins/win-dshow")
setup_plugin_target(win-dshow)
if(ENABLE_VIRTUALCAM AND VIRTUALCAM_AVAILABLE)
target_sources(win-dshow PRIVATE tiny-nv12-scale.c tiny-nv12-scale.h shared-memory-queue.c shared-memory-queue.h
virtualcam.c)
target_compile_definitions(win-dshow PRIVATE VIRTUALCAM_AVAILABLE)
target_include_directories(win-dshow PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-guid.h.in ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h)
target_sources(win-dshow PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h)
configure_file(virtualcam-module/virtualcam-install.bat.in "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat")
configure_file(virtualcam-module/virtualcam-uninstall.bat.in "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat")
add_target_resource(win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat" "obs-plugins/win-dshow/")
add_target_resource(win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat" "obs-plugins/win-dshow/")
add_subdirectory(virtualcam-module)
endif()
@@ -0,0 +1,56 @@
add_library(libdshowcapture INTERFACE)
add_library(OBS::libdshowcapture ALIAS libdshowcapture)
target_sources(
libdshowcapture
INTERFACE libdshowcapture/dshowcapture.hpp
libdshowcapture/source/capture-filter.cpp
libdshowcapture/source/capture-filter.hpp
libdshowcapture/source/device-vendor.cpp
libdshowcapture/source/device.cpp
libdshowcapture/source/device.hpp
libdshowcapture/source/dshow-base.cpp
libdshowcapture/source/dshow-base.hpp
libdshowcapture/source/dshow-demux.cpp
libdshowcapture/source/dshow-demux.hpp
libdshowcapture/source/dshow-device-defs.hpp
libdshowcapture/source/dshow-encoded-device.cpp
libdshowcapture/source/dshow-enum.cpp
libdshowcapture/source/dshow-enum.hpp
libdshowcapture/source/dshow-formats.cpp
libdshowcapture/source/dshow-formats.hpp
libdshowcapture/source/dshow-media-type.cpp
libdshowcapture/source/dshow-media-type.hpp
libdshowcapture/source/dshowcapture.cpp
libdshowcapture/source/dshowencode.cpp
libdshowcapture/source/encoder.cpp
libdshowcapture/source/encoder.hpp
libdshowcapture/source/external/IVideoCaptureFilter.h
libdshowcapture/source/log.cpp
libdshowcapture/source/log.hpp
libdshowcapture/source/output-filter.cpp
libdshowcapture/source/output-filter.hpp
libdshowcapture/external/capture-device-support/Library/EGAVResult.cpp
libdshowcapture/external/capture-device-support/Library/ElgatoUVCDevice.cpp
libdshowcapture/external/capture-device-support/Library/win/EGAVHIDImplementation.cpp
libdshowcapture/external/capture-device-support/SampleCode/DriverInterface.cpp)
target_include_directories(
libdshowcapture INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture"
"${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/external/capture-device-support/Library")
target_compile_definitions(libdshowcapture INTERFACE _UP_WINDOWS=1)
target_compile_options(libdshowcapture INTERFACE /wd4018)
get_target_property(target_sources libdshowcapture INTERFACE_SOURCES)
set(target_headers ${target_sources})
set(target_external_sources ${target_sources})
list(FILTER target_external_sources INCLUDE REGEX ".+external/.+/.+\\.cpp")
list(FILTER target_sources EXCLUDE REGEX ".+external/.+/.+\\.cpp")
list(FILTER target_sources INCLUDE REGEX ".*\\.(m|c[cp]?p?|swift)")
list(FILTER target_headers INCLUDE REGEX ".*\\.h(pp)?")
source_group("libdshowcapture-external\\Source Files" FILES ${target_external_sources})
source_group("libdshowcapture\\Source Files" FILES ${target_sources})
source_group("libdshowcapture\\Header Files" FILES ${target_headers})
@@ -0,0 +1,24 @@
1 VERSIONINFO
FILEVERSION ${OBS_VERSION_MAJOR},${OBS_VERSION_MINOR},${OBS_VERSION_PATCH},0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904B0"
BEGIN
VALUE "CompanyName", "${OBS_COMPANY_NAME}"
VALUE "FileDescription", "OBS DirectShow module"
VALUE "FileVersion", "${OBS_VERSION_CANONICAL}"
VALUE "ProductName", "${OBS_PRODUCT_NAME}"
VALUE "ProductVersion", "${OBS_VERSION_CANONICAL}"
VALUE "Comments", "${OBS_COMMENTS}"
VALUE "LegalCopyright", "${OBS_LEGAL_COPYRIGHT}"
VALUE "InternalName", "win-dshow"
VALUE "OriginalFilename", "win-dshow"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409, 0x04B0
END
END
@@ -1,59 +1,97 @@
cmake_minimum_required(VERSION 3.5)
project(obs-virtualcam-module)
cmake_minimum_required(VERSION 3.24...3.25)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_output_suffix "64")
else()
set(_output_suffix "32")
if(OBS_CMAKE_VERSION VERSION_GREATER_EQUAL 3.0.0)
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)
# cmake-format: off
set(VIRTUALCAM_GUID "" CACHE STRING "Virtual Camera GUID" FORCE)
mark_as_advanced(VIRTUALCAM_GUID)
# cmake-format: on
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()
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(_virtualcam INTERFACE)
configure_file(cmake/windows/obs-module.rc.in virtualcam-module.rc)
target_sources(_virtualcam INTERFACE placeholder.cpp sleepto.c sleepto.h virtualcam-filter.cpp virtualcam-filter.hpp
virtualcam-module.cpp)
target_include_directories(_virtualcam INTERFACE "${CMAKE_CURRENT_BINARY_DIR}")
target_compile_definitions(_virtualcam INTERFACE VIRTUALCAM_AVAILABLE)
target_compile_options(_virtualcam INTERFACE $<IF:$<CONFIG:Debug>,/MTd,/MT>)
target_link_libraries(
_virtualcam
INTERFACE OBS::virtualcam-interface
OBS::virtualcam-guid
OBS::libdshowcapture
OBS::winhandle
gdiplus
strmiids
winmm)
endif()
legacy_check()
add_library(obs-virtualcam-module MODULE)
add_library(OBS::virtualcam-module ALIAS obs-virtualcam-module)
add_library(OBS::virtualcam ALIAS obs-virtualcam-module)
target_sources(
obs-virtualcam-module
PRIVATE sleepto.c
sleepto.h
placeholder.cpp
virtualcam-module.cpp
virtualcam-filter.cpp
virtualcam-filter.hpp
virtualcam-module.rc
../shared-memory-queue.c
../shared-memory-queue.h
../tiny-nv12-scale.c
../tiny-nv12-scale.h)
target_sources(obs-virtualcam-module PRIVATE cmake/windows/virtualcam-module64.def)
target_link_libraries(obs-virtualcam-module PRIVATE _virtualcam)
target_include_directories(obs-virtualcam-module PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
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")
set(MODULE_DESCRIPTION "OBS Virtual Camera output module")
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")
configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in virtualcam-module.rc)
include(cmake/32bit.cmake)
target_sources(obs-virtualcam-module PRIVATE virtualcam-module.rc)
target_link_libraries(obs-virtualcam-module PRIVATE OBS::libdshowcapture OBS::libdshowcapture-external setupapi winmm
strmiids gdiplus)
target_link_options(obs-virtualcam-module PRIVATE "LINKER:/ignore:4104")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-module.def.in ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def)
target_sources(obs-virtualcam-module PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def)
target_include_directories(obs-virtualcam-module PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../config)
target_compile_definitions(obs-virtualcam-module PRIVATE VIRTUALCAM_AVAILABLE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
_CRT_NONSTDC_NO_WARNINGS)
if(MSVC)
target_compile_options(obs-virtualcam-module PRIVATE "$<IF:$<CONFIG:Debug>,/MTd,/MT>")
add_target_resource(win-dshow "$<TARGET_PDB_FILE:obs-virtualcam-module>" "obs-plugins/win-dshow/" OPTIONAL)
endif()
set_target_properties(obs-virtualcam-module PROPERTIES FOLDER "plugins/win-dshow")
set_target_properties(obs-virtualcam-module PROPERTIES OUTPUT_NAME "obs-virtualcam-module${_output_suffix}")
add_target_resource(win-dshow "$<TARGET_FILE:obs-virtualcam-module>" "obs-plugins/win-dshow/")
# cmake-format: off
set_target_properties_obs(obs-virtualcam-module PROPERTIES FOLDER plugins/win-dshow OUTPUT_NAME obs-virtualcam-module64)
# cmake-format: on
@@ -0,0 +1,49 @@
option(ENABLE_VIRTUALCAM "Enable Windows Virtual Camera" ON)
if(NOT ENABLE_VIRTUALCAM)
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.")
return()
else()
set(VALID_GUID FALSE)
check_uuid(${VIRTUALCAM_GUID} VALID_GUID)
if(NOT VALID_GUID)
message(WARNING "Invalid Virtual Camera GUID set.")
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()
add_library(obs-virtualcam-module MODULE)
add_library(OBS::virtualcam ALIAS obs-virtualcam-module)
target_sources(obs-virtualcam-module PRIVATE cmake/windows/virtualcam-module32.def)
target_link_libraries(obs-virtualcam-module PRIVATE _virtualcam)
set_property(TARGET obs-virtualcam-module PROPERTY OUTPUT_NAME obs-virtualcam-module32)
@@ -0,0 +1,5 @@
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 32-bit obs-virtualcam")
@@ -0,0 +1,60 @@
cmake_minimum_required(VERSION 3.5)
project(obs-virtualcam-module)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_output_suffix "64")
else()
set(_output_suffix "32")
endif()
add_library(obs-virtualcam-module MODULE)
add_library(OBS::virtualcam-module ALIAS obs-virtualcam-module)
target_sources(
obs-virtualcam-module
PRIVATE sleepto.c
sleepto.h
placeholder.cpp
virtualcam-module.cpp
virtualcam-filter.cpp
virtualcam-filter.hpp
virtualcam-module.rc
../shared-memory-queue.c
../shared-memory-queue.h
../tiny-nv12-scale.c
../tiny-nv12-scale.h)
target_include_directories(obs-virtualcam-module PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
set(MODULE_DESCRIPTION "OBS Virtual Camera output module")
configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in virtualcam-module.rc)
target_sources(obs-virtualcam-module PRIVATE virtualcam-module.rc)
target_link_libraries(obs-virtualcam-module PRIVATE OBS::libdshowcapture OBS::libdshowcapture-external setupapi winmm
strmiids gdiplus)
target_link_options(obs-virtualcam-module PRIVATE "LINKER:/ignore:4104")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-module.def.in ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def)
target_sources(obs-virtualcam-module PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def)
target_include_directories(obs-virtualcam-module PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../config
${CMAKE_SOURCE_DIR}/libobs)
target_compile_definitions(obs-virtualcam-module PRIVATE VIRTUALCAM_AVAILABLE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
_CRT_NONSTDC_NO_WARNINGS OBS_LEGACY)
if(MSVC)
target_compile_options(obs-virtualcam-module PRIVATE "$<IF:$<CONFIG:Debug>,/MTd,/MT>")
add_target_resource(win-dshow "$<TARGET_PDB_FILE:obs-virtualcam-module>" "obs-plugins/win-dshow/" OPTIONAL)
endif()
set_target_properties(obs-virtualcam-module PROPERTIES FOLDER "plugins/win-dshow")
set_target_properties(obs-virtualcam-module PROPERTIES OUTPUT_NAME "obs-virtualcam-module${_output_suffix}")
add_target_resource(win-dshow "$<TARGET_FILE:obs-virtualcam-module>" "obs-plugins/win-dshow/")
@@ -0,0 +1,24 @@
1 VERSIONINFO
FILEVERSION ${OBS_VERSION_MAJOR},${OBS_VERSION_MINOR},${OBS_VERSION_PATCH},0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904B0"
BEGIN
VALUE "CompanyName", "${OBS_COMPANY_NAME}"
VALUE "FileDescription", "OBS Virtual Camera output module"
VALUE "FileVersion", "${OBS_VERSION_CANONICAL}"
VALUE "ProductName", "${OBS_PRODUCT_NAME}"
VALUE "ProductVersion", "${OBS_VERSION_CANONICAL}"
VALUE "Comments", "${OBS_COMMENTS}"
VALUE "LegalCopyright", "${OBS_LEGAL_COPYRIGHT}"
VALUE "InternalName", "${PROJECT_NAME}"
VALUE "OriginalFilename", "${PROJECT_NAME}"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409, 0x04B0
END
END
@@ -0,0 +1,8 @@
LIBRARY obs-virtualcam-module32.dll
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllInstall PRIVATE
@@ -0,0 +1,8 @@
LIBRARY obs-virtualcam-module64.dll
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllInstall PRIVATE
@@ -3,12 +3,22 @@
#include <windows.h>
#include <cstdint>
#include <thread>
#ifdef OBS_LEGACY
#include "../shared-memory-queue.h"
#include "../tiny-nv12-scale.h"
#include "../libdshowcapture/source/output-filter.hpp"
#include "../libdshowcapture/source/dshow-formats.hpp"
#include "../../../libobs/util/windows/WinHandle.hpp"
#include "../../../libobs/util/threading-windows.h"
#else
#include <shared-memory-queue.h>
#include <tiny-nv12-scale.h>
#include <libdshowcapture/source/output-filter.hpp>
#include <libdshowcapture/source/dshow-formats.hpp>
#include <util/windows/WinHandle.hpp>
#include <util/threading-windows.h>
#endif
typedef struct {
int cx;