diff --git a/trunk/src/core/srs_core_config.cpp b/trunk/src/core/srs_core_config.cpp index a373f3563..a7dc6aa15 100644 --- a/trunk/src/core/srs_core_config.cpp +++ b/trunk/src/core/srs_core_config.cpp @@ -559,6 +559,28 @@ int SrsConfig::reload() } srs_trace("vhost %s reload forward success.", vhost.c_str()); } + // hls + if (!srs_directive_equals(new_vhost->get("hls"), old_vhost->get("hls"))) { + for (it = subscribes.begin(); it != subscribes.end(); ++it) { + ISrsReloadHandler* subscribe = *it; + if ((ret = subscribe->on_reload_hls(vhost)) != ERROR_SUCCESS) { + srs_error("vhost %s notify subscribes hls failed. ret=%d", vhost.c_str(), ret); + return ret; + } + } + srs_trace("vhost %s reload hls success.", vhost.c_str()); + } + // transcode + if (!srs_directive_equals(new_vhost->get("transcode"), old_vhost->get("transcode"))) { + for (it = subscribes.begin(); it != subscribes.end(); ++it) { + ISrsReloadHandler* subscribe = *it; + if ((ret = subscribe->on_reload_transcode(vhost)) != ERROR_SUCCESS) { + srs_error("vhost %s notify subscribes transcode failed. ret=%d", vhost.c_str(), ret); + return ret; + } + } + srs_trace("vhost %s reload transcode success.", vhost.c_str()); + } // TODO: suppor reload hls/forward/ffmpeg/http continue; } diff --git a/trunk/src/core/srs_core_reload.cpp b/trunk/src/core/srs_core_reload.cpp index 7e6752ea6..71cd5a3c1 100644 --- a/trunk/src/core/srs_core_reload.cpp +++ b/trunk/src/core/srs_core_reload.cpp @@ -60,3 +60,13 @@ int ISrsReloadHandler::on_reload_forward(string /*vhost*/) return ERROR_SUCCESS; } +int ISrsReloadHandler::on_reload_hls(string /*vhost*/) +{ + return ERROR_SUCCESS; +} + +int ISrsReloadHandler::on_reload_transcode(string /*vhost*/) +{ + return ERROR_SUCCESS; +} + diff --git a/trunk/src/core/srs_core_reload.hpp b/trunk/src/core/srs_core_reload.hpp index 9f40927b7..a819bd7dd 100644 --- a/trunk/src/core/srs_core_reload.hpp +++ b/trunk/src/core/srs_core_reload.hpp @@ -45,6 +45,8 @@ public: virtual int on_reload_vhost_removed(std::string vhost); virtual int on_reload_gop_cache(std::string vhost); virtual int on_reload_forward(std::string vhost); + virtual int on_reload_hls(std::string vhost); + virtual int on_reload_transcode(std::string vhost); }; #endif \ No newline at end of file diff --git a/trunk/src/core/srs_core_source.cpp b/trunk/src/core/srs_core_source.cpp index 0c5ad90e3..32b3586ca 100644 --- a/trunk/src/core/srs_core_source.cpp +++ b/trunk/src/core/srs_core_source.cpp @@ -455,6 +455,47 @@ int SrsSource::on_reload_forward(string vhost) return ret; } +int SrsSource::on_reload_hls(string vhost) +{ + int ret = ERROR_SUCCESS; + + if (req->vhost != vhost) { + return ret; + } + + // TODO: HLS should continue previous sequence and stream. +#ifdef SRS_HLS + hls->on_unpublish(); + if ((ret = hls->on_publish(req)) != ERROR_SUCCESS) { + srs_error("hls publish failed. ret=%d", ret); + return ret; + } + srs_trace("vhost %s hls reload success", vhost.c_str()); +#endif + + return ret; +} + +int SrsSource::on_reload_transcode(string vhost) +{ + int ret = ERROR_SUCCESS; + + if (req->vhost != vhost) { + return ret; + } + +#ifdef SRS_FFMPEG + encoder->on_unpublish(); + if ((ret = encoder->on_publish(req)) != ERROR_SUCCESS) { + srs_error("start encoder failed. ret=%d", ret); + return ret; + } + srs_trace("vhost %s transcode reload success", vhost.c_str()); +#endif + + return ret; +} + bool SrsSource::can_publish() { return _can_publish; @@ -697,12 +738,14 @@ int SrsSource::on_publish(SrsRequest* _req) #ifdef SRS_FFMPEG if ((ret = encoder->on_publish(req)) != ERROR_SUCCESS) { + srs_error("start encoder failed. ret=%d", ret); return ret; } #endif #ifdef SRS_HLS if ((ret = hls->on_publish(req)) != ERROR_SUCCESS) { + srs_error("start hls failed. ret=%d", ret); return ret; } #endif diff --git a/trunk/src/core/srs_core_source.hpp b/trunk/src/core/srs_core_source.hpp index d3fbc6bef..aeada9d3d 100644 --- a/trunk/src/core/srs_core_source.hpp +++ b/trunk/src/core/srs_core_source.hpp @@ -219,6 +219,8 @@ public: public: virtual int on_reload_gop_cache(std::string vhost); virtual int on_reload_forward(std::string vhost); + virtual int on_reload_hls(std::string vhost); + virtual int on_reload_transcode(std::string vhost); public: virtual bool can_publish(); virtual int on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata);