diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 4e4998f00..d91682aec 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -373,118 +373,6 @@ vhost publish.srs.com { } } -# the MR(merged-read) setting for publisher. -# the MW(merged-write) settings for player. -vhost mrw.srs.com { - # @see scope.vhost.srs.com - min_latency off; - - # set the MW(merged-write) latency in ms. - # SRS always set mw on, so we just set the latency value. - # the latency of stream >= mw_latency + mr_latency - # the value recomment is [300, 1800] - # default: 350 - mw_latency 350; - - # @see publish.srs.com - publish { - mr on; - mr_latenct 350; - } -} - -# the vhost for min delay, donot cache any stream. -vhost min.delay.com { - # @see vhost mrw.srs.com for detail. - min_latency on; - # @see scope.vhost.srs.com - mw_latency 100; - # whether cache the last gop. - # if on, cache the last gop and dispatch to client, - # to enabled fast startup for client, client play immediately. - # if off, send the latest media data to client, - # client need to wait for the next Iframe to decode and show the video. - # set to off if requires min delay; - # set to on if requires client fast startup. - # default: on - gop_cache off; - # the max live queue length in seconds. - # if the messages in the queue exceed the max length, - # drop the old whole gop. - # default: 30 - queue_length 10; - # @see scope.vhost.srs.com - tcp_nodelay on; - - # @see publish.srs.com - publish { - mr off; - } -} - -# the vhost to control the stream delivery feature -vhost stream.control.com { - # @see vhost mrw.srs.com for detail. - min_latency on; - mw_latency 100; - # @see vhost min.delay.com - queue_length 10; - tcp_nodelay on; - # the minimal packets send interval in ms, - # used to control the ndiff of stream by srs_rtmp_dump, - # for example, some device can only accept some stream which - # delivery packets in constant interval(not cbr). - # @remark 0 to disable the minimal interval. - # @remark >0 to make the srs to send message one by one. - # @remark user can get the right packets interval in ms by srs_rtmp_dump. - # default: 0 - send_min_interval 10.0; - # whether reduce the sequence header, - # for some client which cannot got duplicated sequence header, - # while the sequence header is not changed yet. - # default: off - reduce_sequence_header on; - - # @see publish.srs.com - publish { - mr off; - firstpkt_timeout 20000; - normal_timeout 7000; - } -} - -# the vhost which forward publish streams. -vhost same.vhost.forward.srs.com { - # forward all publish stream to the specified server. - # this used to split/forward the current stream for cluster active-standby, - # active-active for cdn to build high available fault tolerance system. - # format: {ip}:{port} {ip_N}:{port_N} - forward 127.0.0.1:1936 127.0.0.1:1937; -} - -# the vhost for exec, fork process when publish stream. -vhost exec.srs.com { - # the exec used to fork process when got some event. - exec { - # whether enable the exec. - # default: off. - enabled off; - # when publish stream, exec the process with variables: - # [vhost] the input stream vhost. - # [port] the intput stream port. - # [app] the input stream app. - # [stream] the input stream name. - # [engine] the tanscode engine name. - # other variables for exec only: - # [url] the rtmp url which trigger the publish. - # [tcUrl] the client request tcUrl. - # [swfUrl] the client request swfUrl. - # [pageUrl] the client request pageUrl. - # @remark empty to ignore this exec. - publish ./objs/ffmpeg/bin/ffmpeg -f flv -i [url] -c copy -y ./[stream].flv; - } -} - # the play specified configs vhost play.srs.com { # for play client, both RTMP and other stream clients, @@ -527,6 +415,13 @@ vhost play.srs.com { # always ignore the onMetaData if atc_auto is off. # default: off atc_auto off; + + # set the MW(merged-write) latency in ms. + # SRS always set mw on, so we just set the latency value. + # the latency of stream >= mw_latency + mr_latency + # the value recomment is [300, 1800] + # default: 350 + mw_latency 350; } } @@ -546,6 +441,126 @@ vhost atc.srs.com { atc_auto on; } +# the MR(merged-read) setting for publisher. +# the MW(merged-write) settings for player. +vhost mrw.srs.com { + # @see scope.vhost.srs.com + min_latency off; + + # @see play.srs.com + play { + mw_latency 350; + } + + # @see publish.srs.com + publish { + mr on; + mr_latenct 350; + } +} + +# the vhost for min delay, donot cache any stream. +vhost min.delay.com { + # @see scope.vhost.srs.com + min_latency on; + # @see scope.vhost.srs.com + tcp_nodelay on; + + # whether cache the last gop. + # if on, cache the last gop and dispatch to client, + # to enabled fast startup for client, client play immediately. + # if off, send the latest media data to client, + # client need to wait for the next Iframe to decode and show the video. + # set to off if requires min delay; + # set to on if requires client fast startup. + # default: on + gop_cache off; + # the max live queue length in seconds. + # if the messages in the queue exceed the max length, + # drop the old whole gop. + # default: 30 + queue_length 10; + + # @see play.srs.com + play { + mw_latency 100; + } + + # @see publish.srs.com + publish { + mr off; + } +} + +# the vhost to control the stream delivery feature +vhost stream.control.com { + # @see scope.vhost.srs.com + min_latency on; + # @see scope.vhost.srs.com + tcp_nodelay on; + + # @see vhost min.delay.com + queue_length 10; + # the minimal packets send interval in ms, + # used to control the ndiff of stream by srs_rtmp_dump, + # for example, some device can only accept some stream which + # delivery packets in constant interval(not cbr). + # @remark 0 to disable the minimal interval. + # @remark >0 to make the srs to send message one by one. + # @remark user can get the right packets interval in ms by srs_rtmp_dump. + # default: 0 + send_min_interval 10.0; + # whether reduce the sequence header, + # for some client which cannot got duplicated sequence header, + # while the sequence header is not changed yet. + # default: off + reduce_sequence_header on; + + # @see play.srs.com + play { + mw_latency 100; + } + + # @see publish.srs.com + publish { + mr off; + firstpkt_timeout 20000; + normal_timeout 7000; + } +} + +# the vhost which forward publish streams. +vhost same.vhost.forward.srs.com { + # forward all publish stream to the specified server. + # this used to split/forward the current stream for cluster active-standby, + # active-active for cdn to build high available fault tolerance system. + # format: {ip}:{port} {ip_N}:{port_N} + forward 127.0.0.1:1936 127.0.0.1:1937; +} + +# the vhost for exec, fork process when publish stream. +vhost exec.srs.com { + # the exec used to fork process when got some event. + exec { + # whether enable the exec. + # default: off. + enabled off; + # when publish stream, exec the process with variables: + # [vhost] the input stream vhost. + # [port] the intput stream port. + # [app] the input stream app. + # [stream] the input stream name. + # [engine] the tanscode engine name. + # other variables for exec only: + # [url] the rtmp url which trigger the publish. + # [tcUrl] the client request tcUrl. + # [swfUrl] the client request swfUrl. + # [pageUrl] the client request pageUrl. + # @remark empty to ignore this exec. + publish ./objs/ffmpeg/bin/ffmpeg -f flv -i [url] -c copy -y ./[stream].flv; + } +} + # the security to allow or deny clients. vhost security.srs.com { # security for host to allow or deny clients. diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 0b7c697c8..3d15d0d68 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -841,18 +841,6 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root) srs_trace("vhost %s reload publish success.", vhost.c_str()); } - // mw, only one per vhost - if (!srs_directive_equals(new_vhost->get("mw_latency"), old_vhost->get("mw_latency"))) { - for (it = subscribes.begin(); it != subscribes.end(); ++it) { - ISrsReloadHandler* subscribe = *it; - if ((ret = subscribe->on_reload_vhost_mw(vhost)) != ERROR_SUCCESS) { - srs_error("vhost %s notify subscribes mw failed. ret=%d", vhost.c_str(), ret); - return ret; - } - } - srs_trace("vhost %s reload mw success.", vhost.c_str()); - } - // smi(send_min_interval), only one per vhost if (!srs_directive_equals(new_vhost->get("send_min_interval"), old_vhost->get("send_min_interval"))) { for (it = subscribes.begin(); it != subscribes.end(); ++it) { @@ -1735,11 +1723,6 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj) obj->set("debug_srs_upnode", dir->dumps_arg0_to_boolean()); } - // mrw - if ((dir = vhost->get("mw_latency")) != NULL) { - obj->set("mw_latency", dir->dumps_arg0_to_number()); - } - // realtime latency if ((dir = vhost->get("gop_cache")) != NULL) { obj->set("gop_cache", dir->dumps_arg0_to_boolean()); @@ -1772,6 +1755,8 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj) play->set("atc", sdir->dumps_arg0_to_boolean()); } else if (sdir->name == "atc_auto") { play->set("atc_auto", sdir->dumps_arg0_to_boolean()); + } else if (sdir->name == "mw_latency") { + play->set("mw_latency", sdir->dumps_arg0_to_number()); } } } @@ -2654,7 +2639,7 @@ int SrsConfig::check_config() && n != "dvr" && n != "ingest" && n != "hls" && n != "http_hooks" && n != "gop_cache" && n != "queue_length" && n != "refer" && n != "forward" && n != "transcode" && n != "bandcheck" - && n != "debug_srs_upnode" && n != "play" && n != "publish" && n != "mw_latency" + && n != "debug_srs_upnode" && n != "play" && n != "publish" && n != "send_min_interval" && n != "reduce_sequence_header" && n != "security" && n != "http_remux" && n != "http_static" && n != "hds" && n != "exec" @@ -2696,7 +2681,7 @@ int SrsConfig::check_config() } else if (n == "play") { for (int j = 0; j < (int)conf->directives.size(); j++) { string m = conf->at(j)->name.c_str(); - if (m != "time_jitter" && m != "mix_correct" && m != "atc" && m != "atc_auto" ) { + if (m != "time_jitter" && m != "mix_correct" && m != "atc" && m != "atc_auto" && m != "mw_latency") { ret = ERROR_SYSTEM_CONFIG_INVALID; srs_error("unsupported vhost play directive %s, ret=%d", m.c_str(), ret); return ret; @@ -3482,6 +3467,11 @@ int SrsConfig::get_mw_sleep_ms(string vhost) if (!conf) { return SRS_PERF_MW_SLEEP; } + + conf = conf->get("play"); + if (!conf || conf->arg0().empty()) { + return SRS_PERF_MW_SLEEP; + } conf = conf->get("mw_latency"); if (!conf || conf->arg0().empty()) { @@ -5789,12 +5779,12 @@ int srs_config_transform_vhost(SrsConfDirective* root) } // SRS3.0, change the folowing like a shadow: - // time_jitter, mix_correct, atc, atc_auto + // time_jitter, mix_correct, atc, atc_auto, mw_latency // SRS1/2: // vhost { shadow; } // SRS3+: // vhost { play { shadow; } } - if (n == "time_jitter" || n == "mix_correct" || n == "atc" || n == "atc_auto") { + if (n == "time_jitter" || n == "mix_correct" || n == "atc" || n == "atc_auto" || n == "mw_latency") { it = dir->directives.erase(it); SrsConfDirective* play = dir->get_or_create("play"); diff --git a/trunk/src/app/srs_app_reload.cpp b/trunk/src/app/srs_app_reload.cpp index 79714646d..271c972b1 100644 --- a/trunk/src/app/srs_app_reload.cpp +++ b/trunk/src/app/srs_app_reload.cpp @@ -165,11 +165,6 @@ int ISrsReloadHandler::on_reload_vhost_publish(string /*vhost*/) return ERROR_SUCCESS; } -int ISrsReloadHandler::on_reload_vhost_mw(string /*vhost*/) -{ - return ERROR_SUCCESS; -} - int ISrsReloadHandler::on_reload_vhost_smi(string /*vhost*/) { return ERROR_SUCCESS; diff --git a/trunk/src/app/srs_app_reload.hpp b/trunk/src/app/srs_app_reload.hpp index e067ec187..cd7f74f01 100644 --- a/trunk/src/app/srs_app_reload.hpp +++ b/trunk/src/app/srs_app_reload.hpp @@ -72,7 +72,6 @@ public: virtual int on_reload_vhost_hds(std::string vhost); virtual int on_reload_vhost_dvr(std::string vhost); virtual int on_reload_vhost_publish(std::string vhost); - virtual int on_reload_vhost_mw(std::string vhost); virtual int on_reload_vhost_smi(std::string vhost); virtual int on_reload_vhost_tcp_nodelay(std::string vhost); virtual int on_reload_vhost_realtime(std::string vhost); diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index ecf027893..f4f8996b4 100755 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -231,18 +231,13 @@ int SrsRtmpConn::on_reload_vhost_removed(string vhost) return ret; } -int SrsRtmpConn::on_reload_vhost_mw(string vhost) +int SrsRtmpConn::on_reload_vhost_play(string vhost) { int ret = ERROR_SUCCESS; if (req->vhost != vhost) { return ret; } - - int sleep_ms = _srs_config->get_mw_sleep_ms(req->vhost); - - // when mw_sleep changed, resize the socket send buffer. - change_mw_sleep(sleep_ms); return ret; } diff --git a/trunk/src/app/srs_app_rtmp_conn.hpp b/trunk/src/app/srs_app_rtmp_conn.hpp index f44b74248..073125ffe 100755 --- a/trunk/src/app/srs_app_rtmp_conn.hpp +++ b/trunk/src/app/srs_app_rtmp_conn.hpp @@ -103,7 +103,7 @@ protected: // interface ISrsReloadHandler public: virtual int on_reload_vhost_removed(std::string vhost); - virtual int on_reload_vhost_mw(std::string vhost); + virtual int on_reload_vhost_play(std::string vhost); virtual int on_reload_vhost_smi(std::string vhost); virtual int on_reload_vhost_tcp_nodelay(std::string vhost); virtual int on_reload_vhost_realtime(std::string vhost);