CMakeLists.txt 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/dshowcapture.hpp")
  2. obs_status(
  3. FATAL_ERROR
  4. "libdshowcapture submodule not found! Please fetch submodules. win-dshow plugin disabled."
  5. )
  6. return()
  7. endif()
  8. option(ENABLE_VIRTUALCAM "Enable building with Virtual Camera (Windows)" ON)
  9. if(NOT ENABLE_VIRTUALCAM)
  10. obs_status(DISABLED "Windows Virtual Camera")
  11. endif()
  12. if(ENABLE_VIRTUALCAM AND NOT VIRTUALCAM_GUID)
  13. set(VIRTUALCAM_GUID
  14. ""
  15. CACHE STRING "Virtual Camera GUID" FORCE)
  16. mark_as_advanced(VIRTUALCAM_GUID)
  17. endif()
  18. project(win-dshow)
  19. find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil)
  20. add_library(win-dshow MODULE)
  21. add_library(OBS::dshow ALIAS win-dshow)
  22. target_sources(
  23. win-dshow PRIVATE encode-dstr.hpp win-dshow.cpp win-dshow-encoder.cpp
  24. dshow-plugin.cpp ffmpeg-decode.c ffmpeg-decode.h)
  25. add_library(libdshowcapture INTERFACE)
  26. add_library(OBS::libdshowcapture ALIAS libdshowcapture)
  27. target_sources(
  28. libdshowcapture
  29. INTERFACE libdshowcapture/dshowcapture.hpp
  30. libdshowcapture/source/capture-filter.cpp
  31. libdshowcapture/source/capture-filter.hpp
  32. libdshowcapture/source/output-filter.cpp
  33. libdshowcapture/source/output-filter.hpp
  34. libdshowcapture/source/dshowcapture.cpp
  35. libdshowcapture/source/dshowencode.cpp
  36. libdshowcapture/source/device.cpp
  37. libdshowcapture/source/device.hpp
  38. libdshowcapture/source/encoder.cpp
  39. libdshowcapture/source/encoder.hpp
  40. libdshowcapture/source/dshow-base.cpp
  41. libdshowcapture/source/dshow-base.hpp
  42. libdshowcapture/source/dshow-demux.cpp
  43. libdshowcapture/source/dshow-demux.hpp
  44. libdshowcapture/source/dshow-device-defs.hpp
  45. libdshowcapture/source/dshow-enum.cpp
  46. libdshowcapture/source/dshow-enum.hpp
  47. libdshowcapture/source/dshow-formats.cpp
  48. libdshowcapture/source/dshow-formats.hpp
  49. libdshowcapture/source/dshow-media-type.cpp
  50. libdshowcapture/source/dshow-encoded-device.cpp
  51. libdshowcapture/source/dshow-media-type.hpp
  52. libdshowcapture/source/log.cpp
  53. libdshowcapture/source/log.hpp
  54. libdshowcapture/source/external/IVideoCaptureFilter.h)
  55. target_include_directories(
  56. libdshowcapture INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture)
  57. set(MODULE_DESCRIPTION "OBS DirectShow module")
  58. configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
  59. win-dshow.rc)
  60. target_sources(win-dshow PRIVATE win-dshow.rc)
  61. target_compile_definitions(
  62. win-dshow PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
  63. _CRT_NONSTDC_NO_WARNINGS)
  64. set(VIRTUALCAM_AVAILABLE OFF)
  65. if(VIRTUALCAM_GUID STREQUAL "")
  66. obs_status(
  67. WARNING
  68. "Windows Virtual Camera - GUID not set - specify as 'VIRTUALCAM_GUID' to enable."
  69. )
  70. else()
  71. set(INVALID_GUID ON)
  72. string(REPLACE "-" ";" GUID_VALS ${VIRTUALCAM_GUID})
  73. list(LENGTH GUID_VALS GUID_VAL_COUNT)
  74. if(GUID_VAL_COUNT EQUAL 5)
  75. string(REPLACE ";" "0" GUID_HEX ${GUID_VALS})
  76. string(REGEX MATCH "[0-9a-fA-F]+" GUID_ACTUAL_HEX ${GUID_HEX})
  77. if(GUID_ACTUAL_HEX STREQUAL GUID_HEX)
  78. list(GET GUID_VALS 0 GUID_VALS_DATA1)
  79. list(GET GUID_VALS 1 GUID_VALS_DATA2)
  80. list(GET GUID_VALS 2 GUID_VALS_DATA3)
  81. list(GET GUID_VALS 3 GUID_VALS_DATA4)
  82. list(GET GUID_VALS 4 GUID_VALS_DATA5)
  83. string(LENGTH ${GUID_VALS_DATA1} GUID_VALS_DATA1_LENGTH)
  84. string(LENGTH ${GUID_VALS_DATA2} GUID_VALS_DATA2_LENGTH)
  85. string(LENGTH ${GUID_VALS_DATA3} GUID_VALS_DATA3_LENGTH)
  86. string(LENGTH ${GUID_VALS_DATA4} GUID_VALS_DATA4_LENGTH)
  87. string(LENGTH ${GUID_VALS_DATA5} GUID_VALS_DATA5_LENGTH)
  88. if(GUID_VALS_DATA1_LENGTH EQUAL 8
  89. AND GUID_VALS_DATA2_LENGTH EQUAL 4
  90. AND GUID_VALS_DATA3_LENGTH EQUAL 4
  91. AND GUID_VALS_DATA4_LENGTH EQUAL 4
  92. AND GUID_VALS_DATA5_LENGTH EQUAL 12)
  93. set(GUID_VAL01 ${GUID_VALS_DATA1})
  94. set(GUID_VAL02 ${GUID_VALS_DATA2})
  95. set(GUID_VAL03 ${GUID_VALS_DATA3})
  96. string(SUBSTRING ${GUID_VALS_DATA4} 0 2 GUID_VAL04)
  97. string(SUBSTRING ${GUID_VALS_DATA4} 2 2 GUID_VAL05)
  98. string(SUBSTRING ${GUID_VALS_DATA5} 0 2 GUID_VAL06)
  99. string(SUBSTRING ${GUID_VALS_DATA5} 2 2 GUID_VAL07)
  100. string(SUBSTRING ${GUID_VALS_DATA5} 4 2 GUID_VAL08)
  101. string(SUBSTRING ${GUID_VALS_DATA5} 6 2 GUID_VAL09)
  102. string(SUBSTRING ${GUID_VALS_DATA5} 8 2 GUID_VAL10)
  103. string(SUBSTRING ${GUID_VALS_DATA5} 10 2 GUID_VAL11)
  104. set(VIRTUALCAM_AVAILABLE ON)
  105. set(INVALID_GUID OFF)
  106. endif()
  107. endif()
  108. endif()
  109. endif()
  110. if(INVALID_GUID)
  111. obs_status(WARNING "Windows Virtual Camera - invalid GUID supplied")
  112. endif()
  113. target_link_libraries(
  114. win-dshow
  115. PRIVATE OBS::libobs
  116. OBS::w32-pthreads
  117. OBS::libdshowcapture
  118. setupapi
  119. strmiids
  120. ksuser
  121. winmm
  122. wmcodecdspuuid
  123. FFmpeg::avcodec
  124. FFmpeg::avutil)
  125. file(GLOB _LIBOBS_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.c
  126. ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.cpp)
  127. file(GLOB _LIBOBS_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.h
  128. ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.hpp)
  129. source_group("libdshowcapture\\Source Files" FILES ${_LIBOBS_SOURCE_FILES})
  130. source_group("libdshowcapture\\Header Files" FILES ${_LIBOBS_HEADER_FILES})
  131. set_target_properties(win-dshow PROPERTIES FOLDER "plugins/win-dshow")
  132. setup_plugin_target(win-dshow)
  133. if(ENABLE_VIRTUALCAM AND VIRTUALCAM_AVAILABLE)
  134. target_sources(
  135. win-dshow PRIVATE tiny-nv12-scale.c tiny-nv12-scale.h shared-memory-queue.c
  136. shared-memory-queue.h virtualcam.c)
  137. target_compile_definitions(win-dshow PRIVATE VIRTUALCAM_AVAILABLE)
  138. target_include_directories(win-dshow
  139. PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config)
  140. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-guid.h.in
  141. ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h)
  142. target_sources(win-dshow
  143. PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h)
  144. configure_file(virtualcam-install.bat.in
  145. "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat")
  146. configure_file(virtualcam-uninstall.bat.in
  147. "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat")
  148. add_target_resource(
  149. win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat"
  150. "obs-plugins/win-dshow/")
  151. add_target_resource(
  152. win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat"
  153. "obs-plugins/win-dshow/")
  154. add_subdirectory(virtualcam-module)
  155. endif()