mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 10:40:05 +08:00
commit
76df34de81
185
3rdpart/CMakeLists.txt
Normal file
185
3rdpart/CMakeLists.txt
Normal file
@ -0,0 +1,185 @@
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
|
||||
# jsoncpp
|
||||
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp JSONCPP_SRC_LIST)
|
||||
add_library(jsoncpp STATIC ${JSONCPP_SRC_LIST})
|
||||
target_compile_options(jsoncpp
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_include_directories(jsoncpp
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
|
||||
|
||||
update_cached_list(MK_LINK_LIBRARIES jsoncpp)
|
||||
|
||||
##############################################################################
|
||||
|
||||
# media-server
|
||||
set(MediaServer_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/media-server")
|
||||
# TODO: 补一个函数处理各种库
|
||||
|
||||
# 添加 mov、flv 库用于 MP4 录制
|
||||
if(ENABLE_MP4)
|
||||
message(STATUS "ENABLE_MP4 defined")
|
||||
|
||||
# MOV
|
||||
set(MediaServer_MOV_ROOT ${MediaServer_ROOT}/libmov)
|
||||
aux_source_directory(${MediaServer_MOV_ROOT}/include MOV_SRC_LIST)
|
||||
aux_source_directory(${MediaServer_MOV_ROOT}/source MOV_SRC_LIST)
|
||||
add_library(mov STATIC ${MOV_SRC_LIST})
|
||||
add_library(MediaServer::mov ALIAS mov)
|
||||
target_compile_definitions(mov
|
||||
PUBLIC -DENABLE_MP4)
|
||||
target_compile_options(mov
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_include_directories(mov
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${MediaServer_MOV_ROOT}/include>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${MediaServer_MOV_ROOT}/include>")
|
||||
|
||||
# FLV
|
||||
set(MediaServer_FLV_ROOT ${MediaServer_ROOT}/libflv)
|
||||
aux_source_directory(${MediaServer_FLV_ROOT}/include FLV_SRC_LIST)
|
||||
aux_source_directory(${MediaServer_FLV_ROOT}/source FLV_SRC_LIST)
|
||||
add_library(flv STATIC ${FLV_SRC_LIST})
|
||||
add_library(MediaServer::flv ALIAS flv)
|
||||
target_compile_options(flv
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_include_directories(flv
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${MediaServer_FLV_ROOT}/include>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${MediaServer_FLV_ROOT}/include>")
|
||||
|
||||
update_cached_list(MK_LINK_LIBRARIES
|
||||
MediaServer::flv MediaServer::mov)
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS
|
||||
ENABLE_MP4)
|
||||
endif()
|
||||
|
||||
# 添加 mpeg 用于支持 ts 生成
|
||||
if(ENABLE_RTPPROXY OR ENABLE_HLS)
|
||||
# mpeg
|
||||
set(MediaServer_MPEG_ROOT ${MediaServer_ROOT}/libmpeg)
|
||||
aux_source_directory(${MediaServer_MPEG_ROOT}/include MPEG_SRC_LIST)
|
||||
aux_source_directory(${MediaServer_MPEG_ROOT}/source MPEG_SRC_LIST)
|
||||
add_library(mpeg STATIC ${MPEG_SRC_LIST})
|
||||
add_library(MediaServer::mpeg ALIAS mpeg)
|
||||
target_compile_options(mpeg
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_include_directories(mpeg
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${MediaServer_MPEG_ROOT}/include>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${MediaServer_MPEG_ROOT}/include>")
|
||||
|
||||
update_cached_list(MK_LINK_LIBRARIES MediaServer::mpeg)
|
||||
if(ENABLE_RTPPROXY)
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_RTPPROXY)
|
||||
endif()
|
||||
if(ENABLE_HLS)
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_HLS)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
##############################################################################
|
||||
|
||||
# toolkit
|
||||
# TODO: 改造 toolkit 以便直接引用
|
||||
|
||||
include(CheckStructHasMember)
|
||||
include(CheckSymbolExists)
|
||||
|
||||
# 检查 sendmmsg 相关依赖并设置对应的宏, 配置 _GNU_SOURCE 以启用 GNU 扩展特性
|
||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
|
||||
check_struct_has_member("struct mmsghdr" msg_hdr sys/socket.h HAVE_MMSG_HDR)
|
||||
check_symbol_exists(sendmmsg sys/socket.h HAVE_SENDMMSG_API)
|
||||
check_symbol_exists(recvmmsg sys/socket.h HAVE_RECVMMSG_API)
|
||||
|
||||
set(COMPILE_DEFINITIONS)
|
||||
if(HAVE_MMSG_HDR)
|
||||
list(APPEND COMPILE_DEFINITIONS HAVE_MMSG_HDR)
|
||||
endif()
|
||||
if(HAVE_SENDMMSG_API)
|
||||
list(APPEND COMPILE_DEFINITIONS HAVE_SENDMMSG_API)
|
||||
endif()
|
||||
if(HAVE_RECVMMSG_API)
|
||||
list(APPEND COMPILE_DEFINITIONS HAVE_RECVMMSG_API)
|
||||
endif()
|
||||
|
||||
set(ToolKit_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/ZLToolKit)
|
||||
# 收集源代码
|
||||
file(GLOB ToolKit_SRC_LIST
|
||||
${ToolKit_ROOT}/src/*/*.cpp
|
||||
${ToolKit_ROOT}/src/*/*.h
|
||||
${ToolKit_ROOT}/src/*/*.c)
|
||||
if(IOS)
|
||||
list(APPEND ToolKit_SRC_LIST
|
||||
${ToolKit_ROOT}/Network/Socket_ios.mm)
|
||||
endif()
|
||||
|
||||
# 去除 win32 的适配代码
|
||||
if(NOT WIN32)
|
||||
list(REMOVE_ITEM ToolKit_SRC_LIST ${ToolKit_ROOT}/win32/getopt.c)
|
||||
else()
|
||||
# 防止 Windows.h 包含 Winsock.h
|
||||
list(APPEND COMPILE_DEFINITIONS
|
||||
WIN32_LEAN_AND_MEAN MP4V2_NO_STDINT_DEFS
|
||||
# 禁用警告
|
||||
_CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS)
|
||||
endif()
|
||||
|
||||
# 添加库
|
||||
add_library(zltoolkit STATIC ${ToolKit_SRC_LIST})
|
||||
add_library(ZLMediaKit::ToolKit ALIAS zltoolkit)
|
||||
target_compile_definitions(zltoolkit
|
||||
PUBLIC ${COMPILE_DEFINITIONS})
|
||||
target_compile_options(zltoolkit
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_include_directories(zltoolkit
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${ToolKit_ROOT}/src>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${ToolKit_ROOT}>/src")
|
||||
|
||||
update_cached_list(MK_LINK_LIBRARIES ZLMediaKit::ToolKit)
|
||||
|
||||
if(USE_SOLUTION_FOLDERS AND (NOT GROUP_BY_EXPLORER))
|
||||
# 在 IDE 中对文件进行分组, 源文件和头文件分开
|
||||
set_file_group(${ToolKit_ROOT}/src ${ToolKit_SRC_LIST})
|
||||
endif()
|
||||
|
||||
# 未在使用
|
||||
if(ENABLE_CXX_API)
|
||||
# 保留目录结构
|
||||
install(DIRECTORY ${ToolKit_ROOT}/
|
||||
DESTINATION ${INSTALL_PATH_INCLUDE}/ZLToolKit
|
||||
REGEX "(.*[.](md|cpp)|win32)$" EXCLUDE)
|
||||
install(TARGETS zltoolkit
|
||||
DESTINATION ${INSTALL_PATH_LIB})
|
||||
endif()
|
@ -36,5 +36,5 @@ file(GLOB JNI_src_list ${JNI_Root}/*.cpp ${JNI_Root}/*.h)
|
||||
add_library(zlmediakit_jni SHARED ${JNI_src_list})
|
||||
|
||||
#链接
|
||||
target_link_libraries(zlmediakit_jni -Wl,--start-group log z ${LINK_LIB_LIST} -Wl,--end-group)
|
||||
target_link_libraries(zlmediakit_jni -Wl,--start-group log z ${MK_LINK_LIBRARIES} -Wl,--end-group)
|
||||
|
||||
|
887
CMakeLists.txt
887
CMakeLists.txt
@ -1,126 +1,145 @@
|
||||
project(ZLMediaKit)
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
cmake_minimum_required(VERSION 3.1.3)
|
||||
include(CheckStructHasMember)
|
||||
include(CheckSymbolExists)
|
||||
|
||||
# 检查sendmmsg相关依赖并设置对应的宏
|
||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
|
||||
check_struct_has_member("struct mmsghdr" msg_hdr sys/socket.h HAVE_MMSG_HDR)
|
||||
check_symbol_exists(sendmmsg sys/socket.h HAVE_SENDMMSG_API)
|
||||
check_symbol_exists(recvmmsg sys/socket.h HAVE_RECVMMSG_API)
|
||||
# 加载自定义模块
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||
|
||||
if(HAVE_MMSG_HDR)
|
||||
add_definitions(-DHAVE_MMSG_HDR)
|
||||
endif()
|
||||
if(HAVE_SENDMMSG_API)
|
||||
add_definitions(-DHAVE_SENDMMSG_API)
|
||||
endif()
|
||||
if(HAVE_RECVMMSG_API)
|
||||
add_definitions(-DHAVE_RECVMMSG_API)
|
||||
endif()
|
||||
#使能c++11
|
||||
project(ZLMediaKit LANGUAGES C CXX)
|
||||
|
||||
# 使能 C++11
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
#加载自定义模块
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||
set(DEP_ROOT_DIR ${CMAKE_SOURCE_DIR}/3rdpart/external-${CMAKE_SYSTEM_NAME})
|
||||
if(NOT EXISTS ${DEP_ROOT_DIR})
|
||||
file(MAKE_DIRECTORY ${DEP_ROOT_DIR})
|
||||
endif()
|
||||
|
||||
find_program(CCACHE_FOUND ccache)
|
||||
if(CCACHE_FOUND)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
||||
endif(CCACHE_FOUND)
|
||||
option(ENABLE_API "Enable C API SDK" ON)
|
||||
option(ENABLE_API_STATIC_LIB "Enable mk_api static lib" OFF)
|
||||
option(ENABLE_ASAN "Enable Address Sanitize" OFF)
|
||||
option(ENABLE_CXX_API "Enable C++ API SDK" OFF)
|
||||
option(ENABLE_FAAC "Enable FAAC" OFF)
|
||||
option(ENABLE_FFMPEG "Enable FFmpeg" OFF)
|
||||
option(ENABLE_HLS "Enable HLS" ON)
|
||||
option(ENABLE_JEMALLOC_STATIC "Enable static linking to the jemalloc library" OFF)
|
||||
option(ENABLE_MEM_DEBUG "Enable Memory Debug" OFF)
|
||||
option(ENABLE_MP4 "Enable MP4" ON)
|
||||
option(ENABLE_MSVC_MT "Enable MSVC Mt/Mtd lib" ON)
|
||||
option(ENABLE_MYSQL "Enable MySQL" OFF)
|
||||
option(ENABLE_OPENSSL "Enable OpenSSL" ON)
|
||||
option(ENABLE_PLAYER "Enable Player" ON)
|
||||
option(ENABLE_RTPPROXY "Enable RTPPROXY" ON)
|
||||
option(ENABLE_SERVER "Enable Server" ON)
|
||||
option(ENABLE_SERVER_LIB "Enable server as android static library" OFF)
|
||||
option(ENABLE_SRT "Enable SRT" ON)
|
||||
option(ENABLE_TESTS "Enable Tests" ON)
|
||||
option(ENABLE_WEBRTC "Enable WebRTC" ON)
|
||||
option(ENABLE_X264 "Enable x264" OFF)
|
||||
|
||||
#add_compile_options(-D__STDC_FORMAT_MACROS)
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
add_compile_options(-D__STDC_FORMAT_MACROS)
|
||||
message(STATUS "-D__STDC_FORMAT_MACROS")
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
#set(CMAKE_BUILD_TYPE "Release")
|
||||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE "Debug")
|
||||
endif ()
|
||||
|
||||
message(STATUS "编译类型:${CMAKE_BUILD_TYPE}")
|
||||
|
||||
#设置bin和lib库目录
|
||||
set(RELEASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/release)
|
||||
|
||||
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${CMAKE_BUILD_TYPE})
|
||||
SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/linux/${CMAKE_BUILD_TYPE})
|
||||
add_compile_options(-fPIC -Wall -Wno-unused-variable -Wno-unused-value)
|
||||
INCLUDE(CheckCXXSourceCompiles)
|
||||
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/checks/atomic_check.cpp atomic_check_cpp)
|
||||
CHECK_CXX_SOURCE_COMPILES("${atomic_check_cpp}" HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||
if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||
CHECK_CXX_SOURCE_COMPILES("${atomic_check_cpp}" HAVE_CXX_ATOMICS_WITH_LIB)
|
||||
if(NOT HAVE_CXX_ATOMICS_WITH_LIB)
|
||||
message(WARNING "Compiler doesn't support std::atomic<long long>")
|
||||
else()
|
||||
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -latomic")
|
||||
endif()
|
||||
endif()
|
||||
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||||
if (CMAKE_CL_64)
|
||||
set(CL_32_64 64)
|
||||
else ()
|
||||
set(CL_32_64 32)
|
||||
endif ()
|
||||
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/windows${CL_32_64}/${CMAKE_BUILD_TYPE})
|
||||
SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/windows${CL_32_64}/${CMAKE_BUILD_TYPE})
|
||||
elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/mac/${CMAKE_BUILD_TYPE})
|
||||
SET(EXECUTABLE_OUTPUT_PATH ${RELEASE_DIR}/mac/${CMAKE_BUILD_TYPE})
|
||||
add_compile_options(-Wall -Wno-unused-variable -Wno-unused-value)
|
||||
endif ()
|
||||
|
||||
LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH})
|
||||
|
||||
#设置工程源码根目录
|
||||
set(ToolKit_Root ${CMAKE_CURRENT_SOURCE_DIR}/3rdpart/ZLToolKit/src)
|
||||
set(MediaKit_Root ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||
set(MediaServer_Root ${CMAKE_CURRENT_SOURCE_DIR}/3rdpart/media-server)
|
||||
|
||||
#设置头文件目录
|
||||
INCLUDE_DIRECTORIES(${ToolKit_Root})
|
||||
INCLUDE_DIRECTORIES(${MediaKit_Root})
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/3rdpart)
|
||||
|
||||
option(ENABLE_HLS "Enable HLS" true)
|
||||
option(ENABLE_OPENSSL "Enable OpenSSL" true)
|
||||
option(ENABLE_MYSQL "Enable MySQL" false)
|
||||
option(ENABLE_FAAC "Enable FAAC" false)
|
||||
option(ENABLE_X264 "Enable x264" false)
|
||||
option(ENABLE_MP4 "Enable MP4" true)
|
||||
option(ENABLE_RTPPROXY "Enable RTPPROXY" true)
|
||||
option(ENABLE_API "Enable C API SDK" true)
|
||||
option(ENABLE_CXX_API "Enable C++ API SDK" false)
|
||||
option(ENABLE_TESTS "Enable Tests" true)
|
||||
option(ENABLE_SERVER "Enable Server" true)
|
||||
option(ENABLE_SERVER_LIB "Enable server as android static library" false)
|
||||
option(ENABLE_MEM_DEBUG "Enable Memory Debug" false)
|
||||
option(ENABLE_ASAN "Enable Address Sanitize" false)
|
||||
option(ENABLE_WEBRTC "Enable WebRTC" true)
|
||||
option(ENABLE_PLAYER "Enable Player" true)
|
||||
option(ENABLE_FFMPEG "Enable FFmpeg" false)
|
||||
option(ENABLE_MSVC_MT "Enable MSVC Mt/Mtd lib" true)
|
||||
option(ENABLE_API_STATIC_LIB "Enable mk_api static lib" false)
|
||||
option(USE_SOLUTION_FOLDERS "Enable solution dir supported" ON)
|
||||
option(ENABLE_SRT "Enable SRT" true)
|
||||
option(ENABLE_JEMALLOC_STATIC "Enable static linking to the jemalloc library" false)
|
||||
# ----------------------------------------------------------------------------
|
||||
# Solution folders:
|
||||
# ----------------------------------------------------------------------------
|
||||
if(USE_SOLUTION_FOLDERS)
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")
|
||||
|
||||
##############################################################################
|
||||
|
||||
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE "Debug")
|
||||
endif()
|
||||
|
||||
message(STATUS "编译类型: ${CMAKE_BUILD_TYPE}")
|
||||
|
||||
# 方便排查编译问题, 需要 FORCE CACHE, 否则需要命令行设置才生效
|
||||
set(CMAKE_VERBOSE_MAKEFILE ON CACHE INTERNAL "" FORCE)
|
||||
|
||||
# TODO: include 当前目录会导致 server 编译出错, 待排除
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR OFF)
|
||||
|
||||
# 安装路径
|
||||
if(NOT CMAKE_INSTALL_PREFIX)
|
||||
if(UNIX)
|
||||
set(INSTALL_PATH_LIB lib${LIB_SUFFIX})
|
||||
set(INSTALL_PATH_INCLUDE include)
|
||||
set(INSTALL_PATH_RUNTIME bin)
|
||||
elseif(WIN32)
|
||||
# Windows 下安装到了用户主目录下?
|
||||
set(INSTALL_PATH_LIB $ENV{HOME}/${CMAKE_PROJECT_NAME}/lib)
|
||||
set(INSTALL_PATH_INCLUDE $ENV{HOME}/${CMAKE_PROJECT_NAME}/include)
|
||||
else()
|
||||
message(WARNING "该平台(${CMAKE_SYSTEM_NAME})下暂未设置安装路径")
|
||||
endif()
|
||||
else()
|
||||
set(INSTALL_PATH_LIB ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX})
|
||||
set(INSTALL_PATH_INCLUDE ${CMAKE_INSTALL_PREFIX}/include)
|
||||
set(INSTALL_PATH_RUNTIME ${CMAKE_INSTALL_PREFIX}/bin)
|
||||
endif()
|
||||
|
||||
string(TOLOWER ${CMAKE_SYSTEM_NAME} SYSTEM_NAME_LOWER)
|
||||
# 设置输出目录, 包括 bin, lib 以及其他文件
|
||||
# Windows 也不再区分 32/64
|
||||
set(OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/release/${SYSTEM_NAME_LOWER}/${CMAKE_BUILD_TYPE})
|
||||
set(LIBRARY_OUTPUT_PATH ${OUTPUT_DIR})
|
||||
set(EXECUTABLE_OUTPUT_PATH ${OUTPUT_DIR})
|
||||
|
||||
# 添加 git 版本信息
|
||||
set(COMMIT_HASH "Git_NotFound_Unkown_commit")
|
||||
set(BRANCH_NAME "Git_NotFound_Unkown_branch")
|
||||
set(BUILD_TIME "")
|
||||
|
||||
string(TIMESTAMP BUILD_TIME "%Y-%m-%d %H:%M:%S")
|
||||
|
||||
find_package(Git QUIET)
|
||||
if(GIT_FOUND)
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} rev-parse --short=7 HEAD
|
||||
OUTPUT_VARIABLE COMMIT_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_QUIET
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD
|
||||
OUTPUT_VARIABLE BRANCH_NAME
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_QUIET
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
endif()
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/version.h.ini
|
||||
${CMAKE_CURRENT_BINARY_DIR}/version.h
|
||||
@ONLY)
|
||||
|
||||
message(STATUS "Git version is ${BRANCH_NAME}:${COMMIT_HASH}:${BUILD_TIME}")
|
||||
|
||||
##############################################################################
|
||||
|
||||
# 方便修改全局变量
|
||||
function(update_cached name value)
|
||||
set("${name}" "${value}" CACHE INTERNAL "*** Internal ***" FORCE)
|
||||
endfunction()
|
||||
|
||||
function(update_cached_list name)
|
||||
set(_tmp_list "${${name}}")
|
||||
list(APPEND _tmp_list "${ARGN}")
|
||||
list(REMOVE_DUPLICATES _tmp_list)
|
||||
update_cached(${name} "${_tmp_list}")
|
||||
endfunction()
|
||||
|
||||
# TODO:
|
||||
function(set_file_group prefix)
|
||||
message(STATUS "set_file_group " ${prefix} " " ${ARGC})
|
||||
foreach(FILE IN LISTS ARGN 1)
|
||||
@ -133,408 +152,294 @@ function(set_file_group prefix)
|
||||
# Make sure we are using windows slashes
|
||||
string(REPLACE "/" "\\" GROUP "${GROUP}")
|
||||
|
||||
# Group into "Source Files" and "Header Files"
|
||||
#if ("${FILE}" MATCHES ".*\\.cpp")
|
||||
# set(GROUP "Source Files${GROUP}")
|
||||
#elseif("${FILE}" MATCHES ".*\\.h")
|
||||
# set(GROUP "Header Files${GROUP}")
|
||||
#endif()
|
||||
#message(STATUS ${GROUP} " : " ${FILE})
|
||||
source_group("${GROUP}" FILES "${FILE}")
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
if (MSVC AND ENABLE_MSVC_MT)
|
||||
|
||||
find_program(CCACHE_FOUND ccache)
|
||||
if(CCACHE_FOUND)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
# UNIX/Linux/Darwin
|
||||
set(COMPILE_OPTIONS_DEFAULT
|
||||
"-fPIC"
|
||||
"-Wall;-Wextra"
|
||||
"-Wno-unused-function;-Wno-unused-parameter;-Wno-unused-variable"
|
||||
"-Wno-error=extra;-Wno-error=missing-field-initializers;-Wno-error=type-limits")
|
||||
elseif(WIN32)
|
||||
set(COMPILE_OPTIONS_DEFAULT
|
||||
# TODO: /wd4819 应该是不会生效
|
||||
"/wd4566;/wd4819"
|
||||
# warning C4530: C++ exception handler used, but unwind semantics are not enabled.
|
||||
"/EHsc")
|
||||
if (MSVC)
|
||||
# disable Windows logo
|
||||
list(APPEND COMPILE_OPTIONS_DEFAULT "/nologo")
|
||||
list(APPEND CMAKE_STATIC_LINKER_FLAGS "/nologo")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# mediakit 以及各个 runtime 依赖
|
||||
update_cached_list(MK_LINK_LIBRARIES "")
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_VERSION)
|
||||
|
||||
# 多个模块依赖 ffmpeg 相关库, 统一查找
|
||||
if(ENABLE_FFMPEG)
|
||||
find_package(PkgConfig QUIET)
|
||||
# 查找 ffmpeg/libutil 是否安装
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(AVUTIL QUIET IMPORTED_TARGET libavutil)
|
||||
if(AVUTIL_FOUND)
|
||||
update_cached_list(MK_LINK_LIBRARIES PkgConfig::AVUTIL)
|
||||
message(STATUS "found library: ${AVUTIL_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# 查找 ffmpeg/libavcodec 是否安装
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(AVCODEC QUIET IMPORTED_TARGET libavcodec)
|
||||
if(AVCODEC_FOUND)
|
||||
update_cached_list(MK_LINK_LIBRARIES PkgConfig::AVCODEC)
|
||||
message(STATUS "found library: ${AVCODEC_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# 查找 ffmpeg/libswscale 是否安装
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(SWSCALE QUIET IMPORTED_TARGET libswscale)
|
||||
if(SWSCALE_FOUND)
|
||||
update_cached_list(MK_LINK_LIBRARIES PkgConfig::SWSCALE)
|
||||
message(STATUS "found library: ${SWSCALE_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# 查找 ffmpeg/libswresample 是否安装
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(SWRESAMPLE QUIET IMPORTED_TARGET libswresample)
|
||||
if(SWRESAMPLE_FOUND)
|
||||
update_cached_list(MK_LINK_LIBRARIES PkgConfig::SWRESAMPLE)
|
||||
message(STATUS "found library: ${SWRESAMPLE_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# 查找 ffmpeg/libutil 是否安装
|
||||
if(NOT AVUTIL_FOUND)
|
||||
find_package(AVUTIL QUIET)
|
||||
if(AVUTIL_FOUND)
|
||||
include_directories(SYSTEM ${AVUTIL_INCLUDE_DIR})
|
||||
update_cached_list(MK_LINK_LIBRARIES ${AVUTIL_LIBRARIES})
|
||||
message(STATUS "found library: ${AVUTIL_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
# 查找 ffmpeg/libavcodec 是否安装
|
||||
if(NOT AVCODEC_FOUND)
|
||||
find_package(AVCODEC QUIET)
|
||||
if(AVCODEC_FOUND)
|
||||
include_directories(SYSTEM ${AVCODEC_INCLUDE_DIR})
|
||||
update_cached_list(MK_LINK_LIBRARIES ${AVCODEC_LIBRARIES})
|
||||
message(STATUS "found library: ${AVCODEC_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# 查找 ffmpeg/libswscale 是否安装
|
||||
if(NOT SWSCALE_FOUND)
|
||||
find_package(SWSCALE QUIET)
|
||||
if(SWSCALE_FOUND)
|
||||
include_directories(SYSTEM ${SWSCALE_INCLUDE_DIR})
|
||||
update_cached_list(MK_LINK_LIBRARIES ${SWSCALE_LIBRARIES})
|
||||
message(STATUS "found library: ${SWSCALE_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# 查找 ffmpeg/libswresample 是否安装
|
||||
if(NOT SWRESAMPLE_FOUND)
|
||||
find_package(SWRESAMPLE QUIET)
|
||||
if(SWRESAMPLE_FOUND)
|
||||
include_directories(SYSTEM ${SWRESAMPLE_INCLUDE_DIRS})
|
||||
update_cached_list(MK_LINK_LIBRARIES ${SWRESAMPLE_LIBRARIES})
|
||||
message(STATUS "found library: ${SWRESAMPLE_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(AVUTIL_FOUND AND AVCODEC_FOUND AND SWSCALE_FOUND AND SWRESAMPLE_FOUND)
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_FFMPEG)
|
||||
update_cached_list(MK_LINK_LIBRARIES ${CMAKE_DL_LIBS})
|
||||
else()
|
||||
set(ENABLE_FFMPEG OFF)
|
||||
message(WARNING "ffmpeg 相关功能未找到")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(ENABLE_MEM_DEBUG)
|
||||
list(APPEND COMPILE_OPTIONS_DEFAULT
|
||||
"-Wl,-wrap,free;-Wl,-wrap,malloc;-Wl,-wrap,realloc;-Wl,-wrap,calloc")
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_MEM_DEBUG)
|
||||
message(STATUS "已启用内存调试功能")
|
||||
endif()
|
||||
|
||||
if(ENABLE_ASAN)
|
||||
list(APPEND COMPILE_OPTIONS_DEFAULT
|
||||
"-fsanitize=address;-fno-omit-frame-pointer")
|
||||
message(STATUS "已启用 Address Sanitize")
|
||||
endif()
|
||||
|
||||
# TODO: 下载静态编译 jemalloc 后静态编译链接?
|
||||
set(DEP_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdpart/external-${CMAKE_SYSTEM_NAME})
|
||||
if(ENABLE_JEMALLOC_STATIC)
|
||||
if(NOT EXISTS ${DEP_ROOT_DIR})
|
||||
file(MAKE_DIRECTORY ${DEP_ROOT_DIR})
|
||||
endif()
|
||||
|
||||
include(Jemalloc)
|
||||
include_directories(SYSTEM ${DEP_ROOT_DIR}/${JEMALLOC_NAME}/include/jemalloc)
|
||||
link_directories(${DEP_ROOT_DIR}/${JEMALLOC_NAME}/lib)
|
||||
# 用于影响后续查找过程
|
||||
set(JEMALLOC_ROOT_DIR "${DEP_ROOT_DIR}/${JEMALLOC_NAME}")
|
||||
endif()
|
||||
|
||||
# 默认链接 jemalloc 库避免内存碎片
|
||||
find_package(JEMALLOC QUIET)
|
||||
if(JEMALLOC_FOUND)
|
||||
message(STATUS "found library: ${JEMALLOC_LIBRARIES}")
|
||||
include_directories(${JEMALLOC_INCLUDE_DIR})
|
||||
update_cached_list(MK_LINK_LIBRARIES ${JEMALLOC_LIBRARIES})
|
||||
endif()
|
||||
|
||||
# 查找 openssl 是否安装
|
||||
find_package(OpenSSL QUIET)
|
||||
if(OPENSSL_FOUND AND ENABLE_OPENSSL)
|
||||
message(STATUS "found library: ${OPENSSL_LIBRARIES}, ENABLE_OPENSSL defined")
|
||||
include_directories(${OPENSSL_INCLUDE_DIR})
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_OPENSSL)
|
||||
update_cached_list(MK_LINK_LIBRARIES ${OPENSSL_LIBRARIES})
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND OPENSSL_USE_STATIC_LIBS)
|
||||
update_cached_list(MK_LINK_LIBRARIES ${CMAKE_DL_LIBS})
|
||||
endif()
|
||||
else()
|
||||
set(ENABLE_OPENSSL OFF)
|
||||
message(WARNING "openssl 未找到, rtmp 将不支持 flash 播放器, https/wss/rtsps/rtmps 也将失效")
|
||||
endif()
|
||||
|
||||
# 查找 mysql 是否安装
|
||||
find_package(MYSQL QUIET)
|
||||
if(MYSQL_FOUND AND ENABLE_MYSQL)
|
||||
message(STATUS "found library: ${MYSQL_LIBRARIES}, ENABLE_MYSQL defined")
|
||||
include_directories(SYSTEM
|
||||
${MYSQL_INCLUDE_DIR}
|
||||
${MYSQL_INCLUDE_DIR}/mysql)
|
||||
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_MYSQL)
|
||||
update_cached_list(MK_LINK_LIBRARIES ${MYSQL_LIBRARIES})
|
||||
endif()
|
||||
|
||||
# 查找 x264 是否安装
|
||||
find_package(X264 QUIET)
|
||||
if(X264_FOUND AND ENABLE_X264)
|
||||
message(STATUS "found library: ${X264_LIBRARIES}, ENABLE_X264 defined")
|
||||
include_directories(SYSTEM ${X264_INCLUDE_DIRS})
|
||||
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_X264)
|
||||
update_cached_list(MK_LINK_LIBRARIES ${X264_LIBRARIES})
|
||||
endif()
|
||||
|
||||
# 查找 faac 是否安装
|
||||
find_package(FAAC QUIET)
|
||||
if(FAAC_FOUND AND ENABLE_FAAC)
|
||||
message(STATUS "found library:${FAAC_LIBRARIES}, ENABLE_FAAC defined")
|
||||
include_directories(SYSTEM ${FAAC_INCLUDE_DIR})
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_FAAC)
|
||||
update_cached_list(MK_LINK_LIBRARIES ${FAAC_LIBRARIES})
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
update_cached_list(MK_LINK_LIBRARIES WS2_32 Iphlpapi shlwapi)
|
||||
elseif(NOT ANDROID OR IOS)
|
||||
update_cached_list(MK_LINK_LIBRARIES pthread)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
include(CheckCXXSourceCompiles)
|
||||
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/checks/atomic_check.cpp atomic_check_cpp)
|
||||
check_cxx_source_compiles("${atomic_check_cpp}" HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||
if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||
# cmake --help-policy CMP0075
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||
check_cxx_source_compiles("${atomic_check_cpp}" HAVE_CXX_ATOMICS_WITH_LIB)
|
||||
if(NOT HAVE_CXX_ATOMICS_WITH_LIB)
|
||||
message(WARNING "Compiler doesn't support std::atomic<long long>")
|
||||
else()
|
||||
update_cached_list(MK_LINK_LIBRARIES atomic)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Solution folders:
|
||||
# ----------------------------------------------------------------------------
|
||||
if(USE_SOLUTION_FOLDERS)
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")
|
||||
endif()
|
||||
|
||||
if(MSVC AND ENABLE_MSVC_MT)
|
||||
set(CompilerFlags
|
||||
CMAKE_CXX_FLAGS
|
||||
CMAKE_CXX_FLAGS_DEBUG
|
||||
CMAKE_CXX_FLAGS_RELEASE
|
||||
CMAKE_C_FLAGS
|
||||
CMAKE_C_FLAGS_DEBUG
|
||||
CMAKE_C_FLAGS_RELEASE
|
||||
)
|
||||
CMAKE_C_FLAGS_RELEASE)
|
||||
# TODO: 通常应该不需要替换
|
||||
foreach(CompilerFlag ${CompilerFlags})
|
||||
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# 添加git版本信息
|
||||
set(COMMIT_HASH "Git_NotFound_Unkown_commit")
|
||||
set(BRANCH_NAME "Git_NotFound_Unkown_branch")
|
||||
set(BUILD_TIME "")
|
||||
##############################################################################
|
||||
|
||||
string(TIMESTAMP BUILD_TIME "%Y/%m/%d-%H:%M:%S")
|
||||
# for version.h
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
find_package(Git QUIET)
|
||||
if (GIT_FOUND)
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h
|
||||
OUTPUT_VARIABLE COMMIT_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_QUIET
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD
|
||||
OUTPUT_VARIABLE BRANCH_NAME
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_QUIET
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
endif ()
|
||||
add_subdirectory(3rdpart)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/version.h.ini
|
||||
${CMAKE_BINARY_DIR}/version.h
|
||||
@ONLY
|
||||
)
|
||||
add_subdirectory(src)
|
||||
|
||||
add_definitions(-DENABLE_VERSION)
|
||||
include_directories(${CMAKE_BINARY_DIR})
|
||||
message(STATUS "Git version is ${BRANCH_NAME}:${COMMIT_HASH}:${BUILD_TIME}")
|
||||
|
||||
if (ENABLE_MEM_DEBUG)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-wrap,free -Wl,-wrap,malloc -Wl,-wrap,realloc -Wl,-wrap,calloc")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-wrap,free -Wl,-wrap,malloc -Wl,-wrap,realloc -Wl,-wrap,calloc")
|
||||
add_definitions(-DENABLE_MEM_DEBUG)
|
||||
message(STATUS "已启用内存调试功能")
|
||||
endif ()
|
||||
|
||||
if (ENABLE_ASAN)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
|
||||
message(STATUS "已启用Address Sanitize")
|
||||
endif ()
|
||||
|
||||
set(LINK_LIB_LIST zlmediakit zltoolkit)
|
||||
|
||||
if (ENABLE_FFMPEG)
|
||||
find_package(PkgConfig QUIET)
|
||||
#查找ffmpeg/libutil是否安装
|
||||
if (PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(AVUTIL QUIET IMPORTED_TARGET libavutil)
|
||||
if (AVUTIL_FOUND)
|
||||
include_directories(${AVUTIL_INCLUDE_DIRS})
|
||||
link_directories(${AVUTIL_LIBRARY_DIRS})
|
||||
list(APPEND LINK_LIB_LIST ${AVUTIL_LIBRARIES})
|
||||
message(STATUS "found library:${AVUTIL_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#查找ffmpeg/libavcodec是否安装
|
||||
if (PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(AVCODEC QUIET IMPORTED_TARGET libavcodec)
|
||||
if (AVCODEC_FOUND)
|
||||
include_directories(${AVCODEC_INCLUDE_DIRS})
|
||||
link_directories(${AVCODEC_LIBRARY_DIRS})
|
||||
list(APPEND LINK_LIB_LIST ${AVCODEC_LIBRARIES})
|
||||
message(STATUS "found library:${AVCODEC_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#查找ffmpeg/libswscale是否安装
|
||||
if (PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(SWSCALE QUIET IMPORTED_TARGET libswscale)
|
||||
if (SWSCALE_FOUND)
|
||||
include_directories(${SWSCALE_INCLUDE_DIRS})
|
||||
link_directories(${SWSCALE_LIBRARY_DIRS})
|
||||
list(APPEND LINK_LIB_LIST ${SWSCALE_LIBRARIES})
|
||||
message(STATUS "found library:${SWSCALE_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#查找ffmpeg/libswresample是否安装
|
||||
if (PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(SWRESAMPLE QUIET IMPORTED_TARGET libswresample)
|
||||
if (SWRESAMPLE_FOUND)
|
||||
include_directories(${SWRESAMPLE_INCLUDE_DIRS})
|
||||
link_directories(${SWRESAMPLE_LIBRARY_DIRS})
|
||||
list(APPEND LINK_LIB_LIST ${SWRESAMPLE_LIBRARIES})
|
||||
message(STATUS "found library:${SWRESAMPLE_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#查找ffmpeg/libutil是否安装
|
||||
if (NOT AVUTIL_FOUND)
|
||||
find_package(AVUTIL QUIET)
|
||||
if (AVUTIL_FOUND)
|
||||
include_directories(${AVUTIL_INCLUDE_DIR})
|
||||
list(APPEND LINK_LIB_LIST ${AVUTIL_LIBRARIES})
|
||||
message(STATUS "found library:${AVUTIL_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#查找ffmpeg/libavcodec是否安装
|
||||
if (NOT AVCODEC_FOUND)
|
||||
find_package(AVCODEC QUIET)
|
||||
if (AVCODEC_FOUND)
|
||||
include_directories(${AVCODEC_INCLUDE_DIR})
|
||||
list(APPEND LINK_LIB_LIST ${AVCODEC_LIBRARIES})
|
||||
message(STATUS "found library:${AVCODEC_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#查找ffmpeg/libswscale是否安装
|
||||
if (NOT SWSCALE_FOUND)
|
||||
find_package(SWSCALE QUIET)
|
||||
if (SWSCALE_FOUND)
|
||||
include_directories(${SWSCALE_INCLUDE_DIR})
|
||||
list(APPEND LINK_LIB_LIST ${SWSCALE_LIBRARIES})
|
||||
message(STATUS "found library:${SWSCALE_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#查找ffmpeg/libswresample是否安装
|
||||
if (NOT SWRESAMPLE_FOUND)
|
||||
find_package(SWRESAMPLE QUIET)
|
||||
if (SWRESAMPLE_FOUND)
|
||||
include_directories(${SWRESAMPLE_INCLUDE_DIRS})
|
||||
list(APPEND LINK_LIB_LIST ${SWRESAMPLE_LIBRARIES})
|
||||
message(STATUS "found library:${SWRESAMPLE_LIBRARIES}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if (AVUTIL_FOUND AND AVCODEC_FOUND AND SWSCALE_FOUND AND SWRESAMPLE_FOUND)
|
||||
add_definitions(-DENABLE_FFMPEG)
|
||||
list(APPEND LINK_LIB_LIST ${CMAKE_DL_LIBS})
|
||||
else ()
|
||||
set(ENABLE_FFMPEG off)
|
||||
message(WARNING "ffmpeg相关功能未找到")
|
||||
endif ()
|
||||
|
||||
endif ()
|
||||
|
||||
if(ENABLE_JEMALLOC_STATIC)
|
||||
include(cmake/Jemalloc.cmake)
|
||||
include_directories(${DEP_ROOT_DIR}/${JEMALLOC_NAME}/include/jemalloc)
|
||||
link_directories(${DEP_ROOT_DIR}/${JEMALLOC_NAME}/lib)
|
||||
set(JEMALLOC_ROOT_DIR "${DEP_ROOT_DIR}/${JEMALLOC_NAME}")
|
||||
endif ()
|
||||
|
||||
#默认链接jemalloc库避免内存碎片
|
||||
find_package(JEMALLOC QUIET)
|
||||
if (JEMALLOC_FOUND)
|
||||
message(STATUS "found library:\"${JEMALLOC_LIBRARIES}\"")
|
||||
include_directories(${JEMALLOC_INCLUDE_DIR})
|
||||
list(APPEND LINK_LIB_LIST ${JEMALLOC_LIBRARIES})
|
||||
endif ()
|
||||
|
||||
#查找openssl是否安装
|
||||
find_package(OpenSSL QUIET)
|
||||
if (OPENSSL_FOUND AND ENABLE_OPENSSL)
|
||||
message(STATUS "found library:${OPENSSL_LIBRARIES},ENABLE_OPENSSL defined")
|
||||
include_directories(${OPENSSL_INCLUDE_DIR})
|
||||
add_definitions(-DENABLE_OPENSSL)
|
||||
list(APPEND LINK_LIB_LIST ${OPENSSL_LIBRARIES})
|
||||
if (CMAKE_SYSTEM_NAME MATCHES "Linux" AND OPENSSL_USE_STATIC_LIBS)
|
||||
list(APPEND LINK_LIB_LIST dl)
|
||||
endif ()
|
||||
else ()
|
||||
set(ENABLE_OPENSSL off)
|
||||
message(WARNING "openssl未找到,rtmp将不支持flash播放器,https/wss/rtsps/rtmps也将失效")
|
||||
endif ()
|
||||
|
||||
#查找mysql是否安装
|
||||
find_package(MYSQL QUIET)
|
||||
if (MYSQL_FOUND AND ENABLE_MYSQL)
|
||||
message(STATUS "found library:${MYSQL_LIBRARIES},ENABLE_MYSQL defined")
|
||||
include_directories(${MYSQL_INCLUDE_DIR})
|
||||
include_directories(${MYSQL_INCLUDE_DIR}/mysql)
|
||||
add_definitions(-DENABLE_MYSQL)
|
||||
list(APPEND LINK_LIB_LIST ${MYSQL_LIBRARIES})
|
||||
endif ()
|
||||
|
||||
#查找x264是否安装
|
||||
find_package(X264 QUIET)
|
||||
if (X264_FOUND AND ENABLE_X264)
|
||||
message(STATUS "found library:${X264_LIBRARIES},ENABLE_X264 defined")
|
||||
include_directories(${X264_INCLUDE_DIRS})
|
||||
add_definitions(-DENABLE_X264)
|
||||
list(APPEND LINK_LIB_LIST ${X264_LIBRARIES})
|
||||
endif ()
|
||||
|
||||
#查找faac是否安装
|
||||
find_package(FAAC QUIET)
|
||||
if (FAAC_FOUND AND ENABLE_FAAC)
|
||||
message(STATUS "found library:${FAAC_LIBRARIES},ENABLE_FAAC defined")
|
||||
include_directories(${FAAC_INCLUDE_DIR})
|
||||
add_definitions(-DENABLE_FAAC)
|
||||
list(APPEND LINK_LIB_LIST ${FAAC_LIBRARIES})
|
||||
endif ()
|
||||
|
||||
#set(VS_FALGS "/wd4819 /wd4996 /wd4018 /wd4267 /wd4244 /wd4101 /wd4828 /wd4309 /wd4573 /wd4996" )
|
||||
set(VS_FALGS "/wd4819")
|
||||
|
||||
#添加mpeg用于支持ts生成
|
||||
if (ENABLE_RTPPROXY OR ENABLE_HLS)
|
||||
include_directories(${MediaServer_Root}/libmpeg/include)
|
||||
aux_source_directory(${MediaServer_Root}/libmpeg/include src_mpeg)
|
||||
aux_source_directory(${MediaServer_Root}/libmpeg/source src_mpeg)
|
||||
|
||||
add_library(mpeg STATIC ${src_mpeg})
|
||||
list(APPEND LINK_LIB_LIST mpeg)
|
||||
list(APPEND CXX_API_TARGETS mpeg)
|
||||
|
||||
if (MSVC)
|
||||
set_target_properties(mpeg PROPERTIES COMPILE_FLAGS ${VS_FALGS})
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#添加mov、flv库用于MP4录制
|
||||
if (ENABLE_MP4)
|
||||
message(STATUS "ENABLE_MP4 defined")
|
||||
add_definitions(-DENABLE_MP4)
|
||||
|
||||
include_directories(${MediaServer_Root}/libmov/include)
|
||||
include_directories(${MediaServer_Root}/libflv/include)
|
||||
|
||||
aux_source_directory(${MediaServer_Root}/libmov/include src_mov)
|
||||
aux_source_directory(${MediaServer_Root}/libmov/source src_mov)
|
||||
|
||||
aux_source_directory(${MediaServer_Root}/libflv/include src_flv)
|
||||
aux_source_directory(${MediaServer_Root}/libflv/source src_flv)
|
||||
|
||||
add_library(mov STATIC ${src_mov})
|
||||
add_library(flv STATIC ${src_flv})
|
||||
list(APPEND LINK_LIB_LIST mov flv)
|
||||
list(APPEND CXX_API_TARGETS mov flv)
|
||||
|
||||
if (MSVC)
|
||||
set_target_properties(mov flv PROPERTIES COMPILE_FLAGS ${VS_FALGS})
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if (ENABLE_RTPPROXY)
|
||||
message(STATUS "ENABLE_RTPPROXY defined")
|
||||
add_definitions(-DENABLE_RTPPROXY)
|
||||
endif ()
|
||||
|
||||
if (ENABLE_HLS)
|
||||
message(STATUS "ENABLE_HLS defined")
|
||||
add_definitions(-DENABLE_HLS)
|
||||
endif ()
|
||||
|
||||
#收集源代码
|
||||
file(GLOB ToolKit_src_list ${ToolKit_Root}/*/*.cpp ${ToolKit_Root}/*/*.h ${ToolKit_Root}/*/*.c)
|
||||
if (IOS)
|
||||
list(APPEND ToolKit_src_list ${ToolKit_Root}/Network/Socket_ios.mm)
|
||||
endif ()
|
||||
|
||||
file(GLOB MediaKit_src_list ${MediaKit_Root}/*/*.cpp ${MediaKit_Root}/*/*.h ${MediaKit_Root}/*/*.c)
|
||||
|
||||
#去除win32的适配代码
|
||||
if (NOT WIN32)
|
||||
list(REMOVE_ITEM ToolKit_src_list ${ToolKit_Root}/win32/getopt.c)
|
||||
else ()
|
||||
#防止Windows.h包含Winsock.h
|
||||
add_definitions(-DWIN32_LEAN_AND_MEAN -DMP4V2_NO_STDINT_DEFS -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS)
|
||||
endif ()
|
||||
|
||||
if (USE_SOLUTION_FOLDERS AND (NOT GROUP_BY_EXPLORER)) # 在 IDE 中对文件进行分组,源文件和头文件分开
|
||||
set_file_group(${ToolKit_Root} ${ToolKit_src_list})
|
||||
set_file_group("${CMAKE_CURRENT_SOURCE_DIR}/src" ${MediaKit_src_list})
|
||||
if(ENABLE_SRT)
|
||||
add_subdirectory(srt)
|
||||
endif()
|
||||
|
||||
#添加库
|
||||
add_library(zltoolkit STATIC ${ToolKit_src_list})
|
||||
add_library(zlmediakit STATIC ${MediaKit_src_list})
|
||||
list(APPEND CXX_API_TARGETS zltoolkit zlmediakit)
|
||||
|
||||
#安装目录
|
||||
if (WIN32)
|
||||
set(INSTALL_PATH_LIB $ENV{HOME}/${CMAKE_PROJECT_NAME}/lib)
|
||||
set(INSTALL_PATH_INCLUDE $ENV{HOME}/${CMAKE_PROJECT_NAME}/include)
|
||||
else ()
|
||||
set(INSTALL_PATH_LIB lib${LIB_SUFFIX})
|
||||
set(INSTALL_PATH_INCLUDE include)
|
||||
set(INSTALL_PATH_EXECUTABLE bin)
|
||||
endif ()
|
||||
|
||||
if (ENABLE_CXX_API)
|
||||
# 保留目录结构
|
||||
install(DIRECTORY ${ToolKit_Root}/ DESTINATION ${INSTALL_PATH_INCLUDE}/ZLToolKit REGEX "(.*[.](md|cpp)|win32)$" EXCLUDE)
|
||||
install(DIRECTORY ${MediaKit_Root}/ DESTINATION ${INSTALL_PATH_INCLUDE}/ZLMediaKit REGEX ".*[.](md|cpp)$" EXCLUDE)
|
||||
install(TARGETS ${CXX_API_TARGETS} DESTINATION ${INSTALL_PATH_LIB})
|
||||
endif ()
|
||||
|
||||
if (WIN32)
|
||||
list(APPEND LINK_LIB_LIST WS2_32 Iphlpapi shlwapi)
|
||||
if (MSVC)
|
||||
set_target_properties(zltoolkit PROPERTIES COMPILE_FLAGS ${VS_FALGS})
|
||||
set_target_properties(zlmediakit PROPERTIES COMPILE_FLAGS ${VS_FALGS})
|
||||
endif ()
|
||||
elseif (NOT ANDROID OR IOS)
|
||||
list(APPEND LINK_LIB_LIST pthread)
|
||||
endif ()
|
||||
|
||||
#复制文件过来
|
||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/www" DESTINATION ${EXECUTABLE_OUTPUT_PATH})
|
||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/conf/config.ini" DESTINATION ${EXECUTABLE_OUTPUT_PATH})
|
||||
|
||||
|
||||
if (ENABLE_WEBRTC)
|
||||
#查找srtp是否安装
|
||||
find_package(SRTP QUIET)
|
||||
if (SRTP_FOUND AND ENABLE_OPENSSL)
|
||||
message(STATUS "found library:${SRTP_LIBRARIES}")
|
||||
include_directories(${SRTP_INCLUDE_DIRS})
|
||||
list(APPEND LINK_LIB_LIST ${SRTP_LIBRARIES})
|
||||
|
||||
add_definitions(-DENABLE_WEBRTC)
|
||||
include_directories(./webrtc)
|
||||
file(GLOB SRC_WEBRTC_LIST ./webrtc/*.cpp ./webrtc/*.h ./webrtc/*.hpp)
|
||||
add_library(webrtc ${SRC_WEBRTC_LIST})
|
||||
list(APPEND LINK_LIB_LIST webrtc)
|
||||
message(STATUS "webrtc功能已开启")
|
||||
|
||||
find_package(SCTP QUIET)
|
||||
if (SCTP_FOUND)
|
||||
message(STATUS "found library:${SCTP_INCLUDE_DIRS} ${SCTP_LIBRARIES}")
|
||||
include_directories(${SCTP_INCLUDE_DIRS})
|
||||
list(APPEND LINK_LIB_LIST ${SCTP_LIBRARIES})
|
||||
add_definitions(-DENABLE_SCTP)
|
||||
message(STATUS "webrtc datachannel功能已打开")
|
||||
endif ()
|
||||
else ()
|
||||
set(ENABLE_WEBRTC off)
|
||||
message(WARNING "srtp未找到, webrtc相关功能打开失败")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if (ENABLE_SRT)
|
||||
add_definitions(-DENABLE_SRT)
|
||||
include_directories(./srt)
|
||||
file(GLOB SRC_SRT_LIST ./srt/*.cpp ./srt/*.h ./srt/*.hpp)
|
||||
add_library(srt ${SRC_SRT_LIST})
|
||||
list(APPEND LINK_LIB_LIST srt)
|
||||
message(STATUS "srt 功能已开启")
|
||||
if(ENABLE_WEBRTC)
|
||||
add_subdirectory(webrtc)
|
||||
endif()
|
||||
|
||||
#添加c库
|
||||
if (ENABLE_API)
|
||||
if(ENABLE_API)
|
||||
add_subdirectory(api)
|
||||
endif ()
|
||||
|
||||
#ios不编译可执行程序
|
||||
if (IOS)
|
||||
return()
|
||||
endif()
|
||||
|
||||
#测试程序
|
||||
if (ENABLE_TESTS)
|
||||
add_subdirectory(tests)
|
||||
endif ()
|
||||
|
||||
#主服务器
|
||||
if (ENABLE_SERVER)
|
||||
add_subdirectory(server)
|
||||
endif ()
|
||||
|
||||
#播放器
|
||||
if (ENABLE_PLAYER)
|
||||
# IOS 不编译可执行程序
|
||||
if(NOT IOS)
|
||||
if(ENABLE_PLAYER AND ENABLE_FFMPEG)
|
||||
add_subdirectory(player)
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
if (ENABLE_SERVER_LIB)
|
||||
set(LINK_LIB_LIST ${LINK_LIB_LIST} PARENT_SCOPE)
|
||||
endif ()
|
||||
add_subdirectory(server)
|
||||
# Android 会 add_subdirectory 并依赖该变量
|
||||
if(ENABLE_SERVER_LIB)
|
||||
set(MK_LINK_LIBRARIES ${MK_LINK_LIBRARIES} PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
# 复制文件过来
|
||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/www"
|
||||
DESTINATION ${EXECUTABLE_OUTPUT_PATH})
|
||||
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/conf/config.ini"
|
||||
DESTINATION ${EXECUTABLE_OUTPUT_PATH})
|
||||
|
||||
if(ENABLE_TESTS)
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
endif()
|
||||
|
@ -1,38 +1,78 @@
|
||||
include_directories(include source)
|
||||
include(GenerateExportHeader)
|
||||
file(GLOB api_src_list include/*.h source/*.cpp source/*.h source/*.c)
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
if (IOS)
|
||||
add_library(mk_api STATIC ${api_src_list})
|
||||
target_link_libraries(mk_api ${LINK_LIB_LIST} jsoncpp)
|
||||
include(GenerateExportHeader)
|
||||
file(GLOB API_SRC_LIST
|
||||
include/*.h
|
||||
source/*.c
|
||||
source/*.cpp
|
||||
source/*.h)
|
||||
|
||||
set(LINK_LIBRARIES ${MK_LINK_LIBRARIES} jsoncpp)
|
||||
|
||||
if(IOS)
|
||||
add_library(mk_api STATIC ${API_SRC_LIST})
|
||||
target_link_libraries(mk_api
|
||||
PRIVATE ${LINK_LIBRARIES})
|
||||
return()
|
||||
endif ()
|
||||
|
||||
add_definitions(-DGENERATE_EXPORT)
|
||||
include_directories(${CMAKE_BINARY_DIR})
|
||||
set(COMPILE_DEFINITIONS ${MK_COMPILE_DEFINITIONS})
|
||||
list(APPEND COMPILE_DEFINITIONS GENERATE_EXPORT)
|
||||
|
||||
if (ENABLE_API_STATIC_LIB)
|
||||
add_definitions(-DMediaKitApi_STATIC)
|
||||
add_library(mk_api STATIC ${api_src_list})
|
||||
else ()
|
||||
add_library(mk_api SHARED ${api_src_list})
|
||||
endif ()
|
||||
if(ENABLE_API_STATIC_LIB)
|
||||
add_library(mk_api STATIC ${API_SRC_LIST})
|
||||
list(APPEND COMPILE_DEFINITIONS MediaKitApi_STATIC)
|
||||
else()
|
||||
add_library(mk_api SHARED ${API_SRC_LIST})
|
||||
endif()
|
||||
|
||||
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
target_link_libraries(mk_api -Wl,--start-group jsoncpp ${LINK_LIB_LIST} -Wl,--end-group)
|
||||
else ()
|
||||
target_link_libraries(mk_api jsoncpp ${LINK_LIB_LIST})
|
||||
endif ()
|
||||
target_compile_definitions(mk_api
|
||||
PRIVATE ${COMPILE_DEFINITIONS})
|
||||
target_include_directories(mk_api
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>")
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
target_link_libraries(mk_api -Wl,--start-group ${LINK_LIBRARIES} -Wl,--end-group)
|
||||
else()
|
||||
target_link_libraries(mk_api jsoncpp ${LINK_LIBRARIES})
|
||||
endif()
|
||||
|
||||
generate_export_header(mk_api
|
||||
EXPORT_MACRO_NAME API_EXPORT
|
||||
BASE_NAME MK_API
|
||||
STATIC_DEFINE MediaKitApi_STATIC
|
||||
EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/mk_export.h"
|
||||
)
|
||||
EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/mk_export.h")
|
||||
|
||||
add_subdirectory(tests)
|
||||
|
||||
file(GLOB api_header_list include/*.h ${CMAKE_BINARY_DIR}/*.h)
|
||||
install(FILES ${api_header_list} DESTINATION ${INSTALL_PATH_INCLUDE})
|
||||
install(TARGETS mk_api ARCHIVE DESTINATION ${INSTALL_PATH_LIB} LIBRARY DESTINATION ${INSTALL_PATH_LIB})
|
||||
file(GLOB API_HEADER_LIST include/*.h ${CMAKE_CURRENT_BINARY_DIR}/*.h)
|
||||
install(FILES ${API_HEADER_LIST}
|
||||
DESTINATION ${INSTALL_PATH_INCLUDE})
|
||||
install(TARGETS mk_api
|
||||
ARCHIVE DESTINATION ${INSTALL_PATH_LIB}
|
||||
LIBRARY DESTINATION ${INSTALL_PATH_LIB})
|
||||
|
@ -1,28 +1,47 @@
|
||||
aux_source_directory(. TEST_SRC_LIST)
|
||||
include_directories(${PROJECT_BINARY_DIR}/api)
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} TEST_SRC_LIST)
|
||||
|
||||
foreach(TEST_SRC ${TEST_SRC_LIST})
|
||||
STRING(REGEX REPLACE "^\\./|\\.c[a-zA-Z0-9_]*$" "" TEST_EXE_NAME ${TEST_SRC})
|
||||
get_filename_component(TEST_EXE_NAME ${TEST_SRC} NAME_WE)
|
||||
|
||||
if (NOT ENABLE_FFMPEG)
|
||||
if(NOT ENABLE_FFMPEG)
|
||||
# 过滤掉依赖 FFmpeg 的测试模块
|
||||
if ("${TEST_EXE_NAME}" MATCHES "player_opencv")
|
||||
if("${TEST_EXE_NAME}" MATCHES "player_opencv")
|
||||
continue()
|
||||
endif ()
|
||||
endif ()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
message(STATUS "add c api tester:${TEST_EXE_NAME}")
|
||||
message(STATUS "add c api tester: ${TEST_EXE_NAME}")
|
||||
set(exe_name api_tester_${TEST_EXE_NAME})
|
||||
add_executable(${exe_name} ${TEST_SRC})
|
||||
if(USE_SOLUTION_FOLDERS)
|
||||
SET_PROPERTY(TARGET ${exe_name} PROPERTY FOLDER "api_test")
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
set_target_properties(${exe_name} PROPERTIES COMPILE_FLAGS ${VS_FALGS} )
|
||||
set_property(TARGET ${exe_name} PROPERTY FOLDER "api_test")
|
||||
endif()
|
||||
|
||||
target_link_libraries(${exe_name} mk_api)
|
||||
target_compile_options(${exe_name} PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
endforeach()
|
||||
|
||||
|
||||
|
@ -1,46 +1,69 @@
|
||||
if (NOT ENABLE_FFMPEG)
|
||||
return()
|
||||
endif ()
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
set(LINK_LIBRARIES ${MK_LINK_LIBRARIES})
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
#查找SDL2是否安装
|
||||
if (PKG_CONFIG_FOUND)
|
||||
# 查找 SDL2 是否安装
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(SDL2 QUIET IMPORTED_TARGET sdl2)
|
||||
if (SDL2_FOUND)
|
||||
include_directories(${SDL2_INCLUDE_DIRS})
|
||||
link_directories(${SDL2_LIBRARY_DIRS})
|
||||
list(APPEND LINK_LIB_LIST ${SDL2_LIBRARIES})
|
||||
message(STATUS "found library:${SDL2_LIBRARIES}")
|
||||
endif ()
|
||||
else ()
|
||||
if(SDL2_FOUND)
|
||||
list(APPEND LINK_LIBRARIES PkgConfig::SDL2)
|
||||
message(STATUS "found library: ${SDL2_LIBRARIES}")
|
||||
endif()
|
||||
else()
|
||||
find_package(SDL2 QUIET)
|
||||
if (SDL2_FOUND)
|
||||
include_directories(${SDL2_INCLUDE_DIR})
|
||||
list(APPEND LINK_LIB_LIST ${SDL2_LIBRARY})
|
||||
message(STATUS "found library:${SDL2_LIBRARY}")
|
||||
endif (SDL2_FOUND)
|
||||
endif ()
|
||||
if(SDL2_FOUND)
|
||||
include_directories(SYSTEM ${SDL2_INCLUDE_DIR})
|
||||
list(APPEND LINK_LIBRARIES ${SDL2_LIBRARY})
|
||||
message(STATUS "found library: ${SDL2_LIBRARY}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(PLAYER_NAME "test_player")
|
||||
|
||||
#如果ffmpeg/libavcodec ffmpeg/libavcodec SDL 都安装了则编译播放器
|
||||
if (NOT SDL2_FOUND)
|
||||
message(STATUS "${PLAYER_NAME} disabled, please install sdl2 ffmpeg/libavcodec ffmpeg/libavutil ffmpeg/libswresample")
|
||||
# 如果 ffmpeg/libavcodec ffmpeg/libavcodec SDL 都安装了则编译播放器
|
||||
if(NOT SDL2_FOUND)
|
||||
message(WARNING "${PLAYER_NAME} disabled, please install sdl2 ffmpeg/libavcodec ffmpeg/libavutil ffmpeg/libswresample")
|
||||
return()
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
message(STATUS "${PLAYER_NAME} enabled")
|
||||
|
||||
aux_source_directory(. SRC_LIST)
|
||||
add_executable(${PLAYER_NAME} ${SRC_LIST})
|
||||
target_compile_definitions(${PLAYER_NAME}
|
||||
PRIVATE ${MK_COMPILE_DEFINITIONS})
|
||||
target_compile_options(${PLAYER_NAME}
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
|
||||
if (MSVC)
|
||||
set_target_properties(${PLAYER_NAME} PROPERTIES COMPILE_FLAGS ${VS_FALGS})
|
||||
# TODO: 统一参数?
|
||||
if(MSVC)
|
||||
set_target_properties(${PLAYER_NAME} PROPERTIES LINK_FLAGS "/SAFESEH:NO /SUBSYSTEM:WINDOWS")
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
target_link_libraries(${PLAYER_NAME} -Wl,--start-group ${LINK_LIB_LIST} -Wl,--end-group)
|
||||
else ()
|
||||
target_link_libraries(${PLAYER_NAME} ${LINK_LIB_LIST})
|
||||
endif ()
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
target_link_libraries(${PLAYER_NAME} -Wl,--start-group ${LINK_LIBRARIES} -Wl,--end-group)
|
||||
else()
|
||||
target_link_libraries(${PLAYER_NAME} ${LINK_LIBRARIES})
|
||||
endif()
|
||||
|
@ -1,26 +1,53 @@
|
||||
include_directories(../3rdpart)
|
||||
file(GLOB jsoncpp_src_list ../3rdpart/jsoncpp/*.cpp ../3rdpart/jsoncpp/*.h )
|
||||
add_library(jsoncpp STATIC ${jsoncpp_src_list})
|
||||
file(GLOB MediaServer_src_list ./*.cpp ./*.h)
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
if (ENABLE_SERVER_LIB)
|
||||
add_definitions(-DDISABLE_MAIN)
|
||||
add_library(MediaServer STATIC ${MediaServer_src_list})
|
||||
list(APPEND LINK_LIB_LIST MediaServer jsoncpp)
|
||||
set(LINK_LIB_LIST ${LINK_LIB_LIST} PARENT_SCOPE)
|
||||
file(GLOB MediaServer_SRC_LIST ./*.cpp ./*.h)
|
||||
|
||||
set(COMPILE_DEFINITIONS ${MK_COMPILE_DEFINITIONS})
|
||||
|
||||
if(ENABLE_SERVER_LIB)
|
||||
list(APPEND COMPILE_DEFINITIONS DISABLE_MAIN)
|
||||
add_library(MediaServer STATIC ${MediaServer_SRC_LIST})
|
||||
target_compile_definitions(MediaServer
|
||||
PRIVATE ${COMPILE_DEFINITIONS})
|
||||
target_compile_options(MediaServer
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_link_libraries(MediaServer
|
||||
PRIVATE ${MK_LINK_LIBRARIES})
|
||||
update_cached(MK_LINK_LIBRARIES MediaServer)
|
||||
return()
|
||||
endif ()
|
||||
|
||||
add_executable(MediaServer ${MediaServer_src_list})
|
||||
|
||||
if(MSVC)
|
||||
set_target_properties(MediaServer PROPERTIES COMPILE_FLAGS ${VS_FALGS} )
|
||||
else()
|
||||
install(TARGETS MediaServer DESTINATION ${INSTALL_PATH_EXECUTABLE})
|
||||
endif()
|
||||
|
||||
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
target_link_libraries(MediaServer -Wl,--start-group jsoncpp ${LINK_LIB_LIST} -Wl,--end-group)
|
||||
else ()
|
||||
target_link_libraries(MediaServer jsoncpp ${LINK_LIB_LIST})
|
||||
endif ()
|
||||
add_executable(MediaServer ${MediaServer_SRC_LIST})
|
||||
target_compile_definitions(MediaServer
|
||||
PRIVATE ${COMPILE_DEFINITIONS})
|
||||
target_compile_options(MediaServer
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
target_link_libraries(MediaServer -Wl,--start-group ${MK_LINK_LIBRARIES} -Wl,--end-group)
|
||||
else()
|
||||
target_link_libraries(MediaServer ${MK_LINK_LIBRARIES})
|
||||
endif()
|
||||
|
||||
install(TARGETS MediaServer DESTINATION ${INSTALL_PATH_RUNTIME})
|
||||
|
@ -368,6 +368,7 @@ Value makeMediaSourceJson(MediaSource &media){
|
||||
return item;
|
||||
}
|
||||
|
||||
#if defined(ENABLE_RTPPROXY)
|
||||
uint16_t openRtpServer(uint16_t local_port, const string &stream_id, bool enable_tcp, const string &local_ip, bool re_use_port, uint32_t ssrc) {
|
||||
lock_guard<recursive_mutex> lck(s_rtpServerMapMtx);
|
||||
if (s_rtpServerMap.find(stream_id) != s_rtpServerMap.end()) {
|
||||
@ -399,6 +400,7 @@ bool closeRtpServer(const string &stream_id) {
|
||||
s_rtpServerMap.erase(it);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
void getStatisticJson(const function<void(Value &val)> &cb) {
|
||||
auto obj = std::make_shared<Value>(objectValue);
|
||||
|
65
src/CMakeLists.txt
Normal file
65
src/CMakeLists.txt
Normal file
@ -0,0 +1,65 @@
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
file(GLOB MediaKit_SRC_LIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/*/*.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/*/*.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/*/*.h)
|
||||
|
||||
if(USE_SOLUTION_FOLDERS AND (NOT GROUP_BY_EXPLORER))
|
||||
# 在 IDE 中对文件进行分组, 源文件和头文件分开
|
||||
set_file_group("${CMAKE_CURRENT_SOURCE_DIR}" ${MediaKit_SRC_LIST})
|
||||
endif()
|
||||
|
||||
|
||||
# 添加库
|
||||
add_library(zlmediakit STATIC ${MediaKit_SRC_LIST})
|
||||
add_library(ZLMediaKit::MediaKit ALIAS zlmediakit)
|
||||
|
||||
set(LINK_LIBRARIES ${MK_LINK_LIBRARIES})
|
||||
list(REMOVE_ITEM LINK_LIBRARIES ZLMediaKit::MediaKit)
|
||||
set(COMPILE_DEFINITIONS ${MK_COMPILE_DEFINITIONS})
|
||||
|
||||
target_compile_definitions(zlmediakit
|
||||
PRIVATE ${COMPILE_DEFINITIONS})
|
||||
target_compile_options(zlmediakit
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_link_libraries(zlmediakit
|
||||
PRIVATE ${LINK_LIBRARIES})
|
||||
target_include_directories(zlmediakit
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
|
||||
|
||||
update_cached_list(MK_LINK_LIBRARIES ZLMediaKit::MediaKit)
|
||||
|
||||
# 未在使用
|
||||
if(ENABLE_CXX_API)
|
||||
# 保留目录结构
|
||||
install(DIRECTORY ${MediaKit_Root}/
|
||||
DESTINATION ${INSTALL_PATH_INCLUDE}/ZLMediaKit
|
||||
REGEX ".*[.](md|cpp)$" EXCLUDE)
|
||||
install(TARGETS zlmediakit
|
||||
DESTINATION ${INSTALL_PATH_LIB})
|
||||
endif ()
|
44
srt/CMakeLists.txt
Normal file
44
srt/CMakeLists.txt
Normal file
@ -0,0 +1,44 @@
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
file(GLOB SRT_SRC_LIST *.cpp *.h *.hpp)
|
||||
|
||||
add_library(srt STATIC ${SRT_SRC_LIST})
|
||||
add_library(ZLMediaKit::SRT ALIAS srt)
|
||||
target_link_libraries(srt
|
||||
PUBLIC
|
||||
ZLMediaKit::MediaKit
|
||||
ZLMediaKit::ToolKit)
|
||||
target_compile_options(srt
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_include_directories(srt
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>")
|
||||
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_SRT)
|
||||
update_cached_list(MK_LINK_LIBRARIES ZLMediaKit::SRT)
|
||||
|
||||
message(STATUS "srt 功能已开启")
|
@ -1,42 +1,51 @@
|
||||
execute_process(COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/default.pem ${EXECUTABLE_OUTPUT_PATH}/)
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
execute_process(COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/default.pem ${EXECUTABLE_OUTPUT_PATH}/)
|
||||
aux_source_directory(. TEST_SRC_LIST)
|
||||
|
||||
foreach (TEST_SRC ${TEST_SRC_LIST})
|
||||
foreach(TEST_SRC ${TEST_SRC_LIST})
|
||||
get_filename_component(TEST_EXE_NAME ${TEST_SRC} NAME_WE)
|
||||
|
||||
if (NOT ENABLE_WEBRTC)
|
||||
if(NOT TARGET ZLMediaKit::WebRTC)
|
||||
# 暂时过滤掉依赖 WebRTC 的测试模块
|
||||
if ("${TEST_EXE_NAME}" MATCHES "test_rtcp_nack")
|
||||
if("${TEST_EXE_NAME}" MATCHES "test_rtcp_nack")
|
||||
continue()
|
||||
endif ()
|
||||
endif ()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
message(STATUS "add test:${TEST_EXE_NAME}")
|
||||
message(STATUS "add test: ${TEST_EXE_NAME}")
|
||||
add_executable(${TEST_EXE_NAME} ${TEST_SRC})
|
||||
target_compile_options(${TEST_EXE_NAME}
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
|
||||
if(USE_SOLUTION_FOLDERS)
|
||||
SET_PROPERTY(TARGET ${TEST_EXE_NAME} PROPERTY FOLDER "test")
|
||||
endif ()
|
||||
|
||||
if (MSVC)
|
||||
set_target_properties(${TEST_EXE_NAME} PROPERTIES COMPILE_FLAGS ${VS_FALGS})
|
||||
endif ()
|
||||
|
||||
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
target_link_libraries(${TEST_EXE_NAME} -Wl,--start-group ${LINK_LIB_LIST} -Wl,--end-group)
|
||||
else ()
|
||||
target_link_libraries(${TEST_EXE_NAME} ${LINK_LIB_LIST})
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
target_link_libraries(${TEST_EXE_NAME} -Wl,--start-group ${MK_LINK_LIBRARIES} -Wl,--end-group)
|
||||
else()
|
||||
target_link_libraries(${TEST_EXE_NAME} ${MK_LINK_LIBRARIES})
|
||||
endif()
|
||||
endforeach()
|
||||
|
70
webrtc/CMakeLists.txt
Normal file
70
webrtc/CMakeLists.txt
Normal file
@ -0,0 +1,70 @@
|
||||
# MIT License
|
||||
#
|
||||
# Copyright (c) 2016-2022 The ZLMediaKit project authors. All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
# 查找 srtp 是否安装
|
||||
find_package(SRTP QUIET)
|
||||
if(NOT SRTP_FOUND OR NOT ENABLE_OPENSSL)
|
||||
set(ENABLE_WEBRTC OFF)
|
||||
message(WARNING "srtp 未找到, WebRTC 相关功能打开失败")
|
||||
return()
|
||||
endif()
|
||||
|
||||
|
||||
message(STATUS "found library: ${SRTP_LIBRARIES}")
|
||||
include_directories(SYSTEM ${SRTP_INCLUDE_DIRS})
|
||||
|
||||
set(LINK_LIBRARIES ${SRTP_LIBRARIES})
|
||||
|
||||
find_package(SCTP QUIET)
|
||||
if(SCTP_FOUND)
|
||||
message(STATUS "found library: ${SCTP_INCLUDE_DIRS} ${SCTP_LIBRARIES}")
|
||||
include_directories(SYSTEM ${SCTP_INCLUDE_DIRS})
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_SCTP)
|
||||
update_cached_list(LINK_LIBRARIES ${SCTP_LIBRARIES})
|
||||
message(STATUS "WebRTC datachannel 功能已打开")
|
||||
endif()
|
||||
|
||||
file(GLOB WEBRTC_SRC_LIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/*.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/*.hpp)
|
||||
add_library(webrtc ${WEBRTC_SRC_LIST})
|
||||
add_library(ZLMediaKit::WebRTC ALIAS webrtc)
|
||||
target_compile_options(webrtc
|
||||
PRIVATE ${COMPILE_OPTIONS_DEFAULT})
|
||||
target_link_libraries(webrtc
|
||||
PRIVATE
|
||||
ZLMediaKit::MediaKit
|
||||
ZLMediaKit::ToolKit
|
||||
PUBLIC
|
||||
${LINK_LIBRARIES})
|
||||
target_include_directories(webrtc
|
||||
PRIVATE
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>")
|
||||
|
||||
message(STATUS "WebRTC 功能已开启")
|
||||
|
||||
update_cached_list(MK_COMPILE_DEFINITIONS ENABLE_WEBRTC)
|
||||
update_cached_list(MK_LINK_LIBRARIES ZLMediaKit::WebRTC ${LINK_LIBRARIES})
|
@ -20,18 +20,23 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
// #define MS_LOG_DEV_LEVEL 3
|
||||
|
||||
#include "SrtpSession.hpp"
|
||||
#include <cstring> // std::memset(), std::memcpy()
|
||||
#include "logger.h"
|
||||
#include "Util/util.h"
|
||||
|
||||
#include "Util/logger.h"
|
||||
#include "Util/util.h"
|
||||
#include "logger.h"
|
||||
|
||||
#include <srtp2/srtp.h>
|
||||
|
||||
#include <cstring> // std::memset(), std::memcpy()
|
||||
#include <vector>
|
||||
|
||||
using namespace toolkit;
|
||||
|
||||
namespace RTC
|
||||
{
|
||||
/* Static. */
|
||||
namespace RTC {
|
||||
|
||||
static std::vector<const char *> errors = {
|
||||
/* Static. */
|
||||
|
||||
static std::vector<const char *> errors = {
|
||||
// From 0 (srtp_err_status_ok) to 24 (srtp_err_status_pfkey_err).
|
||||
"success (srtp_err_status_ok)",
|
||||
"unspecified failure (srtp_err_status_fail)",
|
||||
@ -57,23 +62,36 @@ namespace RTC
|
||||
"error parsing data (srtp_err_status_parse_err)",
|
||||
"error encoding data (srtp_err_status_encode_err)",
|
||||
"error while using semaphores (srtp_err_status_semaphore_err)",
|
||||
"error while using pfkey (srtp_err_status_pfkey_err)"};
|
||||
// clang-format on
|
||||
"error while using pfkey (srtp_err_status_pfkey_err)"
|
||||
};
|
||||
|
||||
/* Static methods. */
|
||||
|
||||
const char *DepLibSRTP::GetErrorString(srtp_err_status_t code) {
|
||||
class DepLibSRTP : public std::enable_shared_from_this<DepLibSRTP> {
|
||||
public:
|
||||
using Ptr = std::shared_ptr<DepLibSRTP>;
|
||||
~DepLibSRTP();
|
||||
|
||||
static bool IsError(srtp_err_status_t code);
|
||||
static const char *GetErrorString(srtp_err_status_t code);
|
||||
static DepLibSRTP &Instance();
|
||||
|
||||
private:
|
||||
DepLibSRTP();
|
||||
};
|
||||
|
||||
const char *DepLibSRTP::GetErrorString(srtp_err_status_t code) {
|
||||
// This throws out_of_range if the given index is not in the vector.
|
||||
return errors.at(code);
|
||||
}
|
||||
}
|
||||
|
||||
bool DepLibSRTP::IsError(srtp_err_status_t code) {
|
||||
bool DepLibSRTP::IsError(srtp_err_status_t code) {
|
||||
return (code != srtp_err_status_ok);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANCE_IMP(DepLibSRTP);
|
||||
INSTANCE_IMP(DepLibSRTP);
|
||||
|
||||
DepLibSRTP::DepLibSRTP(){
|
||||
DepLibSRTP::DepLibSRTP() {
|
||||
MS_TRACE();
|
||||
|
||||
MS_DEBUG_TAG(info, "libsrtp version: \"%s\"", srtp_get_version_string());
|
||||
@ -102,10 +120,9 @@ namespace RTC
|
||||
}
|
||||
|
||||
// Set libsrtp event handler.
|
||||
err = srtp_install_event_handler([](srtp_event_data_t *data){
|
||||
err = srtp_install_event_handler([](srtp_event_data_t *data) {
|
||||
MS_TRACE();
|
||||
switch (data->event)
|
||||
{
|
||||
switch (data->event) {
|
||||
case event_ssrc_collision:
|
||||
MS_WARN_TAG(srtp, "SSRC collision occurred");
|
||||
break;
|
||||
@ -124,23 +141,21 @@ namespace RTC
|
||||
}
|
||||
});
|
||||
|
||||
if (DepLibSRTP::IsError(err))
|
||||
{
|
||||
if (DepLibSRTP::IsError(err)) {
|
||||
MS_THROW_ERROR("srtp_install_event_handler() failed: %s", DepLibSRTP::GetErrorString(err));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DepLibSRTP::~DepLibSRTP(){
|
||||
DepLibSRTP::~DepLibSRTP() {
|
||||
MS_TRACE();
|
||||
srtp_shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* Instance methods. */
|
||||
/* Instance methods. */
|
||||
|
||||
SrtpSession::SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t* key, size_t keyLen)
|
||||
{
|
||||
SrtpSession::SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t *key, size_t keyLen) {
|
||||
_env = DepLibSRTP::Instance().shared_from_this();
|
||||
MS_TRACE();
|
||||
|
||||
@ -149,18 +164,15 @@ namespace RTC
|
||||
// Set all policy fields to 0.
|
||||
std::memset(&policy, 0, sizeof(srtp_policy_t));
|
||||
|
||||
switch (cryptoSuite)
|
||||
{
|
||||
case CryptoSuite::AES_CM_128_HMAC_SHA1_80:
|
||||
{
|
||||
switch (cryptoSuite) {
|
||||
case CryptoSuite::AES_CM_128_HMAC_SHA1_80: {
|
||||
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtp);
|
||||
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtcp);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CryptoSuite::AES_CM_128_HMAC_SHA1_32:
|
||||
{
|
||||
case CryptoSuite::AES_CM_128_HMAC_SHA1_32: {
|
||||
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_32(&policy.rtp);
|
||||
// NOTE: Must be 80 for RTCP.
|
||||
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtcp);
|
||||
@ -168,34 +180,28 @@ namespace RTC
|
||||
break;
|
||||
}
|
||||
|
||||
case CryptoSuite::AEAD_AES_256_GCM:
|
||||
{
|
||||
case CryptoSuite::AEAD_AES_256_GCM: {
|
||||
srtp_crypto_policy_set_aes_gcm_256_16_auth(&policy.rtp);
|
||||
srtp_crypto_policy_set_aes_gcm_256_16_auth(&policy.rtcp);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CryptoSuite::AEAD_AES_128_GCM:
|
||||
{
|
||||
case CryptoSuite::AEAD_AES_128_GCM: {
|
||||
srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy.rtp);
|
||||
srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy.rtcp);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
default: {
|
||||
MS_ABORT("unknown SRTP crypto suite");
|
||||
}
|
||||
}
|
||||
|
||||
MS_ASSERT(
|
||||
(int)keyLen == policy.rtp.cipher_key_len,
|
||||
"given keyLen does not match policy.rtp.cipher_keyLen");
|
||||
MS_ASSERT((int)keyLen == policy.rtp.cipher_key_len, "given keyLen does not match policy.rtp.cipher_keyLen");
|
||||
|
||||
switch (type)
|
||||
{
|
||||
switch (type) {
|
||||
case Type::INBOUND:
|
||||
policy.ssrc.type = ssrc_any_inbound;
|
||||
break;
|
||||
@ -217,80 +223,71 @@ namespace RTC
|
||||
|
||||
if (DepLibSRTP::IsError(err))
|
||||
MS_THROW_ERROR("srtp_create() failed: %s", DepLibSRTP::GetErrorString(err));
|
||||
}
|
||||
}
|
||||
|
||||
SrtpSession::~SrtpSession()
|
||||
{
|
||||
SrtpSession::~SrtpSession() {
|
||||
MS_TRACE();
|
||||
|
||||
if (this->session != nullptr)
|
||||
{
|
||||
if (this->session != nullptr) {
|
||||
srtp_err_status_t err = srtp_dealloc(this->session);
|
||||
|
||||
if (DepLibSRTP::IsError(err))
|
||||
MS_ABORT("srtp_dealloc() failed: %s", DepLibSRTP::GetErrorString(err));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool SrtpSession::EncryptRtp(uint8_t* data, int* len)
|
||||
{
|
||||
bool SrtpSession::EncryptRtp(uint8_t *data, int *len) {
|
||||
MS_TRACE();
|
||||
srtp_err_status_t err =
|
||||
srtp_protect(this->session, static_cast<void*>(data), reinterpret_cast<int*>(len));
|
||||
srtp_err_status_t err = srtp_protect(this->session, static_cast<void *>(data), reinterpret_cast<int *>(len));
|
||||
|
||||
if (DepLibSRTP::IsError(err))
|
||||
{
|
||||
if (DepLibSRTP::IsError(err)) {
|
||||
WarnL << "srtp_protect() failed:" << DepLibSRTP::GetErrorString(err);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool SrtpSession::DecryptSrtp(uint8_t* data, int* len)
|
||||
{
|
||||
bool SrtpSession::DecryptSrtp(uint8_t *data, int *len) {
|
||||
MS_TRACE();
|
||||
|
||||
srtp_err_status_t err =
|
||||
srtp_unprotect(this->session, static_cast<void*>(data), reinterpret_cast<int*>(len));
|
||||
srtp_err_status_t err = srtp_unprotect(this->session, static_cast<void *>(data), reinterpret_cast<int *>(len));
|
||||
|
||||
if (DepLibSRTP::IsError(err))
|
||||
{
|
||||
if (DepLibSRTP::IsError(err)) {
|
||||
WarnL << "srtp_unprotect() failed:" << DepLibSRTP::GetErrorString(err);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool SrtpSession::EncryptRtcp(uint8_t* data, int* len)
|
||||
{
|
||||
bool SrtpSession::EncryptRtcp(uint8_t *data, int *len) {
|
||||
MS_TRACE();
|
||||
srtp_err_status_t err = srtp_protect_rtcp(
|
||||
this->session, static_cast<void*>(data), reinterpret_cast<int*>(len));
|
||||
srtp_err_status_t err = srtp_protect_rtcp(this->session, static_cast<void *>(data), reinterpret_cast<int *>(len));
|
||||
|
||||
if (DepLibSRTP::IsError(err))
|
||||
{
|
||||
if (DepLibSRTP::IsError(err)) {
|
||||
WarnL << "srtp_protect_rtcp() failed:" << DepLibSRTP::GetErrorString(err);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool SrtpSession::DecryptSrtcp(uint8_t* data, int* len)
|
||||
{
|
||||
bool SrtpSession::DecryptSrtcp(uint8_t *data, int *len) {
|
||||
MS_TRACE();
|
||||
|
||||
srtp_err_status_t err =
|
||||
srtp_unprotect_rtcp(this->session, static_cast<void*>(data), reinterpret_cast<int*>(len));
|
||||
srtp_err_status_t err = srtp_unprotect_rtcp(this->session, static_cast<void *>(data), reinterpret_cast<int *>(len));
|
||||
|
||||
if (DepLibSRTP::IsError(err))
|
||||
{
|
||||
if (DepLibSRTP::IsError(err)) {
|
||||
WarnL << "srtp_unprotect_rtcp() failed:" << DepLibSRTP::GetErrorString(err);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
void SrtpSession::RemoveStream(uint32_t ssrc) {
|
||||
srtp_remove_stream(this->session, uint32_t { htonl(ssrc) });
|
||||
}
|
||||
|
||||
} // namespace RTC
|
||||
|
@ -20,31 +20,18 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
#define MS_RTC_SRTP_SESSION_HPP
|
||||
|
||||
#include "Utils.hpp"
|
||||
#include <srtp2/srtp.h>
|
||||
#include <vector>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace RTC
|
||||
{
|
||||
class DepLibSRTP : public std::enable_shared_from_this<DepLibSRTP>
|
||||
{
|
||||
public:
|
||||
using Ptr = std::shared_ptr<DepLibSRTP>;
|
||||
~DepLibSRTP();
|
||||
typedef struct srtp_ctx_t_ *srtp_t;
|
||||
|
||||
static bool IsError(srtp_err_status_t code);
|
||||
static const char *GetErrorString(srtp_err_status_t code);
|
||||
static DepLibSRTP &Instance();
|
||||
namespace RTC {
|
||||
|
||||
private:
|
||||
DepLibSRTP();
|
||||
};
|
||||
class DepLibSRTP;
|
||||
|
||||
class SrtpSession
|
||||
{
|
||||
public:
|
||||
enum class CryptoSuite
|
||||
{
|
||||
class SrtpSession {
|
||||
public:
|
||||
enum class CryptoSuite {
|
||||
NONE = 0,
|
||||
AES_CM_128_HMAC_SHA1_80 = 1,
|
||||
AES_CM_128_HMAC_SHA1_32,
|
||||
@ -52,32 +39,26 @@ namespace RTC
|
||||
AEAD_AES_128_GCM
|
||||
};
|
||||
|
||||
public:
|
||||
enum class Type
|
||||
{
|
||||
INBOUND = 1,
|
||||
OUTBOUND
|
||||
};
|
||||
public:
|
||||
enum class Type { INBOUND = 1, OUTBOUND };
|
||||
|
||||
public:
|
||||
SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t* key, size_t keyLen);
|
||||
public:
|
||||
SrtpSession(Type type, CryptoSuite cryptoSuite, uint8_t *key, size_t keyLen);
|
||||
~SrtpSession();
|
||||
|
||||
public:
|
||||
bool EncryptRtp(uint8_t* data, int* len);
|
||||
bool DecryptSrtp(uint8_t* data, int* len);
|
||||
bool EncryptRtcp(uint8_t* data, int* len);
|
||||
bool DecryptSrtcp(uint8_t* data, int* len);
|
||||
void RemoveStream(uint32_t ssrc)
|
||||
{
|
||||
srtp_remove_stream(this->session, uint32_t{ htonl(ssrc) });
|
||||
}
|
||||
public:
|
||||
bool EncryptRtp(uint8_t *data, int *len);
|
||||
bool DecryptSrtp(uint8_t *data, int *len);
|
||||
bool EncryptRtcp(uint8_t *data, int *len);
|
||||
bool DecryptSrtcp(uint8_t *data, int *len);
|
||||
void RemoveStream(uint32_t ssrc);
|
||||
|
||||
private:
|
||||
private:
|
||||
// Allocated by this.
|
||||
srtp_t session{ nullptr };
|
||||
DepLibSRTP::Ptr _env;
|
||||
};
|
||||
srtp_t session { nullptr };
|
||||
std::shared_ptr<DepLibSRTP> _env;
|
||||
};
|
||||
|
||||
} // namespace RTC
|
||||
|
||||
#endif
|
||||
|
@ -13,6 +13,9 @@
|
||||
#include "Rtcp/RtcpFCI.h"
|
||||
#include "RtpExt.h"
|
||||
#include "Rtsp/RtpReceiver.h"
|
||||
|
||||
#include <srtp2/srtp.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#define RTP_SSRC_OFFSET 1
|
||||
|
Loading…
Reference in New Issue
Block a user