winlin

merge from 2.0

@@ -116,6 +116,7 @@ cd simple-rtmp-server/trunk @@ -116,6 +116,7 @@ cd simple-rtmp-server/trunk
116 116
117 <strong>See also:</strong> 117 <strong>See also:</strong>
118 * Usage: How to delivery RTMP?([CN][v1_CN_SampleRTMP], [EN][v1_EN_SampleRTMP]) 118 * Usage: How to delivery RTMP?([CN][v1_CN_SampleRTMP], [EN][v1_EN_SampleRTMP])
  119 +* Usage: How to delivery RTMP Cluster?([CN][v1_CN_SampleRTMPCluster], [EN][v1_EN_SampleRTMPCluster])
119 * Usage: How to delivery HTTP FLV Live Streaming?([CN][v2_CN_SampleHttpFlv], [EN][v2_EN_SampleHttpFlv]) 120 * Usage: How to delivery HTTP FLV Live Streaming?([CN][v2_CN_SampleHttpFlv], [EN][v2_EN_SampleHttpFlv])
120 * Usage: How to delivery HTTP FLV Live Streaming Cluster?([CN][v2_CN_SampleHttpFlvCluster], [EN][v2_EN_SampleHttpFlvCluster]) 121 * Usage: How to delivery HTTP FLV Live Streaming Cluster?([CN][v2_CN_SampleHttpFlvCluster], [EN][v2_EN_SampleHttpFlvCluster])
121 * Usage: How to delivery HLS?([CN][v1_CN_SampleHLS], [EN][v1_EN_SampleHLS]) 122 * Usage: How to delivery HLS?([CN][v1_CN_SampleHLS], [EN][v1_EN_SampleHLS])
@@ -343,6 +344,7 @@ Remark: @@ -343,6 +344,7 @@ Remark:
343 344
344 ### SRS 2.0 history 345 ### SRS 2.0 history
345 346
  347 +* v2.0, 2015-05-24, fix [#404](https://github.com/simple-rtmp-server/srs/issues/404) register handler then start http thread. 2.0.167.
346 * v2.0, 2015-05-23, refine the thread, protocol, kbps code. 2.0.166 348 * v2.0, 2015-05-23, refine the thread, protocol, kbps code. 2.0.166
347 * v2.0, 2015-05-23, fix [#391](https://github.com/simple-rtmp-server/srs/issues/391) copy request for async call. 349 * v2.0, 2015-05-23, fix [#391](https://github.com/simple-rtmp-server/srs/issues/391) copy request for async call.
348 * v2.0, 2015-05-22, fix [#397](https://github.com/simple-rtmp-server/srs/issues/397) the USER_HZ maybe not 100. 2.0.165 350 * v2.0, 2015-05-22, fix [#397](https://github.com/simple-rtmp-server/srs/issues/397) the USER_HZ maybe not 100. 2.0.165
@@ -843,6 +845,8 @@ Winlin @@ -843,6 +845,8 @@ Winlin
843 [v1_EN_Git]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_Git 845 [v1_EN_Git]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_Git
844 [v1_CN_SampleRTMP]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleRTMP 846 [v1_CN_SampleRTMP]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleRTMP
845 [v1_EN_SampleRTMP]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleRTMP 847 [v1_EN_SampleRTMP]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleRTMP
  848 +[v1_CN_SampleRTMPCluster]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleRTMPCluster
  849 +[v1_EN_SampleRTMPCluster]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleRTMPCluster
846 [v1_CN_SampleHLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleHLS 850 [v1_CN_SampleHLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleHLS
847 [v1_EN_SampleHLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleHLS 851 [v1_EN_SampleHLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_EN_SampleHLS
848 [v1_CN_SampleTranscode2HLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleTranscode2HLS 852 [v1_CN_SampleTranscode2HLS]: https://github.com/simple-rtmp-server/srs/wiki/v1_CN_SampleTranscode2HLS
@@ -504,11 +504,7 @@ if [ $__SRS_BUILD_NGINX = YES ]; then @@ -504,11 +504,7 @@ if [ $__SRS_BUILD_NGINX = YES ]; then
504 # srs will write ts/m3u8 file use current user, 504 # srs will write ts/m3u8 file use current user,
505 # nginx default use nobody, so cannot read the ts/m3u8 created by srs. 505 # nginx default use nobody, so cannot read the ts/m3u8 created by srs.
506 cp ${SRS_OBJS}/nginx/conf/nginx.conf ${SRS_OBJS}/nginx/conf/nginx.conf.bk 506 cp ${SRS_OBJS}/nginx/conf/nginx.conf ${SRS_OBJS}/nginx/conf/nginx.conf.bk
507 - if [ $OS_IS_OSX = YES ]; then  
508 - sed -i '' "s/^.user nobody;/user `whoami`;/g" ${SRS_OBJS}/nginx/conf/nginx.conf  
509 - else  
510 - sed -i "s/^.user nobody;/user `whoami`;/g" ${SRS_OBJS}/nginx/conf/nginx.conf  
511 - fi 507 + $SED '' "s/^.user nobody;/user `whoami`;/g" ${SRS_OBJS}/nginx/conf/nginx.conf
512 fi 508 fi
513 509
514 # the demo dir. 510 # the demo dir.
1 #!/bin/bash 1 #!/bin/bash
2 2
  3 +OS_IS_OSX=NO
  4 +uname -s|grep Darwin >/dev/null 2>&1
  5 +ret=$?; if [[ 0 -eq $ret ]]; then
  6 + OS_IS_OSX=YES
  7 +fi
  8 +echo "Is OSX: ${OS_IS_OSX}"
  9 +
  10 +# the sed command
  11 +SED="sed -i"
  12 +if [ $OS_IS_OSX = YES ]; then SED="sed -i ''"; fi
  13 +
3 # when export srs-librtmp single files 14 # when export srs-librtmp single files
4 # package the whole project to srs_librtmp.h and srs_librtmp.cpp 15 # package the whole project to srs_librtmp.h and srs_librtmp.cpp
5 # 16 #
@@ -59,7 +70,7 @@ function build_module_hpp() @@ -59,7 +70,7 @@ function build_module_hpp()
59 for item in ${SRS_LIBRTMP_OBJS[*]}; do 70 for item in ${SRS_LIBRTMP_OBJS[*]}; do
60 FILE_NAME="${item%.*}" 71 FILE_NAME="${item%.*}"
61 echo "// following is generated by ${FILE_NAME}.hpp" >> $FILE && 72 echo "// following is generated by ${FILE_NAME}.hpp" >> $FILE &&
62 - sed -i "s|#include <srs_|//#include <srs_|g" $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.hpp && 73 + $SED "s|#include <srs_|//#include <srs_|g" $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.hpp &&
63 cat $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.hpp >>$FILE 74 cat $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.hpp >>$FILE
64 ret=$?; if [[ $ret -ne 0 ]]; then 75 ret=$?; if [[ $ret -ne 0 ]]; then
65 echo -e "${RED}failed to generate the srs_librtmp.cpp by ${FILE_NAME}.hpp. {${BLACK}" 76 echo -e "${RED}failed to generate the srs_librtmp.cpp by ${FILE_NAME}.hpp. {${BLACK}"
@@ -78,7 +89,7 @@ function build_module_cpp() @@ -78,7 +89,7 @@ function build_module_cpp()
78 for item in ${SRS_LIBRTMP_OBJS[*]}; do 89 for item in ${SRS_LIBRTMP_OBJS[*]}; do
79 FILE_NAME="${item%.*}" 90 FILE_NAME="${item%.*}"
80 echo "// following is generated by ${FILE_NAME}.cpp" >> $FILE && 91 echo "// following is generated by ${FILE_NAME}.cpp" >> $FILE &&
81 - sed -i "s|#include <srs_|//#include <srs_|g" $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.cpp && 92 + $SED "s|#include <srs_|//#include <srs_|g" $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.cpp &&
82 cat $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.cpp >>$FILE 93 cat $SRS_EXPORT_LIBRTMP_SINGLE/${FILE_NAME}.cpp >>$FILE
83 ret=$?; if [[ $ret -ne 0 ]]; then 94 ret=$?; if [[ $ret -ne 0 ]]; then
84 echo -e "${RED}failed to generate the srs_librtmp.cpp by ${FILE_NAME}.cpp. {${BLACK}" 95 echo -e "${RED}failed to generate the srs_librtmp.cpp by ${FILE_NAME}.cpp. {${BLACK}"
@@ -1854,17 +1854,20 @@ int SrsHttpServer::http_mount(SrsSource* s, SrsRequest* r) @@ -1854,17 +1854,20 @@ int SrsHttpServer::http_mount(SrsSource* s, SrsRequest* r)
1854 1854
1855 sflvs[sid] = entry; 1855 sflvs[sid] = entry;
1856 1856
1857 - // start http stream cache thread  
1858 - if ((ret = entry->cache->start()) != ERROR_SUCCESS) {  
1859 - srs_error("http: start stream cache failed. ret=%d", ret);  
1860 - return ret;  
1861 - }  
1862 -  
1863 // mount the http flv stream. 1857 // mount the http flv stream.
  1858 + // we must register the handler, then start the thread,
  1859 + // for the thread will cause thread switch context.
  1860 + // @see https://github.com/simple-rtmp-server/srs/issues/404
1864 if ((ret = mux.handle(mount, entry->stream)) != ERROR_SUCCESS) { 1861 if ((ret = mux.handle(mount, entry->stream)) != ERROR_SUCCESS) {
1865 srs_error("http: mount flv stream for vhost=%s failed. ret=%d", sid.c_str(), ret); 1862 srs_error("http: mount flv stream for vhost=%s failed. ret=%d", sid.c_str(), ret);
1866 return ret; 1863 return ret;
1867 } 1864 }
  1865 +
  1866 + // start http stream cache thread
  1867 + if ((ret = entry->cache->start()) != ERROR_SUCCESS) {
  1868 + srs_error("http: start stream cache failed. ret=%d", ret);
  1869 + return ret;
  1870 + }
1868 srs_trace("http: mount flv stream for vhost=%s, mount=%s", sid.c_str(), mount.c_str()); 1871 srs_trace("http: mount flv stream for vhost=%s, mount=%s", sid.c_str(), mount.c_str());
1869 } else { 1872 } else {
1870 entry = sflvs[sid]; 1873 entry = sflvs[sid];
@@ -786,6 +786,13 @@ int SrsServer::http_handle() @@ -786,6 +786,13 @@ int SrsServer::http_handle()
786 return ret; 786 return ret;
787 } 787 }
788 #endif 788 #endif
  789 +
  790 +#ifdef SRS_AUTO_HTTP_SERVER
  791 + // for SRS go-sharp to detect the status of HTTP server of SRS HTTP FLV Cluster.
  792 + if ((ret = http_stream_mux->mux.handle("/api/v1/versions", new SrsGoApiVersion())) != ERROR_SUCCESS) {
  793 + return ret;
  794 + }
  795 +#endif
789 796
790 return ret; 797 return ret;
791 } 798 }
@@ -134,7 +134,9 @@ int SrsFlvEncoder::write_metadata(char type, char* data, int size) @@ -134,7 +134,9 @@ int SrsFlvEncoder::write_metadata(char type, char* data, int size)
134 tag_stream->write_3bytes(size); 134 tag_stream->write_3bytes(size);
135 135
136 if ((ret = write_tag(tag_header, sizeof(tag_header), data, size)) != ERROR_SUCCESS) { 136 if ((ret = write_tag(tag_header, sizeof(tag_header), data, size)) != ERROR_SUCCESS) {
137 - srs_error("write flv data tag failed. ret=%d", ret); 137 + if (!srs_is_client_gracefully_close(ret)) {
  138 + srs_error("write flv data tag failed. ret=%d", ret);
  139 + }
138 return ret; 140 return ret;
139 } 141 }
140 142
@@ -168,7 +170,9 @@ int SrsFlvEncoder::write_audio(int64_t timestamp, char* data, int size) @@ -168,7 +170,9 @@ int SrsFlvEncoder::write_audio(int64_t timestamp, char* data, int size)
168 tag_stream->write_1bytes((timestamp >> 24) & 0xFF); 170 tag_stream->write_1bytes((timestamp >> 24) & 0xFF);
169 171
170 if ((ret = write_tag(tag_header, sizeof(tag_header), data, size)) != ERROR_SUCCESS) { 172 if ((ret = write_tag(tag_header, sizeof(tag_header), data, size)) != ERROR_SUCCESS) {
171 - srs_error("write flv audio tag failed. ret=%d", ret); 173 + if (!srs_is_client_gracefully_close(ret)) {
  174 + srs_error("write flv audio tag failed. ret=%d", ret);
  175 + }
172 return ret; 176 return ret;
173 } 177 }
174 178
@@ -221,13 +225,17 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s @@ -221,13 +225,17 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s
221 225
222 // write tag header. 226 // write tag header.
223 if ((ret = _fs->write(header, header_size, NULL)) != ERROR_SUCCESS) { 227 if ((ret = _fs->write(header, header_size, NULL)) != ERROR_SUCCESS) {
224 - srs_error("write flv tag header failed. ret=%d", ret); 228 + if (!srs_is_client_gracefully_close(ret)) {
  229 + srs_error("write flv tag header failed. ret=%d", ret);
  230 + }
225 return ret; 231 return ret;
226 } 232 }
227 233
228 // write tag data. 234 // write tag data.
229 if ((ret = _fs->write(tag, tag_size, NULL)) != ERROR_SUCCESS) { 235 if ((ret = _fs->write(tag, tag_size, NULL)) != ERROR_SUCCESS) {
230 - srs_error("write flv tag failed. ret=%d", ret); 236 + if (!srs_is_client_gracefully_close(ret)) {
  237 + srs_error("write flv tag failed. ret=%d", ret);
  238 + }
231 return ret; 239 return ret;
232 } 240 }
233 241
@@ -238,7 +246,9 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s @@ -238,7 +246,9 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s
238 } 246 }
239 tag_stream->write_4bytes(tag_size + header_size); 247 tag_stream->write_4bytes(tag_size + header_size);
240 if ((ret = _fs->write(pre_size, sizeof(pre_size), NULL)) != ERROR_SUCCESS) { 248 if ((ret = _fs->write(pre_size, sizeof(pre_size), NULL)) != ERROR_SUCCESS) {
241 - srs_error("write flv previous tag size failed. ret=%d", ret); 249 + if (!srs_is_client_gracefully_close(ret)) {
  250 + srs_error("write flv previous tag size failed. ret=%d", ret);
  251 + }
242 return ret; 252 return ret;
243 } 253 }
244 254