Skip to content

Commit 5a2789c

Browse files
committed
Bridger: Support RTC2RTMP bridger and shared FastTimer
1 parent e23ad8c commit 5a2789c

10 files changed

+696
-3
lines changed

trunk/conf/full.conf

+7
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,13 @@ vhost rtc.vhost.srs.com {
560560
# Drop the packet with the pt(payload type), 0 never drop.
561561
# default: 0
562562
drop_for_pt 0;
563+
# Whether trans-mux RTC to RTMP streaming.
564+
# Default: off
565+
rtc_to_rtmp off;
566+
# The PLI interval in seconds, for RTC to RTMP.
567+
# Note the available range is [0.5, 30]
568+
# Default: 6.0
569+
pli_for_rtmp 6.0;
563570
}
564571
# whether enable min delay mode for vhost.
565572
# default: on, for RTC.

trunk/src/app/srs_app_config.cpp

+42-1
Original file line numberDiff line numberDiff line change
@@ -3941,7 +3941,8 @@ srs_error_t SrsConfig::check_normal_config()
39413941
for (int j = 0; j < (int)conf->directives.size(); j++) {
39423942
string m = conf->at(j)->name;
39433943
if (m != "enabled" && m != "bframe" && m != "aac" && m != "stun_timeout" && m != "stun_strict_check"
3944-
&& m != "dtls_role" && m != "dtls_version" && m != "drop_for_pt") {
3944+
&& m != "dtls_role" && m != "dtls_version" && m != "drop_for_pt" && m != "rtc_to_rtmp"
3945+
&& m != "pli_for_rtmp") {
39453946
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal vhost.rtc.%s of %s", m.c_str(), vhost->arg0().c_str());
39463947
}
39473948
}
@@ -5227,6 +5228,46 @@ int SrsConfig::get_rtc_drop_for_pt(string vhost)
52275228
return ::atoi(conf->arg0().c_str());
52285229
}
52295230

5231+
bool SrsConfig::get_rtc_to_rtmp(string vhost)
5232+
{
5233+
static bool DEFAULT = false;
5234+
5235+
SrsConfDirective* conf = get_rtc(vhost);
5236+
if (!conf) {
5237+
return DEFAULT;
5238+
}
5239+
5240+
conf = conf->get("rtc_to_rtmp");
5241+
if (!conf || conf->arg0().empty()) {
5242+
return DEFAULT;
5243+
}
5244+
5245+
return SRS_CONF_PERFER_FALSE(conf->arg0());
5246+
}
5247+
5248+
srs_utime_t SrsConfig::get_rtc_pli_for_rtmp(string vhost)
5249+
{
5250+
static srs_utime_t DEFAULT = 6 * SRS_UTIME_SECONDS;
5251+
5252+
SrsConfDirective* conf = get_rtc(vhost);
5253+
if (!conf) {
5254+
return DEFAULT;
5255+
}
5256+
5257+
conf = conf->get("pli_for_rtmp");
5258+
if (!conf || conf->arg0().empty()) {
5259+
return DEFAULT;
5260+
}
5261+
5262+
srs_utime_t v = (srs_utime_t)(::atof(conf->arg0().c_str()) * SRS_UTIME_SECONDS);
5263+
if (v < 500 * SRS_UTIME_MILLISECONDS || v > 30 * SRS_UTIME_SECONDS) {
5264+
srs_warn("Reset pli %dms to %dms", srsu2msi(v), srsu2msi(DEFAULT));
5265+
return DEFAULT;
5266+
}
5267+
5268+
return v;
5269+
}
5270+
52305271
bool SrsConfig::get_rtc_nack_enabled(string vhost)
52315272
{
52325273
static bool DEFAULT = true;

trunk/src/app/srs_app_config.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,8 @@ class SrsConfig
562562
std::string get_rtc_dtls_role(std::string vhost);
563563
std::string get_rtc_dtls_version(std::string vhost);
564564
int get_rtc_drop_for_pt(std::string vhost);
565+
bool get_rtc_to_rtmp(std::string vhost);
566+
srs_utime_t get_rtc_pli_for_rtmp(std::string vhost);
565567
bool get_rtc_nack_enabled(std::string vhost);
566568
bool get_rtc_nack_no_copy(std::string vhost);
567569
bool get_rtc_twcc_enabled(std::string vhost);

trunk/src/app/srs_app_listener.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,10 @@ srs_error_t SrsUdpMuxListener::listen()
536536

537537
srs_freep(trd);
538538
trd = new SrsSTCoroutine("udp", this, cid);
539+
540+
//change stack size to 256K, fix crash when call some 3rd-part api.
541+
((SrsSTCoroutine*)trd)->set_stack_size(1 << 18);
542+
539543
if ((err = trd->start()) != srs_success) {
540544
return srs_error_wrap(err, "start thread");
541545
}

trunk/src/app/srs_app_rtc_conn.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,28 @@ srs_error_t SrsRtcPublishStream::initialize(SrsRequest* r, SrsRtcStreamDescripti
998998
}
999999
source->set_publish_stream(this);
10001000

1001+
// Bridge to rtmp
1002+
bool rtc_to_rtmp = _srs_config->get_rtc_to_rtmp(req->vhost);
1003+
if (rtc_to_rtmp) {
1004+
SrsSource *rtmp = NULL;
1005+
if ((err = _srs_sources->fetch_or_create(r, _srs_hybrid->srs()->instance(), &rtmp)) != srs_success) {
1006+
return srs_error_wrap(err, "create source");
1007+
}
1008+
1009+
// TODO: FIMXE: Check it in SrsRtcConnection::add_publisher?
1010+
if (!rtmp->can_publish(false)) {
1011+
return srs_error_new(ERROR_SYSTEM_STREAM_BUSY, "rtmp stream %s busy", r->get_stream_url().c_str());
1012+
}
1013+
1014+
SrsRtmpFromRtcBridger *bridger = new SrsRtmpFromRtcBridger(rtmp);
1015+
if ((err = bridger->initialize(r)) != srs_success) {
1016+
srs_freep(bridger);
1017+
return srs_error_wrap(err, "create bridger");
1018+
}
1019+
1020+
source->set_bridger(bridger);
1021+
}
1022+
10011023
return err;
10021024
}
10031025

0 commit comments

Comments
 (0)