diff --git a/README.md b/README.md index 212fb2b6e..67e7b3c9b 100755 --- a/README.md +++ b/README.md @@ -212,6 +212,7 @@ usr sys idl wai hiq siq| read writ| recv send| in out | int csw * nginx v1.5.0: 139524 lines
### History +* v0.9, 2013-12-15, fix the forwarder reconnect bug, feed it the sequence header. * v0.9, 2013-12-15, support reload the hls/forwarder/transcoder. * v0.9, 2013-12-14, refine the thread model for the retry threads. * v0.9, 2013-12-10, auto install depends tools/libs on centos/ubuntu. diff --git a/trunk/auto/build_ffmpeg.sh b/trunk/auto/build_ffmpeg.sh old mode 100644 new mode 100755 index 5d841c8df..2e177e160 --- a/trunk/auto/build_ffmpeg.sh +++ b/trunk/auto/build_ffmpeg.sh @@ -59,7 +59,9 @@ else echo "build x264" cd $ff_current_dir && rm -rf x264-snapshot-20131129-2245-stable && unzip -q ${ff_src_dir}/x264-snapshot-20131129-2245-stable.zip && - cd x264-snapshot-20131129-2245-stable && ./configure --prefix=${ff_release_dir} --disable-opencl --bit-depth=8 --enable-static && make && make install + cd x264-snapshot-20131129-2245-stable && + ./configure --prefix=${ff_release_dir} --disable-opencl --bit-depth=8 --enable-static && + make && make install ret=$?; if [[ 0 -ne ${ret} ]]; then echo "build x264 failed"; exit 1; fi fi diff --git a/trunk/conf/srs.conf b/trunk/conf/srs.conf index a9a1368ec..dc94b75ef 100755 --- a/trunk/conf/srs.conf +++ b/trunk/conf/srs.conf @@ -92,7 +92,7 @@ vhost __defaultVhost__ { vhost dev { enabled on; gop_cache on; - #forward 127.0.0.1:19350; + forward 127.0.0.1:19350; hls { enabled off; hls_path ./objs/nginx/html; diff --git a/trunk/src/core/srs_core_forward.cpp b/trunk/src/core/srs_core_forward.cpp index 39059121b..c6bca4fbb 100644 --- a/trunk/src/core/srs_core_forward.cpp +++ b/trunk/src/core/srs_core_forward.cpp @@ -35,14 +35,17 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include #define SRS_PULSE_TIMEOUT_MS 100 #define SRS_FORWARDER_SLEEP_MS 2000 #define SRS_SEND_TIMEOUT_US 3000000L #define SRS_RECV_TIMEOUT_US SRS_SEND_TIMEOUT_US -SrsForwarder::SrsForwarder() +SrsForwarder::SrsForwarder(SrsSource* _source) { + source = _source; + client = NULL; stfd = NULL; stream_id = 0; @@ -182,14 +185,17 @@ int SrsForwarder::cycle() return ret; } - // TODO: FIXME: need to cache the metadata and sequence header when reconnect. - if ((ret = client->publish(stream_name, stream_id)) != ERROR_SUCCESS) { srs_error("connect with server failed, stream_name=%s, stream_id=%d. ret=%d", stream_name.c_str(), stream_id, ret); return ret; } + if ((ret = source->on_forwarder_start(this)) != ERROR_SUCCESS) { + srs_error("callback the source to feed the sequence header failed. ret=%d", ret); + return ret; + } + if ((ret = forward()) != ERROR_SUCCESS) { return ret; } diff --git a/trunk/src/core/srs_core_forward.hpp b/trunk/src/core/srs_core_forward.hpp index 01bb7251b..d2d38242e 100644 --- a/trunk/src/core/srs_core_forward.hpp +++ b/trunk/src/core/srs_core_forward.hpp @@ -38,6 +38,7 @@ class SrsSharedPtrMessage; class SrsOnMetaDataPacket; class SrsRtmpClient; class SrsRequest; +class SrsSource; /** * forward the stream to other servers. @@ -55,10 +56,11 @@ private: st_netfd_t stfd; SrsThread* pthread; private: + SrsSource* source; SrsRtmpClient* client; std::vector msgs; public: - SrsForwarder(); + SrsForwarder(SrsSource* _source); virtual ~SrsForwarder(); public: virtual int on_publish(SrsRequest* req, std::string forward_server); diff --git a/trunk/src/core/srs_core_source.cpp b/trunk/src/core/srs_core_source.cpp index 94556df84..fab9361bc 100644 --- a/trunk/src/core/srs_core_source.cpp +++ b/trunk/src/core/srs_core_source.cpp @@ -450,7 +450,7 @@ int SrsSource::on_reload_forward(string vhost) srs_error("create forwarders failed. ret=%d", ret); return ret; } - // TODO: FIXME: must feed it the sequence header. + srs_trace("vhost %s forwarders reload success", vhost.c_str()); return ret; @@ -498,6 +498,28 @@ int SrsSource::on_reload_transcode(string vhost) return ret; } +int SrsSource::on_forwarder_start(SrsForwarder* forwarder) +{ + int ret = ERROR_SUCCESS; + + // feed the forwarder the metadata/sequence header, + // when reload to enable the forwarder. + if (cache_metadata && (ret = forwarder->on_meta_data(cache_metadata->copy())) != ERROR_SUCCESS) { + srs_error("forwarder process onMetaData message failed. ret=%d", ret); + return ret; + } + if (cache_sh_video && (ret = forwarder->on_video(cache_sh_video->copy())) != ERROR_SUCCESS) { + srs_error("forwarder process video sequence header message failed. ret=%d", ret); + return ret; + } + if (cache_sh_audio && (ret = forwarder->on_audio(cache_sh_audio->copy())) != ERROR_SUCCESS) { + srs_error("forwarder process audio sequence header message failed. ret=%d", ret); + return ret; + } + + return ret; +} + bool SrsSource::can_publish() { return _can_publish; @@ -837,7 +859,7 @@ int SrsSource::create_forwarders() for (int i = 0; conf && i < (int)conf->args.size(); i++) { std::string forward_server = conf->args.at(i); - SrsForwarder* forwarder = new SrsForwarder(); + SrsForwarder* forwarder = new SrsForwarder(this); forwarders.push_back(forwarder); if ((ret = forwarder->on_publish(req, forward_server)) != ERROR_SUCCESS) { diff --git a/trunk/src/core/srs_core_source.hpp b/trunk/src/core/srs_core_source.hpp index aeada9d3d..897918c7e 100644 --- a/trunk/src/core/srs_core_source.hpp +++ b/trunk/src/core/srs_core_source.hpp @@ -221,6 +221,9 @@ public: virtual int on_reload_forward(std::string vhost); virtual int on_reload_hls(std::string vhost); virtual int on_reload_transcode(std::string vhost); +// for the SrsForwarder to callback to request the sequence headers. +public: + virtual int on_forwarder_start(SrsForwarder* forwarder); public: virtual bool can_publish(); virtual int on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata);