正在显示
6 个修改的文件
包含
45 行增加
和
14 行删除
@@ -806,6 +806,11 @@ int SrsPublishEdge::initialize(SrsSource* source, SrsRequest* req) | @@ -806,6 +806,11 @@ int SrsPublishEdge::initialize(SrsSource* source, SrsRequest* req) | ||
806 | return ret; | 806 | return ret; |
807 | } | 807 | } |
808 | 808 | ||
809 | +bool SrsPublishEdge::can_publish() | ||
810 | +{ | ||
811 | + return state != SrsEdgeStatePublish; | ||
812 | +} | ||
813 | + | ||
809 | int SrsPublishEdge::on_client_publish() | 814 | int SrsPublishEdge::on_client_publish() |
810 | { | 815 | { |
811 | int ret = ERROR_SUCCESS; | 816 | int ret = ERROR_SUCCESS; |
trunk/src/app/srs_app_edge.hpp
100644 → 100755
@@ -207,6 +207,7 @@ public: | @@ -207,6 +207,7 @@ public: | ||
207 | virtual void set_queue_size(double queue_size); | 207 | virtual void set_queue_size(double queue_size); |
208 | public: | 208 | public: |
209 | virtual int initialize(SrsSource* source, SrsRequest* req); | 209 | virtual int initialize(SrsSource* source, SrsRequest* req); |
210 | + virtual bool can_publish(); | ||
210 | /** | 211 | /** |
211 | * when client publish stream on edge. | 212 | * when client publish stream on edge. |
212 | */ | 213 | */ |
@@ -424,6 +424,13 @@ int SrsRtmpConn::stream_service_cycle() | @@ -424,6 +424,13 @@ int SrsRtmpConn::stream_service_cycle() | ||
424 | } | 424 | } |
425 | srs_assert(source != NULL); | 425 | srs_assert(source != NULL); |
426 | 426 | ||
427 | + // check ASAP, to fail it faster if invalid. | ||
428 | + if (type != SrsRtmpConnPlay) { | ||
429 | + if ((ret = prepare_publish(source, vhost_is_edge)) != ERROR_SUCCESS) { | ||
430 | + return ret; | ||
431 | + } | ||
432 | + } | ||
433 | + | ||
427 | // update the statistic when source disconveried. | 434 | // update the statistic when source disconveried. |
428 | SrsStatistic* stat = SrsStatistic::instance(); | 435 | SrsStatistic* stat = SrsStatistic::instance(); |
429 | if ((ret = stat->on_client(_srs_context->get_id(), req)) != ERROR_SUCCESS) { | 436 | if ((ret = stat->on_client(_srs_context->get_id(), req)) != ERROR_SUCCESS) { |
@@ -431,20 +438,6 @@ int SrsRtmpConn::stream_service_cycle() | @@ -431,20 +438,6 @@ int SrsRtmpConn::stream_service_cycle() | ||
431 | return ret; | 438 | return ret; |
432 | } | 439 | } |
433 | 440 | ||
434 | - // check ASAP, to fail it faster if invalid. | ||
435 | - if (type != SrsRtmpConnPlay && !vhost_is_edge) { | ||
436 | - // check publish available | ||
437 | - // for edge, never check it, for edge use proxy mode. | ||
438 | - if (!source->can_publish()) { | ||
439 | - ret = ERROR_SYSTEM_STREAM_BUSY; | ||
440 | - srs_warn("stream %s is already publishing. ret=%d", | ||
441 | - req->get_stream_url().c_str(), ret); | ||
442 | - // to delay request | ||
443 | - st_usleep(SRS_STREAM_BUSY_SLEEP_US); | ||
444 | - return ret; | ||
445 | - } | ||
446 | - } | ||
447 | - | ||
448 | bool enabled_cache = _srs_config->get_gop_cache(req->vhost); | 441 | bool enabled_cache = _srs_config->get_gop_cache(req->vhost); |
449 | srs_trace("source url=%s, ip=%s, cache=%d, is_edge=%d, source_id=%d[%d]", | 442 | srs_trace("source url=%s, ip=%s, cache=%d, is_edge=%d, source_id=%d[%d]", |
450 | req->get_stream_url().c_str(), ip.c_str(), enabled_cache, vhost_is_edge, | 443 | req->get_stream_url().c_str(), ip.c_str(), enabled_cache, vhost_is_edge, |
@@ -1260,6 +1253,31 @@ int SrsRtmpConn::do_token_traverse_auth(SrsRtmpClient* client) | @@ -1260,6 +1253,31 @@ int SrsRtmpConn::do_token_traverse_auth(SrsRtmpClient* client) | ||
1260 | return ret; | 1253 | return ret; |
1261 | } | 1254 | } |
1262 | 1255 | ||
1256 | +int SrsRtmpConn::prepare_publish(SrsSource* source, bool vhost_is_edge) | ||
1257 | +{ | ||
1258 | + int ret = ERROR_SUCCESS; | ||
1259 | + srs_assert(source); | ||
1260 | + | ||
1261 | + // check publish available | ||
1262 | + bool can_publish = false; | ||
1263 | + if (vhost_is_edge) { | ||
1264 | + can_publish = source->proxy_can_publish(); | ||
1265 | + } else { | ||
1266 | + can_publish = source->can_publish(); | ||
1267 | + } | ||
1268 | + | ||
1269 | + if (!can_publish) { | ||
1270 | + ret = ERROR_SYSTEM_STREAM_BUSY; | ||
1271 | + srs_warn("stream %s is already publishing. ret=%d", | ||
1272 | + req->get_stream_url().c_str(), ret); | ||
1273 | + // to delay request | ||
1274 | + st_usleep(SRS_STREAM_BUSY_SLEEP_US); | ||
1275 | + return ret; | ||
1276 | + } | ||
1277 | + | ||
1278 | + return ret; | ||
1279 | +} | ||
1280 | + | ||
1263 | int SrsRtmpConn::http_hooks_on_connect() | 1281 | int SrsRtmpConn::http_hooks_on_connect() |
1264 | { | 1282 | { |
1265 | int ret = ERROR_SUCCESS; | 1283 | int ret = ERROR_SUCCESS; |
trunk/src/app/srs_app_rtmp_conn.hpp
100644 → 100755
@@ -123,6 +123,7 @@ private: | @@ -123,6 +123,7 @@ private: | ||
123 | virtual int check_edge_token_traverse_auth(); | 123 | virtual int check_edge_token_traverse_auth(); |
124 | virtual int connect_server(int origin_index, st_netfd_t* pstsock); | 124 | virtual int connect_server(int origin_index, st_netfd_t* pstsock); |
125 | virtual int do_token_traverse_auth(SrsRtmpClient* client); | 125 | virtual int do_token_traverse_auth(SrsRtmpClient* client); |
126 | + virtual int prepare_publish(SrsSource* source, bool vhost_is_edge); | ||
126 | private: | 127 | private: |
127 | virtual int http_hooks_on_connect(); | 128 | virtual int http_hooks_on_connect(); |
128 | virtual void http_hooks_on_close(); | 129 | virtual void http_hooks_on_close(); |
@@ -1355,6 +1355,11 @@ bool SrsSource::can_publish() | @@ -1355,6 +1355,11 @@ bool SrsSource::can_publish() | ||
1355 | return _can_publish; | 1355 | return _can_publish; |
1356 | } | 1356 | } |
1357 | 1357 | ||
1358 | +bool SrsSource::proxy_can_publish() | ||
1359 | +{ | ||
1360 | + return publish_edge->can_publish(); | ||
1361 | +} | ||
1362 | + | ||
1358 | int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata) | 1363 | int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata) |
1359 | { | 1364 | { |
1360 | int ret = ERROR_SUCCESS; | 1365 | int ret = ERROR_SUCCESS; |
trunk/src/app/srs_app_source.hpp
100644 → 100755
@@ -538,6 +538,7 @@ public: | @@ -538,6 +538,7 @@ public: | ||
538 | // logic data methods | 538 | // logic data methods |
539 | public: | 539 | public: |
540 | virtual bool can_publish(); | 540 | virtual bool can_publish(); |
541 | + virtual bool proxy_can_publish(); | ||
541 | virtual int on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata); | 542 | virtual int on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata); |
542 | public: | 543 | public: |
543 | virtual int on_audio(SrsCommonMessage* audio); | 544 | virtual int on_audio(SrsCommonMessage* audio); |
-
请 注册 或 登录 后发表评论