| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- 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 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/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/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)
- 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)
- set(VIRTUALCAM_AVAILABLE OFF)
- 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()
- target_link_libraries(
- win-dshow
- PRIVATE OBS::libobs
- OBS::w32-pthreads
- OBS::libdshowcapture
- setupapi
- strmiids
- ksuser
- winmm
- wmcodecdspuuid
- FFmpeg::avcodec
- FFmpeg::avutil)
- file(GLOB _LIBOBS_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.c
- ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.cpp)
- file(GLOB _LIBOBS_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.h
- ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.hpp)
- source_group("libdshowcapture\\Source Files" FILES ${_LIBOBS_SOURCE_FILES})
- source_group("libdshowcapture\\Header Files" FILES ${_LIBOBS_HEADER_FILES})
- 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-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)
- endif()
|