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);