正在显示
5 个修改的文件
包含
130 行增加
和
9 行删除
@@ -573,6 +573,17 @@ SrsConfDirective* SrsConfig::get_gop_cache(std::string vhost) | @@ -573,6 +573,17 @@ SrsConfDirective* SrsConfig::get_gop_cache(std::string vhost) | ||
573 | return conf->get("gop_cache"); | 573 | return conf->get("gop_cache"); |
574 | } | 574 | } |
575 | 575 | ||
576 | +SrsConfDirective* SrsConfig::get_forward(std::string vhost) | ||
577 | +{ | ||
578 | + SrsConfDirective* conf = get_vhost(vhost); | ||
579 | + | ||
580 | + if (!conf) { | ||
581 | + return NULL; | ||
582 | + } | ||
583 | + | ||
584 | + return conf->get("forward"); | ||
585 | +} | ||
586 | + | ||
576 | SrsConfDirective* SrsConfig::get_hls(std::string vhost) | 587 | SrsConfDirective* SrsConfig::get_hls(std::string vhost) |
577 | { | 588 | { |
578 | SrsConfDirective* conf = get_vhost(vhost); | 589 | SrsConfDirective* conf = get_vhost(vhost); |
@@ -115,6 +115,7 @@ public: | @@ -115,6 +115,7 @@ public: | ||
115 | virtual SrsConfDirective* get_vhost(std::string vhost); | 115 | virtual SrsConfDirective* get_vhost(std::string vhost); |
116 | virtual SrsConfDirective* get_vhost_enabled(std::string vhost); | 116 | virtual SrsConfDirective* get_vhost_enabled(std::string vhost); |
117 | virtual SrsConfDirective* get_gop_cache(std::string vhost); | 117 | virtual SrsConfDirective* get_gop_cache(std::string vhost); |
118 | + virtual SrsConfDirective* get_forward(std::string vhost); | ||
118 | virtual SrsConfDirective* get_hls(std::string vhost); | 119 | virtual SrsConfDirective* get_hls(std::string vhost); |
119 | virtual SrsConfDirective* get_hls_path(std::string vhost); | 120 | virtual SrsConfDirective* get_hls_path(std::string vhost); |
120 | virtual SrsConfDirective* get_hls_fragment(std::string vhost); | 121 | virtual SrsConfDirective* get_hls_fragment(std::string vhost); |
@@ -23,6 +23,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -23,6 +23,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
23 | 23 | ||
24 | #include <srs_core_forward.hpp> | 24 | #include <srs_core_forward.hpp> |
25 | 25 | ||
26 | +#include <srs_core_error.hpp> | ||
27 | + | ||
26 | SrsForwarder::SrsForwarder() | 28 | SrsForwarder::SrsForwarder() |
27 | { | 29 | { |
28 | } | 30 | } |
@@ -31,3 +33,31 @@ SrsForwarder::~SrsForwarder() | @@ -31,3 +33,31 @@ SrsForwarder::~SrsForwarder() | ||
31 | { | 33 | { |
32 | } | 34 | } |
33 | 35 | ||
36 | +int SrsForwarder::on_publish(std::string vhost, std::string app, std::string stream, std::string forward_server) | ||
37 | +{ | ||
38 | + int ret = ERROR_SUCCESS; | ||
39 | + return ret; | ||
40 | +} | ||
41 | + | ||
42 | +void SrsForwarder::on_unpublish() | ||
43 | +{ | ||
44 | +} | ||
45 | + | ||
46 | +int SrsForwarder::on_meta_data(SrsOnMetaDataPacket* metadata) | ||
47 | +{ | ||
48 | + int ret = ERROR_SUCCESS; | ||
49 | + return ret; | ||
50 | +} | ||
51 | + | ||
52 | +int SrsForwarder::on_audio(SrsSharedPtrMessage* msg) | ||
53 | +{ | ||
54 | + int ret = ERROR_SUCCESS; | ||
55 | + return ret; | ||
56 | +} | ||
57 | + | ||
58 | +int SrsForwarder::on_video(SrsSharedPtrMessage* msg) | ||
59 | +{ | ||
60 | + int ret = ERROR_SUCCESS; | ||
61 | + return ret; | ||
62 | +} | ||
63 | + |
@@ -29,6 +29,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -29,6 +29,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
29 | */ | 29 | */ |
30 | #include <srs_core.hpp> | 30 | #include <srs_core.hpp> |
31 | 31 | ||
32 | +#include <string> | ||
33 | + | ||
34 | +class SrsSharedPtrMessage; | ||
35 | +class SrsOnMetaDataPacket; | ||
36 | + | ||
32 | /** | 37 | /** |
33 | * forward the stream to other servers. | 38 | * forward the stream to other servers. |
34 | */ | 39 | */ |
@@ -38,6 +43,11 @@ public: | @@ -38,6 +43,11 @@ public: | ||
38 | SrsForwarder(); | 43 | SrsForwarder(); |
39 | virtual ~SrsForwarder(); | 44 | virtual ~SrsForwarder(); |
40 | public: | 45 | public: |
46 | + virtual int on_publish(std::string vhost, std::string app, std::string stream, std::string forward_server); | ||
47 | + virtual void on_unpublish(); | ||
48 | + virtual int on_meta_data(SrsOnMetaDataPacket* metadata); | ||
49 | + virtual int on_audio(SrsSharedPtrMessage* msg); | ||
50 | + virtual int on_video(SrsSharedPtrMessage* msg); | ||
41 | }; | 51 | }; |
42 | 52 | ||
43 | #endif | 53 | #endif |
@@ -32,6 +32,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -32,6 +32,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
32 | #include <srs_core_codec.hpp> | 32 | #include <srs_core_codec.hpp> |
33 | #include <srs_core_hls.hpp> | 33 | #include <srs_core_hls.hpp> |
34 | #include <srs_core_forward.hpp> | 34 | #include <srs_core_forward.hpp> |
35 | +#include <srs_core_config.hpp> | ||
35 | 36 | ||
36 | #define CONST_MAX_JITTER_MS 500 | 37 | #define CONST_MAX_JITTER_MS 500 |
37 | #define DEFAULT_FRAME_TIME_MS 10 | 38 | #define DEFAULT_FRAME_TIME_MS 10 |
@@ -409,6 +410,17 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | @@ -409,6 +410,17 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | ||
409 | } | 410 | } |
410 | #endif | 411 | #endif |
411 | 412 | ||
413 | + if (true) { | ||
414 | + std::vector<SrsForwarder*>::iterator it; | ||
415 | + for (it = forwarders.begin(); it != forwarders.end(); ++it) { | ||
416 | + SrsForwarder* forwarder = *it; | ||
417 | + if ((ret = forwarder->on_meta_data(metadata)) != ERROR_SUCCESS) { | ||
418 | + srs_error("forwarder process onMetaData message failed. ret=%d", ret); | ||
419 | + return ret; | ||
420 | + } | ||
421 | + } | ||
422 | + } | ||
423 | + | ||
412 | metadata->metadata->set("server", new SrsAmf0String( | 424 | metadata->metadata->set("server", new SrsAmf0String( |
413 | RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")")); | 425 | RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")")); |
414 | 426 | ||
@@ -453,6 +465,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | @@ -453,6 +465,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | ||
453 | srs_verbose("initialize shared ptr metadata success."); | 465 | srs_verbose("initialize shared ptr metadata success."); |
454 | 466 | ||
455 | // copy to all consumer | 467 | // copy to all consumer |
468 | + if (true) { | ||
456 | std::vector<SrsConsumer*>::iterator it; | 469 | std::vector<SrsConsumer*>::iterator it; |
457 | for (it = consumers.begin(); it != consumers.end(); ++it) { | 470 | for (it = consumers.begin(); it != consumers.end(); ++it) { |
458 | SrsConsumer* consumer = *it; | 471 | SrsConsumer* consumer = *it; |
@@ -462,6 +475,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | @@ -462,6 +475,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | ||
462 | } | 475 | } |
463 | } | 476 | } |
464 | srs_trace("dispatch metadata success."); | 477 | srs_trace("dispatch metadata success."); |
478 | + } | ||
465 | 479 | ||
466 | return ret; | 480 | return ret; |
467 | } | 481 | } |
@@ -485,7 +499,19 @@ int SrsSource::on_audio(SrsCommonMessage* audio) | @@ -485,7 +499,19 @@ int SrsSource::on_audio(SrsCommonMessage* audio) | ||
485 | } | 499 | } |
486 | #endif | 500 | #endif |
487 | 501 | ||
502 | + if (true) { | ||
503 | + std::vector<SrsForwarder*>::iterator it; | ||
504 | + for (it = forwarders.begin(); it != forwarders.end(); ++it) { | ||
505 | + SrsForwarder* forwarder = *it; | ||
506 | + if ((ret = forwarder->on_audio(msg->copy())) != ERROR_SUCCESS) { | ||
507 | + srs_error("forwarder process audio message failed. ret=%d", ret); | ||
508 | + return ret; | ||
509 | + } | ||
510 | + } | ||
511 | + } | ||
512 | + | ||
488 | // copy to all consumer | 513 | // copy to all consumer |
514 | + if (true) { | ||
489 | std::vector<SrsConsumer*>::iterator it; | 515 | std::vector<SrsConsumer*>::iterator it; |
490 | for (it = consumers.begin(); it != consumers.end(); ++it) { | 516 | for (it = consumers.begin(); it != consumers.end(); ++it) { |
491 | SrsConsumer* consumer = *it; | 517 | SrsConsumer* consumer = *it; |
@@ -495,6 +521,7 @@ int SrsSource::on_audio(SrsCommonMessage* audio) | @@ -495,6 +521,7 @@ int SrsSource::on_audio(SrsCommonMessage* audio) | ||
495 | } | 521 | } |
496 | } | 522 | } |
497 | srs_info("dispatch audio success."); | 523 | srs_info("dispatch audio success."); |
524 | + } | ||
498 | 525 | ||
499 | // cache the sequence header if h264 | 526 | // cache the sequence header if h264 |
500 | if (SrsCodec::audio_is_sequence_header(msg->payload, msg->size)) { | 527 | if (SrsCodec::audio_is_sequence_header(msg->payload, msg->size)) { |
@@ -533,7 +560,19 @@ int SrsSource::on_video(SrsCommonMessage* video) | @@ -533,7 +560,19 @@ int SrsSource::on_video(SrsCommonMessage* video) | ||
533 | } | 560 | } |
534 | #endif | 561 | #endif |
535 | 562 | ||
563 | + if (true) { | ||
564 | + std::vector<SrsForwarder*>::iterator it; | ||
565 | + for (it = forwarders.begin(); it != forwarders.end(); ++it) { | ||
566 | + SrsForwarder* forwarder = *it; | ||
567 | + if ((ret = forwarder->on_video(msg->copy())) != ERROR_SUCCESS) { | ||
568 | + srs_error("forwarder process video message failed. ret=%d", ret); | ||
569 | + return ret; | ||
570 | + } | ||
571 | + } | ||
572 | + } | ||
573 | + | ||
536 | // copy to all consumer | 574 | // copy to all consumer |
575 | + if (true) { | ||
537 | std::vector<SrsConsumer*>::iterator it; | 576 | std::vector<SrsConsumer*>::iterator it; |
538 | for (it = consumers.begin(); it != consumers.end(); ++it) { | 577 | for (it = consumers.begin(); it != consumers.end(); ++it) { |
539 | SrsConsumer* consumer = *it; | 578 | SrsConsumer* consumer = *it; |
@@ -543,6 +582,7 @@ int SrsSource::on_video(SrsCommonMessage* video) | @@ -543,6 +582,7 @@ int SrsSource::on_video(SrsCommonMessage* video) | ||
543 | } | 582 | } |
544 | } | 583 | } |
545 | srs_info("dispatch video success."); | 584 | srs_info("dispatch video success."); |
585 | + } | ||
546 | 586 | ||
547 | // cache the sequence header if h264 | 587 | // cache the sequence header if h264 |
548 | if (SrsCodec::video_is_sequence_header(msg->payload, msg->size)) { | 588 | if (SrsCodec::video_is_sequence_header(msg->payload, msg->size)) { |
@@ -562,26 +602,55 @@ int SrsSource::on_video(SrsCommonMessage* video) | @@ -562,26 +602,55 @@ int SrsSource::on_video(SrsCommonMessage* video) | ||
562 | return ret; | 602 | return ret; |
563 | } | 603 | } |
564 | 604 | ||
565 | -#ifdef SRS_HLS | ||
566 | int SrsSource::on_publish(std::string vhost, std::string app, std::string stream) | 605 | int SrsSource::on_publish(std::string vhost, std::string app, std::string stream) |
567 | { | 606 | { |
607 | + int ret = ERROR_SUCCESS; | ||
608 | + | ||
568 | _can_publish = false; | 609 | _can_publish = false; |
569 | - return hls->on_publish(vhost, app, stream); | ||
570 | -} | ||
571 | -#else | ||
572 | -int SrsSource::on_publish(std::string /*vhost*/, std::string /*app*/, std::string /*stream*/) | ||
573 | -{ | ||
574 | - _can_publish = false; | ||
575 | - return ERROR_SUCCESS; | ||
576 | -} | 610 | + |
611 | +#ifdef SRS_HLS | ||
612 | + if ((ret = hls->on_publish(vhost, app, stream)) != ERROR_SUCCESS) { | ||
613 | + return ret; | ||
614 | + } | ||
577 | #endif | 615 | #endif |
578 | 616 | ||
617 | + // TODO: support reload. | ||
618 | + | ||
619 | + // create forwarders | ||
620 | + SrsConfDirective* conf = config->get_forward(vhost); | ||
621 | + for (int i = 0; conf && i < conf->args.size(); i++) { | ||
622 | + std::string forward_server = conf->args.at(i); | ||
623 | + | ||
624 | + SrsForwarder* forwarder = new SrsForwarder(); | ||
625 | + forwarders.push_back(forwarder); | ||
626 | + | ||
627 | + if ((ret = forwarder->on_publish(vhost, app, stream, forward_server)) != ERROR_SUCCESS) { | ||
628 | + srs_error("start forwarder failed. " | ||
629 | + "vhost=%s, app=%s, stream=%s, forward-to=%s", | ||
630 | + vhost.c_str(), app.c_str(), stream.c_str(), | ||
631 | + forward_server.c_str()); | ||
632 | + return ret; | ||
633 | + } | ||
634 | + } | ||
635 | + | ||
636 | + return ret; | ||
637 | +} | ||
638 | + | ||
579 | void SrsSource::on_unpublish() | 639 | void SrsSource::on_unpublish() |
580 | { | 640 | { |
581 | #ifdef SRS_HLS | 641 | #ifdef SRS_HLS |
582 | hls->on_unpublish(); | 642 | hls->on_unpublish(); |
583 | #endif | 643 | #endif |
584 | 644 | ||
645 | + // close all forwarders | ||
646 | + std::vector<SrsForwarder*>::iterator it; | ||
647 | + for (it = forwarders.begin(); it != forwarders.end(); ++it) { | ||
648 | + SrsForwarder* forwarder = *it; | ||
649 | + forwarder->on_unpublish(); | ||
650 | + srs_freep(forwarder); | ||
651 | + } | ||
652 | + forwarders.clear(); | ||
653 | + | ||
585 | gop_cache->clear(); | 654 | gop_cache->clear(); |
586 | 655 | ||
587 | srs_freep(cache_metadata); | 656 | srs_freep(cache_metadata); |
-
请 注册 或 登录 后发表评论