diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 189aa168fc..dbe5f2c28e 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -826,6 +826,19 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root) } srs_trace("vhost %s reload hls success.", vhost.c_str()); } + + // hds reload + if (!srs_directive_equals(new_vhost->get("hds"), old_vhost->get("hds"))) { + for (it = subscribes.begin(); it != subscribes.end(); ++it) { + ISrsReloadHandler* subscribe = *it; + if ((ret = subscribe->on_reload_vhost_hds(vhost)) != ERROR_SUCCESS) { + srs_error("vhost %s notify subscribes hds failed. ret=%d", vhost.c_str(), ret); + return ret; + } + } + srs_trace("vhost %s reload hds success.", vhost.c_str()); + } + // dvr, only one per vhost if (!srs_directive_equals(new_vhost->get("dvr"), old_vhost->get("dvr"))) { for (it = subscribes.begin(); it != subscribes.end(); ++it) { diff --git a/trunk/src/app/srs_app_hds.cpp b/trunk/src/app/srs_app_hds.cpp index c67f8b7313..1b0e3e33f0 100644 --- a/trunk/src/app/srs_app_hds.cpp +++ b/trunk/src/app/srs_app_hds.cpp @@ -267,6 +267,7 @@ SrsHds::SrsHds(SrsSource *s) , video_sh(NULL) , audio_sh(NULL) , hds_req(NULL) + , hds_enabled(false) { } @@ -278,9 +279,18 @@ SrsHds::~SrsHds() int SrsHds::on_publish(SrsRequest *req) { - // TODO: FIXME: check whether disabled. - // TODO: FIXME: support reload. - + int ret = ERROR_SUCCESS; + if (hds_enabled) { + return ret; + } + + std::string vhost = req->vhost; + if (!_srs_config->get_hds_enabled(vhost)) { + hds_enabled = false; + return ret; + } + hds_enabled = true; + hds_req = req->copy(); return flush_mainfest(); @@ -290,6 +300,12 @@ int SrsHds::on_unpublish() { int ret = ERROR_SUCCESS; + if (!hds_enabled) { + return ret; + } + + hds_enabled = false; + srs_freep(video_sh); srs_freep(audio_sh); srs_freep(hds_req); @@ -313,6 +329,10 @@ int SrsHds::on_video(SrsSharedPtrMessage* msg) { int ret = ERROR_SUCCESS; + if (!hds_enabled) { + return ret; + } + if (SrsFlvCodec::video_is_sequence_header(msg->payload, msg->size)) { srs_freep(video_sh); video_sh = msg->copy(); @@ -361,6 +381,10 @@ int SrsHds::on_audio(SrsSharedPtrMessage* msg) { int ret = ERROR_SUCCESS; + if (!hds_enabled) { + return ret; + } + if (SrsFlvCodec::audio_is_sequence_header(msg->payload, msg->size)) { srs_freep(audio_sh); audio_sh = msg->copy(); diff --git a/trunk/src/app/srs_app_hds.hpp b/trunk/src/app/srs_app_hds.hpp index 2de6912d76..b6a44cac91 100644 --- a/trunk/src/app/srs_app_hds.hpp +++ b/trunk/src/app/srs_app_hds.hpp @@ -61,6 +61,7 @@ class SrsHds SrsSharedPtrMessage *audio_sh; SrsRequest *hds_req; + bool hds_enabled; }; #endif diff --git a/trunk/src/app/srs_app_reload.cpp b/trunk/src/app/srs_app_reload.cpp index 255aecca57..85d368bfc9 100644 --- a/trunk/src/app/srs_app_reload.cpp +++ b/trunk/src/app/srs_app_reload.cpp @@ -140,6 +140,11 @@ int ISrsReloadHandler::on_reload_vhost_hls(string /*vhost*/) return ERROR_SUCCESS; } +int ISrsReloadHandler::on_reload_vhost_hds(string /*vhost*/) +{ + return ERROR_SUCCESS; +} + int ISrsReloadHandler::on_reload_vhost_dvr(string /*vhost*/) { return ERROR_SUCCESS; diff --git a/trunk/src/app/srs_app_reload.hpp b/trunk/src/app/srs_app_reload.hpp index 09313a97c3..39e3b65389 100644 --- a/trunk/src/app/srs_app_reload.hpp +++ b/trunk/src/app/srs_app_reload.hpp @@ -65,6 +65,7 @@ class ISrsReloadHandler virtual int on_reload_vhost_time_jitter(std::string vhost); virtual int on_reload_vhost_forward(std::string vhost); virtual int on_reload_vhost_hls(std::string vhost); + virtual int on_reload_vhost_hds(std::string vhost); virtual int on_reload_vhost_dvr(std::string vhost); virtual int on_reload_vhost_mr(std::string vhost); virtual int on_reload_vhost_mw(std::string vhost); diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index 4cdb1e6c1e..4e6d599137 100644 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -1013,6 +1013,26 @@ int SrsSource::on_reload_vhost_hls(string vhost) return ret; } +int SrsSource::on_reload_vhost_hds(string vhost) +{ + int ret = ERROR_SUCCESS; + + if (_req->vhost != vhost) { + return ret; + } + +#ifdef SRS_AUTO_HDS + hds->on_unpublish(); + if ((ret = hds->on_publish(_req)) != ERROR_SUCCESS) { + srs_error("hds publish failed. ret=%d", ret); + return ret; + } + srs_trace("vhost %s hds reload success", vhost.c_str()); +#endif + + return ret; +} + int SrsSource::on_reload_vhost_dvr(string vhost) { int ret = ERROR_SUCCESS; diff --git a/trunk/src/app/srs_app_source.hpp b/trunk/src/app/srs_app_source.hpp index 148a8263da..c0804b0520 100644 --- a/trunk/src/app/srs_app_source.hpp +++ b/trunk/src/app/srs_app_source.hpp @@ -476,6 +476,7 @@ class SrsSource : public ISrsReloadHandler virtual int on_reload_vhost_time_jitter(std::string vhost); virtual int on_reload_vhost_forward(std::string vhost); virtual int on_reload_vhost_hls(std::string vhost); + virtual int on_reload_vhost_hds(std::string vhost); virtual int on_reload_vhost_dvr(std::string vhost); virtual int on_reload_vhost_transcode(std::string vhost); // for the tools callback diff --git a/trunk/src/utest/srs_utest_reload.cpp b/trunk/src/utest/srs_utest_reload.cpp index 166a0247c0..876faced3f 100644 --- a/trunk/src/utest/srs_utest_reload.cpp +++ b/trunk/src/utest/srs_utest_reload.cpp @@ -266,6 +266,12 @@ int MockReloadHandler::on_reload_vhost_hls(string /*vhost*/) return ERROR_SUCCESS; } +int MockReloadHandler::on_reload_vhost_hds(string /*vhost*/) +{ + vhost_hls_reloaded = true; + return ERROR_SUCCESS; +} + int MockReloadHandler::on_reload_vhost_dvr(string /*vhost*/) { vhost_dvr_reloaded = true; diff --git a/trunk/src/utest/srs_utest_reload.hpp b/trunk/src/utest/srs_utest_reload.hpp index fd23da7966..1622046c16 100644 --- a/trunk/src/utest/srs_utest_reload.hpp +++ b/trunk/src/utest/srs_utest_reload.hpp @@ -91,6 +91,7 @@ class MockReloadHandler : public ISrsReloadHandler virtual int on_reload_vhost_time_jitter(std::string vhost); virtual int on_reload_vhost_forward(std::string vhost); virtual int on_reload_vhost_hls(std::string vhost); + virtual int on_reload_vhost_hds(std::string vhost); virtual int on_reload_vhost_dvr(std::string vhost); virtual int on_reload_vhost_transcode(std::string vhost); virtual int on_reload_ingest_removed(std::string vhost, std::string ingest_id);