正在显示
5 个修改的文件
包含
151 行增加
和
30 行删除
@@ -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 |
@@ -408,6 +409,17 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | @@ -408,6 +409,17 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | ||
408 | return ret; | 409 | return ret; |
409 | } | 410 | } |
410 | #endif | 411 | #endif |
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 | + } | ||
411 | 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")")); |
@@ -453,15 +465,17 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata | @@ -453,15 +465,17 @@ 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 |
456 | - std::vector<SrsConsumer*>::iterator it; | ||
457 | - for (it = consumers.begin(); it != consumers.end(); ++it) { | ||
458 | - SrsConsumer* consumer = *it; | ||
459 | - if ((ret = consumer->enqueue(cache_metadata->copy(), sample_rate, frame_rate)) != ERROR_SUCCESS) { | ||
460 | - srs_error("dispatch the metadata failed. ret=%d", ret); | ||
461 | - return ret; | 468 | + if (true) { |
469 | + std::vector<SrsConsumer*>::iterator it; | ||
470 | + for (it = consumers.begin(); it != consumers.end(); ++it) { | ||
471 | + SrsConsumer* consumer = *it; | ||
472 | + if ((ret = consumer->enqueue(cache_metadata->copy(), sample_rate, frame_rate)) != ERROR_SUCCESS) { | ||
473 | + srs_error("dispatch the metadata failed. ret=%d", ret); | ||
474 | + return ret; | ||
475 | + } | ||
462 | } | 476 | } |
477 | + srs_trace("dispatch metadata success."); | ||
463 | } | 478 | } |
464 | - srs_trace("dispatch metadata success."); | ||
465 | 479 | ||
466 | return ret; | 480 | return ret; |
467 | } | 481 | } |
@@ -484,17 +498,30 @@ int SrsSource::on_audio(SrsCommonMessage* audio) | @@ -484,17 +498,30 @@ int SrsSource::on_audio(SrsCommonMessage* audio) | ||
484 | return ret; | 498 | return ret; |
485 | } | 499 | } |
486 | #endif | 500 | #endif |
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 | + } | ||
487 | 512 | ||
488 | // copy to all consumer | 513 | // copy to all consumer |
489 | - std::vector<SrsConsumer*>::iterator it; | ||
490 | - for (it = consumers.begin(); it != consumers.end(); ++it) { | ||
491 | - SrsConsumer* consumer = *it; | ||
492 | - if ((ret = consumer->enqueue(msg->copy(), sample_rate, frame_rate)) != ERROR_SUCCESS) { | ||
493 | - srs_error("dispatch the audio failed. ret=%d", ret); | ||
494 | - return ret; | 514 | + if (true) { |
515 | + std::vector<SrsConsumer*>::iterator it; | ||
516 | + for (it = consumers.begin(); it != consumers.end(); ++it) { | ||
517 | + SrsConsumer* consumer = *it; | ||
518 | + if ((ret = consumer->enqueue(msg->copy(), sample_rate, frame_rate)) != ERROR_SUCCESS) { | ||
519 | + srs_error("dispatch the audio failed. ret=%d", ret); | ||
520 | + return ret; | ||
521 | + } | ||
495 | } | 522 | } |
523 | + srs_info("dispatch audio success."); | ||
496 | } | 524 | } |
497 | - srs_info("dispatch audio success."); | ||
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)) { |
@@ -532,17 +559,30 @@ int SrsSource::on_video(SrsCommonMessage* video) | @@ -532,17 +559,30 @@ int SrsSource::on_video(SrsCommonMessage* video) | ||
532 | return ret; | 559 | return ret; |
533 | } | 560 | } |
534 | #endif | 561 | #endif |
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 | + } | ||
535 | 573 | ||
536 | // copy to all consumer | 574 | // copy to all consumer |
537 | - std::vector<SrsConsumer*>::iterator it; | ||
538 | - for (it = consumers.begin(); it != consumers.end(); ++it) { | ||
539 | - SrsConsumer* consumer = *it; | ||
540 | - if ((ret = consumer->enqueue(msg->copy(), sample_rate, frame_rate)) != ERROR_SUCCESS) { | ||
541 | - srs_error("dispatch the video failed. ret=%d", ret); | ||
542 | - return ret; | 575 | + if (true) { |
576 | + std::vector<SrsConsumer*>::iterator it; | ||
577 | + for (it = consumers.begin(); it != consumers.end(); ++it) { | ||
578 | + SrsConsumer* consumer = *it; | ||
579 | + if ((ret = consumer->enqueue(msg->copy(), sample_rate, frame_rate)) != ERROR_SUCCESS) { | ||
580 | + srs_error("dispatch the video failed. ret=%d", ret); | ||
581 | + return ret; | ||
582 | + } | ||
543 | } | 583 | } |
584 | + srs_info("dispatch video success."); | ||
544 | } | 585 | } |
545 | - srs_info("dispatch video success."); | ||
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); |
-
请 注册 或 登录 后发表评论