diff --git a/DONATIONS.txt b/DONATIONS.txt
index c404c221d..bec0ed9c9 100644
--- a/DONATIONS.txt
+++ b/DONATIONS.txt
@@ -3,18 +3,22 @@ Donations ordered by first donation.
===========================================================
2015
-RMB 1000+
+RMB 10000+
+* [2015-03-03 13:25] 郭强
+
+RMB 1000-9999
* [2015-xx-xx xx:xx] xxx
RMB 500-999
* [2015-xx-xx xx:xx] xxx
RMB 100-499
+* [2015-03-11 09:44] 叶发养
* [2015-02-08 21:10] 韩友洪
* [2015-01-09 16:08] 李理
RMB 50-99
-* [2015-xx-xx xx:xx] xxx
+* [2015-03-03 17:30] flybird
RMB 0.01-49
* [2015-xx-xx xx:xx] xxx
diff --git a/README.md b/README.md
index 58b9c76ec..39341c337 100755
--- a/README.md
+++ b/README.md
@@ -12,11 +12,32 @@ Download from ossrs.net:
[Centos6-x86_64](http://www.ossrs.net/srs.release/releases/files/SRS-CentOS6-x86_64-1.0.27.zip)
[more...](http://www.ossrs.net/srs.release/releases/)
+## Why SRS?
+
+1. Completely rewrite HLS following m3u8/ts spec, and HLS support h.264+aac/mp3.
+1. High efficient RTMP deliverying support 7k+ concurrency, vhost based, both origin and edge.
+1. Embeded simplified media HTTP server for HLS, api and HTTP flv/ts/mp3/aac streaming.
+1. Variety input: RTMP, pull by ingest file or stream(HTTP/RTMP/RTSP), push by stream caster
+RTSP/MPEGTS-over-UDP.
+1. Popular internet delivery: RTMP for flash, HLS for mobile(IOS/IPad/MAC/Android), HTTP
+flv/ts/mp3/aac streaming for user prefered.
+1. Enhanced DVR: segment/session/append plan, customer path and HTTP callback.
+1. Multiple feature: transcode, forward, ingest, http hooks, dvr, hls, rtsp, http streaming,
+http api, refer, log, bandwith test and srs-librtmp.
+1. Best maintainess: simple arch over state-threads(coroutine), single thread, single process
+and for linux/osx platform, common server x86-64/i386/arm/mips cpus, rich comments, strictly
+follows RTMP/HLS/RTSP spec.
+1. Easy to use: both English and Chinese wiki, typically config files in trunk/conf, traceable
+and session based log, linux service script and install script.
+1. MIT license, open source with product management and evolution.
+
+Enjoy it!
+
## About
SRS(SIMPLE RTMP Server) over state-threads created in 2013.10.
-SRS delivers rtmp/hls/http live on x86/x64/arm/mips linux,
+SRS delivers rtmp/hls/http live on x86/x64/arm/mips linux/osx,
supports origin/edge/vhost and transcode/ingest and dvr/forward
and http-api/http-callback/reload, introduces tracable
session-oriented log, exports client srs-librtmp,
@@ -486,14 +507,12 @@ Supported operating systems and hardware:
).
1. Support HLS(h.264+mp3) streaming, read
[#301](https://github.com/winlinvip/simple-rtmp-server/issues/301).
-1. Support push MPEG-TS over UDP to SRS, read
-[#250](https://github.com/winlinvip/simple-rtmp-server/issues/250).
1. Rewrite HLS(h.264+aac/mp3) streaming, read
[#304](https://github.com/winlinvip/simple-rtmp-server/issues/304).
-1. Support push RTSP to SRS, read
+1. [experiment] Support push MPEG-TS over UDP to SRS, read
+[#250](https://github.com/winlinvip/simple-rtmp-server/issues/250).
+1. [experiment] Support push RTSP to SRS, read
[#133](https://github.com/winlinvip/simple-rtmp-server/issues/133).
-1. Support DVR http api, read
-[#179](https://github.com/winlinvip/simple-rtmp-server/issues/179).
1. [no-plan] Support <500ms latency, FRSC(Fast RTMP-compatible Stream Channel tech).
1. [no-plan] Support RTMP 302 redirect [#92](https://github.com/winlinvip/simple-rtmp-server/issues/92).
1. [no-plan] Support multiple processes, for both origin and edge
@@ -503,7 +522,6 @@ Supported operating systems and hardware:
1. [no-plan] Support encryption: RTMPE/RTMPS, HLS DRM
1. [no-plan] Support RTMPT, http to tranverse firewalls
1. [no-plan] Support file source, transcoding file to live stream
-1. [no-plan] Support RTP/RTSP server.
## Releases
* 2015-02-12, [Release v1.0r2](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0r2), bug fixed, 1.0.27, 59507 lines.
@@ -532,8 +550,13 @@ Supported operating systems and hardware:
### SRS 2.0 history
-* v2.0, 2015-02-24, for [#304](https://github.com/winlinvip/simple-rtmp-server/issues/304), fix hls bug, write pts/dts error. 2.0.124.
-* v2.0, 2015-02-24, fix [#179](https://github.com/winlinvip/simple-rtmp-server/issues/179), support dvr http api. 2.0.123.
+* v2.0, 2015-03-10, fix [#155](https://github.com/winlinvip/simple-rtmp-server/issues/155), support osx(darwin) for mac pro. 2.0.137.
+* v2.0, 2015-03-08, fix [#316](https://github.com/winlinvip/simple-rtmp-server/issues/316), http api provides stream/vhost/srs/server bytes, codec and count. 2.0.136.
+* v2.0, 2015-03-08, fix [#310](https://github.com/winlinvip/simple-rtmp-server/issues/310), refine aac LC, support aac HE/HEv2. 2.0.134.
+* v2.0, 2015-03-06, for [#322](https://github.com/winlinvip/simple-rtmp-server/issues/322), fix http-flv stream bug, support multiple streams. 2.0.133.
+* v2.0, 2015-03-06, refine http request parse. 2.0.132.
+* v2.0, 2015-03-01, for [#179](https://github.com/winlinvip/simple-rtmp-server/issues/179), revert dvr http api. 2.0.128.
+* v2.0, 2015-02-24, for [#304](https://github.com/winlinvip/simple-rtmp-server/issues/304), fix hls bug, write pts/dts error. 2.0.124
* v2.0, 2015-02-19, refine dvr, append file when dvr file exists. 2.0.122.
* v2.0, 2015-02-19, refine pithy print to more easyer to use. 2.0.121.
* v2.0, 2015-02-18, fix [#133](https://github.com/winlinvip/simple-rtmp-server/issues/133), support push rtsp to srs. 2.0.120.
diff --git a/trunk/3rdparty/libaacplus-2.0.2.zip b/trunk/3rdparty/libaacplus-2.0.2.zip
deleted file mode 100644
index ecf78dbf8..000000000
Binary files a/trunk/3rdparty/libaacplus-2.0.2.zip and /dev/null differ
diff --git a/trunk/3rdparty/libaacplus-patch-26410-800.zip b/trunk/3rdparty/libaacplus-patch-26410-800.zip
deleted file mode 100644
index bef52eb6e..000000000
Binary files a/trunk/3rdparty/libaacplus-patch-26410-800.zip and /dev/null differ
diff --git a/trunk/3rdparty/patches/2.http.parser.patch b/trunk/3rdparty/patches/2.http.parser.patch
new file mode 100644
index 000000000..596d5972b
--- /dev/null
+++ b/trunk/3rdparty/patches/2.http.parser.patch
@@ -0,0 +1,17 @@
+diff -r -c ./Makefile ../http-parser-2.1/Makefile
+*** ./Makefile Tue Mar 10 10:44:19 2015
+--- ../http-parser-2.1/Makefile Wed Mar 27 06:35:20 2013
+***************
+*** 12,22 ****
+ CFLAGS_FAST = $(CFLAGS) -O3 $(CFLAGS_FAST_EXTRA)
+ CFLAGS_LIB = $(CFLAGS_FAST) -fPIC
+
+- # patch by winlin
+- CPPFLAGS_FAST = $(CPPFLAGS_DEBUG)
+- CFLAGS_FAST = $(CFLAGS_DEBUG)
+- CFLAGS_LIB = $(CFLAGS_FAST) -fPIC
+-
+ test: test_g test_fast
+ ./test_g
+ ./test_fast
+--- 12,17 ----
diff --git a/trunk/3rdparty/readme.txt b/trunk/3rdparty/readme.txt
index 6b7d071b1..094504d8c 100644
--- a/trunk/3rdparty/readme.txt
+++ b/trunk/3rdparty/readme.txt
@@ -16,8 +16,6 @@ CherryPy-3.2.4.zip
ffmpeg-2.1.1.tar.gz
yasm-1.2.0.tar.gz
lame-3.99.5.tar.gz
-libaacplus-2.0.2.tar.gz
-libaacplus-patch-26410-800.zip (26410-800.zip)
speex-1.2rc1.zip
x264-snapshot-20131129-2245-stable.tar.bz2 (core.138)
for srs to support live stream transcoding.
@@ -55,12 +53,6 @@ links:
lame:
http://sourceforge.net/projects/lame/
http://nchc.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
- aacplus:
- http://217.20.164.161/~tipok/aacplus/
- http://217.20.164.161/~tipok/aacplus/libaacplus-2.0.2.tar.gz
- aacplus-patch:
- http://www.3gpp.org/DynaReport/26410.htm
- http://www.3gpp.org/ftp/Specs/archive/26_series/26.410/26410-800.zip
yasm:
http://yasm.tortall.net/
http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
diff --git a/trunk/auto/auto_headers.sh b/trunk/auto/auto_headers.sh
new file mode 100755
index 000000000..c559c3dfb
--- /dev/null
+++ b/trunk/auto/auto_headers.sh
@@ -0,0 +1,251 @@
+#!/bin/bash
+
+# output variables:
+# SRS_AUTO_HEADERS_H: the auto generated header file.
+
+SRS_AUTO_HEADERS_H="${SRS_OBJS}/srs_auto_headers.hpp"
+
+# write user options to headers
+echo "// auto generated by configure" > $SRS_AUTO_HEADERS_H
+echo "#ifndef SRS_AUTO_HEADER_HPP" >> $SRS_AUTO_HEADERS_H
+echo "#define SRS_AUTO_HEADER_HPP" >> $SRS_AUTO_HEADERS_H
+echo "" >> $SRS_AUTO_HEADERS_H
+
+echo "#define SRS_AUTO_BUILD_TS \"`date +%s`\"" >> $SRS_AUTO_HEADERS_H
+echo "#define SRS_AUTO_BUILD_DATE \"`date \"+%Y-%m-%d %H:%M:%S\"`\"" >> $SRS_AUTO_HEADERS_H
+echo "#define SRS_AUTO_UNAME \"`uname -a`\"" >> $SRS_AUTO_HEADERS_H
+echo "#define SRS_AUTO_USER_CONFIGURE \"${SRS_AUTO_USER_CONFIGURE}\"" >> $SRS_AUTO_HEADERS_H
+echo "#define SRS_AUTO_CONFIGURE \"${SRS_AUTO_CONFIGURE}\"" >> $SRS_AUTO_HEADERS_H
+echo "" >> $SRS_AUTO_HEADERS_H
+
+# export the preset.
+if [ $SRS_OSX = YES ]; then
+ echo "#define SRS_OSX" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_X86_X64 = YES ]; then
+ echo "#define SRS_X86_X64" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_ARM_UBUNTU12 = YES ]; then
+ echo "#define SRS_ARM_UBUNTU12" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_MIPS_UBUNTU12 = YES ]; then
+ echo "#define SRS_MIPS_UBUNTU12" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_PI = YES ]; then
+ echo "#define SRS_PI" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_CUBIE = YES ]; then
+ echo "#define SRS_CUBIE" >> $SRS_AUTO_HEADERS_H
+fi
+
+echo "" >> $SRS_AUTO_HEADERS_H
+
+#####################################################################################
+# generate auto headers file, depends on the finished of options.sh
+#####################################################################################
+if [ $SRS_ARM_UBUNTU12 = YES ]; then
+ __SrsArmCC="arm-linux-gnueabi-gcc";
+ __SrsArmGCC="arm-linux-gnueabi-gcc";
+ __SrsArmCXX="arm-linux-gnueabi-g++";
+ __SrsArmAR="arm-linux-gnueabi-ar";
+ __SrsArmLD="arm-linux-gnueabi-ld";
+ __SrsArmRANDLIB="arm-linux-gnueabi-ranlib";
+fi
+if [ $SRS_MIPS_UBUNTU12 = YES ]; then
+ __SrsArmCC="mipsel-openwrt-linux-gcc";
+ __SrsArmGCC="mipsel-openwrt-linux-gcc";
+ __SrsArmCXX="mipsel-openwrt-linux-g++";
+ __SrsArmAR="mipsel-openwrt-linux-ar";
+ __SrsArmLD="mipsel-openwrt-linux-ld";
+ __SrsArmRANDLIB="mipsel-openwrt-linux-ranlib";
+fi
+# the arm-ubuntu12 options for make for depends
+if [[ -z $SrsArmCC ]]; then SrsArmCC=$__SrsArmCC; fi
+if [[ -z $SrsArmGCC ]]; then SrsArmGCC=$__SrsArmGCC; fi
+if [[ -z $SrsArmCXX ]]; then SrsArmCXX=$__SrsArmCXX; fi
+if [[ -z $SrsArmAR ]]; then SrsArmAR=$__SrsArmAR; fi
+if [[ -z $SrsArmLD ]]; then SrsArmLD=$__SrsArmLD; fi
+if [[ -z $SrsArmRANDLIB ]]; then SrsArmRANDLIB=$__SrsArmRANDLIB; fi
+# write to source file
+if [ $SRS_EMBEDED_CPU = YES ]; then
+ echo "cc=$SrsArmCC gcc=$SrsArmGCC g++=$SrsArmCXX ar=$SrsArmAR ld=$SrsArmLD randlib=$SrsArmRANDLIB"
+ echo "#define SRS_AUTO_EMBEDED_TOOL_CHAIN \"cc=$SrsArmCC gcc=$SrsArmGCC g++=$SrsArmCXX ar=$SrsArmAR ld=$SrsArmLD randlib=$SrsArmRANDLIB\"" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#define SRS_AUTO_EMBEDED_TOOL_CHAIN \"normal x86/x64 gcc\"" >> $SRS_AUTO_HEADERS_H
+fi
+echo "" >> $SRS_AUTO_HEADERS_H
+
+# auto headers in depends.
+if [ $SRS_HTTP_PARSER = YES ]; then
+ echo "#define SRS_AUTO_HTTP_PARSER" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_HTTP_PARSER" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_HTTP_SERVER = YES ]; then
+ echo "#define SRS_AUTO_HTTP_SERVER" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_HTTP_SERVER" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_STREAM_CASTER = YES ]; then
+ echo "#define SRS_AUTO_STREAM_CASTER" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_STREAM_CASTER" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_HTTP_API = YES ]; then
+ echo "#define SRS_AUTO_HTTP_API" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_HTTP_API" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_NGINX = YES ]; then
+ echo "#define SRS_AUTO_NGINX" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_NGINX" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_DVR = YES ]; then
+ echo "#define SRS_AUTO_DVR" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_DVR" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_HLS = YES ]; then
+ echo "#define SRS_AUTO_HLS" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_HLS" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_HTTP_CALLBACK = YES ]; then
+ echo "#define SRS_AUTO_HTTP_CALLBACK" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_HTTP_CALLBACK" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_SSL = YES ]; then
+ echo "#define SRS_AUTO_SSL" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_SSL" >> $SRS_AUTO_HEADERS_H
+fi
+
+# whether compile ffmpeg tool
+if [ $SRS_FFMPEG_TOOL = YES ]; then
+ echo "#define SRS_AUTO_FFMPEG_TOOL" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_FFMPEG_TOOL" >> $SRS_AUTO_HEADERS_H
+fi
+
+# whatever the FFMPEG tools, if transcode and ingest specified,
+# srs always compile the FFMPEG tool stub which used to start the FFMPEG process.
+if [ $SRS_FFMPEG_STUB = YES ]; then
+ echo "#define SRS_AUTO_FFMPEG_STUB" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_FFMPEG_STUB" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_TRANSCODE = YES ]; then
+ echo "#define SRS_AUTO_TRANSCODE" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_TRANSCODE" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_INGEST = YES ]; then
+ echo "#define SRS_AUTO_INGEST" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_INGEST" >> $SRS_AUTO_HEADERS_H
+fi
+
+# for statistic.
+if [ $SRS_STAT = YES ]; then
+ echo "#define SRS_AUTO_STAT" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_STAT" >> $SRS_AUTO_HEADERS_H
+fi
+
+if [ $SRS_GPERF = YES ]; then
+ echo "#define SRS_AUTO_GPERF" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_GPERF" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_GPERF_MC = YES ]; then
+ echo "#define SRS_AUTO_GPERF_MC" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_GPERF_MC" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_GPERF_MP = YES ]; then
+ echo "#define SRS_AUTO_GPERF_MP" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_GPERF_MP" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_GPERF_CP = YES ]; then
+ echo "#define SRS_AUTO_GPERF_CP" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_GPERF_CP" >> $SRS_AUTO_HEADERS_H
+fi
+
+#####################################################################################
+# for embeded.
+#####################################################################################
+if [ $SRS_EMBEDED_CPU = YES ]; then
+ echo "#define SRS_AUTO_EMBEDED_CPU" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_EMBEDED_CPU" >> $SRS_AUTO_HEADERS_H
+fi
+
+# arm
+if [ $SRS_ARM_UBUNTU12 = YES ]; then
+ echo "#define SRS_AUTO_ARM_UBUNTU12" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_ARM_UBUNTU12" >> $SRS_AUTO_HEADERS_H
+fi
+
+# mips
+if [ $SRS_MIPS_UBUNTU12 = YES ]; then
+ echo "#define SRS_AUTO_MIPS_UBUNTU12" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_MIPS_UBUNTU12" >> $SRS_AUTO_HEADERS_H
+fi
+
+echo "" >> $SRS_AUTO_HEADERS_H
+# for log level compile settings
+if [ $SRS_LOG_VERBOSE = YES ]; then
+ echo "#define SRS_AUTO_VERBOSE" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_VERBOSE" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_LOG_INFO = YES ]; then
+ echo "#define SRS_AUTO_INFO" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_INFO" >> $SRS_AUTO_HEADERS_H
+fi
+if [ $SRS_LOG_TRACE = YES ]; then
+ echo "#define SRS_AUTO_TRACE" >> $SRS_AUTO_HEADERS_H
+else
+ echo "#undef SRS_AUTO_TRACE" >> $SRS_AUTO_HEADERS_H
+fi
+
+# prefix
+echo "" >> $SRS_AUTO_HEADERS_H
+echo "#define SRS_AUTO_PREFIX \"${SRS_PREFIX}\"" >> $SRS_AUTO_HEADERS_H
+
+echo "" >> $SRS_AUTO_HEADERS_H
+
+#####################################################################################
+# generated the contributors from AUTHORS.txt
+#####################################################################################
+SRS_CONSTRIBUTORS=`cat ../AUTHORS.txt|grep "*"|awk '{print $2}'`
+echo "#define SRS_AUTO_CONSTRIBUTORS \"\\" >> $SRS_AUTO_HEADERS_H
+for CONTRIBUTOR in $SRS_CONSTRIBUTORS; do
+ echo "${CONTRIBUTOR} \\" >> $SRS_AUTO_HEADERS_H
+done
+echo "\"" >> $SRS_AUTO_HEADERS_H
+
+# new empty line to auto headers file.
+echo "" >> $SRS_AUTO_HEADERS_H
+
+# auto header EOF.
+echo "#endif" >> $SRS_AUTO_HEADERS_H
+echo "" >> $SRS_AUTO_HEADERS_H
+
diff --git a/trunk/auto/build_ffmpeg.sh b/trunk/auto/build_ffmpeg.sh
index b52d4ce94..19f6f7245 100755
--- a/trunk/auto/build_ffmpeg.sh
+++ b/trunk/auto/build_ffmpeg.sh
@@ -3,7 +3,7 @@
ff_src_dir="../../3rdparty"
# the jobs to make ffmpeg
-if [[ "" -eq SRS_JOBS ]]; then
+if [[ "" == $SRS_JOBS ]]; then
export SRS_JOBS="--jobs=1"
fi
@@ -38,9 +38,6 @@ fi
# ffmpeg can specifies the yasm path when configure it.
export PATH=${PATH}:${ff_release_dir}/bin
-# the aac command for ffmepg.
-AAC_FOR_FFMPEG="--enable-libfdk-aac"
-
# libfdk-aac
if [[ -f ${ff_release_dir}/lib/libfdk-aac.a ]]; then
echo "libfdk_aac is ok"
@@ -52,24 +49,6 @@ else
ret=$?; if [[ 0 -ne ${ret} ]]; then echo "build fdk-aac-0.1.3 failed"; exit 1; fi
fi
-# libaacplus
-if [ $UBUNTU14 = NO ]; then
- AAC_FOR_FFMPEG="$AAC_FOR_FFMPEG --enable-libaacplus"
-
- if [[ -f ${ff_release_dir}/lib/libaacplus.a ]]; then
- echo "libaacplus is ok"
- else
- echo "build libaacplus-2.0.2"
- cd $ff_current_dir &&
- rm -rf libaacplus-2.0.2 && unzip -q ${ff_src_dir}/libaacplus-2.0.2.zip &&
- cd libaacplus-2.0.2 && cp ../${ff_src_dir}/libaacplus-patch-26410-800.zip src/26410-800.zip &&
- bash autogen.sh && ./configure --prefix=${ff_release_dir} --enable-static && make && make install
- ret=$?; if [[ 0 -ne ${ret} ]]; then echo "build libaacplus-2.0.2 failed"; exit 1; fi
- fi
-fi
-
-echo "aac for ffmepg: $AAC_FOR_FFMPEG"
-
# lame-3.99
if [[ -f ${ff_release_dir}/lib/libmp3lame.a ]]; then
echo "libmp3lame is ok"
@@ -128,7 +107,7 @@ else
--extra-ldflags='-L${ffmpeg_exported_release_dir}/lib -lm -ldl' \
--disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc \
--enable-postproc --enable-bzlib --enable-zlib --enable-parsers \
- --enable-libx264 --enable-libmp3lame $AAC_FOR_FFMPEG --enable-libspeex \
+ --enable-libx264 --enable-libmp3lame --enable-libfdk-aac --enable-libspeex \
--enable-pthreads --extra-libs=-lpthread \
--enable-encoders --enable-decoders --enable-avfilter --enable-muxers --enable-demuxers &&
make ${SRS_JOBS} && make install
diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh
index becd2c311..8aee3c73d 100755
--- a/trunk/auto/depends.sh
+++ b/trunk/auto/depends.sh
@@ -3,7 +3,6 @@
# variables, parent script must set it:
# SRS_JOBS: the build jobs.
# SrsArmMakeOptions: the arm make options for ubuntu12(armhf, v7cpu)
-# SRS_AUTO_HEADERS_H: the auto generated header file.
#####################################################################################
#####################################################################################
@@ -42,6 +41,24 @@ function Ubuntu_prepare()
return 0;
fi
fi
+
+ # for arm, install the cross build tool chain.
+ if [ $SRS_ARM_UBUNTU12 = YES ]; then
+ $SrsArmCC --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi"
+ require_sudoer "sudo apt-get install -y --force-yes gcc-arm-linux-gnueabi g++-arm-linux-gnueabi"
+ sudo apt-get install -y --force-yes gcc-arm-linux-gnueabi g++-arm-linux-gnueabi; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi success"
+ fi
+ fi
+
+ # for mips, user must installed the tool chain.
+ if [ $SRS_MIPS_UBUNTU12 = YES ]; then
+ $SrsArmCC --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "user must install the tool chain: $SrsArmCC"
+ return 2
+ fi
+ fi
OS_IS_UBUNTU=YES
echo "Ubuntu detected, install tools if needed"
@@ -74,6 +91,13 @@ function Ubuntu_prepare()
echo "install patch success"
fi
+ unzip --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install unzip"
+ require_sudoer "sudo apt-get install -y --force-yes unzip"
+ sudo apt-get install -y --force-yes unzip; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install unzip success"
+ fi
+
if [ $SRS_FFMPEG_TOOL = YES ]; then
autoconf --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
echo "install autoconf"
@@ -104,24 +128,6 @@ function Ubuntu_prepare()
fi
fi
- # for arm, install the cross build tool chain.
- if [ $SRS_ARM_UBUNTU12 = YES ]; then
- $SrsArmCC --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
- echo "install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi"
- require_sudoer "sudo apt-get install -y --force-yes gcc-arm-linux-gnueabi g++-arm-linux-gnueabi"
- sudo apt-get install -y --force-yes gcc-arm-linux-gnueabi g++-arm-linux-gnueabi; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
- echo "install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi success"
- fi
- fi
-
- # for mips, user must installed the tool chain.
- if [ $SRS_MIPS_UBUNTU12 = YES ]; then
- $SrsArmCC --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
- echo "user must install the tool chain: $SrsArmCC"
- return 2
- fi
- fi
-
echo "Ubuntu install tools success"
return 0
}
@@ -138,6 +144,12 @@ function Centos_prepare()
if [[ ! -f /etc/redhat-release ]]; then
return 0;
fi
+
+ # for arm, install the cross build tool chain.
+ if [ $SRS_EMBEDED_CPU = YES ]; then
+ echo "embeded(arm/mips) is invalid for CentOS"
+ return 1
+ fi
OS_IS_CENTOS=YES
echo "Centos detected, install tools if needed"
@@ -170,6 +182,13 @@ function Centos_prepare()
echo "install patch success"
fi
+ unzip --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install unzip"
+ require_sudoer "sudo yum install -y unzip"
+ sudo yum install -y unzip; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install unzip success"
+ fi
+
if [ $SRS_FFMPEG_TOOL = YES ]; then
automake --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
echo "install automake"
@@ -207,12 +226,6 @@ function Centos_prepare()
fi
fi
- # for arm, install the cross build tool chain.
- if [ $SRS_EMBEDED_CPU = YES ]; then
- echo "embeded(arm/mips) is invalid for CentOS"
- return 1
- fi
-
echo "Centos install tools success"
return 0
}
@@ -220,13 +233,151 @@ function Centos_prepare()
if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
Centos_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "CentOS prepare failed, ret=$ret"; exit $ret; fi
fi
+#####################################################################################
+# for Centos, auto install tools by yum
+#####################################################################################
+OS_IS_OSX=NO
+function OSX_prepare()
+{
+ uname -s|grep Darwin >/dev/null 2>&1
+ ret=$?; if [[ 0 -ne $ret ]]; then
+ if [ $SRS_OSX = YES ]; then
+ echo "OSX check failed, actual is `uname -s`"
+ exit 1;
+ fi
+ return 0;
+ fi
+
+ # for arm, install the cross build tool chain.
+ if [ $SRS_EMBEDED_CPU = YES ]; then
+ echo "embeded(arm/mips) is invalid for OSX"
+ return 1
+ fi
+
+ OS_IS_OSX=YES
+ echo "OSX detected, install tools if needed"
+
+ brew --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install brew"
+ echo "ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\""
+ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install brew success"
+ fi
+
+ gcc --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install gcc"
+ echo "brew install gcc"
+ brew install gcc; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install gcc success"
+ fi
+
+ g++ --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install gcc-c++"
+ echo "brew install gcc-c++"
+ brew install gcc-c++; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install gcc-c++ success"
+ fi
+
+ make --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install make"
+ echo "brew install make"
+ brew install make; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install make success"
+ fi
+
+ patch --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install patch"
+ echo "brew install patch"
+ brew install patch; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install patch success"
+ fi
+
+ unzip --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install unzip"
+ echo "brew install unzip"
+ brew install unzip; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install unzip success"
+ fi
+
+ if [ $SRS_FFMPEG_TOOL = YES ]; then
+ automake --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install automake"
+ echo "brew install automake"
+ brew install automake; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install automake success"
+ fi
+
+ autoconf --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install autoconf"
+ echo "brew install autoconf"
+ brew install autoconf; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install autoconf success"
+ fi
+
+ libtool --help >/dev/null 2>&1; ret=$?; if [[ 0 -ne $ret ]]; then
+ echo "install libtool"
+ echo "brew install libtool"
+ brew install libtool; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install libtool success"
+ fi
+
+ if [[ ! -f /usr/include/pcre.h ]]; then
+ echo "install pcre-devel"
+ echo "brew install pcre-devel"
+ brew install pcre-devel; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install pcre-devel success"
+ fi
+
+ if [[ ! -f /usr/include/zlib.h ]]; then
+ echo "install zlib-devel"
+ echo "brew install zlib-devel"
+ brew install zlib-devel; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi
+ echo "install zlib-devel success"
+ fi
+ fi
+
+ echo "OSX install tools success"
+ return 0
+}
+# donot prepare tools, for srs-librtmp depends only gcc and g++.
+if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
+ OSX_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "OSX prepare failed, ret=$ret"; exit $ret; fi
+fi
+# requires the osx when os
+if [ $OS_IS_OSX = YES ]; then
+ if [ $SRS_OSX = NO ]; then
+ echo "OSX detected, must specifies the --osx"
+ exit 1
+ fi
+ # TODO: FIXME: support following features.
+ if [ $SRS_HTTP_API = YES ]; then
+ echo "OSX does not support http-api, use --without-http-api"
+ exit 1
+ fi
+ if [ $SRS_STAT = YES ]; then
+ echo "OSX does not support stat, use --without-stat"
+ exit 1
+ fi
+ if [ $SRS_FFMPEG_TOOL = YES ]; then
+ echo "OSX does not support ffmpeg, use --without-ffmpeg"
+ exit 1
+ fi
+ if [ $SRS_NGINX = YES ]; then
+ echo "OSX does not support nginx, use --without-nginx"
+ exit 1
+ fi
+fi
#####################################################################################
# st-1.9
#####################################################################################
if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
# check the arm flag file, if flag changed, need to rebuild the st.
- _ST_MAKE=linux-debug
+ _ST_MAKE=linux-debug && _ST_EXTRA_CFLAGS="-DMD_HAVE_EPOLL"
+ # for osx, use darwin for st, donot use epoll.
+ if [ $OS_IS_OSX = YES ]; then
+ _ST_MAKE=darwin-debug && _ST_EXTRA_CFLAGS=""
+ fi
# memory leak for linux-optimized
# @see: https://github.com/winlinvip/simple-rtmp-server/issues/197
if [ $SRS_EMBEDED_CPU = YES ]; then
@@ -240,9 +391,9 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
(
rm -rf ${SRS_OBJS}/st-1.9 && cd ${SRS_OBJS} &&
unzip -q ../3rdparty/st-1.9.zip && cd st-1.9 &&
- patch -p0 < ../../3rdparty/patches/1.st.arm.patch &&
+ patch -p0 -R < ../../3rdparty/patches/1.st.arm.patch &&
make CC=${SrsArmCC} AR=${SrsArmAR} LD=${SrsArmLD} RANDLIB=${SrsArmRANDLIB} \
- EXTRA_CFLAGS="-DMD_HAVE_EPOLL" ${_ST_MAKE} &&
+ EXTRA_CFLAGS=${_ST_EXTRA_CFLAGS} ${_ST_MAKE} &&
cd .. && rm -rf st && ln -sf st-1.9/obj st &&
cd .. && touch ${SRS_OBJS}/_flag.st.arm.tmp
)
@@ -255,7 +406,7 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
(
rm -rf ${SRS_OBJS}/st-1.9 && cd ${SRS_OBJS} &&
unzip -q ../3rdparty/st-1.9.zip && cd st-1.9 &&
- make ${_ST_MAKE} EXTRA_CFLAGS="-DMD_HAVE_EPOLL" &&
+ make ${_ST_MAKE} ${_ST_EXTRA_CFLAGS} &&
cd .. && rm -rf st && ln -sf st-1.9/obj st &&
cd .. && rm -f ${SRS_OBJS}/_flag.st.arm.tmp
)
@@ -280,6 +431,7 @@ if [ $SRS_HTTP_PARSER = YES ]; then
(
rm -rf ${SRS_OBJS}/http-parser-2.1 && cd ${SRS_OBJS} && unzip -q ../3rdparty/http-parser-2.1.zip &&
cd http-parser-2.1 &&
+ patch -p0 -R < ../../3rdparty/patches/2.http.parser.patch &&
sed -i "s/CPPFLAGS_FAST +=.*$/CPPFLAGS_FAST = \$\(CPPFLAGS_DEBUG\)/g" Makefile &&
sed -i "s/CFLAGS_FAST =.*$/CFLAGS_FAST = \$\(CFLAGS_DEBUG\)/g" Makefile &&
make CC=${SrsArmCC} AR=${SrsArmAR} package &&
@@ -296,8 +448,7 @@ if [ $SRS_HTTP_PARSER = YES ]; then
(
rm -rf ${SRS_OBJS}/http-parser-2.1 && cd ${SRS_OBJS} && unzip -q ../3rdparty/http-parser-2.1.zip &&
cd http-parser-2.1 &&
- sed -i "s/CPPFLAGS_FAST +=.*$/CPPFLAGS_FAST = \$\(CPPFLAGS_DEBUG\)/g" Makefile &&
- sed -i "s/CFLAGS_FAST =.*$/CFLAGS_FAST = \$\(CFLAGS_DEBUG\)/g" Makefile &&
+ patch -p0 -R < ../../3rdparty/patches/2.http.parser.patch &&
make package &&
cd .. && rm -rf hp && ln -sf http-parser-2.1 hp &&
cd .. && rm -f ${SRS_OBJS}/_flag.st.hp.tmp
@@ -311,30 +462,6 @@ if [ $SRS_HTTP_PARSER = YES ]; then
if [[ ! -f ${SRS_OBJS}/hp/libhttp_parser.a ]]; then echo "build http-parser-2.1 failed"; exit -1; fi
fi
-if [ $SRS_HTTP_PARSER = YES ]; then
- echo "#define SRS_AUTO_HTTP_PARSER" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_HTTP_PARSER" >> $SRS_AUTO_HEADERS_H
-fi
-
-if [ $SRS_HTTP_SERVER = YES ]; then
- echo "#define SRS_AUTO_HTTP_SERVER" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_HTTP_SERVER" >> $SRS_AUTO_HEADERS_H
-fi
-
-if [ $SRS_STREAM_CASTER = YES ]; then
- echo "#define SRS_AUTO_STREAM_CASTER" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_STREAM_CASTER" >> $SRS_AUTO_HEADERS_H
-fi
-
-if [ $SRS_HTTP_API = YES ]; then
- echo "#define SRS_AUTO_HTTP_API" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_HTTP_API" >> $SRS_AUTO_HEADERS_H
-fi
-
#####################################################################################
# nginx for HLS, nginx-1.5.0
#####################################################################################
@@ -406,24 +533,6 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
echo "nginx is ok" > ${SRS_OBJS}/nginx/html/nginx.html
fi
-if [ $SRS_NGINX = YES ]; then
- echo "#define SRS_AUTO_NGINX" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_NGINX" >> $SRS_AUTO_HEADERS_H
-fi
-
-if [ $SRS_DVR = YES ]; then
- echo "#define SRS_AUTO_DVR" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_DVR" >> $SRS_AUTO_HEADERS_H
-fi
-
-if [ $SRS_HLS = YES ]; then
- echo "#define SRS_AUTO_HLS" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_HLS" >> $SRS_AUTO_HEADERS_H
-fi
-
#####################################################################################
# cherrypy for http hooks callback, CherryPy-3.2.4
#####################################################################################
@@ -431,7 +540,7 @@ if [ $SRS_HTTP_CALLBACK = YES ]; then
if [[ -f ${SRS_OBJS}/CherryPy-3.2.4/setup.py ]]; then
echo "CherryPy-3.2.4 is ok.";
else
- require_sudoer "configure --with-http-callback"
+ require_sudoer "install CherryPy-3.2.4"
echo "install CherryPy-3.2.4";
(
sudo rm -rf ${SRS_OBJS}/CherryPy-3.2.4 && cd ${SRS_OBJS} &&
@@ -444,12 +553,6 @@ if [ $SRS_HTTP_CALLBACK = YES ]; then
if [ ! -f ${SRS_OBJS}/CherryPy-3.2.4/setup.py ]; then echo "build CherryPy-3.2.4 failed."; exit -1; fi
fi
-if [ $SRS_HTTP_CALLBACK = YES ]; then
- echo "#define SRS_AUTO_HTTP_CALLBACK" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_HTTP_CALLBACK" >> $SRS_AUTO_HEADERS_H
-fi
-
if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
echo "link players to cherrypy static-dir"
rm -rf research/api-server/static-dir/players &&
@@ -489,9 +592,11 @@ fi
#####################################################################################
# extra configure options
CONFIGURE_TOOL="./config"
-EXTRA_CONFIGURE=""
if [ $SRS_EMBEDED_CPU = YES ]; then
- CONFIGURE_TOOL="./Configure"
+ CONFIGURE_TOOL="./Configure linux-armv4"
+fi
+if [ $SRS_OSX = YES ]; then
+ CONFIGURE_TOOL="./Configure darwin64-`uname -m`-cc"
fi
# @see http://www.openssl.org/news/secadv_20140407.txt
# Affected users should upgrade to OpenSSL 1.0.1g. Users unable to immediately
@@ -510,7 +615,7 @@ if [ $SRS_SSL = YES ]; then
(
rm -rf ${SRS_OBJS}/openssl-1.0.1f && cd ${SRS_OBJS} &&
unzip -q ../3rdparty/openssl-1.0.1f.zip && cd openssl-1.0.1f &&
- $CONFIGURE_TOOL --prefix=`pwd`/_release -no-shared no-asm linux-armv4 -DOPENSSL_NO_HEARTBEATS ${EXTRA_CONFIGURE} &&
+ $CONFIGURE_TOOL --prefix=`pwd`/_release -no-shared no-asm &&
make CC=${SrsArmCC} GCC=${SrsArmGCC} AR="${SrsArmAR} r" \
LD=${SrsArmLD} LINK=${SrsArmGCC} RANDLIB=${SrsArmRANDLIB} &&
make install_sw &&
@@ -527,7 +632,7 @@ if [ $SRS_SSL = YES ]; then
(
rm -rf ${SRS_OBJS}/openssl-1.0.1f && cd ${SRS_OBJS} &&
unzip -q ../3rdparty/openssl-1.0.1f.zip && cd openssl-1.0.1f &&
- $CONFIGURE_TOOL --prefix=`pwd`/_release -no-shared -DOPENSSL_NO_HEARTBEATS ${EXTRA_CONFIGURE} &&
+ $CONFIGURE_TOOL --prefix=`pwd`/_release -no-shared &&
make && make install_sw &&
cd .. && rm -rf openssl && ln -sf openssl-1.0.1f/_release openssl &&
cd .. && rm -f ${SRS_OBJS}/_flag.ssl.arm.tmp
@@ -540,12 +645,6 @@ if [ $SRS_SSL = YES ]; then
fi
fi
-if [ $SRS_SSL = YES ]; then
- echo "#define SRS_AUTO_SSL" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_SSL" >> $SRS_AUTO_HEADERS_H
-fi
-
#####################################################################################
# live transcoding, ffmpeg-2.1, x264-core138, lame-3.99.5, libaacplus-2.0.2.
#####################################################################################
@@ -566,40 +665,6 @@ if [ $SRS_FFMPEG_TOOL = YES ]; then
if [ ! -f ${SRS_OBJS}/ffmpeg/bin/ffmpeg ]; then echo "build ffmpeg-2.1 failed."; exit -1; fi
fi
-# whether compile ffmpeg tool
-if [ $SRS_FFMPEG_TOOL = YES ]; then
- echo "#define SRS_AUTO_FFMPEG_TOOL" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_FFMPEG_TOOL" >> $SRS_AUTO_HEADERS_H
-fi
-
-# whatever the FFMPEG tools, if transcode and ingest specified,
-# srs always compile the FFMPEG tool stub which used to start the FFMPEG process.
-if [ $SRS_FFMPEG_STUB = YES ]; then
- echo "#define SRS_AUTO_FFMPEG_STUB" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_FFMPEG_STUB" >> $SRS_AUTO_HEADERS_H
-fi
-
-if [ $SRS_TRANSCODE = YES ]; then
- echo "#define SRS_AUTO_TRANSCODE" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_TRANSCODE" >> $SRS_AUTO_HEADERS_H
-fi
-
-if [ $SRS_INGEST = YES ]; then
- echo "#define SRS_AUTO_INGEST" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_INGEST" >> $SRS_AUTO_HEADERS_H
-fi
-
-# for statistic.
-if [ $SRS_STAT = YES ]; then
- echo "#define SRS_AUTO_STAT" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_STAT" >> $SRS_AUTO_HEADERS_H
-fi
-
#####################################################################################
# build research code, librtmp
#####################################################################################
@@ -663,89 +728,8 @@ if [ $SRS_GPERF = YES ]; then
if [ ! -f ${SRS_OBJS}/gperf/bin/pprof ]; then echo "build gperftools-2.1 failed."; exit -1; fi
fi
-if [ $SRS_GPERF = YES ]; then
- echo "#define SRS_AUTO_GPERF" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_GPERF" >> $SRS_AUTO_HEADERS_H
-fi
-if [ $SRS_GPERF_MC = YES ]; then
- echo "#define SRS_AUTO_GPERF_MC" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_GPERF_MC" >> $SRS_AUTO_HEADERS_H
-fi
-if [ $SRS_GPERF_MP = YES ]; then
- echo "#define SRS_AUTO_GPERF_MP" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_GPERF_MP" >> $SRS_AUTO_HEADERS_H
-fi
-if [ $SRS_GPERF_CP = YES ]; then
- echo "#define SRS_AUTO_GPERF_CP" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_GPERF_CP" >> $SRS_AUTO_HEADERS_H
-fi
-
-#####################################################################################
-# for embeded.
-#####################################################################################
-if [ $SRS_EMBEDED_CPU = YES ]; then
- echo "#define SRS_AUTO_EMBEDED_CPU" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_EMBEDED_CPU" >> $SRS_AUTO_HEADERS_H
-fi
-
-# arm
-if [ $SRS_ARM_UBUNTU12 = YES ]; then
- echo "#define SRS_AUTO_ARM_UBUNTU12" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_ARM_UBUNTU12" >> $SRS_AUTO_HEADERS_H
-fi
-
-# mips
-if [ $SRS_MIPS_UBUNTU12 = YES ]; then
- echo "#define SRS_AUTO_MIPS_UBUNTU12" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_MIPS_UBUNTU12" >> $SRS_AUTO_HEADERS_H
-fi
-
-echo "" >> $SRS_AUTO_HEADERS_H
-
-# for log level compile settings
-if [ $SRS_LOG_VERBOSE = YES ]; then
- echo "#define SRS_AUTO_VERBOSE" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_VERBOSE" >> $SRS_AUTO_HEADERS_H
-fi
-if [ $SRS_LOG_INFO = YES ]; then
- echo "#define SRS_AUTO_INFO" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_INFO" >> $SRS_AUTO_HEADERS_H
-fi
-if [ $SRS_LOG_TRACE = YES ]; then
- echo "#define SRS_AUTO_TRACE" >> $SRS_AUTO_HEADERS_H
-else
- echo "#undef SRS_AUTO_TRACE" >> $SRS_AUTO_HEADERS_H
-fi
-
-# prefix
-echo "" >> $SRS_AUTO_HEADERS_H
-echo "#define SRS_AUTO_PREFIX \"${SRS_PREFIX}\"" >> $SRS_AUTO_HEADERS_H
-
-echo "" >> $SRS_AUTO_HEADERS_H
-
-#####################################################################################
-# generated the contributors from AUTHORS.txt
-#####################################################################################
-SRS_CONSTRIBUTORS=`cat ../AUTHORS.txt|grep "*"|awk '{print $2}'`
-echo "#define SRS_AUTO_CONSTRIBUTORS \"\\" >> $SRS_AUTO_HEADERS_H
-for CONTRIBUTOR in $SRS_CONSTRIBUTORS; do
- echo "${CONTRIBUTOR} \\" >> $SRS_AUTO_HEADERS_H
-done
-echo "\"" >> $SRS_AUTO_HEADERS_H
-
-# new empty line to auto headers file.
-echo "" >> $SRS_AUTO_HEADERS_H
-
#####################################################################################
# generated the test script
#####################################################################################
rm -rf ${SRS_OBJS}/srs.test && ln -sf `pwd`/scripts/srs.test objs/srs.test
+
diff --git a/trunk/auto/libs.sh b/trunk/auto/libs.sh
index 6e1eedaf9..2795aed7e 100755
--- a/trunk/auto/libs.sh
+++ b/trunk/auto/libs.sh
@@ -57,7 +57,7 @@ done
echo "" >> ${FILE}
# parent Makefile, to create module output dir before compile it.
-echo " mkdir -p ${SRS_OBJS_DIR}/include" >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
-echo " mkdir -p ${SRS_OBJS_DIR}/lib" >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
+echo " @mkdir -p ${SRS_OBJS_DIR}/include" >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
+echo " @mkdir -p ${SRS_OBJS_DIR}/lib" >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
echo -n "generate lib ${LIB_NAME} ok"; echo '!';
diff --git a/trunk/auto/modules.sh b/trunk/auto/modules.sh
index 9b4af71b5..ed91b611e 100755
--- a/trunk/auto/modules.sh
+++ b/trunk/auto/modules.sh
@@ -85,6 +85,6 @@ done
echo "" >> ${FILE}
# parent Makefile, to create module output dir before compile it.
-echo " mkdir -p ${SRS_OBJS_DIR}/${MODULE_DIR}" >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
+echo " @mkdir -p ${SRS_OBJS_DIR}/${MODULE_DIR}" >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
echo -n "generate module ${MODULE_ID} ok"; echo '!';
diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh
index adec4828a..d4e8b723d 100755
--- a/trunk/auto/options.sh
+++ b/trunk/auto/options.sh
@@ -68,6 +68,8 @@ SRS_EXPORT_LIBRTMP_SINGLE=NO
# presets
# for x86/x64 pc/servers
SRS_X86_X64=NO
+# for osx system
+SRS_OSX=NO
# armhf(v7cpu) built on ubuntu12
SRS_ARM_UBUNTU12=NO
# mips built on ubuntu12
@@ -166,6 +168,7 @@ Options:
Presets:
--x86-x64 [default] for x86/x64 cpu, common pc and servers.
+ --osx for osx(darwin) system to build SRS.
--pi for raspberry-pi(directly build), open features hls/ssl/static.
--cubie for cubieboard(directly build), open features except ffmpeg/nginx.
--arm alias for --with-arm-ubuntu12, for ubuntu12, arm crossbuild
@@ -260,6 +263,7 @@ function parse_user_option() {
--log-trace) SRS_LOG_TRACE=YES ;;
--x86-x64) SRS_X86_X64=YES ;;
+ --osx) SRS_OSX=YES ;;
--arm) SRS_ARM_UBUNTU12=YES ;;
--mips) SRS_MIPS_UBUNTU12=YES ;;
--pi) SRS_PI=YES ;;
@@ -331,7 +335,9 @@ function apply_user_presets() {
if [ $SRS_PI = NO ]; then
if [ $SRS_CUBIE = NO ]; then
if [ $SRS_X86_X64 = NO ]; then
- SRS_X86_X64=YES; opt="--x86-x64 $opt";
+ if [ $SRS_OSX = NO ]; then
+ SRS_X86_X64=YES; opt="--x86-x64 $opt";
+ fi
fi
fi
fi
@@ -563,6 +569,32 @@ function apply_user_presets() {
SRS_STATIC=NO
fi
+ # for osx(darwin)
+ if [ $SRS_OSX = YES ]; then
+ SRS_HLS=YES
+ SRS_DVR=YES
+ SRS_NGINX=NO
+ SRS_SSL=YES
+ SRS_FFMPEG_TOOL=NO
+ SRS_TRANSCODE=YES
+ SRS_INGEST=YES
+ SRS_STAT=NO
+ SRS_HTTP_PARSER=YES
+ SRS_HTTP_CALLBACK=YES
+ SRS_HTTP_SERVER=YES
+ SRS_STREAM_CASTER=YES
+ SRS_HTTP_API=NO
+ SRS_LIBRTMP=YES
+ SRS_RESEARCH=NO
+ SRS_UTEST=NO
+ SRS_GPERF=NO
+ SRS_GPERF_MC=NO
+ SRS_GPERF_MP=NO
+ SRS_GPERF_CP=NO
+ SRS_GPROF=NO
+ SRS_STATIC=NO
+ fi
+
# if dev specified, open features if possible.
if [ $SRS_DEV = YES ]; then
SRS_HLS=YES
diff --git a/trunk/auto/utest.sh b/trunk/auto/utest.sh
index 79477686f..f789e8a84 100755
--- a/trunk/auto/utest.sh
+++ b/trunk/auto/utest.sh
@@ -176,6 +176,6 @@ END
#####################################################################################
# parent Makefile, to create module output dir before compile it.
-echo " mkdir -p ${SRS_OBJS_DIR}/utest" >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
+echo " @mkdir -p ${SRS_OBJS_DIR}/utest" >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
echo -n "generate utest ok"; echo '!';
diff --git a/trunk/conf/demo.conf b/trunk/conf/demo.conf
index 06d7ee4ad..362fb9d0a 100644
--- a/trunk/conf/demo.conf
+++ b/trunk/conf/demo.conf
@@ -82,7 +82,7 @@ vhost demo.srs.com {
vpreset superfast;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
@@ -105,7 +105,7 @@ vhost demo.srs.com {
vpreset fast;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 40;
asample_rate 44100;
achannels 2;
@@ -151,7 +151,7 @@ vhost players {
vparams {
g 100;
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 30;
asample_rate 44100;
achannels 2;
diff --git a/trunk/conf/ffmpeg.transcode.conf b/trunk/conf/ffmpeg.transcode.conf
index 04c434982..66c63cfbc 100644
--- a/trunk/conf/ffmpeg.transcode.conf
+++ b/trunk/conf/ffmpeg.transcode.conf
@@ -22,7 +22,7 @@ vhost __defaultVhost__ {
vpreset medium;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 70;
asample_rate 44100;
achannels 2;
diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf
index 2d875e0ee..d95954c5f 100644
--- a/trunk/conf/full.conf
+++ b/trunk/conf/full.conf
@@ -180,6 +180,8 @@ stream_caster {
caster rtsp;
output rtmp://127.0.0.1/[app]/[stream];
listen 554;
+ rtp_port_min 57200;
+ rtp_port_max 57300;
}
#############################################################################################
@@ -288,44 +290,7 @@ vhost dvr.srs.com {
# session reap flv when session end(unpublish).
# segment reap flv when flv duration exceed the specified dvr_duration.
# append always append to flv file, never reap it.
- # api reap flv when api required.
- # about the api plan, the HTTP api to dvr,
- # http url to control dvr, for example, http://dev:1985/api/v1/dvrs
- # method=GET
- # to query dvrs of server.
- # request params, for example ?vhost=__defaultVhost__, where:
- # vhost, query all dvr of this vhost.
- # response in json, where:
- # {code:0, dvrs: [{path_tmpl:"./[15].[04].[05].[999].flv", path_dvr:"./22.7.43.312.flv",
- # wait_keyframe:true, vhost:"__defaultVhost", callback:"http://127.0.0.1:8085/api/v1/dvrs",
- # status:"stop"|"start"
- # }]}
- # method=POST
- # to start dvr of specified vhost.
- # request should encode in json, specifies the dvr to create, where:
- # {path_tmpl:"./[15].[04].[05].[999].flv",
- # wait_keyframe:true, vhost:"__defaultVhost", callback:"http://127.0.0.1:8085/api/v1/dvrs"
- # }
- # response in json, where:
- # {code:0}
- # method=DELETE, to stop dvr
- # to stop dvr of specified vhost.
- # request params, for example ?vhost=__defaultVhost__, where:
- # vhost, stop all dvr of this vhost.
- # response in json, where:
- # {code:0}
- # method=PUT, use as RPC(remote process call).
- # reap_segment, the request params in json, where:
- # {action:"reap_segment", vhost:"__defaultVhost", path_tmpl:"./[15].[04].[05].[999].flv"}
- # when reap segment, the callback POST request in json:
- # {action:"on_dvr_reap_segment", client_id:100, vhost:"__defaultVhost__",
- # app:"live", stream:"livestream", cwd:"/home/winlin/srs", file:"./dvr.flv"
- # }
- # for the dvr http callback, @see http_hooks.on_dvr of vhost hooks.callback.srs.com
- # @read https://github.com/winlinvip/simple-rtmp-server/wiki/v2_CN_DVR#http-callback
- # @read https://github.com/winlinvip/simple-rtmp-server/wiki/v2_EN_DVR#http-callback
# default: session
- # TODO: FIXME: update wiki for the api plan.
dvr_plan session;
# the dvr output path.
# we supports some variables to generate the filename.
@@ -361,27 +326,20 @@ vhost dvr.srs.com {
# @see https://github.com/winlinvip/simple-rtmp-server/wiki/v2_CN_DVR#custom-path
# @see https://github.com/winlinvip/simple-rtmp-server/wiki/v2_EN_DVR#custom-path
# segment,session apply it.
- # api apply before api specified the path.
# default: ./objs/nginx/html
dvr_path ./objs/nginx/html;
# the duration for dvr file, reap if exeed, in seconds.
# segment apply it.
- # session,api ignore.
+ # session,append ignore.
# default: 30
dvr_duration 30;
# whether wait keyframe to reap segment,
# if off, reap segment when duration exceed the dvr_duration,
# if on, reap segment when duration exceed and got keyframe.
# segment apply it.
- # session,api ignore.
+ # session,append ignore.
# default: on
dvr_wait_keyframe on;
- # whether dvr auto start when publish.
- # if off, dvr wait for api to start it.
- # api apply it.
- # segment,session ignore.
- # default: on
- dvr_autostart on;
# about the stream monotonically increasing:
# 1. video timestamp is monotonically increasing,
# 2. audio timestamp is monotonically increasing,
@@ -576,7 +534,6 @@ vhost with-hls.srs.com {
# the available audio codec:
# aac, mp3
# default: aac
- # TODO: FIXME: update wiki for it.
hls_acodec aac;
# the default video codec of hls.
# when codec changed, write the PAT/PMT table, but maybe ok util next ts.
@@ -584,7 +541,6 @@ vhost with-hls.srs.com {
# the available video codec:
# h264, vn
# default: h264
- # TODO: FIXME: update wiki for it.
hls_vcodec h264;
}
}
@@ -832,12 +788,11 @@ vhost example.transcode.srs.com {
refs 10;
}
# audio encoder name. can be:
- # libaacplus: use aac(libaacplus) audio encoder.
# libfdk_aac: use aac(libfdk_aac) audio encoder.
# copy: donot encoder the audio stream, copy it.
# an: disable audio output.
- acodec libaacplus;
- # audio bitrate, in kbps. [16, 72] for libaacplus.
+ acodec libfdk_aac;
+ # audio bitrate, in kbps. [16, 72] for libfdk_aac.
abitrate 70;
# audio sample rate. for flv/rtmp, it must be:
# 44100,22050,11025,5512
@@ -847,6 +802,7 @@ vhost example.transcode.srs.com {
# other ffmpeg audio params
aparams {
# audio params, @see: http://ffmpeg.org/ffmpeg-codecs.html#Audio-Encoders
+ # @remark SRS supported aac profile for HLS is: aac_low, aac_he, aac_he_v2
profile:a aac_low;
}
# output format, can be:
@@ -885,7 +841,7 @@ vhost mirror.transcode.srs.com {
vpreset superfast;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
@@ -918,7 +874,7 @@ vhost crop.transcode.srs.com {
vpreset superfast;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
@@ -949,7 +905,7 @@ vhost logo.transcode.srs.com {
vpreset superfast;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
@@ -969,7 +925,7 @@ vhost audio.transcode.srs.com {
engine acodec {
enabled on;
vcodec copy;
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
@@ -988,7 +944,7 @@ vhost vn.transcode.srs.com {
engine vn {
enabled on;
vcodec vn;
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
@@ -1040,7 +996,7 @@ vhost all.transcode.srs.com {
bf 3;
refs 10;
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 70;
asample_rate 44100;
achannels 2;
@@ -1062,7 +1018,7 @@ vhost all.transcode.srs.com {
vpreset medium;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 70;
asample_rate 44100;
achannels 2;
@@ -1082,7 +1038,7 @@ vhost all.transcode.srs.com {
vpreset fast;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 60;
asample_rate 44100;
achannels 2;
@@ -1102,7 +1058,7 @@ vhost all.transcode.srs.com {
vpreset superfast;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
@@ -1113,7 +1069,7 @@ vhost all.transcode.srs.com {
engine vcopy {
enabled on;
vcodec copy;
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
@@ -1161,7 +1117,7 @@ vhost ffempty.transcode.srs.com {
vpreset superfast;
vparams {
}
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
diff --git a/trunk/conf/hds.conf b/trunk/conf/hds.conf
new file mode 100644
index 000000000..ade6f5b27
--- /dev/null
+++ b/trunk/conf/hds.conf
@@ -0,0 +1,19 @@
+# the config for srs to delivery hds
+# @see https://github.com/winlinvip/simple-rtmp-server/wiki/v1_CN_SampleHDS
+# @see full.conf for detail config.
+
+listen 1935;
+max_connections 1000;
+
+daemon off;
+srs_log_tank console;
+srs_log_level trace;
+
+vhost __defaultVhost__ {
+ hds {
+ enabled on;
+ hds_fragment 10;
+ hds_window 60;
+ hds_path ./objs/nginx/html;
+ }
+}
diff --git a/trunk/conf/mac.dev.conf b/trunk/conf/mac.dev.conf
new file mode 100644
index 000000000..e624e165b
--- /dev/null
+++ b/trunk/conf/mac.dev.conf
@@ -0,0 +1,36 @@
+# no-daemon and write log to console config for srs.
+# @see full.conf for detail config.
+
+listen 1935;
+max_connections 1000;
+daemon off;
+srs_log_tank console;
+http_api {
+ enabled on;
+ listen 1985;
+}
+http_server {
+ enabled on;
+ listen 8080;
+}
+vhost __defaultVhost__ {
+ hls {
+ enabled on;
+ hls_fragment 10;
+ hls_window 60;
+ hls_path ./objs/nginx/html;
+ }
+ ingest livestream {
+ enabled on;
+ input {
+ type file;
+ url ./doc/source.200kbps.768x320.flv;
+ }
+ #ffmpeg ./objs/ffmpeg/bin/ffmpeg;
+ ffmpeg ./objs/research/librtmp/srs_ingest_flv;
+ engine {
+ enabled off;
+ output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream;
+ }
+ }
+}
diff --git a/trunk/conf/push.rtsp.conf b/trunk/conf/push.rtsp.conf
new file mode 100644
index 000000000..ab3486b68
--- /dev/null
+++ b/trunk/conf/push.rtsp.conf
@@ -0,0 +1,17 @@
+# push MPEG-TS over UDP to SRS.
+# @see https://github.com/winlinvip/simple-rtmp-server/wiki/v2_CN_Streamer#push-mpeg-ts-over-udp
+# @see https://github.com/winlinvip/simple-rtmp-server/issues/250#issuecomment-72321769
+# @see full.conf for detail config.
+
+listen 1935;
+max_connections 1000;
+stream_caster {
+ enabled on;
+ caster rtsp;
+ output rtmp://127.0.0.1/[app]/[stream];
+ listen 554;
+ rtp_port_min 57200;
+ rtp_port_max 57300;
+}
+vhost __defaultVhost__ {
+}
diff --git a/trunk/conf/transcode2hls.audio.only.conf b/trunk/conf/transcode2hls.audio.only.conf
index 69eb9525c..addd00e43 100644
--- a/trunk/conf/transcode2hls.audio.only.conf
+++ b/trunk/conf/transcode2hls.audio.only.conf
@@ -17,7 +17,7 @@ vhost __defaultVhost__ {
engine ff {
enabled on;
vcodec copy;
- acodec libaacplus;
+ acodec libfdk_aac;
abitrate 45;
asample_rate 44100;
achannels 2;
diff --git a/trunk/configure b/trunk/configure
index 636289872..e94cc15d8 100755
--- a/trunk/configure
+++ b/trunk/configure
@@ -7,14 +7,24 @@
SRS_WORKDIR="."
SRS_OBJS_DIR="objs"
SRS_OBJS="${SRS_WORKDIR}/${SRS_OBJS_DIR}"
-mkdir -p ${SRS_OBJS}
+SRS_MAKEFILE="Makefile"
-#####################################################################################
# linux shell color support.
-RED="\\e[31m"
-GREEN="\\e[32m"
-YELLOW="\\e[33m"
-BLACK="\\e[0m"
+RED="\\033[31m"
+GREEN="\\033[32m"
+YELLOW="\\033[33m"
+BLACK="\\033[0m"
+
+# clean the exists, when not export srs-librtmp.
+# do this only when the options is ok.
+if [[ -f Makefile ]]; then
+ make clean
+fi
+# remove makefile
+rm -f ${SRS_WORKDIR}/${SRS_MAKEFILE}
+
+# create objs
+mkdir -p ${SRS_OBJS}
#####################################################################################
# parse user options, set the variables like:
@@ -27,82 +37,18 @@ BLACK="\\e[0m"
# for export srs-librtmp, change target to it.
. auto/generate-srs-librtmp-project.sh
-# the auto generated variables.
-SRS_AUTO_HEADERS_H="${SRS_OBJS}/srs_auto_headers.hpp"
-
-# clean the exists, when not export srs-librtmp.
-# do this only when the options is ok.
-if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
- if [[ -f Makefile ]]; then
- make clean
- fi
-fi
-
-# write user options to headers
-echo "// auto generated by configure" > $SRS_AUTO_HEADERS_H
-echo "#ifndef SRS_AUTO_HEADER_HPP" >> $SRS_AUTO_HEADERS_H
-echo "#define SRS_AUTO_HEADER_HPP" >> $SRS_AUTO_HEADERS_H
-echo "" >> $SRS_AUTO_HEADERS_H
-
-echo "#define SRS_AUTO_BUILD_TS \"`date +%s`\"" >> $SRS_AUTO_HEADERS_H
-echo "#define SRS_AUTO_BUILD_DATE \"`date \"+%Y-%m-%d %H:%M:%S\"`\"" >> $SRS_AUTO_HEADERS_H
-echo "#define SRS_AUTO_UNAME \"`uname -a`\"" >> $SRS_AUTO_HEADERS_H
-echo "#define SRS_AUTO_USER_CONFIGURE \"${SRS_AUTO_USER_CONFIGURE}\"" >> $SRS_AUTO_HEADERS_H
-echo "#define SRS_AUTO_CONFIGURE \"${SRS_AUTO_CONFIGURE}\"" >> $SRS_AUTO_HEADERS_H
-
-# new empty line to auto headers file.
-echo "" >> $SRS_AUTO_HEADERS_H
-
-#####################################################################################
-# generate auto headers file, depends on the finished of options.sh
-#####################################################################################
-if [ $SRS_ARM_UBUNTU12 = YES ]; then
- __SrsArmCC="arm-linux-gnueabi-gcc";
- __SrsArmGCC="arm-linux-gnueabi-gcc";
- __SrsArmCXX="arm-linux-gnueabi-g++";
- __SrsArmAR="arm-linux-gnueabi-ar";
- __SrsArmLD="arm-linux-gnueabi-ld";
- __SrsArmRANDLIB="arm-linux-gnueabi-ranlib";
-fi
-if [ $SRS_MIPS_UBUNTU12 = YES ]; then
- __SrsArmCC="mipsel-openwrt-linux-gcc";
- __SrsArmGCC="mipsel-openwrt-linux-gcc";
- __SrsArmCXX="mipsel-openwrt-linux-g++";
- __SrsArmAR="mipsel-openwrt-linux-ar";
- __SrsArmLD="mipsel-openwrt-linux-ld";
- __SrsArmRANDLIB="mipsel-openwrt-linux-ranlib";
-fi
-# the arm-ubuntu12 options for make for depends
-if [[ -z $SrsArmCC ]]; then SrsArmCC=$__SrsArmCC; fi
-if [[ -z $SrsArmGCC ]]; then SrsArmGCC=$__SrsArmGCC; fi
-if [[ -z $SrsArmCXX ]]; then SrsArmCXX=$__SrsArmCXX; fi
-if [[ -z $SrsArmAR ]]; then SrsArmAR=$__SrsArmAR; fi
-if [[ -z $SrsArmLD ]]; then SrsArmLD=$__SrsArmLD; fi
-if [[ -z $SrsArmRANDLIB ]]; then SrsArmRANDLIB=$__SrsArmRANDLIB; fi
-# write to source file
-if [ $SRS_EMBEDED_CPU = YES ]; then
- echo "cc=$SrsArmCC gcc=$SrsArmGCC g++=$SrsArmCXX ar=$SrsArmAR ld=$SrsArmLD randlib=$SrsArmRANDLIB"
- echo "#define SRS_AUTO_EMBEDED_TOOL_CHAIN \"cc=$SrsArmCC gcc=$SrsArmGCC g++=$SrsArmCXX ar=$SrsArmAR ld=$SrsArmLD randlib=$SrsArmRANDLIB\"" >> $SRS_AUTO_HEADERS_H
-else
- echo "#define SRS_AUTO_EMBEDED_TOOL_CHAIN \"normal x86/x64 gcc\"" >> $SRS_AUTO_HEADERS_H
-fi
-echo "" >> $SRS_AUTO_HEADERS_H
-
# apply user options.
. auto/depends.sh
-# auto header EOF.
-echo "#endif" >> $SRS_AUTO_HEADERS_H
-echo "" >> $SRS_AUTO_HEADERS_H
+# the auto generated variables.
+. auto/auto_headers.sh
#####################################################################################
# generate Makefile.
#####################################################################################
-SRS_MAKEFILE="Makefile"
# ubuntu echo in Makefile cannot display color, use bash instead
SRS_BUILD_SUMMARY="_srs_build_summary.sh"
-#####################################################################################
# srs-librtmp sample entry
SrsLibrtmpSampleEntry="nossl"
if [ $SRS_SSL = YES ]; then SrsLibrtmpSampleEntry="ssl";fi
@@ -110,6 +56,203 @@ if [ $SRS_SSL = YES ]; then SrsLibrtmpSampleEntry="ssl";fi
SrsUtestMakeEntry="@echo -e \"ignore utest for it's disabled\""
if [ $SRS_UTEST = YES ]; then SrsUtestMakeEntry="(cd ${SRS_OBJS_DIR}/utest; \$(MAKE))"; fi
+#####################################################################################
+# finger out modules to install.
+# where srs module is a dir which contains a config file.
+SRS_MODULES=()
+__mfiles=`find modules -name "config"` && for __mfile in $__mfiles; do
+ SRS_MODULES+="`dirname $__mfile`"
+done
+
+# variables for makefile for all modules.
+__mphonys="" && __mdefaults="" && __mcleanups=""
+# add each modules for application
+for SRS_MODULE in $SRS_MODULES; do
+ echo "install module at: $SRS_MODULE"
+ . $SRS_MODULE/config
+ __mphonys="$__mphonys $SRS_MODULE_NAME"
+ __mdefaults="$__mdefaults $SRS_MODULE_NAME"
+ __mcleanups="$__mcleanups $SRS_MODULE_NAME"
+done
+
+#####################################################################################
+# build tools or compiler args.
+# enable gdb debug
+GDBDebug=" -g -O0"
+# the warning level.
+WarnLevel=" -Wall"
+# the compile standard.
+CppStd="-ansi"
+# for library compile
+LibraryCompile=" -fPIC"
+# 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="${CppStd}${WarnLevel}${GDBDebug}${LibraryCompile}${SrsGprof}"
+if [ $SRS_GPERF = YES ]; then CXXFLAGS="${CXXFLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free"; fi
+cat << END > ${SRS_OBJS}/${SRS_MAKEFILE}
+GCC = gcc
+CXX = g++
+AR = ar
+LINK = g++
+CXXFLAGS = ${CXXFLAGS}
+
+.PHONY: default srs librtmp
+
+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
+#
+# st(state-threads) the basic network library for SRS.
+LibSTRoot="${SRS_OBJS_DIR}/st"; LibSTfile="${LibSTRoot}/libst.a"
+# hp(http-parser) the http request/url parser, for SRS to support HTTP callback.
+LibHttpParserRoot=""; LibHttpParserfile=""
+if [ $SRS_HTTP_PARSER = YES ]; then LibHttpParserRoot="${SRS_OBJS_DIR}/hp"; LibHttpParserfile="${LibHttpParserRoot}/libhttp_parser.a"; fi
+# openssl-1.0.1f, for the RTMP complex handshake.
+LibSSLRoot="";LibSSLfile=""
+if [ $SRS_SSL = YES ]; then if [ $SRS_USE_SYS_SSL = NO ]; then LibSSLRoot="${SRS_OBJS_DIR}/openssl/include"; LibSSLfile="${SRS_OBJS_DIR}/openssl/lib/libssl.a ${SRS_OBJS_DIR}/openssl/lib/libcrypto.a"; fi fi
+# gperftools-2.1, for mem check and mem/cpu profile
+LibGperfRoot=""; LibGperfFile=""
+if [ $SRS_GPERF = YES ]; then LibGperfRoot="${SRS_OBJS_DIR}/gperf/include"; LibGperfFile="${SRS_OBJS_DIR}/gperf/lib/libtcmalloc_and_profiler.a"; fi
+# the link options, always use static link
+SrsLinkOptions="-ldl";
+if [ $SRS_SSL = YES ]; then if [ $SRS_USE_SYS_SSL = YES ]; then SrsLinkOptions="${SrsLinkOptions} -lssl"; fi fi
+# if static specified, add static
+# TODO: FIXME: remove static.
+if [ $SRS_STATIC = YES ]; then SrsLinkOptions="${SrsLinkOptions} -static"; fi
+# if mips, add -lgcc_eh, or stl compile failed.
+if [ $SRS_MIPS_UBUNTU12 = YES ]; then SrsLinkOptions="${SrsLinkOptions} -lgcc_eh"; fi
+
+#####################################################################################
+# Modules, compile each module, then link to binary
+#
+#Core, depends only on system apis.
+MODULE_ID="CORE"
+MODULE_DEPENDS=()
+ModuleLibIncs=(${SRS_OBJS_DIR})
+MODULE_FILES=("srs_core" "srs_core_autofree" "srs_core_performance")
+CORE_INCS="src/core"; MODULE_DIR=${CORE_INCS} . 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_DIR})
+MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_stream"
+ "srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_file"
+ "srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3" "srs_kernel_ts"
+ "srs_kernel_buffer")
+KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh
+KERNEL_OBJS="${MODULE_OBJS[@]}"
+#
+#RTMP Protocol, depends on core/kernel, provides rtmp/htttp protocol features.
+MODULE_ID="RTMP"
+MODULE_DEPENDS=("CORE" "KERNEL")
+ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSSLRoot})
+MODULE_FILES=("srs_rtmp_amf0" "srs_rtmp_io" "srs_rtmp_stack" "srs_rtmp_sdk"
+ "srs_rtmp_handshake" "srs_rtmp_utility" "srs_rtmp_msg_array" "srs_rtmp_buffer"
+ "srs_raw_avc" "srs_rtsp_stack")
+RTMP_INCS="src/protocol"; MODULE_DIR=${RTMP_INCS} . auto/modules.sh
+RTMP_OBJS="${MODULE_OBJS[@]}"
+#
+#App Module
+if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
+ MODULE_ID="APP"
+ MODULE_DEPENDS=("CORE" "KERNEL" "RTMP")
+ ModuleLibIncs=(${LibSTRoot} ${LibHttpParserRoot} ${SRS_OBJS_DIR})
+ MODULE_FILES=("srs_app_server" "srs_app_conn" "srs_app_rtmp_conn" "srs_app_st_socket" "srs_app_source"
+ "srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder" "srs_app_http"
+ "srs_app_thread" "srs_app_bandwidth" "srs_app_st" "srs_app_log" "srs_app_config"
+ "srs_app_pithy_print" "srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks"
+ "srs_app_json" "srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_dvr" "srs_app_edge"
+ "srs_app_kbps" "srs_app_heartbeat" "srs_app_empty" "srs_app_http_client"
+ "srs_app_recv_thread" "srs_app_security" "srs_app_statistic"
+ "srs_app_mpegts_udp" "srs_app_rtsp" "srs_app_listener")
+ # add each modules for app
+ for SRS_MODULE in $SRS_MODULES; do
+ . $SRS_MODULE/config
+ MODULE_FILES+=($SRS_MODULE_APP)
+ done
+ APP_INCS="src/app"; MODULE_DIR=${APP_INCS} . auto/modules.sh
+ APP_OBJS="${MODULE_OBJS[@]}"
+fi
+#
+#LIBS Module, build libsrs.a for static link.
+MODULE_ID="LIBS"
+MODULE_DEPENDS=("CORE" "KERNEL" "RTMP")
+ModuleLibIncs=(${SRS_OBJS_DIR})
+MODULE_FILES=("srs_librtmp" "srs_lib_simple_socket" "srs_lib_bandwidth")
+LIBS_INCS="src/libs"; MODULE_DIR=${LIBS_INCS} . auto/modules.sh
+LIBS_OBJS="${MODULE_OBJS[@]}"
+#
+#Main Module
+if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
+ MODULE_ID="MAIN"
+ MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP")
+ ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS_DIR} ${LibGperfRoot} ${LibHttpParserRoot})
+ MODULE_FILES=("srs_main_server")
+ # add each modules for main
+ for SRS_MODULE in $SRS_MODULES; do
+ . $SRS_MODULE/config
+ MODULE_FILES+=($SRS_MODULE_MAIN)
+ done
+ MAIN_INCS="src/main"; MODULE_DIR=${MAIN_INCS} . auto/modules.sh
+ MAIN_OBJS="${MODULE_OBJS[@]}"
+fi
+
+#####################################################################################
+# Binaries, main entrances, link the module and its depends modules,
+# then link to a binary, for example, objs/srs
+#
+# disable all app when export librtmp
+if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
+ # all main entrances
+ MAIN_ENTRANCES=("srs_main_server")
+ # add each modules for main
+ for SRS_MODULE in $SRS_MODULES; do
+ . $SRS_MODULE/config
+ MAIN_ENTRANCES+=($SRS_MODULE_MAIN)
+ done
+ #
+ # all depends libraries
+ ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile} ${LibGperfFile})
+ # all depends objects
+ MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${APP_OBJS[@]} ${MAIN_OBJS[@]}"
+ LINK_OPTIONS="${SrsLinkOptions}${SrsGprofLink}${SrsGperfLink}"
+ #
+ # srs: srs(simple rtmp server) over st(state-threads)
+ BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . auto/apps.sh
+ # add each modules for application
+ for SRS_MODULE in $SRS_MODULES; do
+ . $SRS_MODULE/config
+ BUILD_KEY="$SRS_MODULE_NAME" APP_MAIN="$SRS_MODULE_MAIN" APP_NAME="$SRS_MODULE_NAME" . auto/apps.sh
+ done
+fi
+# srs librtmp
+if [ $SRS_LIBRTMP = YES ]; then
+ MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${LIBS_OBJS[@]}"
+ BUILD_KEY="librtmp" LIB_NAME="lib/srs_librtmp" . auto/libs.sh
+fi
+#
+# utest, the unit-test cases of srs, base on gtest1.6
+if [ $SRS_UTEST = YES ]; then
+ MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_protocol"
+ "srs_utest_kernel" "srs_utest_core" "srs_utest_config"
+ "srs_utest_reload")
+ ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSTRoot} ${LibSSLRoot})
+ ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile})
+ MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP")
+ MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${APP_OBJS[@]}"
+ LINK_OPTIONS="-lpthread ${SrsLinkOptions}" MODULE_DIR="src/utest" APP_NAME="srs_utest" . auto/utest.sh
+fi
+
#####################################################################################
# generate colorful summary script
. auto/summary.sh
@@ -117,8 +260,14 @@ if [ $SRS_UTEST = YES ]; then SrsUtestMakeEntry="(cd ${SRS_OBJS_DIR}/utest; \$(M
#####################################################################################
# makefile
echo "generate Makefile"
+
+# backup old makefile.
+rm -f ${SRS_WORKDIR}/${SRS_MAKEFILE}.bk &&
+mv ${SRS_WORKDIR}/${SRS_MAKEFILE} ${SRS_WORKDIR}/${SRS_MAKEFILE}.bk
+
+# generate phony header
cat << END > ${SRS_WORKDIR}/${SRS_MAKEFILE}
-.PHONY: default _default install install-api help clean server librtmp utest _prepare_dir
+.PHONY: default _default install install-api help clean server librtmp utest _prepare_dir $__mphonys
# install prefix.
SRS_PREFIX=${SRS_PREFIX}
@@ -146,23 +295,27 @@ fi
# the server, librtmp and utest
# where the bellow will check and disable some entry by only echo.
cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
-_default: server librtmp utest
+_default: server librtmp utest $__mdefaults
@bash objs/_srs_build_summary.sh
help:
@echo "Usage: make |||||||"
- @echo " help display this help menu"
- @echo " clean cleanup project"
- @echo " server build the srs(simple rtmp server) over st(state-threads)"
- @echo " librtmp build the client publish/play library, and samples"
- @echo " utest build the utest for srs"
- @echo " install install srs to the prefix path"
- @echo " install-api install srs and api-server to the prefix path"
- @echo " uninstall uninstall srs from prefix path"
+ @echo " help display this help menu"
+ @echo " clean cleanup project"
+ @echo " server build the srs(simple rtmp server) over st(state-threads)"
+ @echo " librtmp build the client publish/play library, and samples"
+ @echo " utest build the utest for srs"
+ @echo " install install srs to the prefix path"
+ @echo " install-api install srs and api-server to the prefix path"
+ @echo " uninstall uninstall srs from prefix path"
+ @echo "@remark all modules will auto genearted and build"
+ @echo "For example:"
+ @echo " make"
+ @echo " make help"
clean:
- (cd ${SRS_OBJS_DIR}; rm -rf srs srs_utest)
- (cd ${SRS_OBJS_DIR}; rm -rf src research include lib)
+ (cd ${SRS_OBJS_DIR}; rm -rf srs srs_utest $__mcleanups)
+ (cd ${SRS_OBJS_DIR}; rm -rf src include lib)
(cd ${SRS_OBJS_DIR}/utest; rm -rf *.o *.a)
(cd research/librtmp; make clean)
(cd research/api-server/static-dir; rm -rf crossdomain.xml forward live players)
@@ -184,6 +337,25 @@ server: _prepare_dir
END
fi
+# generate all modules entry
+for SRS_MODULE in $SRS_MODULES; do
+ . $SRS_MODULE/config
+ # if export librtmp, donot build the bravo-ingest.
+ if [ $SRS_EXPORT_LIBRTMP_PROJECT != NO ]; then
+ cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
+$SRS_MODULE_NAME: _prepare_dir
+ @echo "donot build the $SRS_MODULE_NAME for srs-librtmp"
+
+END
+ else
+ cat << END >> ${SRS_WORKDIR}/${SRS_MAKEFILE}
+$SRS_MODULE_NAME: _prepare_dir
+ @echo "build the $SRS_MODULE_NAME over SRS"
+ \$(MAKE) -f ${SRS_OBJS_DIR}/${SRS_MAKEFILE} $SRS_MODULE_NAME
+
+END
+ fi
+done
# disable install entry for srs-librtmp
if [ $SRS_EXPORT_LIBRTMP_PROJECT != NO ]; then
@@ -293,164 +465,9 @@ _prepare_dir:
@mkdir -p ${SRS_OBJS_DIR}
END
-#####################################################################################
-# build tools or compiler args.
-# enable gdb debug
-GDBDebug=" -g -O0"
-# the warning level.
-WarnLevel=" -Wall"
-# the compile standard.
-CppStd="-ansi"
-# for library compile
-LibraryCompile=" -fPIC"
-# 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="${CppStd}${WarnLevel}${GDBDebug}${LibraryCompile}${SrsGprof}"
-if [ $SRS_GPERF = YES ]; then CXXFLAGS="${CXXFLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free"; fi
-cat << END > ${SRS_OBJS}/${SRS_MAKEFILE}
-GCC = gcc
-CXX = g++
-AR = ar
-LINK = g++
-CXXFLAGS = ${CXXFLAGS}
-
-.PHONY: default srs librtmp
-
-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
-#
-# st(state-threads) the basic network library for SRS.
-LibSTRoot="${SRS_OBJS_DIR}/st"; LibSTfile="${LibSTRoot}/libst.a"
-# hp(http-parser) the http request/url parser, for SRS to support HTTP callback.
-LibHttpParserRoot=""; LibHttpParserfile=""
-if [ $SRS_HTTP_PARSER = YES ]; then LibHttpParserRoot="${SRS_OBJS_DIR}/hp"; LibHttpParserfile="${LibHttpParserRoot}/libhttp_parser.a"; fi
-# openssl-1.0.1f, for the RTMP complex handshake.
-LibSSLRoot="";LibSSLfile=""
-if [ $SRS_SSL = YES ]; then if [ $SRS_USE_SYS_SSL = NO ]; then LibSSLRoot="${SRS_OBJS_DIR}/openssl/include"; LibSSLfile="${SRS_OBJS_DIR}/openssl/lib/libssl.a ${SRS_OBJS_DIR}/openssl/lib/libcrypto.a"; fi fi
-# gperftools-2.1, for mem check and mem/cpu profile
-LibGperfRoot=""; LibGperfFile=""
-if [ $SRS_GPERF = YES ]; then LibGperfRoot="${SRS_OBJS_DIR}/gperf/include"; LibGperfFile="${SRS_OBJS_DIR}/gperf/lib/libtcmalloc_and_profiler.a"; fi
-# the link options, always use static link
-SrsLinkOptions="-ldl";
-if [ $SRS_SSL = YES ]; then if [ $SRS_USE_SYS_SSL = YES ]; then SrsLinkOptions="${SrsLinkOptions} -lssl"; fi fi
-# if static specified, add static
-# TODO: FIXME: remove static.
-if [ $SRS_STATIC = YES ]; then SrsLinkOptions="${SrsLinkOptions} -static"; fi
-# if mips, add -lgcc_eh, or stl compile failed.
-if [ $SRS_MIPS_UBUNTU12 = YES ]; then SrsLinkOptions="${SrsLinkOptions} -lgcc_eh"; fi
-
-#####################################################################################
-# Modules, compile each module, then link to binary
-#
-#Core, depends only on system apis.
-MODULE_ID="CORE"
-MODULE_DEPENDS=()
-ModuleLibIncs=(${SRS_OBJS_DIR})
-MODULE_FILES=("srs_core" "srs_core_autofree" "srs_core_performance")
-CORE_INCS="src/core"; MODULE_DIR=${CORE_INCS} . 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_DIR})
-MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_stream"
- "srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_file"
- "srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3" "srs_kernel_ts"
- "srs_kernel_buffer")
-KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh
-KERNEL_OBJS="${MODULE_OBJS[@]}"
-#
-#RTMP Protocol, depends on core/kernel, provides rtmp/htttp protocol features.
-MODULE_ID="RTMP"
-MODULE_DEPENDS=("CORE" "KERNEL")
-ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSSLRoot})
-MODULE_FILES=("srs_rtmp_amf0" "srs_rtmp_io" "srs_rtmp_stack" "srs_rtmp_sdk"
- "srs_rtmp_handshake" "srs_rtmp_utility" "srs_rtmp_msg_array" "srs_rtmp_buffer"
- "srs_raw_avc" "srs_rtsp_stack")
-RTMP_INCS="src/protocol"; MODULE_DIR=${RTMP_INCS} . auto/modules.sh
-RTMP_OBJS="${MODULE_OBJS[@]}"
-#
-#App Module
-if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
- MODULE_ID="APP"
- MODULE_DEPENDS=("CORE" "KERNEL" "RTMP")
- ModuleLibIncs=(${LibSTRoot} ${LibHttpParserRoot} ${SRS_OBJS_DIR})
- MODULE_FILES=("srs_app_server" "srs_app_conn" "srs_app_rtmp_conn" "srs_app_st_socket" "srs_app_source"
- "srs_app_refer" "srs_app_hls" "srs_app_forward" "srs_app_encoder" "srs_app_http"
- "srs_app_thread" "srs_app_bandwidth" "srs_app_st" "srs_app_log" "srs_app_config"
- "srs_app_pithy_print" "srs_app_reload" "srs_app_http_api" "srs_app_http_conn" "srs_app_http_hooks"
- "srs_app_json" "srs_app_ingest" "srs_app_ffmpeg" "srs_app_utility" "srs_app_dvr" "srs_app_edge"
- "srs_app_kbps" "srs_app_heartbeat" "srs_app_empty" "srs_app_http_client"
- "srs_app_recv_thread" "srs_app_security" "srs_app_statistic"
- "srs_app_mpegts_udp" "srs_app_rtsp" "srs_app_listener" "srs_app_hds")
- APP_INCS="src/app"; MODULE_DIR=${APP_INCS} . auto/modules.sh
- APP_OBJS="${MODULE_OBJS[@]}"
-fi
-#
-#LIBS Module, build libsrs.a for static link.
-MODULE_ID="LIBS"
-MODULE_DEPENDS=("CORE" "KERNEL" "RTMP")
-ModuleLibIncs=(${SRS_OBJS_DIR})
-MODULE_FILES=("srs_librtmp" "srs_lib_simple_socket" "srs_lib_bandwidth")
-LIBS_INCS="src/libs"; MODULE_DIR=${LIBS_INCS} . auto/modules.sh
-LIBS_OBJS="${MODULE_OBJS[@]}"
-#
-#Main Module
-if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
- MODULE_ID="MAIN"
- MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP")
- ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS_DIR} ${LibGperfRoot})
- MODULE_FILES=("srs_main_server")
- MAIN_INCS="src/main"; MODULE_DIR=${MAIN_INCS} . auto/modules.sh
- MAIN_OBJS="${MODULE_OBJS[@]}"
-fi
-
-#####################################################################################
-# Binaries, main entrances, link the module and its depends modules,
-# then link to a binary, for example, objs/srs
-#
-# disable all app when export librtmp
-if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
- # all main entrances
- MAIN_ENTRANCES=("srs_main_server")
- #
- # all depends libraries
- ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile} ${LibGperfFile})
- # all depends objects
- MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${APP_OBJS[@]} ${MAIN_OBJS[@]}"
- LINK_OPTIONS="${SrsLinkOptions}${SrsGprofLink}${SrsGperfLink}"
- #
- # srs:
- # srs(simple rtmp server) over st(state-threads)
- BUILD_KEY="srs" APP_MAIN="srs_main_server" APP_NAME="srs" . auto/apps.sh
-fi
-# srs librtmp
-if [ $SRS_LIBRTMP = YES ]; then
- MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${LIBS_OBJS[@]}"
- BUILD_KEY="librtmp" LIB_NAME="lib/srs_librtmp" . auto/libs.sh
-fi
-#
-# utest, the unit-test cases of srs, base on gtest1.6
-if [ $SRS_UTEST = YES ]; then
- MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_protocol"
- "srs_utest_kernel" "srs_utest_core" "srs_utest_config"
- "srs_utest_reload")
- ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSTRoot} ${LibSSLRoot})
- ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile})
- MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP")
- MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${APP_OBJS[@]}"
- LINK_OPTIONS="-lpthread ${SrsLinkOptions}" MODULE_DIR="src/utest" APP_NAME="srs_utest" . auto/utest.sh
-fi
+# generate makefile ok, append the tails.
+cat ${SRS_WORKDIR}/${SRS_MAKEFILE}.bk >> ${SRS_WORKDIR}/${SRS_MAKEFILE} &&
+rm -f ${SRS_WORKDIR}/${SRS_MAKEFILE}.bk
echo 'configure ok! '
@@ -571,6 +588,10 @@ if [ $SRS_EXPORT_LIBRTMP_PROJECT = NO ]; then
else
echo -e "${GREEN}note: mips-ubuntu12 for srs are not builded${BLACK}"
fi
+ # add each modules for application
+ for SRS_MODULE in $SRS_MODULES; do
+ echo -e "${GREEN}module: $SRS_MODULE${BLACK}"
+ done
fi
#####################################################################################
diff --git a/trunk/etc/init.d/srs b/trunk/etc/init.d/srs
index f49039649..f25d8bb9b 100755
--- a/trunk/etc/init.d/srs
+++ b/trunk/etc/init.d/srs
@@ -21,11 +21,11 @@ DEFAULT_LOG_FILE='./objs/srs.log'
########################################################################
# utility functions
########################################################################
-RED="\\e[31m"
-GREEN="\\e[32m"
-YELLOW="\\e[33m"
-BLACK="\\e[0m"
-POS="\\e[60G"
+RED="\\033[31m"
+GREEN="\\033[32m"
+YELLOW="\\033[33m"
+BLACK="\\033[0m"
+POS="\\033[60G"
ok_msg() {
echo -e "${1}${POS}${BLACK}[${GREEN} OK ${BLACK}]"
diff --git a/trunk/ide/readme.txt b/trunk/ide/readme.txt
new file mode 100644
index 000000000..a97910071
--- /dev/null
+++ b/trunk/ide/readme.txt
@@ -0,0 +1,5 @@
+提供了各种ide。
+
+1. UPP添加Assembly时,路径指向ide即可,譬如:\\dev\winlin\srs\ide
+
+2015.3 winlin
diff --git a/trunk/ide/srs_qt/srs-qt.pro.user b/trunk/ide/srs_qt/srs-qt.pro.user
index 572bbe375..5d891ca10 100755
--- a/trunk/ide/srs_qt/srs-qt.pro.user
+++ b/trunk/ide/srs_qt/srs-qt.pro.user
@@ -1,6 +1,6 @@
-
+
ProjectExplorer.Project.ActiveTarget
@@ -56,12 +56,12 @@
Desktop
Desktop
- {fa2d28f9-85de-4a75-8e79-69d805f974bf}
+ {fdda5a74-8ef6-4e67-b28c-c5be6c667578}
0
0
0
- /home/winlin/git/simple-rtmp-server/trunk/src/build-qt-Desktop-Debug
+ /home/winlin/git/simple-rtmp-server/trunk/ide/build-srs-qt-Desktop-Debug
true
@@ -119,7 +119,66 @@
2
true
- 1
+
+ /home/winlin/git/simple-rtmp-server/trunk/ide/build-srs-qt-Desktop-Release
+
+
+ true
+ qmake
+
+ QtProjectManager.QMakeBuildStep
+ false
+ true
+
+ false
+
+
+ true
+ Make
+
+ Qt4ProjectManager.MakeStep
+
+ -w
+ -r
+
+ false
+
+
+
+ 2
+ Build
+
+ ProjectExplorer.BuildSteps.Build
+
+
+
+ true
+ Make
+
+ Qt4ProjectManager.MakeStep
+
+ -w
+ -r
+
+ true
+ clean
+
+
+ 1
+ Clean
+
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ Release
+
+ Qt4ProjectManager.Qt4BuildConfiguration
+ 0
+ true
+
+ 2
0
@@ -172,13 +231,13 @@
2
srs-qt
- srs-qt2
+
Qt4ProjectManager.Qt4RunConfiguration:/home/winlin/git/simple-rtmp-server/trunk/ide/srs_qt/srs-qt.pro
- -c console.conf
+
srs-qt.pro
false
true
- /home/winlin/srs
+
3768
false
true
diff --git a/trunk/ide/srs_upp/init b/trunk/ide/srs_upp/init
old mode 100644
new mode 100755
index 9489480dc..cf8175cb4
--- a/trunk/ide/srs_upp/init
+++ b/trunk/ide/srs_upp/init
@@ -1,3 +1,3 @@
-#ifndef _srs_icpp_init_stub
-#define _srs_icpp_init_stub
+#ifndef _ide_srs_upp_icpp_init_stub
+#define _ide_srs_upp_icpp_init_stub
#endif
diff --git a/trunk/ide/srs_upp/srs_upp.upp b/trunk/ide/srs_upp/srs_upp.upp
index a27b7b635..c52bd3391 100755
--- a/trunk/ide/srs_upp/srs_upp.upp
+++ b/trunk/ide/srs_upp/srs_upp.upp
@@ -36,8 +36,8 @@ file
../../src/kernel/srs_kernel_log.cpp,
../../src/kernel/srs_kernel_mp3.hpp,
../../src/kernel/srs_kernel_mp3.cpp,
- ../../src/kernel/srs_rtsp_stack.hpp,
- ../../src/kernel/srs_rtsp_stack.cpp,
+ ../../src/kernel/srs_rtsp_stack.hpp,
+ ../../src/kernel/srs_rtsp_stack.cpp,
../../src/kernel/srs_kernel_stream.hpp,
../../src/kernel/srs_kernel_stream.cpp,
../../src/kernel/srs_kernel_ts.cpp,
@@ -45,8 +45,8 @@ file
../../src/kernel/srs_kernel_utility.hpp,
../../src/kernel/srs_kernel_utility.cpp,
protocol readonly separator,
- ../../src/protocol/srs_raw_avc.hpp,
- ../../src/protocol/srs_raw_avc.cpp,
+ ../../src/protocol/srs_raw_avc.hpp,
+ ../../src/protocol/srs_raw_avc.cpp,
../../src/protocol/srs_rtmp_amf0.hpp,
../../src/protocol/srs_rtmp_amf0.cpp,
../../src/protocol/srs_rtmp_buffer.hpp,
@@ -102,8 +102,8 @@ file
../../src/app/srs_app_json.cpp,
../../src/app/srs_app_kbps.hpp,
../../src/app/srs_app_kbps.cpp,
- ../../src/app/srs_app_listener.hpp,
- ../../src/app/srs_app_listener.cpp,
+ ../../src/app/srs_app_listener.hpp,
+ ../../src/app/srs_app_listener.cpp,
../../src/app/srs_app_log.hpp,
../../src/app/srs_app_log.cpp,
../../src/app/srs_app_mpegts_udp.hpp,
@@ -116,8 +116,8 @@ file
../../src/app/srs_app_reload.cpp,
../../src/app/srs_app_rtmp_conn.hpp,
../../src/app/srs_app_rtmp_conn.cpp,
- ../../src/app/srs_app_rtsp.hpp,
- ../../src/app/srs_app_rtsp.cpp,
+ ../../src/app/srs_app_rtsp.hpp,
+ ../../src/app/srs_app_rtsp.cpp,
../../src/app/srs_app_pithy_print.hpp,
../../src/app/srs_app_pithy_print.cpp,
../../src/app/srs_app_security.hpp,
diff --git a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..867df88b9
--- /dev/null
+++ b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj
@@ -0,0 +1,844 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 3C1231F61AAE652D00CE8F6C /* srs_core_autofree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1231F01AAE652C00CE8F6C /* srs_core_autofree.cpp */; };
+ 3C1231F71AAE652D00CE8F6C /* srs_core_performance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1231F21AAE652C00CE8F6C /* srs_core_performance.cpp */; };
+ 3C1231F81AAE652D00CE8F6C /* srs_core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1231F41AAE652D00CE8F6C /* srs_core.cpp */; };
+ 3C1232061AAE812C00CE8F6C /* srs_main_server.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232051AAE812C00CE8F6C /* srs_main_server.cpp */; };
+ 3C1232201AAE814D00CE8F6C /* srs_kernel_aac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232081AAE814D00CE8F6C /* srs_kernel_aac.cpp */; };
+ 3C1232211AAE814D00CE8F6C /* srs_kernel_buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12320A1AAE814D00CE8F6C /* srs_kernel_buffer.cpp */; };
+ 3C1232221AAE814D00CE8F6C /* srs_kernel_codec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12320C1AAE814D00CE8F6C /* srs_kernel_codec.cpp */; };
+ 3C1232231AAE814D00CE8F6C /* srs_kernel_consts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12320E1AAE814D00CE8F6C /* srs_kernel_consts.cpp */; };
+ 3C1232241AAE814D00CE8F6C /* srs_kernel_error.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232101AAE814D00CE8F6C /* srs_kernel_error.cpp */; };
+ 3C1232251AAE814D00CE8F6C /* srs_kernel_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232121AAE814D00CE8F6C /* srs_kernel_file.cpp */; };
+ 3C1232261AAE814D00CE8F6C /* srs_kernel_flv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232141AAE814D00CE8F6C /* srs_kernel_flv.cpp */; };
+ 3C1232271AAE814D00CE8F6C /* srs_kernel_log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232161AAE814D00CE8F6C /* srs_kernel_log.cpp */; };
+ 3C1232281AAE814D00CE8F6C /* srs_kernel_mp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232181AAE814D00CE8F6C /* srs_kernel_mp3.cpp */; };
+ 3C1232291AAE814D00CE8F6C /* srs_kernel_stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12321A1AAE814D00CE8F6C /* srs_kernel_stream.cpp */; };
+ 3C12322A1AAE814D00CE8F6C /* srs_kernel_ts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12321C1AAE814D00CE8F6C /* srs_kernel_ts.cpp */; };
+ 3C12322B1AAE814D00CE8F6C /* srs_kernel_utility.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12321E1AAE814D00CE8F6C /* srs_kernel_utility.cpp */; };
+ 3C1232411AAE81A400CE8F6C /* srs_raw_avc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12322D1AAE81A400CE8F6C /* srs_raw_avc.cpp */; };
+ 3C1232421AAE81A400CE8F6C /* srs_rtmp_amf0.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12322F1AAE81A400CE8F6C /* srs_rtmp_amf0.cpp */; };
+ 3C1232431AAE81A400CE8F6C /* srs_rtmp_buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232311AAE81A400CE8F6C /* srs_rtmp_buffer.cpp */; };
+ 3C1232441AAE81A400CE8F6C /* srs_rtmp_handshake.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232331AAE81A400CE8F6C /* srs_rtmp_handshake.cpp */; };
+ 3C1232451AAE81A400CE8F6C /* srs_rtmp_io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232351AAE81A400CE8F6C /* srs_rtmp_io.cpp */; };
+ 3C1232461AAE81A400CE8F6C /* srs_rtmp_msg_array.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232371AAE81A400CE8F6C /* srs_rtmp_msg_array.cpp */; };
+ 3C1232471AAE81A400CE8F6C /* srs_rtmp_sdk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232391AAE81A400CE8F6C /* srs_rtmp_sdk.cpp */; };
+ 3C1232481AAE81A400CE8F6C /* srs_rtmp_stack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12323B1AAE81A400CE8F6C /* srs_rtmp_stack.cpp */; };
+ 3C1232491AAE81A400CE8F6C /* srs_rtmp_utility.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12323D1AAE81A400CE8F6C /* srs_rtmp_utility.cpp */; };
+ 3C12324A1AAE81A400CE8F6C /* srs_rtsp_stack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12323F1AAE81A400CE8F6C /* srs_rtsp_stack.cpp */; };
+ 3C1232941AAE81D900CE8F6C /* srs_app_bandwidth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12324C1AAE81D900CE8F6C /* srs_app_bandwidth.cpp */; };
+ 3C1232951AAE81D900CE8F6C /* srs_app_config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12324E1AAE81D900CE8F6C /* srs_app_config.cpp */; };
+ 3C1232961AAE81D900CE8F6C /* srs_app_conn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232501AAE81D900CE8F6C /* srs_app_conn.cpp */; };
+ 3C1232971AAE81D900CE8F6C /* srs_app_dvr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232521AAE81D900CE8F6C /* srs_app_dvr.cpp */; };
+ 3C1232981AAE81D900CE8F6C /* srs_app_edge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232541AAE81D900CE8F6C /* srs_app_edge.cpp */; };
+ 3C1232991AAE81D900CE8F6C /* srs_app_empty.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232561AAE81D900CE8F6C /* srs_app_empty.cpp */; };
+ 3C12329A1AAE81D900CE8F6C /* srs_app_encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232581AAE81D900CE8F6C /* srs_app_encoder.cpp */; };
+ 3C12329B1AAE81D900CE8F6C /* srs_app_ffmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12325A1AAE81D900CE8F6C /* srs_app_ffmpeg.cpp */; };
+ 3C12329C1AAE81D900CE8F6C /* srs_app_forward.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12325C1AAE81D900CE8F6C /* srs_app_forward.cpp */; };
+ 3C12329D1AAE81D900CE8F6C /* srs_app_heartbeat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12325E1AAE81D900CE8F6C /* srs_app_heartbeat.cpp */; };
+ 3C12329E1AAE81D900CE8F6C /* srs_app_hls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232601AAE81D900CE8F6C /* srs_app_hls.cpp */; };
+ 3C12329F1AAE81D900CE8F6C /* srs_app_http_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232621AAE81D900CE8F6C /* srs_app_http_api.cpp */; };
+ 3C1232A01AAE81D900CE8F6C /* srs_app_http_client.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232641AAE81D900CE8F6C /* srs_app_http_client.cpp */; };
+ 3C1232A11AAE81D900CE8F6C /* srs_app_http_conn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232661AAE81D900CE8F6C /* srs_app_http_conn.cpp */; };
+ 3C1232A21AAE81D900CE8F6C /* srs_app_http_hooks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232681AAE81D900CE8F6C /* srs_app_http_hooks.cpp */; };
+ 3C1232A31AAE81D900CE8F6C /* srs_app_http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12326A1AAE81D900CE8F6C /* srs_app_http.cpp */; };
+ 3C1232A41AAE81D900CE8F6C /* srs_app_ingest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12326C1AAE81D900CE8F6C /* srs_app_ingest.cpp */; };
+ 3C1232A51AAE81D900CE8F6C /* srs_app_json.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12326E1AAE81D900CE8F6C /* srs_app_json.cpp */; };
+ 3C1232A61AAE81D900CE8F6C /* srs_app_kbps.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232701AAE81D900CE8F6C /* srs_app_kbps.cpp */; };
+ 3C1232A71AAE81D900CE8F6C /* srs_app_listener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232721AAE81D900CE8F6C /* srs_app_listener.cpp */; };
+ 3C1232A81AAE81D900CE8F6C /* srs_app_log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232741AAE81D900CE8F6C /* srs_app_log.cpp */; };
+ 3C1232A91AAE81D900CE8F6C /* srs_app_mpegts_udp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232761AAE81D900CE8F6C /* srs_app_mpegts_udp.cpp */; };
+ 3C1232AA1AAE81D900CE8F6C /* srs_app_pithy_print.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232781AAE81D900CE8F6C /* srs_app_pithy_print.cpp */; };
+ 3C1232AB1AAE81D900CE8F6C /* srs_app_recv_thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12327A1AAE81D900CE8F6C /* srs_app_recv_thread.cpp */; };
+ 3C1232AC1AAE81D900CE8F6C /* srs_app_refer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12327C1AAE81D900CE8F6C /* srs_app_refer.cpp */; };
+ 3C1232AD1AAE81D900CE8F6C /* srs_app_reload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12327E1AAE81D900CE8F6C /* srs_app_reload.cpp */; };
+ 3C1232AE1AAE81D900CE8F6C /* srs_app_rtmp_conn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232801AAE81D900CE8F6C /* srs_app_rtmp_conn.cpp */; };
+ 3C1232AF1AAE81D900CE8F6C /* srs_app_rtsp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232821AAE81D900CE8F6C /* srs_app_rtsp.cpp */; };
+ 3C1232B01AAE81D900CE8F6C /* srs_app_security.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232841AAE81D900CE8F6C /* srs_app_security.cpp */; };
+ 3C1232B11AAE81D900CE8F6C /* srs_app_server.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232861AAE81D900CE8F6C /* srs_app_server.cpp */; };
+ 3C1232B21AAE81D900CE8F6C /* srs_app_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232881AAE81D900CE8F6C /* srs_app_source.cpp */; };
+ 3C1232B31AAE81D900CE8F6C /* srs_app_st_socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12328A1AAE81D900CE8F6C /* srs_app_st_socket.cpp */; };
+ 3C1232B41AAE81D900CE8F6C /* srs_app_st.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12328C1AAE81D900CE8F6C /* srs_app_st.cpp */; };
+ 3C1232B51AAE81D900CE8F6C /* srs_app_statistic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C12328E1AAE81D900CE8F6C /* srs_app_statistic.cpp */; };
+ 3C1232B61AAE81D900CE8F6C /* srs_app_thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232901AAE81D900CE8F6C /* srs_app_thread.cpp */; };
+ 3C1232B71AAE81D900CE8F6C /* srs_app_utility.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C1232921AAE81D900CE8F6C /* srs_app_utility.cpp */; };
+ 3C1232D31AAEA56B00CE8F6C /* libst.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1232D21AAEA56B00CE8F6C /* libst.a */; };
+ 3C1232E91AAEA5D000CE8F6C /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1232E71AAEA5D000CE8F6C /* libcrypto.a */; };
+ 3C1232EA1AAEA5D000CE8F6C /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1232E81AAEA5D000CE8F6C /* libssl.a */; };
+ 3C1232ED1AAEA70F00CE8F6C /* libhttp_parser.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C1232EC1AAEA70F00CE8F6C /* libhttp_parser.a */; };
+ 3C663F0E1AB0155100286D8B /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F011AB0155100286D8B /* Makefile */; };
+ 3C663F0F1AB0155100286D8B /* srs_aac_raw_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F021AB0155100286D8B /* srs_aac_raw_publish.c */; };
+ 3C663F101AB0155100286D8B /* srs_audio_raw_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F031AB0155100286D8B /* srs_audio_raw_publish.c */; };
+ 3C663F111AB0155100286D8B /* srs_bandwidth_check.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F041AB0155100286D8B /* srs_bandwidth_check.c */; };
+ 3C663F121AB0155100286D8B /* srs_detect_rtmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F051AB0155100286D8B /* srs_detect_rtmp.c */; };
+ 3C663F131AB0155100286D8B /* srs_flv_injecter.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F061AB0155100286D8B /* srs_flv_injecter.c */; };
+ 3C663F141AB0155100286D8B /* srs_flv_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F071AB0155100286D8B /* srs_flv_parser.c */; };
+ 3C663F151AB0155100286D8B /* srs_h264_raw_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F081AB0155100286D8B /* srs_h264_raw_publish.c */; };
+ 3C663F161AB0155100286D8B /* srs_ingest_flv.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F091AB0155100286D8B /* srs_ingest_flv.c */; };
+ 3C663F171AB0155100286D8B /* srs_ingest_rtmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F0A1AB0155100286D8B /* srs_ingest_rtmp.c */; };
+ 3C663F181AB0155100286D8B /* srs_play.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F0B1AB0155100286D8B /* srs_play.c */; };
+ 3C663F191AB0155100286D8B /* srs_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F0C1AB0155100286D8B /* srs_publish.c */; };
+ 3C663F1A1AB0155100286D8B /* srs_rtmp_dump.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F0D1AB0155100286D8B /* srs_rtmp_dump.c */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 3C1231E31AAE64A400CE8F6C /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 3C1231E51AAE64A400CE8F6C /* srs_xcode */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; includeInIndex = 0; path = srs_xcode; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3C1231F01AAE652C00CE8F6C /* srs_core_autofree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_core_autofree.cpp; path = ../../../src/core/srs_core_autofree.cpp; sourceTree = ""; };
+ 3C1231F11AAE652C00CE8F6C /* srs_core_autofree.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_core_autofree.hpp; path = ../../../src/core/srs_core_autofree.hpp; sourceTree = ""; };
+ 3C1231F21AAE652C00CE8F6C /* srs_core_performance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_core_performance.cpp; path = ../../../src/core/srs_core_performance.cpp; sourceTree = ""; };
+ 3C1231F31AAE652C00CE8F6C /* srs_core_performance.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_core_performance.hpp; path = ../../../src/core/srs_core_performance.hpp; sourceTree = ""; };
+ 3C1231F41AAE652D00CE8F6C /* srs_core.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_core.cpp; path = ../../../src/core/srs_core.cpp; sourceTree = ""; };
+ 3C1231F51AAE652D00CE8F6C /* srs_core.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_core.hpp; path = ../../../src/core/srs_core.hpp; sourceTree = ""; };
+ 3C1231FB1AAE673100CE8F6C /* srs_auto_headers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_auto_headers.hpp; path = ../../../objs/srs_auto_headers.hpp; sourceTree = ""; };
+ 3C1232051AAE812C00CE8F6C /* srs_main_server.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_main_server.cpp; path = ../../../src/main/srs_main_server.cpp; sourceTree = ""; };
+ 3C1232081AAE814D00CE8F6C /* srs_kernel_aac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_aac.cpp; path = ../../../src/kernel/srs_kernel_aac.cpp; sourceTree = ""; };
+ 3C1232091AAE814D00CE8F6C /* srs_kernel_aac.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_aac.hpp; path = ../../../src/kernel/srs_kernel_aac.hpp; sourceTree = ""; };
+ 3C12320A1AAE814D00CE8F6C /* srs_kernel_buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_buffer.cpp; path = ../../../src/kernel/srs_kernel_buffer.cpp; sourceTree = ""; };
+ 3C12320B1AAE814D00CE8F6C /* srs_kernel_buffer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_buffer.hpp; path = ../../../src/kernel/srs_kernel_buffer.hpp; sourceTree = ""; };
+ 3C12320C1AAE814D00CE8F6C /* srs_kernel_codec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_codec.cpp; path = ../../../src/kernel/srs_kernel_codec.cpp; sourceTree = ""; };
+ 3C12320D1AAE814D00CE8F6C /* srs_kernel_codec.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_codec.hpp; path = ../../../src/kernel/srs_kernel_codec.hpp; sourceTree = ""; };
+ 3C12320E1AAE814D00CE8F6C /* srs_kernel_consts.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_consts.cpp; path = ../../../src/kernel/srs_kernel_consts.cpp; sourceTree = ""; };
+ 3C12320F1AAE814D00CE8F6C /* srs_kernel_consts.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_consts.hpp; path = ../../../src/kernel/srs_kernel_consts.hpp; sourceTree = ""; };
+ 3C1232101AAE814D00CE8F6C /* srs_kernel_error.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_error.cpp; path = ../../../src/kernel/srs_kernel_error.cpp; sourceTree = ""; };
+ 3C1232111AAE814D00CE8F6C /* srs_kernel_error.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_error.hpp; path = ../../../src/kernel/srs_kernel_error.hpp; sourceTree = ""; };
+ 3C1232121AAE814D00CE8F6C /* srs_kernel_file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_file.cpp; path = ../../../src/kernel/srs_kernel_file.cpp; sourceTree = ""; };
+ 3C1232131AAE814D00CE8F6C /* srs_kernel_file.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_file.hpp; path = ../../../src/kernel/srs_kernel_file.hpp; sourceTree = ""; };
+ 3C1232141AAE814D00CE8F6C /* srs_kernel_flv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_flv.cpp; path = ../../../src/kernel/srs_kernel_flv.cpp; sourceTree = ""; };
+ 3C1232151AAE814D00CE8F6C /* srs_kernel_flv.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_flv.hpp; path = ../../../src/kernel/srs_kernel_flv.hpp; sourceTree = ""; };
+ 3C1232161AAE814D00CE8F6C /* srs_kernel_log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_log.cpp; path = ../../../src/kernel/srs_kernel_log.cpp; sourceTree = ""; };
+ 3C1232171AAE814D00CE8F6C /* srs_kernel_log.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_log.hpp; path = ../../../src/kernel/srs_kernel_log.hpp; sourceTree = ""; };
+ 3C1232181AAE814D00CE8F6C /* srs_kernel_mp3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_mp3.cpp; path = ../../../src/kernel/srs_kernel_mp3.cpp; sourceTree = ""; };
+ 3C1232191AAE814D00CE8F6C /* srs_kernel_mp3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_mp3.hpp; path = ../../../src/kernel/srs_kernel_mp3.hpp; sourceTree = ""; };
+ 3C12321A1AAE814D00CE8F6C /* srs_kernel_stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_stream.cpp; path = ../../../src/kernel/srs_kernel_stream.cpp; sourceTree = ""; };
+ 3C12321B1AAE814D00CE8F6C /* srs_kernel_stream.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_stream.hpp; path = ../../../src/kernel/srs_kernel_stream.hpp; sourceTree = ""; };
+ 3C12321C1AAE814D00CE8F6C /* srs_kernel_ts.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_ts.cpp; path = ../../../src/kernel/srs_kernel_ts.cpp; sourceTree = ""; };
+ 3C12321D1AAE814D00CE8F6C /* srs_kernel_ts.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_ts.hpp; path = ../../../src/kernel/srs_kernel_ts.hpp; sourceTree = ""; };
+ 3C12321E1AAE814D00CE8F6C /* srs_kernel_utility.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_kernel_utility.cpp; path = ../../../src/kernel/srs_kernel_utility.cpp; sourceTree = ""; };
+ 3C12321F1AAE814D00CE8F6C /* srs_kernel_utility.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_kernel_utility.hpp; path = ../../../src/kernel/srs_kernel_utility.hpp; sourceTree = ""; };
+ 3C12322D1AAE81A400CE8F6C /* srs_raw_avc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_raw_avc.cpp; path = ../../../src/protocol/srs_raw_avc.cpp; sourceTree = ""; };
+ 3C12322E1AAE81A400CE8F6C /* srs_raw_avc.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_raw_avc.hpp; path = ../../../src/protocol/srs_raw_avc.hpp; sourceTree = ""; };
+ 3C12322F1AAE81A400CE8F6C /* srs_rtmp_amf0.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtmp_amf0.cpp; path = ../../../src/protocol/srs_rtmp_amf0.cpp; sourceTree = ""; };
+ 3C1232301AAE81A400CE8F6C /* srs_rtmp_amf0.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtmp_amf0.hpp; path = ../../../src/protocol/srs_rtmp_amf0.hpp; sourceTree = ""; };
+ 3C1232311AAE81A400CE8F6C /* srs_rtmp_buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtmp_buffer.cpp; path = ../../../src/protocol/srs_rtmp_buffer.cpp; sourceTree = ""; };
+ 3C1232321AAE81A400CE8F6C /* srs_rtmp_buffer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtmp_buffer.hpp; path = ../../../src/protocol/srs_rtmp_buffer.hpp; sourceTree = ""; };
+ 3C1232331AAE81A400CE8F6C /* srs_rtmp_handshake.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtmp_handshake.cpp; path = ../../../src/protocol/srs_rtmp_handshake.cpp; sourceTree = ""; };
+ 3C1232341AAE81A400CE8F6C /* srs_rtmp_handshake.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtmp_handshake.hpp; path = ../../../src/protocol/srs_rtmp_handshake.hpp; sourceTree = ""; };
+ 3C1232351AAE81A400CE8F6C /* srs_rtmp_io.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtmp_io.cpp; path = ../../../src/protocol/srs_rtmp_io.cpp; sourceTree = ""; };
+ 3C1232361AAE81A400CE8F6C /* srs_rtmp_io.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtmp_io.hpp; path = ../../../src/protocol/srs_rtmp_io.hpp; sourceTree = ""; };
+ 3C1232371AAE81A400CE8F6C /* srs_rtmp_msg_array.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtmp_msg_array.cpp; path = ../../../src/protocol/srs_rtmp_msg_array.cpp; sourceTree = ""; };
+ 3C1232381AAE81A400CE8F6C /* srs_rtmp_msg_array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtmp_msg_array.hpp; path = ../../../src/protocol/srs_rtmp_msg_array.hpp; sourceTree = ""; };
+ 3C1232391AAE81A400CE8F6C /* srs_rtmp_sdk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtmp_sdk.cpp; path = ../../../src/protocol/srs_rtmp_sdk.cpp; sourceTree = ""; };
+ 3C12323A1AAE81A400CE8F6C /* srs_rtmp_sdk.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtmp_sdk.hpp; path = ../../../src/protocol/srs_rtmp_sdk.hpp; sourceTree = ""; };
+ 3C12323B1AAE81A400CE8F6C /* srs_rtmp_stack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtmp_stack.cpp; path = ../../../src/protocol/srs_rtmp_stack.cpp; sourceTree = ""; };
+ 3C12323C1AAE81A400CE8F6C /* srs_rtmp_stack.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtmp_stack.hpp; path = ../../../src/protocol/srs_rtmp_stack.hpp; sourceTree = ""; };
+ 3C12323D1AAE81A400CE8F6C /* srs_rtmp_utility.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtmp_utility.cpp; path = ../../../src/protocol/srs_rtmp_utility.cpp; sourceTree = ""; };
+ 3C12323E1AAE81A400CE8F6C /* srs_rtmp_utility.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtmp_utility.hpp; path = ../../../src/protocol/srs_rtmp_utility.hpp; sourceTree = ""; };
+ 3C12323F1AAE81A400CE8F6C /* srs_rtsp_stack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_rtsp_stack.cpp; path = ../../../src/protocol/srs_rtsp_stack.cpp; sourceTree = ""; };
+ 3C1232401AAE81A400CE8F6C /* srs_rtsp_stack.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_rtsp_stack.hpp; path = ../../../src/protocol/srs_rtsp_stack.hpp; sourceTree = ""; };
+ 3C12324C1AAE81D900CE8F6C /* srs_app_bandwidth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_bandwidth.cpp; path = ../../../src/app/srs_app_bandwidth.cpp; sourceTree = ""; };
+ 3C12324D1AAE81D900CE8F6C /* srs_app_bandwidth.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_bandwidth.hpp; path = ../../../src/app/srs_app_bandwidth.hpp; sourceTree = ""; };
+ 3C12324E1AAE81D900CE8F6C /* srs_app_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_config.cpp; path = ../../../src/app/srs_app_config.cpp; sourceTree = ""; };
+ 3C12324F1AAE81D900CE8F6C /* srs_app_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_config.hpp; path = ../../../src/app/srs_app_config.hpp; sourceTree = ""; };
+ 3C1232501AAE81D900CE8F6C /* srs_app_conn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_conn.cpp; path = ../../../src/app/srs_app_conn.cpp; sourceTree = ""; };
+ 3C1232511AAE81D900CE8F6C /* srs_app_conn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_conn.hpp; path = ../../../src/app/srs_app_conn.hpp; sourceTree = ""; };
+ 3C1232521AAE81D900CE8F6C /* srs_app_dvr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_dvr.cpp; path = ../../../src/app/srs_app_dvr.cpp; sourceTree = ""; };
+ 3C1232531AAE81D900CE8F6C /* srs_app_dvr.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_dvr.hpp; path = ../../../src/app/srs_app_dvr.hpp; sourceTree = ""; };
+ 3C1232541AAE81D900CE8F6C /* srs_app_edge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_edge.cpp; path = ../../../src/app/srs_app_edge.cpp; sourceTree = ""; };
+ 3C1232551AAE81D900CE8F6C /* srs_app_edge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_edge.hpp; path = ../../../src/app/srs_app_edge.hpp; sourceTree = ""; };
+ 3C1232561AAE81D900CE8F6C /* srs_app_empty.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_empty.cpp; path = ../../../src/app/srs_app_empty.cpp; sourceTree = ""; };
+ 3C1232571AAE81D900CE8F6C /* srs_app_empty.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_empty.hpp; path = ../../../src/app/srs_app_empty.hpp; sourceTree = ""; };
+ 3C1232581AAE81D900CE8F6C /* srs_app_encoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_encoder.cpp; path = ../../../src/app/srs_app_encoder.cpp; sourceTree = ""; };
+ 3C1232591AAE81D900CE8F6C /* srs_app_encoder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_encoder.hpp; path = ../../../src/app/srs_app_encoder.hpp; sourceTree = ""; };
+ 3C12325A1AAE81D900CE8F6C /* srs_app_ffmpeg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_ffmpeg.cpp; path = ../../../src/app/srs_app_ffmpeg.cpp; sourceTree = ""; };
+ 3C12325B1AAE81D900CE8F6C /* srs_app_ffmpeg.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_ffmpeg.hpp; path = ../../../src/app/srs_app_ffmpeg.hpp; sourceTree = ""; };
+ 3C12325C1AAE81D900CE8F6C /* srs_app_forward.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_forward.cpp; path = ../../../src/app/srs_app_forward.cpp; sourceTree = ""; };
+ 3C12325D1AAE81D900CE8F6C /* srs_app_forward.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_forward.hpp; path = ../../../src/app/srs_app_forward.hpp; sourceTree = ""; };
+ 3C12325E1AAE81D900CE8F6C /* srs_app_heartbeat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_heartbeat.cpp; path = ../../../src/app/srs_app_heartbeat.cpp; sourceTree = ""; };
+ 3C12325F1AAE81D900CE8F6C /* srs_app_heartbeat.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_heartbeat.hpp; path = ../../../src/app/srs_app_heartbeat.hpp; sourceTree = ""; };
+ 3C1232601AAE81D900CE8F6C /* srs_app_hls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_hls.cpp; path = ../../../src/app/srs_app_hls.cpp; sourceTree = ""; };
+ 3C1232611AAE81D900CE8F6C /* srs_app_hls.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_hls.hpp; path = ../../../src/app/srs_app_hls.hpp; sourceTree = ""; };
+ 3C1232621AAE81D900CE8F6C /* srs_app_http_api.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_http_api.cpp; path = ../../../src/app/srs_app_http_api.cpp; sourceTree = ""; };
+ 3C1232631AAE81D900CE8F6C /* srs_app_http_api.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_http_api.hpp; path = ../../../src/app/srs_app_http_api.hpp; sourceTree = ""; };
+ 3C1232641AAE81D900CE8F6C /* srs_app_http_client.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_http_client.cpp; path = ../../../src/app/srs_app_http_client.cpp; sourceTree = ""; };
+ 3C1232651AAE81D900CE8F6C /* srs_app_http_client.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_http_client.hpp; path = ../../../src/app/srs_app_http_client.hpp; sourceTree = ""; };
+ 3C1232661AAE81D900CE8F6C /* srs_app_http_conn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_http_conn.cpp; path = ../../../src/app/srs_app_http_conn.cpp; sourceTree = ""; };
+ 3C1232671AAE81D900CE8F6C /* srs_app_http_conn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_http_conn.hpp; path = ../../../src/app/srs_app_http_conn.hpp; sourceTree = ""; };
+ 3C1232681AAE81D900CE8F6C /* srs_app_http_hooks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_http_hooks.cpp; path = ../../../src/app/srs_app_http_hooks.cpp; sourceTree = ""; };
+ 3C1232691AAE81D900CE8F6C /* srs_app_http_hooks.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_http_hooks.hpp; path = ../../../src/app/srs_app_http_hooks.hpp; sourceTree = ""; };
+ 3C12326A1AAE81D900CE8F6C /* srs_app_http.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_http.cpp; path = ../../../src/app/srs_app_http.cpp; sourceTree = ""; };
+ 3C12326B1AAE81D900CE8F6C /* srs_app_http.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_http.hpp; path = ../../../src/app/srs_app_http.hpp; sourceTree = ""; };
+ 3C12326C1AAE81D900CE8F6C /* srs_app_ingest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_ingest.cpp; path = ../../../src/app/srs_app_ingest.cpp; sourceTree = ""; };
+ 3C12326D1AAE81D900CE8F6C /* srs_app_ingest.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_ingest.hpp; path = ../../../src/app/srs_app_ingest.hpp; sourceTree = ""; };
+ 3C12326E1AAE81D900CE8F6C /* srs_app_json.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_json.cpp; path = ../../../src/app/srs_app_json.cpp; sourceTree = ""; };
+ 3C12326F1AAE81D900CE8F6C /* srs_app_json.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_json.hpp; path = ../../../src/app/srs_app_json.hpp; sourceTree = ""; };
+ 3C1232701AAE81D900CE8F6C /* srs_app_kbps.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_kbps.cpp; path = ../../../src/app/srs_app_kbps.cpp; sourceTree = ""; };
+ 3C1232711AAE81D900CE8F6C /* srs_app_kbps.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_kbps.hpp; path = ../../../src/app/srs_app_kbps.hpp; sourceTree = ""; };
+ 3C1232721AAE81D900CE8F6C /* srs_app_listener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_listener.cpp; path = ../../../src/app/srs_app_listener.cpp; sourceTree = ""; };
+ 3C1232731AAE81D900CE8F6C /* srs_app_listener.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_listener.hpp; path = ../../../src/app/srs_app_listener.hpp; sourceTree = ""; };
+ 3C1232741AAE81D900CE8F6C /* srs_app_log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_log.cpp; path = ../../../src/app/srs_app_log.cpp; sourceTree = ""; };
+ 3C1232751AAE81D900CE8F6C /* srs_app_log.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_log.hpp; path = ../../../src/app/srs_app_log.hpp; sourceTree = ""; };
+ 3C1232761AAE81D900CE8F6C /* srs_app_mpegts_udp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_mpegts_udp.cpp; path = ../../../src/app/srs_app_mpegts_udp.cpp; sourceTree = ""; };
+ 3C1232771AAE81D900CE8F6C /* srs_app_mpegts_udp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_mpegts_udp.hpp; path = ../../../src/app/srs_app_mpegts_udp.hpp; sourceTree = ""; };
+ 3C1232781AAE81D900CE8F6C /* srs_app_pithy_print.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_pithy_print.cpp; path = ../../../src/app/srs_app_pithy_print.cpp; sourceTree = ""; };
+ 3C1232791AAE81D900CE8F6C /* srs_app_pithy_print.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_pithy_print.hpp; path = ../../../src/app/srs_app_pithy_print.hpp; sourceTree = ""; };
+ 3C12327A1AAE81D900CE8F6C /* srs_app_recv_thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_recv_thread.cpp; path = ../../../src/app/srs_app_recv_thread.cpp; sourceTree = ""; };
+ 3C12327B1AAE81D900CE8F6C /* srs_app_recv_thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_recv_thread.hpp; path = ../../../src/app/srs_app_recv_thread.hpp; sourceTree = ""; };
+ 3C12327C1AAE81D900CE8F6C /* srs_app_refer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_refer.cpp; path = ../../../src/app/srs_app_refer.cpp; sourceTree = ""; };
+ 3C12327D1AAE81D900CE8F6C /* srs_app_refer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_refer.hpp; path = ../../../src/app/srs_app_refer.hpp; sourceTree = ""; };
+ 3C12327E1AAE81D900CE8F6C /* srs_app_reload.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_reload.cpp; path = ../../../src/app/srs_app_reload.cpp; sourceTree = ""; };
+ 3C12327F1AAE81D900CE8F6C /* srs_app_reload.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_reload.hpp; path = ../../../src/app/srs_app_reload.hpp; sourceTree = ""; };
+ 3C1232801AAE81D900CE8F6C /* srs_app_rtmp_conn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_rtmp_conn.cpp; path = ../../../src/app/srs_app_rtmp_conn.cpp; sourceTree = ""; };
+ 3C1232811AAE81D900CE8F6C /* srs_app_rtmp_conn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_rtmp_conn.hpp; path = ../../../src/app/srs_app_rtmp_conn.hpp; sourceTree = ""; };
+ 3C1232821AAE81D900CE8F6C /* srs_app_rtsp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_rtsp.cpp; path = ../../../src/app/srs_app_rtsp.cpp; sourceTree = ""; };
+ 3C1232831AAE81D900CE8F6C /* srs_app_rtsp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_rtsp.hpp; path = ../../../src/app/srs_app_rtsp.hpp; sourceTree = ""; };
+ 3C1232841AAE81D900CE8F6C /* srs_app_security.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_security.cpp; path = ../../../src/app/srs_app_security.cpp; sourceTree = ""; };
+ 3C1232851AAE81D900CE8F6C /* srs_app_security.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_security.hpp; path = ../../../src/app/srs_app_security.hpp; sourceTree = ""; };
+ 3C1232861AAE81D900CE8F6C /* srs_app_server.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_server.cpp; path = ../../../src/app/srs_app_server.cpp; sourceTree = ""; };
+ 3C1232871AAE81D900CE8F6C /* srs_app_server.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_server.hpp; path = ../../../src/app/srs_app_server.hpp; sourceTree = ""; };
+ 3C1232881AAE81D900CE8F6C /* srs_app_source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_source.cpp; path = ../../../src/app/srs_app_source.cpp; sourceTree = ""; };
+ 3C1232891AAE81D900CE8F6C /* srs_app_source.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_source.hpp; path = ../../../src/app/srs_app_source.hpp; sourceTree = ""; };
+ 3C12328A1AAE81D900CE8F6C /* srs_app_st_socket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_st_socket.cpp; path = ../../../src/app/srs_app_st_socket.cpp; sourceTree = ""; };
+ 3C12328B1AAE81D900CE8F6C /* srs_app_st_socket.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_st_socket.hpp; path = ../../../src/app/srs_app_st_socket.hpp; sourceTree = ""; };
+ 3C12328C1AAE81D900CE8F6C /* srs_app_st.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_st.cpp; path = ../../../src/app/srs_app_st.cpp; sourceTree = ""; };
+ 3C12328D1AAE81D900CE8F6C /* srs_app_st.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_st.hpp; path = ../../../src/app/srs_app_st.hpp; sourceTree = ""; };
+ 3C12328E1AAE81D900CE8F6C /* srs_app_statistic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_statistic.cpp; path = ../../../src/app/srs_app_statistic.cpp; sourceTree = ""; };
+ 3C12328F1AAE81D900CE8F6C /* srs_app_statistic.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_statistic.hpp; path = ../../../src/app/srs_app_statistic.hpp; sourceTree = ""; };
+ 3C1232901AAE81D900CE8F6C /* srs_app_thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_thread.cpp; path = ../../../src/app/srs_app_thread.cpp; sourceTree = ""; };
+ 3C1232911AAE81D900CE8F6C /* srs_app_thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_thread.hpp; path = ../../../src/app/srs_app_thread.hpp; sourceTree = ""; };
+ 3C1232921AAE81D900CE8F6C /* srs_app_utility.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_utility.cpp; path = ../../../src/app/srs_app_utility.cpp; sourceTree = ""; };
+ 3C1232931AAE81D900CE8F6C /* srs_app_utility.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_utility.hpp; path = ../../../src/app/srs_app_utility.hpp; sourceTree = ""; };
+ 3C1232B81AAE824500CE8F6C /* configure */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = configure; path = ../../../configure; sourceTree = ""; };
+ 3C1232BB1AAE827E00CE8F6C /* apps.sh */ = {isa = PBXFileReference; explicitFileType = text.script.sh; fileEncoding = 4; name = apps.sh; path = ../../../auto/apps.sh; sourceTree = ""; };
+ 3C1232BC1AAE827E00CE8F6C /* auto_headers.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = auto_headers.sh; path = ../../../auto/auto_headers.sh; sourceTree = ""; };
+ 3C1232BD1AAE827E00CE8F6C /* build_ffmpeg.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = build_ffmpeg.sh; path = ../../../auto/build_ffmpeg.sh; sourceTree = ""; };
+ 3C1232BE1AAE827E00CE8F6C /* depends.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = depends.sh; path = ../../../auto/depends.sh; sourceTree = ""; };
+ 3C1232BF1AAE827E00CE8F6C /* generate_header.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = generate_header.sh; path = ../../../auto/generate_header.sh; sourceTree = ""; };
+ 3C1232C01AAE827E00CE8F6C /* generate-srs-librtmp-project.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "generate-srs-librtmp-project.sh"; path = "../../../auto/generate-srs-librtmp-project.sh"; sourceTree = ""; };
+ 3C1232C11AAE827E00CE8F6C /* generate-srs-librtmp-single.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "generate-srs-librtmp-single.sh"; path = "../../../auto/generate-srs-librtmp-single.sh"; sourceTree = ""; };
+ 3C1232C21AAE827E00CE8F6C /* libs.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = libs.sh; path = ../../../auto/libs.sh; sourceTree = ""; };
+ 3C1232C31AAE827E00CE8F6C /* local_ip.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = local_ip.sh; path = ../../../auto/local_ip.sh; sourceTree = ""; };
+ 3C1232C41AAE827E00CE8F6C /* modules.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = modules.sh; path = ../../../auto/modules.sh; sourceTree = ""; };
+ 3C1232C51AAE827E00CE8F6C /* options.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = options.sh; path = ../../../auto/options.sh; sourceTree = ""; };
+ 3C1232C61AAE827E00CE8F6C /* summary.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = summary.sh; path = ../../../auto/summary.sh; sourceTree = ""; };
+ 3C1232C71AAE827E00CE8F6C /* utest.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = utest.sh; path = ../../../auto/utest.sh; sourceTree = ""; };
+ 3C1232C81AAE833300CE8F6C /* _log.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = _log.sh; path = ../../../scripts/_log.sh; sourceTree = ""; };
+ 3C1232C91AAE833300CE8F6C /* build.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = build.sh; path = ../../../scripts/build.sh; sourceTree = ""; };
+ 3C1232CA1AAE833300CE8F6C /* git.commit.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = git.commit.sh; path = ../../../scripts/git.commit.sh; sourceTree = ""; };
+ 3C1232CB1AAE833300CE8F6C /* git2unix.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = git2unix.sh; path = ../../../scripts/git2unix.sh; sourceTree = ""; };
+ 3C1232CC1AAE833300CE8F6C /* install.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = install.sh; path = ../../../scripts/install.sh; sourceTree = ""; };
+ 3C1232CD1AAE833300CE8F6C /* package.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = package.sh; path = ../../../scripts/package.sh; sourceTree = ""; };
+ 3C1232CE1AAE833300CE8F6C /* run.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = run.sh; path = ../../../scripts/run.sh; sourceTree = ""; };
+ 3C1232CF1AAE833300CE8F6C /* srs.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = srs.test; path = ../../../scripts/srs.test; sourceTree = ""; };
+ 3C1232D01AAE833300CE8F6C /* stop.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = stop.sh; path = ../../../scripts/stop.sh; sourceTree = ""; };
+ 3C1232D11AAE833300CE8F6C /* test_configure.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = test_configure.sh; path = ../../../scripts/test_configure.sh; sourceTree = ""; };
+ 3C1232D21AAEA56B00CE8F6C /* libst.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libst.a; path = "../../objs/st-1.9/DARWIN_14.0.0_DBG/libst.a"; sourceTree = ""; };
+ 3C1232E71AAEA5D000CE8F6C /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcrypto.a; path = "../../objs/openssl-1.0.1f/_release/lib/libcrypto.a"; sourceTree = ""; };
+ 3C1232E81AAEA5D000CE8F6C /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libssl.a; path = "../../objs/openssl-1.0.1f/_release/lib/libssl.a"; sourceTree = ""; };
+ 3C1232EC1AAEA70F00CE8F6C /* libhttp_parser.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libhttp_parser.a; path = "../../objs/http-parser-2.1/libhttp_parser.a"; sourceTree = ""; };
+ 3C1232F11AAEAC7000CE8F6C /* srs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = srs; path = ../../../etc/init.d/srs; sourceTree = ""; };
+ 3C1232F21AAEAC7000CE8F6C /* srs-api */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "srs-api"; path = "../../../etc/init.d/srs-api"; sourceTree = ""; };
+ 3C1232F31AAEAC7000CE8F6C /* srs-demo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "srs-demo"; path = "../../../etc/init.d/srs-demo"; sourceTree = ""; };
+ 3C1232F41AAEAC7000CE8F6C /* srs-demo-19350 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "srs-demo-19350"; path = "../../../etc/init.d/srs-demo-19350"; sourceTree = ""; };
+ 3C663F011AB0155100286D8B /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = ../../../research/librtmp/Makefile; sourceTree = ""; };
+ 3C663F021AB0155100286D8B /* srs_aac_raw_publish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_aac_raw_publish.c; path = ../../../research/librtmp/srs_aac_raw_publish.c; sourceTree = ""; };
+ 3C663F031AB0155100286D8B /* srs_audio_raw_publish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_audio_raw_publish.c; path = ../../../research/librtmp/srs_audio_raw_publish.c; sourceTree = ""; };
+ 3C663F041AB0155100286D8B /* srs_bandwidth_check.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_bandwidth_check.c; path = ../../../research/librtmp/srs_bandwidth_check.c; sourceTree = ""; };
+ 3C663F051AB0155100286D8B /* srs_detect_rtmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_detect_rtmp.c; path = ../../../research/librtmp/srs_detect_rtmp.c; sourceTree = ""; };
+ 3C663F061AB0155100286D8B /* srs_flv_injecter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_flv_injecter.c; path = ../../../research/librtmp/srs_flv_injecter.c; sourceTree = ""; };
+ 3C663F071AB0155100286D8B /* srs_flv_parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_flv_parser.c; path = ../../../research/librtmp/srs_flv_parser.c; sourceTree = ""; };
+ 3C663F081AB0155100286D8B /* srs_h264_raw_publish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_h264_raw_publish.c; path = ../../../research/librtmp/srs_h264_raw_publish.c; sourceTree = ""; };
+ 3C663F091AB0155100286D8B /* srs_ingest_flv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_ingest_flv.c; path = ../../../research/librtmp/srs_ingest_flv.c; sourceTree = ""; };
+ 3C663F0A1AB0155100286D8B /* srs_ingest_rtmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_ingest_rtmp.c; path = ../../../research/librtmp/srs_ingest_rtmp.c; sourceTree = ""; };
+ 3C663F0B1AB0155100286D8B /* srs_play.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_play.c; path = ../../../research/librtmp/srs_play.c; sourceTree = ""; };
+ 3C663F0C1AB0155100286D8B /* srs_publish.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_publish.c; path = ../../../research/librtmp/srs_publish.c; sourceTree = ""; };
+ 3C663F0D1AB0155100286D8B /* srs_rtmp_dump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = srs_rtmp_dump.c; path = ../../../research/librtmp/srs_rtmp_dump.c; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 3C1231E21AAE64A400CE8F6C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3C1232ED1AAEA70F00CE8F6C /* libhttp_parser.a in Frameworks */,
+ 3C1232E91AAEA5D000CE8F6C /* libcrypto.a in Frameworks */,
+ 3C1232EA1AAEA5D000CE8F6C /* libssl.a in Frameworks */,
+ 3C1232D31AAEA56B00CE8F6C /* libst.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 3C1231DC1AAE64A400CE8F6C = {
+ isa = PBXGroup;
+ children = (
+ 3C1231E61AAE64A400CE8F6C /* Products */,
+ 3C1232EE1AAEA71C00CE8F6C /* links */,
+ 3C1231E71AAE64A400CE8F6C /* srs_xcode */,
+ 3C663F001AB014B500286D8B /* research */,
+ );
+ sourceTree = "";
+ };
+ 3C1231E61AAE64A400CE8F6C /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1231E51AAE64A400CE8F6C /* srs_xcode */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 3C1231E71AAE64A400CE8F6C /* srs_xcode */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1232B81AAE824500CE8F6C /* configure */,
+ 3C1232EF1AAEAC5800CE8F6C /* etc */,
+ 3C1232BA1AAE826F00CE8F6C /* auto */,
+ 3C1232B91AAE825100CE8F6C /* scripts */,
+ 3C12324B1AAE81CE00CE8F6C /* app */,
+ 3C12322C1AAE819900CE8F6C /* protocol */,
+ 3C1232071AAE814200CE8F6C /* kernel */,
+ 3C1232041AAE80CB00CE8F6C /* main */,
+ 3C1231F91AAE670E00CE8F6C /* objs */,
+ 3C1231EF1AAE651100CE8F6C /* core */,
+ );
+ path = srs_xcode;
+ sourceTree = "";
+ };
+ 3C1231EF1AAE651100CE8F6C /* core */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1231F01AAE652C00CE8F6C /* srs_core_autofree.cpp */,
+ 3C1231F11AAE652C00CE8F6C /* srs_core_autofree.hpp */,
+ 3C1231F21AAE652C00CE8F6C /* srs_core_performance.cpp */,
+ 3C1231F31AAE652C00CE8F6C /* srs_core_performance.hpp */,
+ 3C1231F41AAE652D00CE8F6C /* srs_core.cpp */,
+ 3C1231F51AAE652D00CE8F6C /* srs_core.hpp */,
+ );
+ name = core;
+ sourceTree = "";
+ };
+ 3C1231F91AAE670E00CE8F6C /* objs */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1231FB1AAE673100CE8F6C /* srs_auto_headers.hpp */,
+ );
+ name = objs;
+ sourceTree = "";
+ };
+ 3C1232041AAE80CB00CE8F6C /* main */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1232051AAE812C00CE8F6C /* srs_main_server.cpp */,
+ );
+ name = main;
+ sourceTree = "";
+ };
+ 3C1232071AAE814200CE8F6C /* kernel */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1232081AAE814D00CE8F6C /* srs_kernel_aac.cpp */,
+ 3C1232091AAE814D00CE8F6C /* srs_kernel_aac.hpp */,
+ 3C12320A1AAE814D00CE8F6C /* srs_kernel_buffer.cpp */,
+ 3C12320B1AAE814D00CE8F6C /* srs_kernel_buffer.hpp */,
+ 3C12320C1AAE814D00CE8F6C /* srs_kernel_codec.cpp */,
+ 3C12320D1AAE814D00CE8F6C /* srs_kernel_codec.hpp */,
+ 3C12320E1AAE814D00CE8F6C /* srs_kernel_consts.cpp */,
+ 3C12320F1AAE814D00CE8F6C /* srs_kernel_consts.hpp */,
+ 3C1232101AAE814D00CE8F6C /* srs_kernel_error.cpp */,
+ 3C1232111AAE814D00CE8F6C /* srs_kernel_error.hpp */,
+ 3C1232121AAE814D00CE8F6C /* srs_kernel_file.cpp */,
+ 3C1232131AAE814D00CE8F6C /* srs_kernel_file.hpp */,
+ 3C1232141AAE814D00CE8F6C /* srs_kernel_flv.cpp */,
+ 3C1232151AAE814D00CE8F6C /* srs_kernel_flv.hpp */,
+ 3C1232161AAE814D00CE8F6C /* srs_kernel_log.cpp */,
+ 3C1232171AAE814D00CE8F6C /* srs_kernel_log.hpp */,
+ 3C1232181AAE814D00CE8F6C /* srs_kernel_mp3.cpp */,
+ 3C1232191AAE814D00CE8F6C /* srs_kernel_mp3.hpp */,
+ 3C12321A1AAE814D00CE8F6C /* srs_kernel_stream.cpp */,
+ 3C12321B1AAE814D00CE8F6C /* srs_kernel_stream.hpp */,
+ 3C12321C1AAE814D00CE8F6C /* srs_kernel_ts.cpp */,
+ 3C12321D1AAE814D00CE8F6C /* srs_kernel_ts.hpp */,
+ 3C12321E1AAE814D00CE8F6C /* srs_kernel_utility.cpp */,
+ 3C12321F1AAE814D00CE8F6C /* srs_kernel_utility.hpp */,
+ );
+ name = kernel;
+ sourceTree = "";
+ };
+ 3C12322C1AAE819900CE8F6C /* protocol */ = {
+ isa = PBXGroup;
+ children = (
+ 3C12322D1AAE81A400CE8F6C /* srs_raw_avc.cpp */,
+ 3C12322E1AAE81A400CE8F6C /* srs_raw_avc.hpp */,
+ 3C12322F1AAE81A400CE8F6C /* srs_rtmp_amf0.cpp */,
+ 3C1232301AAE81A400CE8F6C /* srs_rtmp_amf0.hpp */,
+ 3C1232311AAE81A400CE8F6C /* srs_rtmp_buffer.cpp */,
+ 3C1232321AAE81A400CE8F6C /* srs_rtmp_buffer.hpp */,
+ 3C1232331AAE81A400CE8F6C /* srs_rtmp_handshake.cpp */,
+ 3C1232341AAE81A400CE8F6C /* srs_rtmp_handshake.hpp */,
+ 3C1232351AAE81A400CE8F6C /* srs_rtmp_io.cpp */,
+ 3C1232361AAE81A400CE8F6C /* srs_rtmp_io.hpp */,
+ 3C1232371AAE81A400CE8F6C /* srs_rtmp_msg_array.cpp */,
+ 3C1232381AAE81A400CE8F6C /* srs_rtmp_msg_array.hpp */,
+ 3C1232391AAE81A400CE8F6C /* srs_rtmp_sdk.cpp */,
+ 3C12323A1AAE81A400CE8F6C /* srs_rtmp_sdk.hpp */,
+ 3C12323B1AAE81A400CE8F6C /* srs_rtmp_stack.cpp */,
+ 3C12323C1AAE81A400CE8F6C /* srs_rtmp_stack.hpp */,
+ 3C12323D1AAE81A400CE8F6C /* srs_rtmp_utility.cpp */,
+ 3C12323E1AAE81A400CE8F6C /* srs_rtmp_utility.hpp */,
+ 3C12323F1AAE81A400CE8F6C /* srs_rtsp_stack.cpp */,
+ 3C1232401AAE81A400CE8F6C /* srs_rtsp_stack.hpp */,
+ );
+ name = protocol;
+ sourceTree = "";
+ };
+ 3C12324B1AAE81CE00CE8F6C /* app */ = {
+ isa = PBXGroup;
+ children = (
+ 3C12324C1AAE81D900CE8F6C /* srs_app_bandwidth.cpp */,
+ 3C12324D1AAE81D900CE8F6C /* srs_app_bandwidth.hpp */,
+ 3C12324E1AAE81D900CE8F6C /* srs_app_config.cpp */,
+ 3C12324F1AAE81D900CE8F6C /* srs_app_config.hpp */,
+ 3C1232501AAE81D900CE8F6C /* srs_app_conn.cpp */,
+ 3C1232511AAE81D900CE8F6C /* srs_app_conn.hpp */,
+ 3C1232521AAE81D900CE8F6C /* srs_app_dvr.cpp */,
+ 3C1232531AAE81D900CE8F6C /* srs_app_dvr.hpp */,
+ 3C1232541AAE81D900CE8F6C /* srs_app_edge.cpp */,
+ 3C1232551AAE81D900CE8F6C /* srs_app_edge.hpp */,
+ 3C1232561AAE81D900CE8F6C /* srs_app_empty.cpp */,
+ 3C1232571AAE81D900CE8F6C /* srs_app_empty.hpp */,
+ 3C1232581AAE81D900CE8F6C /* srs_app_encoder.cpp */,
+ 3C1232591AAE81D900CE8F6C /* srs_app_encoder.hpp */,
+ 3C12325A1AAE81D900CE8F6C /* srs_app_ffmpeg.cpp */,
+ 3C12325B1AAE81D900CE8F6C /* srs_app_ffmpeg.hpp */,
+ 3C12325C1AAE81D900CE8F6C /* srs_app_forward.cpp */,
+ 3C12325D1AAE81D900CE8F6C /* srs_app_forward.hpp */,
+ 3C12325E1AAE81D900CE8F6C /* srs_app_heartbeat.cpp */,
+ 3C12325F1AAE81D900CE8F6C /* srs_app_heartbeat.hpp */,
+ 3C1232601AAE81D900CE8F6C /* srs_app_hls.cpp */,
+ 3C1232611AAE81D900CE8F6C /* srs_app_hls.hpp */,
+ 3C1232621AAE81D900CE8F6C /* srs_app_http_api.cpp */,
+ 3C1232631AAE81D900CE8F6C /* srs_app_http_api.hpp */,
+ 3C1232641AAE81D900CE8F6C /* srs_app_http_client.cpp */,
+ 3C1232651AAE81D900CE8F6C /* srs_app_http_client.hpp */,
+ 3C1232661AAE81D900CE8F6C /* srs_app_http_conn.cpp */,
+ 3C1232671AAE81D900CE8F6C /* srs_app_http_conn.hpp */,
+ 3C1232681AAE81D900CE8F6C /* srs_app_http_hooks.cpp */,
+ 3C1232691AAE81D900CE8F6C /* srs_app_http_hooks.hpp */,
+ 3C12326A1AAE81D900CE8F6C /* srs_app_http.cpp */,
+ 3C12326B1AAE81D900CE8F6C /* srs_app_http.hpp */,
+ 3C12326C1AAE81D900CE8F6C /* srs_app_ingest.cpp */,
+ 3C12326D1AAE81D900CE8F6C /* srs_app_ingest.hpp */,
+ 3C12326E1AAE81D900CE8F6C /* srs_app_json.cpp */,
+ 3C12326F1AAE81D900CE8F6C /* srs_app_json.hpp */,
+ 3C1232701AAE81D900CE8F6C /* srs_app_kbps.cpp */,
+ 3C1232711AAE81D900CE8F6C /* srs_app_kbps.hpp */,
+ 3C1232721AAE81D900CE8F6C /* srs_app_listener.cpp */,
+ 3C1232731AAE81D900CE8F6C /* srs_app_listener.hpp */,
+ 3C1232741AAE81D900CE8F6C /* srs_app_log.cpp */,
+ 3C1232751AAE81D900CE8F6C /* srs_app_log.hpp */,
+ 3C1232761AAE81D900CE8F6C /* srs_app_mpegts_udp.cpp */,
+ 3C1232771AAE81D900CE8F6C /* srs_app_mpegts_udp.hpp */,
+ 3C1232781AAE81D900CE8F6C /* srs_app_pithy_print.cpp */,
+ 3C1232791AAE81D900CE8F6C /* srs_app_pithy_print.hpp */,
+ 3C12327A1AAE81D900CE8F6C /* srs_app_recv_thread.cpp */,
+ 3C12327B1AAE81D900CE8F6C /* srs_app_recv_thread.hpp */,
+ 3C12327C1AAE81D900CE8F6C /* srs_app_refer.cpp */,
+ 3C12327D1AAE81D900CE8F6C /* srs_app_refer.hpp */,
+ 3C12327E1AAE81D900CE8F6C /* srs_app_reload.cpp */,
+ 3C12327F1AAE81D900CE8F6C /* srs_app_reload.hpp */,
+ 3C1232801AAE81D900CE8F6C /* srs_app_rtmp_conn.cpp */,
+ 3C1232811AAE81D900CE8F6C /* srs_app_rtmp_conn.hpp */,
+ 3C1232821AAE81D900CE8F6C /* srs_app_rtsp.cpp */,
+ 3C1232831AAE81D900CE8F6C /* srs_app_rtsp.hpp */,
+ 3C1232841AAE81D900CE8F6C /* srs_app_security.cpp */,
+ 3C1232851AAE81D900CE8F6C /* srs_app_security.hpp */,
+ 3C1232861AAE81D900CE8F6C /* srs_app_server.cpp */,
+ 3C1232871AAE81D900CE8F6C /* srs_app_server.hpp */,
+ 3C1232881AAE81D900CE8F6C /* srs_app_source.cpp */,
+ 3C1232891AAE81D900CE8F6C /* srs_app_source.hpp */,
+ 3C12328A1AAE81D900CE8F6C /* srs_app_st_socket.cpp */,
+ 3C12328B1AAE81D900CE8F6C /* srs_app_st_socket.hpp */,
+ 3C12328C1AAE81D900CE8F6C /* srs_app_st.cpp */,
+ 3C12328D1AAE81D900CE8F6C /* srs_app_st.hpp */,
+ 3C12328E1AAE81D900CE8F6C /* srs_app_statistic.cpp */,
+ 3C12328F1AAE81D900CE8F6C /* srs_app_statistic.hpp */,
+ 3C1232901AAE81D900CE8F6C /* srs_app_thread.cpp */,
+ 3C1232911AAE81D900CE8F6C /* srs_app_thread.hpp */,
+ 3C1232921AAE81D900CE8F6C /* srs_app_utility.cpp */,
+ 3C1232931AAE81D900CE8F6C /* srs_app_utility.hpp */,
+ );
+ name = app;
+ sourceTree = "";
+ };
+ 3C1232B91AAE825100CE8F6C /* scripts */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1232C81AAE833300CE8F6C /* _log.sh */,
+ 3C1232C91AAE833300CE8F6C /* build.sh */,
+ 3C1232CA1AAE833300CE8F6C /* git.commit.sh */,
+ 3C1232CB1AAE833300CE8F6C /* git2unix.sh */,
+ 3C1232CC1AAE833300CE8F6C /* install.sh */,
+ 3C1232CD1AAE833300CE8F6C /* package.sh */,
+ 3C1232CE1AAE833300CE8F6C /* run.sh */,
+ 3C1232CF1AAE833300CE8F6C /* srs.test */,
+ 3C1232D01AAE833300CE8F6C /* stop.sh */,
+ 3C1232D11AAE833300CE8F6C /* test_configure.sh */,
+ );
+ name = scripts;
+ sourceTree = "";
+ };
+ 3C1232BA1AAE826F00CE8F6C /* auto */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1232BB1AAE827E00CE8F6C /* apps.sh */,
+ 3C1232BC1AAE827E00CE8F6C /* auto_headers.sh */,
+ 3C1232BD1AAE827E00CE8F6C /* build_ffmpeg.sh */,
+ 3C1232BE1AAE827E00CE8F6C /* depends.sh */,
+ 3C1232BF1AAE827E00CE8F6C /* generate_header.sh */,
+ 3C1232C01AAE827E00CE8F6C /* generate-srs-librtmp-project.sh */,
+ 3C1232C11AAE827E00CE8F6C /* generate-srs-librtmp-single.sh */,
+ 3C1232C21AAE827E00CE8F6C /* libs.sh */,
+ 3C1232C31AAE827E00CE8F6C /* local_ip.sh */,
+ 3C1232C41AAE827E00CE8F6C /* modules.sh */,
+ 3C1232C51AAE827E00CE8F6C /* options.sh */,
+ 3C1232C61AAE827E00CE8F6C /* summary.sh */,
+ 3C1232C71AAE827E00CE8F6C /* utest.sh */,
+ );
+ name = auto;
+ sourceTree = "";
+ };
+ 3C1232EE1AAEA71C00CE8F6C /* links */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1232EC1AAEA70F00CE8F6C /* libhttp_parser.a */,
+ 3C1232D21AAEA56B00CE8F6C /* libst.a */,
+ 3C1232E81AAEA5D000CE8F6C /* libssl.a */,
+ 3C1232E71AAEA5D000CE8F6C /* libcrypto.a */,
+ );
+ name = links;
+ sourceTree = "";
+ };
+ 3C1232EF1AAEAC5800CE8F6C /* etc */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1232F01AAEAC5D00CE8F6C /* init.d */,
+ );
+ name = etc;
+ sourceTree = "";
+ };
+ 3C1232F01AAEAC5D00CE8F6C /* init.d */ = {
+ isa = PBXGroup;
+ children = (
+ 3C1232F11AAEAC7000CE8F6C /* srs */,
+ 3C1232F21AAEAC7000CE8F6C /* srs-api */,
+ 3C1232F31AAEAC7000CE8F6C /* srs-demo */,
+ 3C1232F41AAEAC7000CE8F6C /* srs-demo-19350 */,
+ );
+ name = init.d;
+ sourceTree = "";
+ };
+ 3C663F001AB014B500286D8B /* research */ = {
+ isa = PBXGroup;
+ children = (
+ 3C663F011AB0155100286D8B /* Makefile */,
+ 3C663F021AB0155100286D8B /* srs_aac_raw_publish.c */,
+ 3C663F031AB0155100286D8B /* srs_audio_raw_publish.c */,
+ 3C663F041AB0155100286D8B /* srs_bandwidth_check.c */,
+ 3C663F051AB0155100286D8B /* srs_detect_rtmp.c */,
+ 3C663F061AB0155100286D8B /* srs_flv_injecter.c */,
+ 3C663F071AB0155100286D8B /* srs_flv_parser.c */,
+ 3C663F081AB0155100286D8B /* srs_h264_raw_publish.c */,
+ 3C663F091AB0155100286D8B /* srs_ingest_flv.c */,
+ 3C663F0A1AB0155100286D8B /* srs_ingest_rtmp.c */,
+ 3C663F0B1AB0155100286D8B /* srs_play.c */,
+ 3C663F0C1AB0155100286D8B /* srs_publish.c */,
+ 3C663F0D1AB0155100286D8B /* srs_rtmp_dump.c */,
+ );
+ name = research;
+ path = srs_xcode;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 3C1231E41AAE64A400CE8F6C /* srs_xcode */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 3C1231EC1AAE64A400CE8F6C /* Build configuration list for PBXNativeTarget "srs_xcode" */;
+ buildPhases = (
+ 3C1231E11AAE64A400CE8F6C /* Sources */,
+ 3C1231E21AAE64A400CE8F6C /* Frameworks */,
+ 3C1231E31AAE64A400CE8F6C /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = srs_xcode;
+ productName = srs_xcode;
+ productReference = 3C1231E51AAE64A400CE8F6C /* srs_xcode */;
+ productType = "com.apple.product-type.tool";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 3C1231DD1AAE64A400CE8F6C /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0610;
+ ORGANIZATIONNAME = winlin;
+ TargetAttributes = {
+ 3C1231E41AAE64A400CE8F6C = {
+ CreatedOnToolsVersion = 6.1.1;
+ };
+ };
+ };
+ buildConfigurationList = 3C1231E01AAE64A400CE8F6C /* Build configuration list for PBXProject "srs_xcode" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 3C1231DC1AAE64A400CE8F6C;
+ productRefGroup = 3C1231E61AAE64A400CE8F6C /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 3C1231E41AAE64A400CE8F6C /* srs_xcode */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 3C1231E11AAE64A400CE8F6C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3C1232951AAE81D900CE8F6C /* srs_app_config.cpp in Sources */,
+ 3C663F0F1AB0155100286D8B /* srs_aac_raw_publish.c in Sources */,
+ 3C1232961AAE81D900CE8F6C /* srs_app_conn.cpp in Sources */,
+ 3C12322A1AAE814D00CE8F6C /* srs_kernel_ts.cpp in Sources */,
+ 3C12329E1AAE81D900CE8F6C /* srs_app_hls.cpp in Sources */,
+ 3C663F171AB0155100286D8B /* srs_ingest_rtmp.c in Sources */,
+ 3C663F131AB0155100286D8B /* srs_flv_injecter.c in Sources */,
+ 3C1232971AAE81D900CE8F6C /* srs_app_dvr.cpp in Sources */,
+ 3C1232271AAE814D00CE8F6C /* srs_kernel_log.cpp in Sources */,
+ 3C1232A81AAE81D900CE8F6C /* srs_app_log.cpp in Sources */,
+ 3C1232A41AAE81D900CE8F6C /* srs_app_ingest.cpp in Sources */,
+ 3C1232B41AAE81D900CE8F6C /* srs_app_st.cpp in Sources */,
+ 3C1232481AAE81A400CE8F6C /* srs_rtmp_stack.cpp in Sources */,
+ 3C1232B01AAE81D900CE8F6C /* srs_app_security.cpp in Sources */,
+ 3C12322B1AAE814D00CE8F6C /* srs_kernel_utility.cpp in Sources */,
+ 3C12324A1AAE81A400CE8F6C /* srs_rtsp_stack.cpp in Sources */,
+ 3C1232A51AAE81D900CE8F6C /* srs_app_json.cpp in Sources */,
+ 3C12329F1AAE81D900CE8F6C /* srs_app_http_api.cpp in Sources */,
+ 3C663F101AB0155100286D8B /* srs_audio_raw_publish.c in Sources */,
+ 3C663F111AB0155100286D8B /* srs_bandwidth_check.c in Sources */,
+ 3C1232A11AAE81D900CE8F6C /* srs_app_http_conn.cpp in Sources */,
+ 3C1232AC1AAE81D900CE8F6C /* srs_app_refer.cpp in Sources */,
+ 3C1232991AAE81D900CE8F6C /* srs_app_empty.cpp in Sources */,
+ 3C1232201AAE814D00CE8F6C /* srs_kernel_aac.cpp in Sources */,
+ 3C1232941AAE81D900CE8F6C /* srs_app_bandwidth.cpp in Sources */,
+ 3C1232221AAE814D00CE8F6C /* srs_kernel_codec.cpp in Sources */,
+ 3C1232B71AAE81D900CE8F6C /* srs_app_utility.cpp in Sources */,
+ 3C1232AB1AAE81D900CE8F6C /* srs_app_recv_thread.cpp in Sources */,
+ 3C663F151AB0155100286D8B /* srs_h264_raw_publish.c in Sources */,
+ 3C1231F61AAE652D00CE8F6C /* srs_core_autofree.cpp in Sources */,
+ 3C1232411AAE81A400CE8F6C /* srs_raw_avc.cpp in Sources */,
+ 3C1232491AAE81A400CE8F6C /* srs_rtmp_utility.cpp in Sources */,
+ 3C663F191AB0155100286D8B /* srs_publish.c in Sources */,
+ 3C1232A01AAE81D900CE8F6C /* srs_app_http_client.cpp in Sources */,
+ 3C12329B1AAE81D900CE8F6C /* srs_app_ffmpeg.cpp in Sources */,
+ 3C1232421AAE81A400CE8F6C /* srs_rtmp_amf0.cpp in Sources */,
+ 3C1232AA1AAE81D900CE8F6C /* srs_app_pithy_print.cpp in Sources */,
+ 3C12329C1AAE81D900CE8F6C /* srs_app_forward.cpp in Sources */,
+ 3C1232251AAE814D00CE8F6C /* srs_kernel_file.cpp in Sources */,
+ 3C1232AD1AAE81D900CE8F6C /* srs_app_reload.cpp in Sources */,
+ 3C1231F81AAE652D00CE8F6C /* srs_core.cpp in Sources */,
+ 3C1232A21AAE81D900CE8F6C /* srs_app_http_hooks.cpp in Sources */,
+ 3C663F121AB0155100286D8B /* srs_detect_rtmp.c in Sources */,
+ 3C1232B11AAE81D900CE8F6C /* srs_app_server.cpp in Sources */,
+ 3C1232B31AAE81D900CE8F6C /* srs_app_st_socket.cpp in Sources */,
+ 3C1232061AAE812C00CE8F6C /* srs_main_server.cpp in Sources */,
+ 3C1232281AAE814D00CE8F6C /* srs_kernel_mp3.cpp in Sources */,
+ 3C1232B21AAE81D900CE8F6C /* srs_app_source.cpp in Sources */,
+ 3C1231F71AAE652D00CE8F6C /* srs_core_performance.cpp in Sources */,
+ 3C1232981AAE81D900CE8F6C /* srs_app_edge.cpp in Sources */,
+ 3C1232461AAE81A400CE8F6C /* srs_rtmp_msg_array.cpp in Sources */,
+ 3C1232A71AAE81D900CE8F6C /* srs_app_listener.cpp in Sources */,
+ 3C1232261AAE814D00CE8F6C /* srs_kernel_flv.cpp in Sources */,
+ 3C663F1A1AB0155100286D8B /* srs_rtmp_dump.c in Sources */,
+ 3C1232241AAE814D00CE8F6C /* srs_kernel_error.cpp in Sources */,
+ 3C1232441AAE81A400CE8F6C /* srs_rtmp_handshake.cpp in Sources */,
+ 3C1232291AAE814D00CE8F6C /* srs_kernel_stream.cpp in Sources */,
+ 3C663F181AB0155100286D8B /* srs_play.c in Sources */,
+ 3C1232B61AAE81D900CE8F6C /* srs_app_thread.cpp in Sources */,
+ 3C1232A91AAE81D900CE8F6C /* srs_app_mpegts_udp.cpp in Sources */,
+ 3C1232AE1AAE81D900CE8F6C /* srs_app_rtmp_conn.cpp in Sources */,
+ 3C1232B51AAE81D900CE8F6C /* srs_app_statistic.cpp in Sources */,
+ 3C663F161AB0155100286D8B /* srs_ingest_flv.c in Sources */,
+ 3C663F141AB0155100286D8B /* srs_flv_parser.c in Sources */,
+ 3C1232451AAE81A400CE8F6C /* srs_rtmp_io.cpp in Sources */,
+ 3C1232431AAE81A400CE8F6C /* srs_rtmp_buffer.cpp in Sources */,
+ 3C663F0E1AB0155100286D8B /* Makefile in Sources */,
+ 3C1232211AAE814D00CE8F6C /* srs_kernel_buffer.cpp in Sources */,
+ 3C1232471AAE81A400CE8F6C /* srs_rtmp_sdk.cpp in Sources */,
+ 3C1232A61AAE81D900CE8F6C /* srs_app_kbps.cpp in Sources */,
+ 3C12329D1AAE81D900CE8F6C /* srs_app_heartbeat.cpp in Sources */,
+ 3C1232231AAE814D00CE8F6C /* srs_kernel_consts.cpp in Sources */,
+ 3C1232AF1AAE81D900CE8F6C /* srs_app_rtsp.cpp in Sources */,
+ 3C1232A31AAE81D900CE8F6C /* srs_app_http.cpp in Sources */,
+ 3C12329A1AAE81D900CE8F6C /* srs_app_encoder.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 3C1231EA1AAE64A400CE8F6C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.10;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 3C1231EB1AAE64A400CE8F6C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.10;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ 3C1231ED1AAE64A400CE8F6C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++98";
+ CLANG_CXX_LIBRARY = "libstdc++";
+ LIBRARY_SEARCH_PATHS = (
+ "../../objs/**",
+ "/Users/winlin/Desktop/git/simple-rtmp-server/trunk/objs/http-parser-2.1",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ "USER_HEADER_SEARCH_PATHS[arch=*]" = "../../src/** ../../objs ../../objs/st ../../objs/hp ../../objs/openssl";
+ };
+ name = Debug;
+ };
+ 3C1231EE1AAE64A400CE8F6C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++98";
+ CLANG_CXX_LIBRARY = "libstdc++";
+ LIBRARY_SEARCH_PATHS = (
+ "../../objs/**",
+ "/Users/winlin/Desktop/git/simple-rtmp-server/trunk/objs/http-parser-2.1",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 3C1231E01AAE64A400CE8F6C /* Build configuration list for PBXProject "srs_xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3C1231EA1AAE64A400CE8F6C /* Debug */,
+ 3C1231EB1AAE64A400CE8F6C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 3C1231EC1AAE64A400CE8F6C /* Build configuration list for PBXNativeTarget "srs_xcode" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3C1231ED1AAE64A400CE8F6C /* Debug */,
+ 3C1231EE1AAE64A400CE8F6C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 3C1231DD1AAE64A400CE8F6C /* Project object */;
+}
diff --git a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..60847b6bd
--- /dev/null
+++ b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/trunk/ide/srs_xcode/srs_xcode/readme.txt b/trunk/ide/srs_xcode/srs_xcode/readme.txt
new file mode 100644
index 000000000..94cb20b46
--- /dev/null
+++ b/trunk/ide/srs_xcode/srs_xcode/readme.txt
@@ -0,0 +1 @@
+the xcode project for osx.
diff --git a/trunk/modules/readme.txt b/trunk/modules/readme.txt
new file mode 100644
index 000000000..18be774ed
--- /dev/null
+++ b/trunk/modules/readme.txt
@@ -0,0 +1,11 @@
+SRS模块规则:
+1. 一个模块一个目录
+2. 目录下放一个config文件
+3. 所有的configure中的变量模块中可以使用
+
+模块中需要定义变量,例如:
+1. SRS_MODULE_NAME:模块名称,用来做Makefile的phony以及执行binary文件名。
+2. SRS_MODULE_MAIN:模块的main函数所在的cpp文件,在src/main目录。
+3. SRS_MODULE_APP:模块在src/app目录的源文件列表。
+
+winlin, 2015.3
diff --git a/trunk/research/librtmp/srs_ingest_flv.c b/trunk/research/librtmp/srs_ingest_flv.c
index 04de28629..7d8ce132c 100644
--- a/trunk/research/librtmp/srs_ingest_flv.c
+++ b/trunk/research/librtmp/srs_ingest_flv.c
@@ -53,7 +53,8 @@ int main(int argc, char** argv)
// user option parse index.
int opt = 0;
// user options.
- char* in_flv_file; char* out_rtmp_url;
+ char* in_flv_file = NULL;
+ char* out_rtmp_url = NULL;
// rtmp handler
srs_rtmp_t ortmp;
// flv handler
@@ -75,18 +76,35 @@ int main(int argc, char** argv)
exit(-1);
}
- // parse options in FFMPEG format.
- while ((opt = getopt(argc, argv, "i:y:")) != -1) {
- switch (opt) {
- case 'i':
- in_flv_file = optarg;
- break;
- case 'y':
- out_rtmp_url = optarg;
- break;
- default:
- break;
+ for (opt = 0; opt < argc; opt++) {
+ srs_human_trace("argv[%d]=%s", opt, argv[opt]);
+ }
+
+ // fill the options for mac
+ for (opt = 0; opt < argc - 1; opt++) {
+ // ignore all options except -i and -y.
+ char* p = argv[opt];
+
+ // only accept -x
+ if (p[0] != '-' || p[1] == 0 || p[2] != 0) {
+ continue;
}
+
+ // parse according the option name.
+ switch (p[1]) {
+ case 'i': in_flv_file = argv[opt + 1]; break;
+ case 'y': out_rtmp_url = argv[opt + 1]; break;
+ default: break;
+ }
+ }
+
+ if (!in_flv_file) {
+ srs_human_trace("input invalid, use -i ");
+ return -1;
+ }
+ if (!out_rtmp_url) {
+ srs_human_trace("output invalid, use -y