Files
srs/trunk/configure

765 lines
29 KiB
Plaintext
Raw Permalink Normal View History

2013-10-17 20:58:04 +08:00
#!/bin/bash
2014-02-28 13:17:31 +08:00
#####################################################################################
# the main output dir, all configure and make output are in this dir.
#####################################################################################
# Configure SRS from other directory, for example:
# env SRS_WORKDIR=~/git/srs/trunk ./configure
if [[ -z $SRS_WORKDIR ]]; then SRS_WORKDIR="."; fi
# Set the objs to other directory, for example:
# env SRS_OUTPUT=$(pwd) ./configure
if [[ -z $SRS_OUTPUT ]]; then
SRS_OBJS="${SRS_WORKDIR}/objs" && SRS_MAKEFILE=${SRS_WORKDIR}/Makefile
else
SRS_OBJS="${SRS_OUTPUT}/objs" && SRS_MAKEFILE=${SRS_OUTPUT}/Makefile
fi
2013-10-17 20:58:04 +08:00
# linux shell color support.
RED="\\033[31m"
GREEN="\\033[32m"
YELLOW="\\033[33m"
BLACK="\\033[0m"
#####################################################################################
# parse user options, set the variables like:
# srs features: SRS_SSL/SRS_HLS/SRS_HTTP_CALLBACK/......
# build options: SRS_JOBS
#####################################################################################
# parse options, exit with error when parse options invalid.
. $SRS_WORKDIR/auto/options.sh
2015-09-23 11:54:53 +08:00
# setup variables when options parsed.
. $SRS_WORKDIR/auto/setup_variables.sh
2015-09-23 11:54:53 +08:00
# We don't need to cleanup the exists files.
rm -f ${SRS_MAKEFILE}
2015-03-10 13:13:31 +08:00
# Create objs and platform directories.
mkdir -p ${SRS_OBJS}/${SRS_PLATFORM}
# If only generate objs directory, quit without error.
if [[ $SRS_GENERATE_OBJS == YES ]]; then exit 0; fi
2013-11-27 22:41:58 +08:00
# apply user options.
. $SRS_WORKDIR/auto/depends.sh
2013-11-27 22:41:58 +08:00
# the auto generated variables.
. $SRS_WORKDIR/auto/auto_headers.sh
2014-03-19 11:24:25 +08:00
2013-10-17 20:58:04 +08:00
#####################################################################################
# generate Makefile.
#####################################################################################
2014-03-15 19:44:06 +08:00
# ubuntu echo in Makefile cannot display color, use bash instead
SRS_BUILD_SUMMARY="_srs_build_summary.sh"
2014-03-03 18:28:50 +08:00
# utest make entry, (cd utest; make)
SrsUtestMakeEntry="@echo -e \"ignore utest for it's disabled\""
if [[ $SRS_UTEST == YES ]]; then SrsUtestMakeEntry="\$(MAKE)\$(JOBS) -C ${SRS_OBJS}/${SRS_PLATFORM}/utest"; fi
2014-03-03 18:28:50 +08:00
# generate extra phony for each modules.
cat << END > ${SRS_OBJS}/Makefile
.PHONY: $__mphonys
END
#####################################################################################
# build tools or compiler args.
# enable gdb debug
GDBDebug=" -g -O0"
# the warning level.
2022-10-12 20:21:23 +08:00
WarnLevel=" -Wall"
# the compile standard.
CppStd="-ansi"
2020-06-03 19:18:41 +08:00
if [[ $SRS_CXX11 == YES ]]; then
CppStd="-std=c++11"
fi
2020-06-11 17:12:37 +08:00
if [[ $SRS_CXX14 == YES ]]; then
CppStd="-std=c++14"
fi
# performance of gprof
SrsGprof=""; SrsGprofLink=""; if [[ $SRS_GPROF == YES ]]; then SrsGprof=" -pg -lc_p"; SrsGprofLink=" -pg"; fi
# performance of gperf
SrsGperf=""; SrsGperfLink=""; if [[ $SRS_GPERF == YES ]]; then SrsGperfLink=" -lpthread"; fi
# the cxx flag generated.
CXXFLAGS="${CXXFLAGS} ${CppStd}${WarnLevel}${GDBDebug}${LibraryCompile}${SrsGprof}"
if [[ $SRS_GPERF == YES ]]; then
2018-12-22 20:08:42 +08:00
CXXFLAGS="${CXXFLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free";
fi
2019-02-02 21:42:03 +08:00
# For coverage.
if [[ $SRS_GCOV == YES ]]; then
2019-02-03 09:27:08 +08:00
SrsGcov="-fprofile-arcs -ftest-coverage"
fi
if [[ $SRS_GCOV == YES ]]; then
CXXFLAGS="${CXXFLAGS} ${SrsGcov}";
2019-02-02 21:42:03 +08:00
fi
# User configed options.
if [[ $SRS_EXTRA_FLAGS != '' ]]; then
CXXFLAGS="${CXXFLAGS} $SRS_EXTRA_FLAGS";
fi
# For Sanitizer
# @doc: https://github.com/google/sanitizers/wiki/AddressSanitizer
ASAN: Support coroutine context switching and stack tracing (#4153) For coroutine, we should use `__sanitizer_start_switch_fiber` which similar to`VALGRIND_STACK_REGISTER`, see https://github.com/google/sanitizers/issues/189#issuecomment-1346243598 for details. If not fix this, asan will output warning: ``` ==72269==WARNING: ASan is ignoring requested __asan_handle_no_return: stack type: default top: 0x00016f638000; bottom 0x000106bec000; size: 0x000068a4c000 (1755627520) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 ``` It will cause asan failed to get the stack, see `research/st/asan-switch.cpp` for example: ``` ==71611==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x000103600733 at pc 0x0001009d3d7c bp 0x000100b4bd40 sp 0x000100b4bd38 WRITE of size 1 at 0x000103600733 thread T0 #0 0x1009d3d78 in foo(void*) asan-switch.cpp:13 ``` After fix this issue, it should provide the full stack when crashing: ``` ==73437==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x000103300733 at pc 0x000100693d7c bp 0x00016f76f550 sp 0x00016f76f548 WRITE of size 1 at 0x000103300733 thread T0 #0 0x100693d78 in foo(void*) asan-switch.cpp:13 #1 0x100693df4 in main asan-switch.cpp:23 #2 0x195aa20dc (<unknown module>) ``` For primordial coroutine, if not set the stack by `st_set_primordial_stack`, then the stack is NULL and asan can't get the stack tracing. Note that it's optional and only make it fail to display the stack information, no other errors. --- Co-authored-by: john <hondaxiao@tencent.com>
2024-08-22 17:12:39 +08:00
if [[ $SRS_SANITIZER == YES ]]; then
CXXFLAGS="${CXXFLAGS} -fsanitize=address -fno-omit-frame-pointer";
fi
2017-03-01 09:21:20 +08:00
# Start to generate the Makefile.
cat << END >> ${SRS_OBJS}/Makefile
CC = ${SRS_TOOL_CC}
CXX = ${SRS_TOOL_CXX}
AR = ${SRS_TOOL_AR}
LINK = ${SRS_TOOL_CXX}
CXXFLAGS = ${CXXFLAGS}
2020-05-29 17:00:06 +08:00
.PHONY: default srs srs_ingest_hls
default:
END
#####################################################################################
# Libraries, external library to build in srs,
# header(.h): add to ModuleLibIncs if need the specified library. for example, LibSTRoot
# library(.a): add to ModuleLibFiles if binary need the specifeid library. for example, LibSTfile
#
# the link options, always use static link
SrsLinkOptions="-ldl -lpthread";
# st(state-threads) the basic network library for SRS.
LibSTRoot="${SRS_OBJS}/st"; LibSTfile="${LibSTRoot}/libst.a"
ST: Simplify it, only Linux/Darwin, epoll/kqueue, single process. 5.0.2 commit f4872e528cad07f8ea683cc8cb26e34111bad1b5 Author: winlin <winlin@vip.126.com> Date: Fri Feb 26 09:13:21 2021 +0800 ST: For #2188: Remove sendmmsg from ST. commit aaeb8919bd4a026268e0600398cb1e9ad477663f Author: winlin <winlin@vip.126.com> Date: Thu Mar 11 08:09:54 2021 +0800 ST: Refine utest script. commit d1ac9da53060b6bfa82b5d041da4c2ad9bd6b90a Author: winlin <winlin@vip.126.com> Date: Wed Mar 3 11:02:25 2021 +0800 ST: Support fast utest and coverage commit 8400115b83c022e33f59422dbf6d85ee46fb9edb Author: winlin <winlin@vip.126.com> Date: Fri Feb 26 07:02:19 2021 +0800 ST: Always use unserialized accept for linux or darwin commit c3686f2bca80d2c139239b08975575b1bb981ffa Author: winlin <winlin@vip.126.com> Date: Fri Feb 26 06:54:05 2021 +0800 ST: Refine ARFLAGS by disable the verbose log commit aaa5c4f863eba278c4ed2b29a46297fb01a4ed63 Author: winlin <winlin@vip.126.com> Date: Thu Feb 25 08:58:46 2021 +0800 ST: Stack always grows from top to down. commit dddd466e5c2e418c6f4896cd8bf701130052b3d9 Author: winlin <winlin@vip.126.com> Date: Thu Feb 25 08:51:31 2021 +0800 ST: Ignore process fork, for single process only commit 7906cb5f6e78c916cb8b8d9522275bfc086bb6a3 Author: winlin <winlin@vip.126.com> Date: Thu Feb 25 08:50:59 2021 +0800 ST: Fix build warnings commit d94921b84a3b6cf88ace2c766cc2bfedb9c0602e Author: winlin <winlin@vip.126.com> Date: Thu Feb 25 07:27:45 2021 +0800 ST: Remove select and poll support, only epoll and kqueue commit 76d202514615f78d1a8f2b15778f3dac5abf4abb Author: winlin <winlin@vip.126.com> Date: Thu Feb 25 07:10:47 2021 +0800 ST: Remove multiple OS support, except Linux and Darwin. commit 13c4ba345c61170e86dde486a174378ca235f442 Author: winlin <winlin@vip.126.com> Date: Thu Feb 25 06:59:35 2021 +0800 ST: Remove __ia64__ CPU support commit 46c06e4a11879cfeb828382e44f11287782ce4b5 Author: winlin <winlin@vip.126.com> Date: Wed Feb 24 11:37:27 2021 +0800 ST: Remove unused files for ST
2021-04-26 08:01:49 +08:00
if [[ $SRS_SHARED_ST == YES ]]; then LibSTfile="-L${LibSTRoot} -lst"; fi
2020-03-06 23:01:48 +08:00
# srtp
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
LibSrtpRoot="${SRS_OBJS}/srtp2/include"; LibSrtpFile="${SRS_OBJS}/srtp2/lib/libsrtp2.a"
if [[ $SRS_USE_SYS_SRTP == YES ]]; then
LibSrtpRoot=""; LibSrtpFile="libsrtp2.a"
if [[ $SRS_SHARED_SRTP == YES ]]; then
LibSrtpFile="";
SrsLinkOptions="${SrsLinkOptions} -lsrtp2";
fi
fi
# FFMPEG for WebRTC transcoding, such as aac to opus.
if [[ $SRS_FFMPEG_FIT == YES ]]; then
LibFfmpegRoot="${SRS_OBJS}/ffmpeg/include"
LibFfmpegFile="${SRS_OBJS}/ffmpeg/lib/libavcodec.a ${SRS_OBJS}/ffmpeg/lib/libswresample.a ${SRS_OBJS}/ffmpeg/lib/libavutil.a"
if [[ $SRS_FFMPEG_OPUS != YES ]]; then
LibFfmpegFile="${LibFfmpegFile} ${SRS_OBJS}/opus/lib/libopus.a"
2022-08-09 18:31:55 +08:00
fi
if [[ $SRS_SHARED_FFMPEG == YES ]]; then
LibFfmpegFile="-L${SRS_OBJS}/ffmpeg/lib -lavcodec -lswresample -lavutil";
if [[ $SRS_FFMPEG_OPUS != YES ]]; then
LibFfmpegFile="$LibFfmpegFile -L${SRS_OBJS}/opus/lib -lopus"
fi
fi
if [[ $SRS_USE_SYS_FFMPEG == YES ]]; then
LibFfmpegRoot=""
LibFfmpegFile="libavcodec.a libswresample.a libavutil.a libopus.a";
if [[ $SRS_SHARED_FFMPEG == YES ]]; then
LibFfmpegFile=""
SrsLinkOptions="${SrsLinkOptions} -lavcodec -lswresample -lavutil -lopus";
fi
fi
fi
# openssl-1.1.0e, for the RTMP complex handshake.
LibSSLRoot="";LibSSLfile=""
2018-12-22 20:23:39 +08:00
if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL == NO ]]; then
LibSSLRoot="${SRS_OBJS}/openssl/include"; LibSSLfile="${SRS_OBJS}/openssl/lib/libssl.a ${SRS_OBJS}/openssl/lib/libcrypto.a";
2018-12-22 20:08:42 +08:00
fi
# gperftools-2.1, for mem check and mem/cpu profile
LibGperfRoot=""; LibGperfFile=""
if [[ $SRS_GPERF == YES ]]; then
LibGperfRoot="${SRS_OBJS}/gperf/include"; LibGperfFile="${SRS_OBJS}/gperf/lib/libtcmalloc_and_profiler.a";
2018-12-22 20:08:42 +08:00
fi
if [[ $SRS_GPERF_MD == YES ]]; then
LibGperfFile="${SRS_OBJS}/gperf/lib/libtcmalloc_debug.a";
2018-12-22 20:08:42 +08:00
fi
# srt code path - always enabled
LibSRTRoot="${SRS_OBJS}/srt/include"; LibSRTfile="${SRS_OBJS}/srt/lib/libsrt.a"
if [[ $SRS_SHARED_SRT == YES ]]; then LibSRTfile="-L${SRS_OBJS}/srt/lib -lsrt"; fi
if [[ $SRS_USE_SYS_SRT == YES ]]; then
LibSRTRoot=""; LibSRTfile="libsrt.a"
if [[ $SRS_SHARED_SRT == YES ]]; then
LibSRTfile="";
SrsLinkOptions="${SrsLinkOptions} -lsrt";
fi
fi
2018-12-22 20:23:39 +08:00
if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL == YES ]]; then
2018-12-22 20:08:42 +08:00
SrsLinkOptions="${SrsLinkOptions} -lssl -lcrypto";
fi
# Static link the c++ libraries, for user who build SRS by a new version of gcc,
# so we need to link the c++ libraries staticly but not all.
# @see https://stackoverflow.com/a/26107550
if [[ $SRS_STATIC == YES ]]; then
SrsLinkOptions="${SrsLinkOptions} -static-libstdc++";
2018-12-22 20:08:42 +08:00
fi
2019-02-02 21:42:03 +08:00
# For coverage.
if [[ $SRS_GCOV == YES ]]; then
2019-02-03 09:27:08 +08:00
SrsLinkOptions="${SrsLinkOptions} ${SrsGcov}";
2019-02-02 21:42:03 +08:00
fi
2021-03-04 10:41:23 +08:00
# For FFMPEG/RTC on Linux.
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
if [[ $SRS_OSX != YES && $SRS_FFMPEG_FIT == YES ]]; then
SrsLinkOptions="${SrsLinkOptions} -lrt";
fi
# The backtrace symbol option.
if [[ $SRS_BACKTRACE == YES ]]; then
SrsLinkOptions="${SrsLinkOptions} -rdynamic";
fi
# For address sanitizer
# @doc: https://github.com/google/sanitizers/wiki/AddressSanitizer
ASAN: Support coroutine context switching and stack tracing (#4153) For coroutine, we should use `__sanitizer_start_switch_fiber` which similar to`VALGRIND_STACK_REGISTER`, see https://github.com/google/sanitizers/issues/189#issuecomment-1346243598 for details. If not fix this, asan will output warning: ``` ==72269==WARNING: ASan is ignoring requested __asan_handle_no_return: stack type: default top: 0x00016f638000; bottom 0x000106bec000; size: 0x000068a4c000 (1755627520) False positive error reports may follow For details see https://github.com/google/sanitizers/issues/189 ``` It will cause asan failed to get the stack, see `research/st/asan-switch.cpp` for example: ``` ==71611==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x000103600733 at pc 0x0001009d3d7c bp 0x000100b4bd40 sp 0x000100b4bd38 WRITE of size 1 at 0x000103600733 thread T0 #0 0x1009d3d78 in foo(void*) asan-switch.cpp:13 ``` After fix this issue, it should provide the full stack when crashing: ``` ==73437==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x000103300733 at pc 0x000100693d7c bp 0x00016f76f550 sp 0x00016f76f548 WRITE of size 1 at 0x000103300733 thread T0 #0 0x100693d78 in foo(void*) asan-switch.cpp:13 #1 0x100693df4 in main asan-switch.cpp:23 #2 0x195aa20dc (<unknown module>) ``` For primordial coroutine, if not set the stack by `st_set_primordial_stack`, then the stack is NULL and asan can't get the stack tracing. Note that it's optional and only make it fail to display the stack information, no other errors. --- Co-authored-by: john <hondaxiao@tencent.com>
2024-08-22 17:12:39 +08:00
if [[ $SRS_SANITIZER == YES ]]; then
SrsLinkOptions="${SrsLinkOptions} -fsanitize=address -fno-omit-frame-pointer";
if [[ $SRS_SANITIZER_STATIC == YES ]]; then
SrsLinkOptions="${SrsLinkOptions} -static-libasan";
fi
fi
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
# User configed options.
if [[ $SRS_EXTRA_LDFLAGS != '' ]]; then
SrsLinkOptions="${SrsLinkOptions} $SRS_EXTRA_LDFLAGS";
fi
#####################################################################################
# Modules, compile each module, then link to binary
#
#Core, depends only on system apis.
MODULE_ID="CORE"
MODULE_DEPENDS=()
ModuleLibIncs=(${SRS_OBJS})
MODULE_FILES=("srs_core" "srs_core_version" "srs_core_version7" "srs_core_autofree"
"srs_core_time" "srs_core_platform" "srs_core_deprecated" "srs_core_performance")
CORE_INCS="src/core"; MODULE_DIR=${CORE_INCS} . $SRS_WORKDIR/auto/modules.sh
CORE_OBJS="${MODULE_OBJS[@]}"
#
#Kernel, depends on core, provides error/log/config, nothing about stream information.
MODULE_ID="KERNEL"
MODULE_DEPENDS=("CORE")
ModuleLibIncs=(${SRS_OBJS} ${LibSSLRoot})
2015-09-22 08:48:55 +08:00
MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_buffer"
"srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_io"
"srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3" "srs_kernel_ts"
2021-02-25 13:46:52 +08:00
"srs_kernel_stream" "srs_kernel_balance" "srs_kernel_mp4" "srs_kernel_file"
"srs_kernel_kbps" "srs_kernel_rtc_rtp" "srs_kernel_rtc_rtcp" "srs_kernel_packet"
"srs_kernel_st" "srs_kernel_factory" "srs_kernel_hourglass" "srs_kernel_ps"
"srs_kernel_pithy_print" "srs_kernel_rtc_queue" "srs_kernel_resource")
KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . $SRS_WORKDIR/auto/modules.sh
KERNEL_OBJS="${MODULE_OBJS[@]}"
#
2015-05-24 18:56:52 +08:00
#RTMP/HTTP/Raw Protocol, depends on core/kernel, provides rtmp/htttp protocol features.
2015-05-23 09:59:24 +08:00
MODULE_ID="PROTOCOL"
MODULE_DEPENDS=("CORE" "KERNEL")
ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot} ${LibSSLRoot})
2022-06-09 20:32:45 +08:00
MODULE_FILES=("srs_protocol_amf0" "srs_protocol_io" "srs_protocol_conn" "srs_protocol_rtmp_handshake"
"srs_protocol_rtmp_stack" "srs_protocol_utility" "srs_protocol_rtmp_msg_array"
"srs_protocol_raw_avc" "srs_protocol_http_stack" "srs_protocol_json" "srs_protocol_stream"
2022-06-09 19:59:51 +08:00
"srs_protocol_format" "srs_protocol_log" "srs_protocol_st" "srs_protocol_http_client"
"srs_protocol_http_conn" "srs_protocol_rtmp_conn" "srs_protocol_protobuf"
"srs_protocol_http_stack_llhttp" "srs_protocol_http_stack_llhttpapi"
"srs_protocol_http_stack_llhttpadapter" "srs_protocol_http_stack_llhttphttp")
# Always include SRT protocol
MODULE_FILES+=("srs_protocol_srt")
ModuleLibIncs+=(${LibSRTRoot})
MODULE_FILES+=("srs_protocol_rtc_stun" "srs_protocol_rtp" "srs_protocol_sdp")
NEW PROTOCOL: Support viewing stream over RTSP. v7.0.47 (#4333) ## Introduce This PR adds support for viewing streams via the RTSP protocol. Note that it only supports viewing streams, not publishing streams via RTSP. Currently, only publishing via RTMP is supported, which is then converted to RTSP. Further work is needed to support publishing RTC/SRT streams and converting them to RTSP. ## Usage Build and run SRS with RTSP support: ``` cd srs/trunk && ./configure --rtsp=on && make -j16 ./objs/srs -c conf/rtsp.conf ``` Push stream via RTMP by FFmpeg: ``` ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://localhost/live/livestream ``` View the stream via RTSP protocol, try UDP first, then use TCP: ``` ffplay -i rtsp://localhost:8554/live/livestream ``` Or specify the transport protocol with TCP: ``` ffplay -rtsp_transport tcp -i rtsp://localhost:8554/live/livestream ``` ## Unit Test Run utest for RTSP: ``` ./configure --utest=on & make utest -j16 ./objs/srs_utest ``` ## Regression Test You need to start SRS for regression testing. ``` ./objs/srs -c conf/regression-test-for-clion.conf ``` Then run regression tests for RTSP. ``` cd srs/trunk/3rdparty/srs-bench go test ./srs -mod=vendor -v -count=1 -run=TestRtmpPublish_RtspPlay ``` ## Blackbox Test For blackbox testing, SRS will be started by utest, so there is no need to start SRS manually. ``` cd srs/trunk/3rdparty/srs-bench go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Basic ``` ## UDP Transport As UDP requires port allocation, this PR doesn't support delivering media stream via UDP transport, so it will fail if you try to use UDP as transport: ``` ffplay -rtsp_transport udp -i rtsp://localhost:8554/live/livestream [rtsp @ 0x7fbc99a14880] method SETUP failed: 461 Unsupported Transport rtsp://localhost:8554/live/livestream: Protocol not supported [2025-07-05 21:30:52.738][WARN][14916][7d7gf623][35] RTSP: setup failed: code=2057 (RtspTransportNotSupported) : UDP transport not supported, only TCP/interleaved mode is supported ``` There are no plans to support UDP transport for RTSP. In the real world, UDP is rarely used; the vast majority of RTSP traffic uses TCP. ## Play Before Publish RTSP supports audio with AAC and OPUS codecs, which is significantly different from RTMP or WebRTC. RTSP uses commands to exchange SDP and specify the audio track to play, unlike WHEP or HTTP-FLV, which use the query string of the URL. RTSP depends on the player’s behavior, making it very difficult to use and describe. Considering the feature that allows playing the stream before publishing it, it requires generating some default parameters in the SDP. For OPUS, the sample rate is 48 kHz with 2 channels, while AAC is more complex, especially regarding the sample rate, which may be 44.1 kHz, 32 kHz, or 48 kHz. Therefore, for RTSP, we cannot support play-then-publish. Instead, there must already be a stream when playing it, so that the audio codec is determined. ## Opus Codec No Opus codec support for RTSP, because for RTC2RTSP, it always converts RTC to RTMP frames, then converts them to RTSP packets. Therefore, the audio codec is always AAC after converting RTC to RTMP. This means the bridge architecture needs some changes. We need a new bridge that binds to the target protocol. For example, RTC2RTMP converts the audio codec, but RTC2RTSP keeps the original audio codec. Furthermore, the RTC2RTMP bridge should also support bypassing the Opus codec if we use enhanced-RTMP, which supports the Opus audio codec. I think it should be configurable to either transcode or bypass the audio codec. However, this is not relevant to RTSP. ## AI Contributor Below commits are contributed by AI: * [AI: Remove support for media transport via UDP.](https://github.com/ossrs/srs/pull/4333/commits/755686229f0d3910f058e6f75993112a68c5f60a) * [AI: Add crutial logs for each RTSP stage.](https://github.com/ossrs/srs/pull/4333/commits/9c8cbe7bdefda19087f87fdb5e041a8934e4db1d) * [AI: Support AAC doec for RTSP.](https://github.com/ossrs/srs/pull/4333/commits/7d7cc12bae269850011d4757eae635a61de99f36) * [AI: Add option --rtsp for RTSP.](https://github.com/ossrs/srs/pull/4333/commits/f67414d9ee98da39cda1f7d47cdf793c0e5a8412) * [AI: Extract SrsRtpVideoBuilder for RTC and RTSP.](https://github.com/ossrs/srs/pull/4333/commits/562e76b90469a1b016857eb23b090e8e45b52de3) --------- Co-authored-by: Jacob Su <suzp1984@gmail.com> Co-authored-by: winlin <winlinvip@gmail.com>
2025-07-11 20:18:40 +08:00
if [[ $SRS_RTSP == YES ]]; then
MODULE_FILES+=("srs_protocol_rtsp_stack")
fi
PROTOCOL_INCS="src/protocol"; MODULE_DIR=${PROTOCOL_INCS} . $SRS_WORKDIR/auto/modules.sh
2015-05-24 18:56:52 +08:00
PROTOCOL_OBJS="${MODULE_OBJS[@]}"
2020-01-22 10:59:50 +08:00
2017-03-26 10:16:21 +08:00
#
#App Module, for SRS server only.
2020-05-27 14:20:40 +08:00
MODULE_ID="APP"
2020-06-02 15:02:59 +08:00
MODULE_DEPENDS=("CORE" "KERNEL" "PROTOCOL")
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
ModuleLibIncs=(${SRS_OBJS} ${LibSSLRoot} ${LibSrtpRoot})
if [[ $SRS_GPERF == YES ]]; then
2020-06-02 16:43:07 +08:00
ModuleLibIncs+=(${LibGperfRoot})
fi
if [[ $SRS_FFMPEG_FIT == YES ]]; then
ModuleLibIncs+=("${LibFfmpegRoot[*]}")
2020-05-27 14:20:40 +08:00
fi
MODULE_FILES=("srs_app_server" "srs_app_rtmp_conn" "srs_app_rtmp_source"
"srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder"
"srs_app_st" "srs_app_log" "srs_app_config" "srs_app_stream_bridge"
"srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks"
2020-05-27 14:20:40 +08:00
"srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_edge"
"srs_app_heartbeat" "srs_app_http_client" "srs_app_http_static"
2020-05-27 14:20:40 +08:00
"srs_app_recv_thread" "srs_app_security" "srs_app_statistic" "srs_app_hds"
"srs_app_mpegts_udp" "srs_app_listener" "srs_app_async_call"
"srs_app_caster_flv" "srs_app_latest_version" "srs_app_process"
"srs_app_dash" "srs_app_fragment" "srs_app_dvr" "srs_app_ng_exec"
"srs_app_coworkers" "srs_app_circuit_breaker" "srs_app_factory"
"srs_app_stream_token" "srs_app_http_stream")
# Always include SRT app modules
MODULE_FILES+=("srs_app_srt_server" "srs_app_srt_listener" "srs_app_srt_conn" "srs_app_srt_source")
MODULE_FILES+=("srs_app_rtc_conn" "srs_app_rtc_dtls" "srs_app_rtc_network"
"srs_app_rtc_server" "srs_app_rtc_source" "srs_app_rtc_api")
NEW PROTOCOL: Support viewing stream over RTSP. v7.0.47 (#4333) ## Introduce This PR adds support for viewing streams via the RTSP protocol. Note that it only supports viewing streams, not publishing streams via RTSP. Currently, only publishing via RTMP is supported, which is then converted to RTSP. Further work is needed to support publishing RTC/SRT streams and converting them to RTSP. ## Usage Build and run SRS with RTSP support: ``` cd srs/trunk && ./configure --rtsp=on && make -j16 ./objs/srs -c conf/rtsp.conf ``` Push stream via RTMP by FFmpeg: ``` ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://localhost/live/livestream ``` View the stream via RTSP protocol, try UDP first, then use TCP: ``` ffplay -i rtsp://localhost:8554/live/livestream ``` Or specify the transport protocol with TCP: ``` ffplay -rtsp_transport tcp -i rtsp://localhost:8554/live/livestream ``` ## Unit Test Run utest for RTSP: ``` ./configure --utest=on & make utest -j16 ./objs/srs_utest ``` ## Regression Test You need to start SRS for regression testing. ``` ./objs/srs -c conf/regression-test-for-clion.conf ``` Then run regression tests for RTSP. ``` cd srs/trunk/3rdparty/srs-bench go test ./srs -mod=vendor -v -count=1 -run=TestRtmpPublish_RtspPlay ``` ## Blackbox Test For blackbox testing, SRS will be started by utest, so there is no need to start SRS manually. ``` cd srs/trunk/3rdparty/srs-bench go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Basic ``` ## UDP Transport As UDP requires port allocation, this PR doesn't support delivering media stream via UDP transport, so it will fail if you try to use UDP as transport: ``` ffplay -rtsp_transport udp -i rtsp://localhost:8554/live/livestream [rtsp @ 0x7fbc99a14880] method SETUP failed: 461 Unsupported Transport rtsp://localhost:8554/live/livestream: Protocol not supported [2025-07-05 21:30:52.738][WARN][14916][7d7gf623][35] RTSP: setup failed: code=2057 (RtspTransportNotSupported) : UDP transport not supported, only TCP/interleaved mode is supported ``` There are no plans to support UDP transport for RTSP. In the real world, UDP is rarely used; the vast majority of RTSP traffic uses TCP. ## Play Before Publish RTSP supports audio with AAC and OPUS codecs, which is significantly different from RTMP or WebRTC. RTSP uses commands to exchange SDP and specify the audio track to play, unlike WHEP or HTTP-FLV, which use the query string of the URL. RTSP depends on the player’s behavior, making it very difficult to use and describe. Considering the feature that allows playing the stream before publishing it, it requires generating some default parameters in the SDP. For OPUS, the sample rate is 48 kHz with 2 channels, while AAC is more complex, especially regarding the sample rate, which may be 44.1 kHz, 32 kHz, or 48 kHz. Therefore, for RTSP, we cannot support play-then-publish. Instead, there must already be a stream when playing it, so that the audio codec is determined. ## Opus Codec No Opus codec support for RTSP, because for RTC2RTSP, it always converts RTC to RTMP frames, then converts them to RTSP packets. Therefore, the audio codec is always AAC after converting RTC to RTMP. This means the bridge architecture needs some changes. We need a new bridge that binds to the target protocol. For example, RTC2RTMP converts the audio codec, but RTC2RTSP keeps the original audio codec. Furthermore, the RTC2RTMP bridge should also support bypassing the Opus codec if we use enhanced-RTMP, which supports the Opus audio codec. I think it should be configurable to either transcode or bypass the audio codec. However, this is not relevant to RTSP. ## AI Contributor Below commits are contributed by AI: * [AI: Remove support for media transport via UDP.](https://github.com/ossrs/srs/pull/4333/commits/755686229f0d3910f058e6f75993112a68c5f60a) * [AI: Add crutial logs for each RTSP stage.](https://github.com/ossrs/srs/pull/4333/commits/9c8cbe7bdefda19087f87fdb5e041a8934e4db1d) * [AI: Support AAC doec for RTSP.](https://github.com/ossrs/srs/pull/4333/commits/7d7cc12bae269850011d4757eae635a61de99f36) * [AI: Add option --rtsp for RTSP.](https://github.com/ossrs/srs/pull/4333/commits/f67414d9ee98da39cda1f7d47cdf793c0e5a8412) * [AI: Extract SrsRtpVideoBuilder for RTC and RTSP.](https://github.com/ossrs/srs/pull/4333/commits/562e76b90469a1b016857eb23b090e8e45b52de3) --------- Co-authored-by: Jacob Su <suzp1984@gmail.com> Co-authored-by: winlin <winlinvip@gmail.com>
2025-07-11 20:18:40 +08:00
if [[ $SRS_RTSP == YES ]]; then
MODULE_FILES+=("srs_app_rtsp_source" "srs_app_rtsp_conn")
fi
if [[ $SRS_FFMPEG_FIT == YES ]]; then
MODULE_FILES+=("srs_app_rtc_codec")
fi
if [[ $SRS_GB28181 == YES ]]; then
MODULE_FILES+=("srs_app_gb28181")
fi
2020-05-27 14:20:40 +08:00
DEFINES=""
# add each modules for app
APP_INCS="src/app"; MODULE_DIR=${APP_INCS} . $SRS_WORKDIR/auto/modules.sh
2020-05-27 14:20:40 +08:00
APP_OBJS="${MODULE_OBJS[@]}"
#
#Server Module, for SRS only.
2020-05-27 14:20:40 +08:00
MODULE_ID="SERVER"
2020-06-02 15:02:59 +08:00
MODULE_DEPENDS=("CORE" "KERNEL" "PROTOCOL" "APP")
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
ModuleLibIncs=(${SRS_OBJS} ${LibGperfRoot} ${LibSSLRoot} ${LibSrtpRoot})
if [[ $SRS_FFMPEG_FIT == YES ]]; then
ModuleLibIncs+=("${LibFfmpegRoot[*]}")
2020-05-27 14:20:40 +08:00
fi
MODULE_FILES=("srs_main_server")
SERVER_INCS="src/main"; MODULE_DIR=${SERVER_INCS} . $SRS_WORKDIR/auto/modules.sh
2020-05-27 14:20:40 +08:00
SERVER_OBJS="${MODULE_OBJS[@]}"
#####################################################################################
# Binaries, main entrances, link the module and its depends modules,
# then link to a binary, for example, objs/srs
#
2020-05-27 14:20:40 +08:00
# all main entrances
MAIN_ENTRANCES=("srs_main_server")
#
# all depends libraries
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
ModuleLibFiles=(${LibSTfile} ${LibSSLfile} ${LibGperfFile} ${LibSrtpFile})
if [[ $SRS_FFMPEG_FIT == YES ]]; then
ModuleLibFiles+=("${LibFfmpegFile[*]}")
2020-05-27 14:20:40 +08:00
fi
# Always include SRT library files
ModuleLibFiles+=("${LibSRTfile[*]}")
2020-05-27 14:20:40 +08:00
# all depends objects
2020-06-02 15:02:59 +08:00
MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${APP_OBJS[@]} ${SERVER_OBJS[@]}"
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot} ${LibGperfRoot} ${LibSSLRoot} ${LibSrtpRoot})
if [[ $SRS_FFMPEG_FIT == YES ]]; then
ModuleLibIncs+=("${LibFfmpegRoot[*]}")
2020-05-27 14:20:40 +08:00
fi
# Always include SRT libraries
ModuleLibIncs+=(${LibSRTRoot})
MODULE_OBJS="${MODULE_OBJS} ${SRT_OBJS[@]}"
LINK_OPTIONS="${LDFLAGS} ${SrsLinkOptions}${SrsGprofLink}${SrsGperfLink}"
2020-05-27 14:20:40 +08:00
#
# srs: srs(simple rtmp server) over st(state-threads)
BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . $SRS_WORKDIR/auto/apps.sh
2020-05-27 14:20:40 +08:00
#
2021-04-21 11:18:35 +08:00
# For modules, with the app module.
2021-04-21 11:03:37 +08:00
MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${APP_OBJS[@]} ${MAIN_OBJS[@]}"
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
ModuleLibFiles=(${LibSTfile} ${LibSSLfile} ${LibGperfFile} ${LibSrtpFile})
if [[ $SRS_FFMPEG_FIT == YES ]]; then
ModuleLibFiles+=("${LibFfmpegFile[*]}")
2020-05-27 14:20:40 +08:00
fi
# Always include SRT library files
ModuleLibFiles+=("${LibSRTfile[*]}")
2020-03-29 17:29:09 +08:00
# For utest on mac.
# @see https://github.com/protocolbuffers/protobuf/issues/51#issuecomment-111044468
if [[ $SRS_OSX == YES ]]; then
2020-03-29 18:01:46 +08:00
UTEST_EXTRA_DEFINES="-DGTEST_USE_OWN_TR1_TUPLE=1"
2020-03-29 17:29:09 +08:00
fi
#
# utest, the unit-test cases of srs, base on gtest1.6
if [[ $SRS_UTEST == YES ]]; then
2025-10-23 09:44:24 -04:00
MODULE_FILES=("srs_utest" "srs_utest_manual_amf0" "srs_utest_manual_kernel" "srs_utest_manual_core" "srs_utest_manual_srt"
"srs_utest_manual_config" "srs_utest_manual_rtmp" "srs_utest_manual_http" "srs_utest_manual_avc" "srs_utest_manual_reload"
"srs_utest_manual_mp4" "srs_utest_manual_service" "srs_utest_manual_app_rtc2rtmp" "srs_utest_manual_rtc" "srs_utest_manual_config2"
"srs_utest_manual_protocol" "srs_utest_manual_protocol2" "srs_utest_manual_kernel2" "srs_utest_manual_st" "srs_utest_manual_fmp4"
"srs_utest_manual_source_lock" "srs_utest_manual_stream_token" "srs_utest_manual_rtc_recv_track" "srs_utest_manual_st2"
"srs_utest_manual_hevc_structs" "srs_utest_manual_coworkers" "srs_utest_manual_pithy_print" "srs_utest_manual_protocol3"
RTC: Fix DVR missing first 4-6 seconds by initializing rate from SDP (#4541) for issue #4418, #4151, #4076 .DVR Missing First Few Seconds of Audio/Video ### Root Cause When recording WebRTC streams to FLV files using DVR, the first 4-6 seconds of audio/video are missing. This occurs because: 1. **Packets are discarded before A/V sync is available**: The RTC-to-RTMP conversion pipeline actively discards all RTP packets when avsync_time <= 0. 2. **Original algorithm requires 2 RTCP SR packets**: The previous implementation needed to receive two RTCP Sender Report (SR) packets before it could calculate the rate for audio/video synchronization timestamp conversion. 3. **Delay causes packet loss**: Since RTCP SR packets typically arrive every 2-3 seconds, waiting for 2 SRs means 4-6 seconds of packets are discarded before A/V sync becomes available. 4. **Audio SR arrives slower than video SR**: As reported in the issue, video RTCP SR packets arrive much faster than audio SR packets. This asymmetry causes audio packets to be discarded for a longer period, resulting in the audio loss observed in DVR recordings. ### Solution 1. **Initialize rate from SDP**: Use the sample rate from SDP (Session Description Protocol) to calculate the initial rate immediately when the track is created. Audio (Opus): 48000 Hz → rate = 48 (RTP units per millisecond) Video (H.264/H.265): 90000 Hz → rate = 90 (RTP units per millisecond) 2. **Enable immediate A/V sync:** With the SDP rate available, cal_avsync_time() can calculate valid timestamps from the very first RTP packet, eliminating packet loss. 3. **Smooth transition to precise rate**: After receiving the 2nd RTCP SR, update to the precisely calculated rate based on actual RTP/NTP timestamp mapping. ## Configuration Added new configuration option `init_rate_from_sdp` in the RTC vhost section: ```nginx vhost rtc.vhost.srs.com { rtc { # Whether initialize RTP rate from SDP sample rate for immediate A/V sync. # When enabled, the RTP rate (units per millisecond) is initialized from the SDP # sample rate (e.g., 90 for video 90kHz, 48 for audio 48kHz) before receiving # 2 RTCP SR packets. This allows immediate audio/video synchronization. # The rate will be updated to a more precise value after receiving the 2nd SR. # Overwrite by env SRS_VHOST_RTC_INIT_RATE_FROM_SDP for all vhosts. # Default: off init_rate_from_sdp off; } } ``` **⚠️ Important Note**: This config defaults to **off** because: - ✅ When **enabled**: Fixes the audio loss problem (no missing first 4-6 seconds) - ❌ When **enabled**: VLC on macOS cannot play the video properly - ✅ Other platforms work fine (Windows, Linux) - ✅ FFplay works fine on all platforms Users experiencing audio loss in DVR recordings can enable this option if they don't need VLC macOS compatibility. We're investigating the VLC macOS issue to make this feature safe to enable by default in the future. --------- Co-authored-by: winlin <winlinvip@gmail.com> Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-10-28 21:33:40 +08:00
"srs_utest_manual_app" "srs_utest_manual_mock")
MODULE_FILES+=("srs_utest_workflow_rtc_playstream" "srs_utest_workflow_rtc_publishstream"
"srs_utest_workflow_rtc_conn" "srs_utest_workflow_rtmp_conn" "srs_utest_workflow_srt_conn" "srs_utest_workflow_http_conn"
"srs_utest_workflow_forward" "srs_utest_workflow_rtc2rtmp" "srs_utest_workflow_rtmp2rtc")
2025-10-19 22:37:43 -04:00
MODULE_FILES+=("srs_utest_ai01" "srs_utest_ai02" "srs_utest_ai03" "srs_utest_ai04" "srs_utest_ai05"
"srs_utest_ai06" "srs_utest_ai07" "srs_utest_ai08" "srs_utest_ai09" "srs_utest_ai10" "srs_utest_ai11"
"srs_utest_ai12" "srs_utest_ai13" "srs_utest_ai14" "srs_utest_ai15" "srs_utest_ai16" "srs_utest_ai17"
RTC: Fix DVR missing first 4-6 seconds by initializing rate from SDP (#4541) for issue #4418, #4151, #4076 .DVR Missing First Few Seconds of Audio/Video ### Root Cause When recording WebRTC streams to FLV files using DVR, the first 4-6 seconds of audio/video are missing. This occurs because: 1. **Packets are discarded before A/V sync is available**: The RTC-to-RTMP conversion pipeline actively discards all RTP packets when avsync_time <= 0. 2. **Original algorithm requires 2 RTCP SR packets**: The previous implementation needed to receive two RTCP Sender Report (SR) packets before it could calculate the rate for audio/video synchronization timestamp conversion. 3. **Delay causes packet loss**: Since RTCP SR packets typically arrive every 2-3 seconds, waiting for 2 SRs means 4-6 seconds of packets are discarded before A/V sync becomes available. 4. **Audio SR arrives slower than video SR**: As reported in the issue, video RTCP SR packets arrive much faster than audio SR packets. This asymmetry causes audio packets to be discarded for a longer period, resulting in the audio loss observed in DVR recordings. ### Solution 1. **Initialize rate from SDP**: Use the sample rate from SDP (Session Description Protocol) to calculate the initial rate immediately when the track is created. Audio (Opus): 48000 Hz → rate = 48 (RTP units per millisecond) Video (H.264/H.265): 90000 Hz → rate = 90 (RTP units per millisecond) 2. **Enable immediate A/V sync:** With the SDP rate available, cal_avsync_time() can calculate valid timestamps from the very first RTP packet, eliminating packet loss. 3. **Smooth transition to precise rate**: After receiving the 2nd RTCP SR, update to the precisely calculated rate based on actual RTP/NTP timestamp mapping. ## Configuration Added new configuration option `init_rate_from_sdp` in the RTC vhost section: ```nginx vhost rtc.vhost.srs.com { rtc { # Whether initialize RTP rate from SDP sample rate for immediate A/V sync. # When enabled, the RTP rate (units per millisecond) is initialized from the SDP # sample rate (e.g., 90 for video 90kHz, 48 for audio 48kHz) before receiving # 2 RTCP SR packets. This allows immediate audio/video synchronization. # The rate will be updated to a more precise value after receiving the 2nd SR. # Overwrite by env SRS_VHOST_RTC_INIT_RATE_FROM_SDP for all vhosts. # Default: off init_rate_from_sdp off; } } ``` **⚠️ Important Note**: This config defaults to **off** because: - ✅ When **enabled**: Fixes the audio loss problem (no missing first 4-6 seconds) - ❌ When **enabled**: VLC on macOS cannot play the video properly - ✅ Other platforms work fine (Windows, Linux) - ✅ FFplay works fine on all platforms Users experiencing audio loss in DVR recordings can enable this option if they don't need VLC macOS compatibility. We're investigating the VLC macOS issue to make this feature safe to enable by default in the future. --------- Co-authored-by: winlin <winlinvip@gmail.com> Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-10-28 21:33:40 +08:00
"srs_utest_ai18" "srs_utest_ai19" "srs_utest_ai20" "srs_utest_ai24")
if [[ $SRS_GB28181 == YES ]]; then
2025-10-23 09:44:24 -04:00
MODULE_FILES+=("srs_utest_manual_gb28181" "srs_utest_ai23")
2025-10-13 08:14:41 -04:00
fi
if [[ $SRS_RTSP == YES ]]; then
2025-10-19 22:37:43 -04:00
MODULE_FILES+=("srs_utest_ai21" "srs_utest_ai22")
fi
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot} ${LibSSLRoot} ${LibSrtpRoot})
if [[ $SRS_FFMPEG_FIT == YES ]]; then
ModuleLibIncs+=("${LibFfmpegRoot[*]}")
fi
# Always include SRT library includes
ModuleLibIncs+=("${LibSRTRoot[*]}")
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
ModuleLibFiles=(${LibSTfile} ${LibSSLfile} ${LibSrtpFile})
if [[ $SRS_FFMPEG_FIT == YES ]]; then
ModuleLibFiles+=("${LibFfmpegFile[*]}")
fi
# Always include SRT library files
ModuleLibFiles+=("${LibSRTfile[*]}")
2020-06-02 15:02:59 +08:00
MODULE_DEPENDS=("CORE" "KERNEL" "PROTOCOL" "APP")
MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${APP_OBJS[@]} ${SRT_OBJS[@]}"
LINK_OPTIONS="${LDFLAGS} -lpthread ${SrsLinkOptions}" MODULE_DIR="src/utest" APP_NAME="srs_utest" . $SRS_WORKDIR/auto/utest.sh
fi
#####################################################################################
# generate colorful summary script
. $SRS_WORKDIR/auto/summary.sh
#####################################################################################
# makefile
2016-12-07 12:09:39 +08:00
echo "Generate Makefile"
2015-03-07 16:39:05 +08:00
# backup old makefile.
rm -f ${SRS_MAKEFILE}.bk &&
mv ${SRS_MAKEFILE} ${SRS_MAKEFILE}.bk
2015-03-07 16:39:05 +08:00
# generate phony header
cat << END > ${SRS_MAKEFILE}
.PHONY: default all _default install help clean destroy server utest _prepare_dir $__mphonys
.PHONY: clean_srs clean_openssl clean_srtp2 clean_opus clean_ffmpeg clean_st
2020-03-29 21:30:32 +08:00
.PHONY: st ffmpeg
CC = ${SRS_TOOL_CC}
CXX = ${SRS_TOOL_CXX}
AR = ${SRS_TOOL_AR}
LINK = ${SRS_TOOL_LD}
RANDLIB = ${SRS_TOOL_RANDLIB}
CXXFLAGS = ${CXXFLAGS}
LDFLAGS = ${LDFLAGS}
# install prefix.
SRS_PREFIX=${SRS_PREFIX}
2022-01-13 18:26:28 +08:00
SRS_DEFAULT_CONFIG=${SRS_DEFAULT_CONFIG}
__REAL_INSTALL=\$(DESTDIR)\$(SRS_PREFIX)
2014-03-02 09:00:49 +08:00
SRS_FORCE_MAKE_JOBS=${SRS_FORCE_MAKE_JOBS}
END
2014-03-02 09:00:49 +08:00
if [[ $SRS_FORCE_MAKE_JOBS == YES ]]; then
cat << END >> ${SRS_MAKEFILE}
JOBS=\$(shell echo \$(MAKEFLAGS)| grep -qE '\-j[0-9]+' || echo " ${SRS_JOBS}")
END
fi
# the real entry for all platform:
cat << END >> ${SRS_MAKEFILE}
default: server
all: _default
_default: server utest
2013-10-17 20:58:04 +08:00
help:
@echo "Usage: make <help>|<clean>|<destroy>|<server>|<utest>|<install>|<uninstall>"
2020-03-29 21:36:41 +08:00
@echo " help Display this help menu"
@echo " clean Cleanup project and all depends"
@echo " destroy Cleanup all files for this platform in ${SRS_OBJS}/${SRS_PLATFORM}"
2020-03-29 21:36:41 +08:00
@echo " server Build the srs and other modules in main"
@echo " utest Build the utest for srs"
@echo " install Install srs to the prefix path"
@echo " uninstall Uninstall srs from prefix path"
2020-03-29 21:30:32 +08:00
@echo "To rebuild special module:"
@echo " st Rebuild st-srs in ${SRS_OBJS}/${SRS_PLATFORM}/st-srs"
2020-03-29 21:36:41 +08:00
@echo " ffmpeg Rebuild ffmpeg in ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4.2-fit"
2020-04-04 20:24:24 +08:00
@echo "To reconfigure special depends:"
@echo " clean_openssl Remove the openssl cache."
@echo " clean_srtp2 Remove the libsrtp2 cache."
@echo " clean_opus Remove the opus cache."
2020-04-10 08:55:04 +08:00
@echo " clean_ffmpeg Remove the FFmpeg cache."
@echo " clean_st Remove the ST cache."
2015-03-07 16:39:05 +08:00
@echo "For example:"
@echo " make"
@echo " make help"
2013-10-17 20:58:04 +08:00
doclean:
(cd ${SRS_OBJS} && rm -rf srs srs_utest srs.exe srs_utest.exe $__mcleanups)
(cd ${SRS_OBJS} && rm -rf src/* include lib)
(mkdir -p ${SRS_OBJS}/utest && cd ${SRS_OBJS}/utest && rm -rf *.o *.a)
2013-10-17 20:58:04 +08:00
clean: clean_srs
2020-03-29 21:30:32 +08:00
destroy:
(cd ${SRS_OBJS} && rm -rf ${SRS_PLATFORM})
2020-03-29 15:23:40 +08:00
clean_srs:
@(cd ${SRS_OBJS} && rm -rf srs srs_utest src/* utest/*)
2020-03-29 15:23:40 +08:00
clean_openssl:
@rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/openssl
2020-04-04 20:24:24 +08:00
@echo "Please rebuild openssl by: ./configure"
2020-03-29 15:23:40 +08:00
2020-03-29 17:54:27 +08:00
clean_srtp2:
@rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/srtp2
2020-04-04 20:24:24 +08:00
@echo "Please rebuild libsrtp2 by: ./configure"
2020-03-29 17:54:27 +08:00
clean_opus:
@rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/opus
2020-04-04 20:24:24 +08:00
@echo "Please rebuild opus by: ./configure"
2020-03-29 17:54:27 +08:00
2020-04-10 08:55:04 +08:00
clean_ffmpeg:
@rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/ffmpeg
2020-04-10 08:55:04 +08:00
@echo "Please rebuild FFmpeg by: ./configure"
clean_st:
@rm -rf ${SRS_OBJS}/${SRS_PLATFORM}/3rdparty/st
2020-04-10 08:55:04 +08:00
@echo "Please rebuild ST by: ./configure"
2020-03-29 21:30:32 +08:00
st:
@rm -f ${SRS_OBJS}/srs srs_utest
@\$(MAKE)\$(JOBS) -C ${SRS_OBJS}/${SRS_PLATFORM}/st-srs clean
@env EXTRA_CFLAGS="${_ST_EXTRA_CFLAGS}" \$(MAKE)\$(JOBS) -C ${SRS_OBJS}/${SRS_PLATFORM}/st-srs ${_ST_MAKE_ARGS} CC=\$(CC) CXX=\$(CXX) AR=\$(AR) LD=\$(LINK) RANDLIB=\$(RANDLIB)
@echo "Please rebuild srs by: make"
2020-03-29 21:30:32 +08:00
ffmpeg:
@rm -f ${SRS_OBJS}/srs srs_utest
\$(MAKE)\$(JOBS) -C ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4.2-fit
\$(MAKE)\$(JOBS) -C ${SRS_OBJS}/${SRS_PLATFORM}/ffmpeg-4.2-fit install-libs
@echo "Please rebuild srs by: make"
2020-03-29 21:30:32 +08:00
END
# Generate Makefile entry for srs-server.
cat << END >> ${SRS_MAKEFILE}
2013-10-17 20:58:04 +08:00
server: _prepare_dir
@echo "Build the SRS server, JOBS=\${JOBS}, FORCE_MAKE_JOBS=${SRS_FORCE_MAKE_JOBS}"
\$(MAKE)\$(JOBS) -f ${SRS_OBJS}/Makefile srs
2022-08-05 18:32:05 +08:00
@bash objs/_srs_build_summary.sh
2013-10-17 20:58:04 +08:00
END
2020-05-29 17:00:06 +08:00
# install entry
cat << END >> ${SRS_MAKEFILE}
uninstall:
@echo "rmdir \$(SRS_PREFIX)"
@rm -rf \$(SRS_PREFIX)
install:
2016-12-07 12:09:39 +08:00
@echo "Now mkdir \$(__REAL_INSTALL)"
@mkdir -p \$(__REAL_INSTALL)
2016-12-07 12:09:39 +08:00
@echo "Now make the http root dir"
@mkdir -p \$(__REAL_INSTALL)/objs/nginx/html
@cp -f research/index.html \$(__REAL_INSTALL)/objs/nginx/html
@cp -f research/favicon.ico \$(__REAL_INSTALL)/objs/nginx/html
2021-05-05 13:26:25 +08:00
@cp -Rf research/players \$(__REAL_INSTALL)/objs/nginx/html/
@cp -Rf research/console \$(__REAL_INSTALL)/objs/nginx/html/
@cp -Rf 3rdparty/signaling/www/demos \$(__REAL_INSTALL)/objs/nginx/html/
2016-12-07 12:09:39 +08:00
@echo "Now copy binary files"
@mkdir -p \$(__REAL_INSTALL)/objs
@cp -f objs/srs \$(__REAL_INSTALL)/objs
2016-12-07 12:09:39 +08:00
@echo "Now copy srs conf files"
@mkdir -p \$(__REAL_INSTALL)/conf
@cp -f conf/*.conf \$(__REAL_INSTALL)/conf
2022-01-11 08:40:05 +08:00
@cp -f conf/server.key conf/server.crt \$(__REAL_INSTALL)/conf
2016-12-07 12:09:39 +08:00
@echo "Now copy init.d script files"
@mkdir -p \$(__REAL_INSTALL)/etc/init.d
@cp -f etc/init.d/srs \$(__REAL_INSTALL)/etc/init.d
@sed -i "s|^ROOT=.*|ROOT=\"\$(SRS_PREFIX)\"|g" \$(__REAL_INSTALL)/etc/init.d/srs
2022-01-13 18:26:28 +08:00
@sed -i "s|^CONFIG=.*|CONFIG=\"\$(SRS_DEFAULT_CONFIG)\"|g" \$(__REAL_INSTALL)/etc/init.d/srs
@echo "Now copy systemctl service files"
@mkdir -p \$(__REAL_INSTALL)/usr/lib/systemd/system
@cp -f usr/lib/systemd/system/srs.service \$(__REAL_INSTALL)/usr/lib/systemd/system/srs.service
2014-03-23 11:25:42 +08:00
@echo ""
@echo "@see: https://ossrs.net/lts/zh-cn/docs/v7/doc/service"
END
if [[ $SRS_UTEST == YES ]]; then
cat << END >> ${SRS_MAKEFILE}
2014-03-04 12:45:41 +08:00
utest: server
2016-12-07 12:09:39 +08:00
@echo "Building the utest for srs"
2014-03-03 18:28:50 +08:00
${SrsUtestMakeEntry}
2016-12-07 12:09:39 +08:00
@echo "The utest is built ok."
2014-03-03 18:28:50 +08:00
2014-03-07 18:55:15 +08:00
END
else
cat << END >> ${SRS_MAKEFILE}
2014-03-07 18:55:15 +08:00
utest: server
2016-12-07 12:09:39 +08:00
@echo "Ignore utest for it's disabled."
2014-03-07 18:55:15 +08:00
END
fi
cat << END >> ${SRS_MAKEFILE}
2013-10-17 20:58:04 +08:00
# the ./configure will generate it.
_prepare_dir:
@mkdir -p ${SRS_OBJS}
2013-10-17 20:58:04 +08:00
END
2015-03-07 16:39:05 +08:00
# generate makefile ok, append the tails.
cat ${SRS_MAKEFILE}.bk >> ${SRS_MAKEFILE} &&
rm -f ${SRS_MAKEFILE}.bk
2015-03-07 16:39:05 +08:00
2016-12-07 12:09:39 +08:00
echo 'Configure ok! '
2013-10-17 20:58:04 +08:00
2014-02-28 21:07:46 +08:00
#####################################################################################
# when configure success, prepare build
#####################################################################################
# create objs/logs for ffmpeg to write log.
2020-05-27 14:20:40 +08:00
mkdir -p ${SRS_OBJS}/logs
2014-02-28 21:07:46 +08:00
#####################################################################################
# configure summary
#####################################################################################
2013-11-30 14:12:19 +08:00
# summary
2020-05-27 14:20:40 +08:00
echo ""
echo "Configure summary:"
echo " ${SRS_AUTO_USER_CONFIGURE}"
echo " ${SRS_AUTO_CONFIGURE}"
if [[ $SRS_HLS == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}HLS is enabled.${BLACK}"
else
echo -e "${YELLOW}Warning: HLS is disabled.${BLACK}"
fi
if [[ $SRS_STREAM_CASTER == YES ]]; then
echo -e "${YELLOW}Experiment: StreamConverter is enabled.${BLACK}"
2020-05-27 14:20:40 +08:00
else
echo -e "${GREEN}Note: StreamConverter is disabled.${BLACK}"
2020-05-27 14:20:40 +08:00
fi
if [[ $SRS_HDS == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${YELLOW}Experiment: HDS is enabled.${BLACK}"
else
echo -e "${GREEN}Warning: HDS is disabled.${BLACK}"
fi
if [[ $SRS_GB28181 == YES ]]; then
echo -e "${YELLOW}Experiment: GB28181 is enabled. https://github.com/ossrs/srs/issues/3176${BLACK}"
else
echo -e "${GREEN}Warning: GB28181 is disabled.${BLACK}"
fi
echo -e "${GREEN}Experiment: HEVC/H.265 is enabled. https://github.com/ossrs/srs/issues/465${BLACK}"
echo -e "${YELLOW}Experiment: SRT is enabled. https://github.com/ossrs/srs/issues/1147${BLACK}"
AI: Remove cygwin64, always enable WebRTC, and enforce C++98 compatibility. v7.0.60 (#4447) This PR makes WebRTC a core feature of SRS and enforces C++98 compatibility by: 1. Always Enable WebRTC Support - Remove `--rtc=on|off` configuration option - WebRTC is now always enabled - Eliminate all `#ifdef SRS_RTC` conditional compilation blocks - Include WebRTC-related modules (RTC, SRTP, DTLS) in all builds - Update build scripts to always link WebRTC dependencies 2. Enforce C++98 Compatibility - Remove `--cxx11=on|off` and `--cxx14=on|off` configuration options - Force `SRS_CXX11=NO` and `SRS_CXX14=NO` in build system - Move these options to deprecated section with warnings - Ensure codebase maintains C++98 standard compatibility 3. Remove Windows/Cygwin Support - Remove all Windows and Cygwin64 conditional compilation blocks (#ifdef _WIN32, #ifdef CYGWIN64) - Delete Cygwin64 build configurations from build scripts ( auto/options.sh, auto/depends.sh, configure) - Remove Cygwin64 assembly files and State Threads platform support ( md_cygwin64.S) - Eliminate Windows-specific GitHub Actions workflows and CI/CD jobs - Remove NSIS packaging files and Windows installer generation - Delete Windows documentation and update feature lists to mark support as removed in v7.0 - Simplify OS detection to only support Unix-like systems (Linux, macOS) 4. Code Cleanup - Remove conditional WebRTC code blocks throughout the codebase - Simplify build configuration by removing WebRTC-related conditionals - Update constructor delegation patterns to be C++98 compatible - Fix vector initialization to use C++98 syntax - Eliminate Windows-specific implementations for file operations, time handling, and networking - Unified platform handling with consistent POSIX API usage --------- Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-21 10:03:38 -06:00
echo -e "${YELLOW}Experiment: RTC is enabled. https://github.com/ossrs/srs/issues/307${BLACK}"
NEW PROTOCOL: Support viewing stream over RTSP. v7.0.47 (#4333) ## Introduce This PR adds support for viewing streams via the RTSP protocol. Note that it only supports viewing streams, not publishing streams via RTSP. Currently, only publishing via RTMP is supported, which is then converted to RTSP. Further work is needed to support publishing RTC/SRT streams and converting them to RTSP. ## Usage Build and run SRS with RTSP support: ``` cd srs/trunk && ./configure --rtsp=on && make -j16 ./objs/srs -c conf/rtsp.conf ``` Push stream via RTMP by FFmpeg: ``` ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://localhost/live/livestream ``` View the stream via RTSP protocol, try UDP first, then use TCP: ``` ffplay -i rtsp://localhost:8554/live/livestream ``` Or specify the transport protocol with TCP: ``` ffplay -rtsp_transport tcp -i rtsp://localhost:8554/live/livestream ``` ## Unit Test Run utest for RTSP: ``` ./configure --utest=on & make utest -j16 ./objs/srs_utest ``` ## Regression Test You need to start SRS for regression testing. ``` ./objs/srs -c conf/regression-test-for-clion.conf ``` Then run regression tests for RTSP. ``` cd srs/trunk/3rdparty/srs-bench go test ./srs -mod=vendor -v -count=1 -run=TestRtmpPublish_RtspPlay ``` ## Blackbox Test For blackbox testing, SRS will be started by utest, so there is no need to start SRS manually. ``` cd srs/trunk/3rdparty/srs-bench go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Basic ``` ## UDP Transport As UDP requires port allocation, this PR doesn't support delivering media stream via UDP transport, so it will fail if you try to use UDP as transport: ``` ffplay -rtsp_transport udp -i rtsp://localhost:8554/live/livestream [rtsp @ 0x7fbc99a14880] method SETUP failed: 461 Unsupported Transport rtsp://localhost:8554/live/livestream: Protocol not supported [2025-07-05 21:30:52.738][WARN][14916][7d7gf623][35] RTSP: setup failed: code=2057 (RtspTransportNotSupported) : UDP transport not supported, only TCP/interleaved mode is supported ``` There are no plans to support UDP transport for RTSP. In the real world, UDP is rarely used; the vast majority of RTSP traffic uses TCP. ## Play Before Publish RTSP supports audio with AAC and OPUS codecs, which is significantly different from RTMP or WebRTC. RTSP uses commands to exchange SDP and specify the audio track to play, unlike WHEP or HTTP-FLV, which use the query string of the URL. RTSP depends on the player’s behavior, making it very difficult to use and describe. Considering the feature that allows playing the stream before publishing it, it requires generating some default parameters in the SDP. For OPUS, the sample rate is 48 kHz with 2 channels, while AAC is more complex, especially regarding the sample rate, which may be 44.1 kHz, 32 kHz, or 48 kHz. Therefore, for RTSP, we cannot support play-then-publish. Instead, there must already be a stream when playing it, so that the audio codec is determined. ## Opus Codec No Opus codec support for RTSP, because for RTC2RTSP, it always converts RTC to RTMP frames, then converts them to RTSP packets. Therefore, the audio codec is always AAC after converting RTC to RTMP. This means the bridge architecture needs some changes. We need a new bridge that binds to the target protocol. For example, RTC2RTMP converts the audio codec, but RTC2RTSP keeps the original audio codec. Furthermore, the RTC2RTMP bridge should also support bypassing the Opus codec if we use enhanced-RTMP, which supports the Opus audio codec. I think it should be configurable to either transcode or bypass the audio codec. However, this is not relevant to RTSP. ## AI Contributor Below commits are contributed by AI: * [AI: Remove support for media transport via UDP.](https://github.com/ossrs/srs/pull/4333/commits/755686229f0d3910f058e6f75993112a68c5f60a) * [AI: Add crutial logs for each RTSP stage.](https://github.com/ossrs/srs/pull/4333/commits/9c8cbe7bdefda19087f87fdb5e041a8934e4db1d) * [AI: Support AAC doec for RTSP.](https://github.com/ossrs/srs/pull/4333/commits/7d7cc12bae269850011d4757eae635a61de99f36) * [AI: Add option --rtsp for RTSP.](https://github.com/ossrs/srs/pull/4333/commits/f67414d9ee98da39cda1f7d47cdf793c0e5a8412) * [AI: Extract SrsRtpVideoBuilder for RTC and RTSP.](https://github.com/ossrs/srs/pull/4333/commits/562e76b90469a1b016857eb23b090e8e45b52de3) --------- Co-authored-by: Jacob Su <suzp1984@gmail.com> Co-authored-by: winlin <winlinvip@gmail.com>
2025-07-11 20:18:40 +08:00
if [[ $SRS_RTSP == YES ]]; then
echo -e "${YELLOW}Experiment: RTSP is enabled (requires RTC).${BLACK}"
else
echo -e "${GREEN}Warning: RTSP is disabled.${BLACK}"
fi
if [[ $SRS_HTTPS == YES ]]; then
echo -e "${YELLOW}Experiment: HTTPS is enabled. https://github.com/ossrs/srs/issues/1657${BLACK}"
else
echo -e "${GREEN}Warning: HTTPS is disabled.${BLACK}"
fi
if [[ $SRS_DVR == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}DVR is enabled.${BLACK}"
else
echo -e "${YELLOW}Warning: DVR is disabled.${BLACK}"
2014-05-04 18:38:08 +08:00
fi
if [[ $SRS_SSL == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}RTMP complex handshake is enabled${BLACK}"
else
echo -e "${YELLOW}Warning: RTMP complex handshake is disabled, flash cann't play h264/aac.${BLACK}"
fi
if [[ $SRS_NASM == YES ]]; then
echo -e "${GREEN}NASM for HTTPS(openssl) and FFmepg is enabled${BLACK}"
else
echo -e "${YELLOW}Warning: NASM for HTTPS(openssl) and FFmepg is disabled${BLACK}"
fi
if [[ $SRS_SRTP_ASM == YES ]]; then
echo -e "${GREEN}SRTP-NASM for WebRTC(openssl) is enabled${BLACK}"
else
echo -e "${YELLOW}Warning: SRTP-NASM for WebRTC(openssl) is disabled${BLACK}"
fi
if [[ $SRS_TRANSCODE == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}The transcoding is enabled${BLACK}"
else
echo -e "${YELLOW}Warning: The transcoding is disabled.${BLACK}"
fi
if [[ $SRS_INGEST == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}The ingesting is enabled.${BLACK}"
else
echo -e "${YELLOW}Warning: The ingesting is disabled.${BLACK}"
fi
if [[ $SRS_HTTP_CALLBACK == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}The http-callback is enabled${BLACK}"
else
echo -e "${YELLOW}Warning: The http-callback is disabled.${BLACK}"
fi
if [[ $SRS_HTTP_SERVER == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}Embeded HTTP server for HTTP-FLV/HLS is enabled.${BLACK}"
else
echo -e "${YELLOW}Warning: Embeded HTTP server is disabled, HTTP-FLV is disabled, please use nginx to delivery HLS.${BLACK}"
fi
if [[ $SRS_HTTP_API == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}The HTTP API is enabled${BLACK}"
else
echo -e "${YELLOW}Warning: The HTTP API is disabled.${BLACK}"
fi
if [[ $SRS_UTEST == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}The utests are enabled.${BLACK}"
else
echo -e "${YELLOW}Note: The utests are disabled.${BLACK}"
fi
if [[ $SRS_GPERF == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}The gperf(tcmalloc) is enabled.${BLACK}"
else
echo -e "${GREEN}Note: The gperf(tcmalloc) is disabled.${BLACK}"
fi
if [[ $SRS_GPERF_MC == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${YELLOW}The gmc(gperf memory check) is enabled, performance may suffer.${BLACK}"
else
echo -e "${GREEN}Note: The gmc(gperf memory check) is disabled.${BLACK}"
fi
if [[ $SRS_GPERF_MD == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${YELLOW}The gmd(gperf memory defense) is enabled, performance may suffer.${BLACK}"
else
echo -e "${GREEN}Note: The gmd(gperf memory defense) is disabled.${BLACK}"
fi
if [[ $SRS_GPERF_MP == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${YELLOW}The gmp(gperf memory profile) is enabled, performance may suffer.${BLACK}"
else
echo -e "${GREEN}Note: The gmp(gperf memory profile) is disabled.${BLACK}"
fi
if [[ $SRS_GPERF_CP == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${YELLOW}The gcp(gperf cpu profile) is enabled, performance may suffer.${BLACK}"
else
echo -e "${GREEN}Note: The gcp(gperf cpu profile) is disabled.${BLACK}"
fi
if [[ $SRS_GPROF == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${YELLOW}The gprof(GNU profile tool) is enabled, performance may suffer.${BLACK}"
else
echo -e "${GREEN}Note: The gprof(GNU profile tool) is disabled.${BLACK}"
fi
if [[ $SRS_CROSS_BUILD == YES ]]; then
2021-05-21 17:14:04 +08:00
echo -e "${YELLOW}The cross-build is enabled.${BLACK}"
else
echo -e "${GREEN}Note: The cross-build is disabled.${BLACK}"
fi
if [[ $SRS_VALGRIND == YES ]]; then
2020-05-27 14:20:40 +08:00
echo -e "${GREEN}The valgrind is enabled.${BLACK}"
else
echo -e "${GREEN}Note: The valgrind is disabled.${BLACK}"
fi
if [[ $SRS_SANITIZER == YES ]]; then
echo -e "${GREEN}The sanitizer is enabled.${BLACK}"
else
echo -e "${GREEN}Note: The sanitizer is disabled.${BLACK}"
fi
2020-04-04 18:47:12 +08:00
#####################################################################################
# Do cleanup when configure done.
#####################################################################################
if [[ $SRS_CLEAN == YES && -f Makefile ]]; then
#echo "Do full cleanup, you can disable it by: --clean=off"
2020-04-04 18:47:12 +08:00
make clean
fi
#####################################################################################
# next step
#####################################################################################
2020-05-27 14:20:40 +08:00
echo ""
echo "You can build SRS:"
echo "\" make \" to build the SRS server"
echo "\" make help \" to get some help"
2020-05-27 14:20:40 +08:00