project(obs-outputs)

if(NOT DEFINED ENABLE_RTMPS)
  set(ENABLE_RTMPS
      AUTO
      CACHE STRING "Enable RTMPS support with mbedTLS" FORCE)
  set_property(CACHE ENABLE_RTMPS PROPERTY STRINGS AUTO ON OFF)
endif()

option(ENABLE_STATIC_MBEDTLS "Enable statically linking mbedTLS into binary"
       OFF)
mark_as_advanced(ENABLE_STATIC_MBEDTLS)

add_library(obs-outputs MODULE)
add_library(OBS::outputs ALIAS obs-outputs)

target_sources(
  obs-outputs
  PRIVATE obs-outputs.c
          obs-output-ver.h
          flv-mux.c
          flv-mux.h
          flv-output.c
          net-if.c
          net-if.h
          null-output.c
          rtmp-helpers.h
          rtmp-stream.c
          rtmp-stream.h
          rtmp-windows.c)

target_link_libraries(obs-outputs PRIVATE OBS::libobs)

set_target_properties(obs-outputs PROPERTIES FOLDER "plugins" PREFIX "")

if(OS_WINDOWS)
  set(MODULE_DESCRIPTION "OBS output module")
  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
                 obs-outputs.rc)

  target_sources(obs-outputs PRIVATE obs-outputs.rc)

  if(MSVC)
    target_link_libraries(obs-outputs PRIVATE OBS::w32-pthreads)
    target_link_options(obs-outputs PRIVATE "LINKER:/IGNORE:4098"
                        "LINKER:/IGNORE:4099")
  endif()

  target_link_libraries(obs-outputs PRIVATE ws2_32 winmm Iphlpapi)
endif()

if(ENABLE_RTMPS STREQUAL "AUTO" OR ENABLE_RTMPS STREQUAL "ON")
  find_package(MbedTLS)
  find_package(ZLIB)
  if(NOT MBEDTLS_FOUND OR NOT ZLIB_FOUND)
    if(ENABLE_RTMPS STREQUAL "ON")
      obs_status(FATAL_ERROR
                 "mbedTLS or zlib not found, but required for RTMPS support.")
      return()
    else()
      obs_status(
        WARNING
        "mbedTLS or zlib was not found, RTMPS will be automatically disabled.")
      target_compile_definitions(obs-outputs PRIVATE NO_CRYPTO)
    endif()
  else()
    target_sources(
      obs-outputs
      PRIVATE librtmp/amf.c
              librtmp/amf.h
              librtmp/bytes.h
              librtmp/cencode.c
              librtmp/cencode.h
              librtmp/handshake.h
              librtmp/hashswf.c
              librtmp/http.h
              librtmp/log.c
              librtmp/log.h
              librtmp/md5.c
              librtmp/md5.h
              librtmp/parseurl.c
              librtmp/rtmp.c
              librtmp/rtmp.h
              librtmp/rtmp_sys.h)

    target_compile_definitions(obs-outputs PRIVATE USE_MBEDTLS CRYPTO)

    target_link_libraries(obs-outputs PRIVATE Mbedtls::Mbedtls ZLIB::ZLIB)

    if(OS_WINDOWS)
      target_link_libraries(obs-outputs PRIVATE crypt32)

    elseif(OS_MACOS)
      find_library(FOUNDATION_FRAMEWORK Foundation)
      find_library(SECURITY_FRAMEWORK Security)
      mark_as_advanced(FOUNDATION_FRAMEWORK SECURITY_FRAMEWORK)

      target_link_libraries(obs-outputs PRIVATE ${FOUNDATION_FRAMEWORK}
                                                ${SECURITY_FRAMEWORK})
      set_target_properties(obs-outputs PROPERTIES CXX_VISIBILITY_PRESET hidden)
      set_target_properties(obs-outputs PROPERTIES C_VISIBILITY_PRESET hidden)

    elseif(OS_POSIX)
      set_target_properties(obs-outputs PROPERTIES CXX_VISIBILITY_PRESET hidden)
      set_target_properties(obs-outputs PROPERTIES C_VISIBILITY_PRESET hidden)
    endif()
  endif()
else()
  target_compile_definitions(obs-outputs PRIVATE NO_CRYPTO)
endif()

find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
  pkg_check_modules(FTL QUIET libftl)
endif()

if(FTL_FOUND)
  find_package(CURL REQUIRED)
  obs_status(ENABLED "ftl outputs (system ftl-sdk)")

  target_sources(obs-outputs PRIVATE ftl-stream.c)

  target_include_directories(obs-outputs PRIVATE ${FTL_INCLUDE_DIRS})

  target_link_libraries(obs-outputs PRIVATE ${FTL_LIBRARIES} CURL::libcurl)

  target_compile_features(obs-outputs PRIVATE c_std_11)

  target_compile_definitions(obs-outputs PRIVATE FTL_FOUND)

elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/CMakeLists.txt")
  find_package(CURL REQUIRED)
  obs_status(ENABLED "ftl ouputs (bundled ftl-sdk)")

  target_compile_definitions(obs-outputs PRIVATE FTL_STATIC_COMPILE)

  target_compile_features(obs-outputs PRIVATE c_std_11)

  target_link_libraries(obs-outputs PRIVATE Jansson::Jansson CURL::libcurl)

  target_sources(
    obs-outputs
    PRIVATE ftl-stream.c
            ftl-sdk/libftl/ftl.h
            ftl-sdk/libftl/ftl_private.h
            ftl-sdk/libftl/hmac/hmac.c
            ftl-sdk/libftl/hmac/hmac.h
            ftl-sdk/libftl/hmac/sha2.c
            ftl-sdk/libftl/hmac/sha2.h
            ftl-sdk/libftl/ftl-sdk.c
            ftl-sdk/libftl/handshake.c
            ftl-sdk/libftl/ingest.c
            ftl-sdk/libftl/ftl_helpers.c
            ftl-sdk/libftl/media.c
            ftl-sdk/libftl/gettimeofday/gettimeofday.c
            ftl-sdk/libftl/logging.c)

  target_include_directories(obs-outputs
                             PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl)

  if(OS_WINDOWS)
    target_sources(
      obs-outputs
      PRIVATE ftl-sdk/libftl/gettimeofday/gettimeofday.c
              ftl-sdk/libftl/gettimeofday/gettimeofday.h
              ftl-sdk/libftl/win32/socket.c
              ftl-sdk/libftl/win32/threads.c
              ftl-sdk/libftl/win32/threads.h)

    target_include_directories(
      obs-outputs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl/win32)
  elseif(OS_POSIX)
    target_sources(
      obs-outputs
      PRIVATE ftl-sdk/libftl/posix/socket.c ftl-sdk/libftl/posix/threads.c
              ftl-sdk/libftl/posix/threads.h)

    target_include_directories(
      obs-outputs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl/posix)
  endif()

  target_compile_definitions(obs-outputs PRIVATE FTL_FOUND)
endif()

setup_plugin_target(obs-outputs)
