正在显示
4 个修改的文件
包含
59 行增加
和
143 行删除
trunk/src/app/srs_app_rtmp_conn.cpp
100644 → 100755
@@ -414,8 +414,6 @@ int SrsRtmpConn::stream_service_cycle() | @@ -414,8 +414,6 @@ int SrsRtmpConn::stream_service_cycle() | ||
414 | } | 414 | } |
415 | srs_info("set chunk_size=%d success", chunk_size); | 415 | srs_info("set chunk_size=%d success", chunk_size); |
416 | 416 | ||
417 | - bool vhost_is_edge = _srs_config->get_vhost_is_edge(req->vhost); | ||
418 | - | ||
419 | // find a source to serve. | 417 | // find a source to serve. |
420 | SrsSource* source = SrsSource::fetch(req); | 418 | SrsSource* source = SrsSource::fetch(req); |
421 | if (!source) { | 419 | if (!source) { |
@@ -432,19 +430,7 @@ int SrsRtmpConn::stream_service_cycle() | @@ -432,19 +430,7 @@ int SrsRtmpConn::stream_service_cycle() | ||
432 | return ret; | 430 | return ret; |
433 | } | 431 | } |
434 | 432 | ||
435 | - // check ASAP, to fail it faster if invalid. | ||
436 | - if (type != SrsRtmpConnPlay) { | ||
437 | - // check publish available | ||
438 | - if (!source->can_publish(vhost_is_edge)) { | ||
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 | - | 433 | + bool vhost_is_edge = _srs_config->get_vhost_is_edge(req->vhost); |
448 | bool enabled_cache = _srs_config->get_gop_cache(req->vhost); | 434 | 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]", | 435 | 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, | 436 | req->get_stream_url().c_str(), ip.c_str(), enabled_cache, vhost_is_edge, |
@@ -479,19 +465,7 @@ int SrsRtmpConn::stream_service_cycle() | @@ -479,19 +465,7 @@ int SrsRtmpConn::stream_service_cycle() | ||
479 | return ret; | 465 | return ret; |
480 | } | 466 | } |
481 | 467 | ||
482 | - if (!vhost_is_edge) { | ||
483 | - if ((ret = source->acquire_publish()) != ERROR_SUCCESS) { | ||
484 | - return ret; | ||
485 | - } | ||
486 | - } | ||
487 | - | ||
488 | - ret = fmle_publishing(source); | ||
489 | - | ||
490 | - if (!vhost_is_edge) { | ||
491 | - source->release_publish(); | ||
492 | - } | ||
493 | - | ||
494 | - return ret; | 468 | + return publishing(source); |
495 | } | 469 | } |
496 | case SrsRtmpConnFlashPublish: { | 470 | case SrsRtmpConnFlashPublish: { |
497 | srs_verbose("flash start to publish stream %s.", req->stream.c_str()); | 471 | srs_verbose("flash start to publish stream %s.", req->stream.c_str()); |
@@ -501,19 +475,7 @@ int SrsRtmpConn::stream_service_cycle() | @@ -501,19 +475,7 @@ int SrsRtmpConn::stream_service_cycle() | ||
501 | return ret; | 475 | return ret; |
502 | } | 476 | } |
503 | 477 | ||
504 | - if (!vhost_is_edge) { | ||
505 | - if ((ret = source->acquire_publish()) != ERROR_SUCCESS) { | ||
506 | - return ret; | ||
507 | - } | ||
508 | - } | ||
509 | - | ||
510 | - ret = flash_publishing(source); | ||
511 | - | ||
512 | - if (!vhost_is_edge) { | ||
513 | - source->release_publish(); | ||
514 | - } | ||
515 | - | ||
516 | - return ret; | 478 | + return publishing(source); |
517 | } | 479 | } |
518 | default: { | 480 | default: { |
519 | ret = ERROR_SYSTEM_CLIENT_INVALID; | 481 | ret = ERROR_SYSTEM_CLIENT_INVALID; |
@@ -767,69 +729,35 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe | @@ -767,69 +729,35 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe | ||
767 | return ret; | 729 | return ret; |
768 | } | 730 | } |
769 | 731 | ||
770 | -int SrsRtmpConn::fmle_publishing(SrsSource* source) | 732 | +int SrsRtmpConn::publishing(SrsSource* source) |
771 | { | 733 | { |
772 | int ret = ERROR_SUCCESS; | 734 | int ret = ERROR_SUCCESS; |
773 | - | ||
774 | - bool vhost_is_edge = _srs_config->get_vhost_is_edge(req->vhost); | ||
775 | - | ||
776 | - if ((ret = http_hooks_on_publish()) != ERROR_SUCCESS) { | ||
777 | - srs_error("http hook on_publish failed. ret=%d", ret); | ||
778 | - return ret; | ||
779 | - } | ||
780 | - | ||
781 | - // use isolate thread to recv, | ||
782 | - // @see: https://github.com/simple-rtmp-server/srs/issues/237 | ||
783 | - SrsPublishRecvThread trd(rtmp, req, | ||
784 | - st_netfd_fileno(stfd), 0, this, source, true, vhost_is_edge); | ||
785 | 735 | ||
786 | - srs_info("start to publish stream %s success", req->stream.c_str()); | ||
787 | - ret = do_publishing(source, &trd); | ||
788 | - | ||
789 | - // stop isolate recv thread | ||
790 | - trd.stop(); | ||
791 | - | ||
792 | - // when edge, notice edge to change state. | ||
793 | - // when origin, notice all service to unpublish. | ||
794 | - if (vhost_is_edge) { | ||
795 | - source->on_edge_proxy_unpublish(); | ||
796 | - } else { | ||
797 | - source->on_unpublish(); | 736 | + if ((ret = refer->check(req->pageUrl, _srs_config->get_refer_publish(req->vhost))) != ERROR_SUCCESS) { |
737 | + srs_error("check publish_refer failed. ret=%d", ret); | ||
738 | + return ret; | ||
798 | } | 739 | } |
799 | - | ||
800 | - http_hooks_on_unpublish(); | ||
801 | - | ||
802 | - return ret; | ||
803 | -} | ||
804 | - | ||
805 | -int SrsRtmpConn::flash_publishing(SrsSource* source) | ||
806 | -{ | ||
807 | - int ret = ERROR_SUCCESS; | ||
808 | - | ||
809 | - bool vhost_is_edge = _srs_config->get_vhost_is_edge(req->vhost); | 740 | + srs_verbose("check publish_refer success."); |
810 | 741 | ||
811 | if ((ret = http_hooks_on_publish()) != ERROR_SUCCESS) { | 742 | if ((ret = http_hooks_on_publish()) != ERROR_SUCCESS) { |
812 | srs_error("http hook on_publish failed. ret=%d", ret); | 743 | srs_error("http hook on_publish failed. ret=%d", ret); |
813 | return ret; | 744 | return ret; |
814 | } | 745 | } |
815 | 746 | ||
816 | - // use isolate thread to recv, | ||
817 | - // @see: https://github.com/simple-rtmp-server/srs/issues/237 | ||
818 | - SrsPublishRecvThread trd(rtmp, req, | ||
819 | - st_netfd_fileno(stfd), 0, this, source, true, vhost_is_edge); | 747 | + bool vhost_is_edge = _srs_config->get_vhost_is_edge(req->vhost); |
748 | + if ((ret = acquire_publish(source, vhost_is_edge)) == ERROR_SUCCESS) { | ||
749 | + // use isolate thread to recv, | ||
750 | + // @see: https://github.com/simple-rtmp-server/srs/issues/237 | ||
751 | + SrsPublishRecvThread trd(rtmp, req, | ||
752 | + st_netfd_fileno(stfd), 0, this, source, true, vhost_is_edge); | ||
820 | 753 | ||
821 | - srs_info("start to publish stream %s success", req->stream.c_str()); | ||
822 | - ret = do_publishing(source, &trd); | 754 | + srs_info("start to publish stream %s success", req->stream.c_str()); |
755 | + ret = do_publishing(source, &trd); | ||
823 | 756 | ||
824 | - // stop isolate recv thread | ||
825 | - trd.stop(); | 757 | + // stop isolate recv thread |
758 | + trd.stop(); | ||
826 | 759 | ||
827 | - // when edge, notice edge to change state. | ||
828 | - // when origin, notice all service to unpublish. | ||
829 | - if (vhost_is_edge) { | ||
830 | - source->on_edge_proxy_unpublish(); | ||
831 | - } else { | ||
832 | - source->on_unpublish(); | 760 | + release_publish(source, vhost_is_edge); |
833 | } | 761 | } |
834 | 762 | ||
835 | http_hooks_on_unpublish(); | 763 | http_hooks_on_unpublish(); |
@@ -840,33 +768,10 @@ int SrsRtmpConn::flash_publishing(SrsSource* source) | @@ -840,33 +768,10 @@ int SrsRtmpConn::flash_publishing(SrsSource* source) | ||
840 | int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd) | 768 | int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd) |
841 | { | 769 | { |
842 | int ret = ERROR_SUCCESS; | 770 | int ret = ERROR_SUCCESS; |
843 | - | ||
844 | - if ((ret = refer->check(req->pageUrl, _srs_config->get_refer_publish(req->vhost))) != ERROR_SUCCESS) { | ||
845 | - srs_error("check publish_refer failed. ret=%d", ret); | ||
846 | - return ret; | ||
847 | - } | ||
848 | - srs_verbose("check publish_refer success."); | ||
849 | 771 | ||
850 | SrsPithyPrint* pprint = SrsPithyPrint::create_rtmp_publish(); | 772 | SrsPithyPrint* pprint = SrsPithyPrint::create_rtmp_publish(); |
851 | SrsAutoFree(SrsPithyPrint, pprint); | 773 | SrsAutoFree(SrsPithyPrint, pprint); |
852 | 774 | ||
853 | - bool vhost_is_edge = _srs_config->get_vhost_is_edge(req->vhost); | ||
854 | - | ||
855 | - // when edge, ignore the publish event, directly proxy it. | ||
856 | - if (!vhost_is_edge) { | ||
857 | - // notify the hls to prepare when publish start. | ||
858 | - if ((ret = source->on_publish()) != ERROR_SUCCESS) { | ||
859 | - srs_error("hls on_publish failed. ret=%d", ret); | ||
860 | - return ret; | ||
861 | - } | ||
862 | - srs_verbose("hls on_publish success."); | ||
863 | - } else { | ||
864 | - if ((ret = source->on_edge_start_publish()) != ERROR_SUCCESS) { | ||
865 | - srs_error("notice edge start publish stream failed. ret=%d", ret); | ||
866 | - return ret; | ||
867 | - } | ||
868 | - } | ||
869 | - | ||
870 | // start isolate recv thread. | 775 | // start isolate recv thread. |
871 | if ((ret = trd->start()) != ERROR_SUCCESS) { | 776 | if ((ret = trd->start()) != ERROR_SUCCESS) { |
872 | srs_error("start isolate recv thread failed. ret=%d", ret); | 777 | srs_error("start isolate recv thread failed. ret=%d", ret); |
@@ -914,6 +819,43 @@ int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd) | @@ -914,6 +819,43 @@ int SrsRtmpConn::do_publishing(SrsSource* source, SrsPublishRecvThread* trd) | ||
914 | return ret; | 819 | return ret; |
915 | } | 820 | } |
916 | 821 | ||
822 | +int SrsRtmpConn::acquire_publish(SrsSource* source, bool is_edge) | ||
823 | +{ | ||
824 | + int ret = ERROR_SUCCESS; | ||
825 | + | ||
826 | + if (!source->can_publish(is_edge)) { | ||
827 | + ret = ERROR_SYSTEM_STREAM_BUSY; | ||
828 | + srs_warn("stream %s is already publishing. ret=%d", | ||
829 | + req->get_stream_url().c_str(), ret); | ||
830 | + return ret; | ||
831 | + } | ||
832 | + | ||
833 | + // when edge, ignore the publish event, directly proxy it. | ||
834 | + if (is_edge) { | ||
835 | + if ((ret = source->on_edge_start_publish()) != ERROR_SUCCESS) { | ||
836 | + srs_error("notice edge start publish stream failed. ret=%d", ret); | ||
837 | + } | ||
838 | + return ret; | ||
839 | + } else { | ||
840 | + if ((ret = source->on_publish()) != ERROR_SUCCESS) { | ||
841 | + srs_error("notify publish failed. ret=%d", ret); | ||
842 | + } | ||
843 | + } | ||
844 | + | ||
845 | + return ret; | ||
846 | +} | ||
847 | + | ||
848 | +void SrsRtmpConn::release_publish(SrsSource* source, bool is_edge) | ||
849 | +{ | ||
850 | + // when edge, notice edge to change state. | ||
851 | + // when origin, notice all service to unpublish. | ||
852 | + if (is_edge) { | ||
853 | + source->on_edge_proxy_unpublish(); | ||
854 | + } else { | ||
855 | + source->on_unpublish(); | ||
856 | + } | ||
857 | +} | ||
858 | + | ||
917 | int SrsRtmpConn::handle_publish_message(SrsSource* source, SrsCommonMessage* msg, bool is_fmle, bool vhost_is_edge) | 859 | int SrsRtmpConn::handle_publish_message(SrsSource* source, SrsCommonMessage* msg, bool is_fmle, bool vhost_is_edge) |
918 | { | 860 | { |
919 | int ret = ERROR_SUCCESS; | 861 | int ret = ERROR_SUCCESS; |
trunk/src/app/srs_app_rtmp_conn.hpp
100644 → 100755
@@ -111,9 +111,10 @@ private: | @@ -111,9 +111,10 @@ private: | ||
111 | virtual int check_vhost(); | 111 | virtual int check_vhost(); |
112 | virtual int playing(SrsSource* source); | 112 | virtual int playing(SrsSource* source); |
113 | virtual int do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRecvThread* trd); | 113 | virtual int do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRecvThread* trd); |
114 | - virtual int fmle_publishing(SrsSource* source); | ||
115 | - virtual int flash_publishing(SrsSource* source); | 114 | + virtual int publishing(SrsSource* source); |
116 | virtual int do_publishing(SrsSource* source, SrsPublishRecvThread* trd); | 115 | virtual int do_publishing(SrsSource* source, SrsPublishRecvThread* trd); |
116 | + virtual int acquire_publish(SrsSource* source, bool is_edge); | ||
117 | + virtual void release_publish(SrsSource* source, bool is_edge); | ||
117 | virtual int handle_publish_message(SrsSource* source, SrsCommonMessage* msg, bool is_fmle, bool vhost_is_edge); | 118 | virtual int handle_publish_message(SrsSource* source, SrsCommonMessage* msg, bool is_fmle, bool vhost_is_edge); |
118 | virtual int process_publish_message(SrsSource* source, SrsCommonMessage* msg, bool vhost_is_edge); | 119 | virtual int process_publish_message(SrsSource* source, SrsCommonMessage* msg, bool vhost_is_edge); |
119 | virtual int process_play_control_msg(SrsConsumer* consumer, SrsCommonMessage* msg); | 120 | virtual int process_play_control_msg(SrsConsumer* consumer, SrsCommonMessage* msg); |
trunk/src/app/srs_app_source.cpp
100644 → 100755
@@ -1958,26 +1958,6 @@ int SrsSource::on_aggregate(SrsCommonMessage* msg) | @@ -1958,26 +1958,6 @@ int SrsSource::on_aggregate(SrsCommonMessage* msg) | ||
1958 | return ret; | 1958 | return ret; |
1959 | } | 1959 | } |
1960 | 1960 | ||
1961 | -int SrsSource::acquire_publish() | ||
1962 | -{ | ||
1963 | - int ret = ERROR_SUCCESS; | ||
1964 | - | ||
1965 | - if (!_can_publish) { | ||
1966 | - ret = ERROR_SYSTEM_STREAM_BUSY; | ||
1967 | - srs_warn("publish lock stream failed, ret=%d", ret); | ||
1968 | - return ret; | ||
1969 | - } | ||
1970 | - | ||
1971 | - _can_publish = false; | ||
1972 | - | ||
1973 | - return ret; | ||
1974 | -} | ||
1975 | - | ||
1976 | -void SrsSource::release_publish() | ||
1977 | -{ | ||
1978 | - _can_publish = true; | ||
1979 | -} | ||
1980 | - | ||
1981 | int SrsSource::on_publish() | 1961 | int SrsSource::on_publish() |
1982 | { | 1962 | { |
1983 | int ret = ERROR_SUCCESS; | 1963 | int ret = ERROR_SUCCESS; |
trunk/src/app/srs_app_source.hpp
100644 → 100755
@@ -550,13 +550,6 @@ private: | @@ -550,13 +550,6 @@ private: | ||
550 | public: | 550 | public: |
551 | virtual int on_aggregate(SrsCommonMessage* msg); | 551 | virtual int on_aggregate(SrsCommonMessage* msg); |
552 | /** | 552 | /** |
553 | - * the pre-publish is we are very sure we are | ||
554 | - * trying to publish stream, please lock the resource, | ||
555 | - * and we use release_publish() to release the resource. | ||
556 | - */ | ||
557 | - virtual int acquire_publish(); | ||
558 | - virtual void release_publish(); | ||
559 | - /** | ||
560 | * publish stream event notify. | 553 | * publish stream event notify. |
561 | * @param _req the request from client, the source will deep copy it, | 554 | * @param _req the request from client, the source will deep copy it, |
562 | * for when reload the request of client maybe invalid. | 555 | * for when reload the request of client maybe invalid. |
-
请 注册 或 登录 后发表评论