mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Refine RTC, no trickle for ice-lite, disable algorithms right-now
This commit is contained in:
parent
365e6bb45a
commit
47df22df9e
4 changed files with 60 additions and 35 deletions
|
@ -46,7 +46,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<label></label>
|
<label></label>
|
||||||
<video id="rtc_media_player" controls autoplay></video>
|
<video id="rtc_media_player" width="320" controls autoplay></video>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<p></p>
|
<p></p>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<label></label>
|
<label></label>
|
||||||
<video id="rtc_media_player" autoplay muted></video>
|
<video id="rtc_media_player" width="320" autoplay muted></video>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<p></p>
|
<p></p>
|
||||||
|
@ -71,10 +71,8 @@
|
||||||
pc.addTransceiver("video", {direction: "sendonly"});
|
pc.addTransceiver("video", {direction: "sendonly"});
|
||||||
|
|
||||||
var constraints = {
|
var constraints = {
|
||||||
"audio": true, "video": {
|
audio: true, video: {
|
||||||
"width": { "min": "480", "max": "720" },
|
height: { max: 320 }
|
||||||
"height": { "min": "320", "max": "480" },
|
|
||||||
"frameRate": { "min": "15", "max": "30" }
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
navigator.mediaDevices.getUserMedia(
|
navigator.mediaDevices.getUserMedia(
|
||||||
|
|
|
@ -1027,8 +1027,14 @@ srs_error_t SrsGoApiRtcPlay::exchange_sdp(const std::string& app, const std::str
|
||||||
// TODO: check opus format specific param
|
// TODO: check opus format specific param
|
||||||
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("opus");
|
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("opus");
|
||||||
for (std::vector<SrsMediaPayloadType>::iterator iter = payloads.begin(); iter != payloads.end(); ++iter) {
|
for (std::vector<SrsMediaPayloadType>::iterator iter = payloads.begin(); iter != payloads.end(); ++iter) {
|
||||||
// Only choose one match opus codec.
|
|
||||||
local_media_desc.payload_types_.push_back(*iter);
|
local_media_desc.payload_types_.push_back(*iter);
|
||||||
|
SrsMediaPayloadType& payload_type = local_media_desc.payload_types_.back();
|
||||||
|
|
||||||
|
// TODO: FIXME: Only support some transport algorithms.
|
||||||
|
vector<string> rtcp_fb;
|
||||||
|
payload_type.rtcp_fb_.swap(rtcp_fb);
|
||||||
|
|
||||||
|
// Only choose one match opus codec.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1050,8 +1056,14 @@ srs_error_t SrsGoApiRtcPlay::exchange_sdp(const std::string& app, const std::str
|
||||||
|
|
||||||
// Try to pick the "best match" H.264 payload type.
|
// Try to pick the "best match" H.264 payload type.
|
||||||
if (h264_param.packetization_mode == "1" && h264_param.level_asymmerty_allow == "1") {
|
if (h264_param.packetization_mode == "1" && h264_param.level_asymmerty_allow == "1") {
|
||||||
// Only choose first match H.264 payload type.
|
|
||||||
local_media_desc.payload_types_.push_back(*iter);
|
local_media_desc.payload_types_.push_back(*iter);
|
||||||
|
SrsMediaPayloadType& payload_type = local_media_desc.payload_types_.back();
|
||||||
|
|
||||||
|
// TODO: FIXME: Only support some transport algorithms.
|
||||||
|
vector<string> rtcp_fb;
|
||||||
|
payload_type.rtcp_fb_.swap(rtcp_fb);
|
||||||
|
|
||||||
|
// Only choose first match H.264 payload type.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1346,8 +1358,14 @@ srs_error_t SrsGoApiRtcPublish::exchange_sdp(const std::string& app, const std::
|
||||||
// TODO: check opus format specific param
|
// TODO: check opus format specific param
|
||||||
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("opus");
|
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("opus");
|
||||||
for (std::vector<SrsMediaPayloadType>::iterator iter = payloads.begin(); iter != payloads.end(); ++iter) {
|
for (std::vector<SrsMediaPayloadType>::iterator iter = payloads.begin(); iter != payloads.end(); ++iter) {
|
||||||
// Only choose one match opus codec.
|
|
||||||
local_media_desc.payload_types_.push_back(*iter);
|
local_media_desc.payload_types_.push_back(*iter);
|
||||||
|
SrsMediaPayloadType& payload_type = local_media_desc.payload_types_.back();
|
||||||
|
|
||||||
|
// TODO: FIXME: Only support some transport algorithms.
|
||||||
|
vector<string> rtcp_fb;
|
||||||
|
payload_type.rtcp_fb_.swap(rtcp_fb);
|
||||||
|
|
||||||
|
// Only choose one match opus codec.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1370,8 +1388,14 @@ srs_error_t SrsGoApiRtcPublish::exchange_sdp(const std::string& app, const std::
|
||||||
|
|
||||||
// Try to pick the "best match" H.264 payload type.
|
// Try to pick the "best match" H.264 payload type.
|
||||||
if (h264_param.packetization_mode == "1" && h264_param.level_asymmerty_allow == "1") {
|
if (h264_param.packetization_mode == "1" && h264_param.level_asymmerty_allow == "1") {
|
||||||
// Only choose first match H.264 payload type.
|
|
||||||
local_media_desc.payload_types_.push_back(*iter);
|
local_media_desc.payload_types_.push_back(*iter);
|
||||||
|
SrsMediaPayloadType& payload_type = local_media_desc.payload_types_.back();
|
||||||
|
|
||||||
|
// TODO: FIXME: Only support some transport algorithms.
|
||||||
|
vector<string> rtcp_fb;
|
||||||
|
payload_type.rtcp_fb_.swap(rtcp_fb);
|
||||||
|
|
||||||
|
// Only choose first match H.264 payload type.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1388,7 +1412,8 @@ srs_error_t SrsGoApiRtcPublish::exchange_sdp(const std::string& app, const std::
|
||||||
return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid H.264 payload type");
|
return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid H.264 payload type");
|
||||||
}
|
}
|
||||||
|
|
||||||
local_media_desc.payload_types_.back().rtcp_fb_.push_back("rrtr");
|
// TODO: FIXME: Support RRTR?
|
||||||
|
//local_media_desc.payload_types_.back().rtcp_fb_.push_back("rrtr");
|
||||||
}
|
}
|
||||||
|
|
||||||
local_media_desc.mid_ = remote_media_desc.mid_;
|
local_media_desc.mid_ = remote_media_desc.mid_;
|
||||||
|
@ -1410,8 +1435,6 @@ srs_error_t SrsGoApiRtcPublish::exchange_sdp(const std::string& app, const std::
|
||||||
local_media_desc.session_info_.setup_ = "passive";
|
local_media_desc.session_info_.setup_ = "passive";
|
||||||
}
|
}
|
||||||
|
|
||||||
local_sdp.media_descs_.back().session_info_.ice_options_ = "trickle";
|
|
||||||
|
|
||||||
local_media_desc.rtcp_mux_ = true;
|
local_media_desc.rtcp_mux_ = true;
|
||||||
|
|
||||||
// For publisher, we are always sendonly.
|
// For publisher, we are always sendonly.
|
||||||
|
|
|
@ -36,12 +36,12 @@ using namespace std;
|
||||||
const std::string kCRLF = "\\r\\n";
|
const std::string kCRLF = "\\r\\n";
|
||||||
|
|
||||||
#define FETCH(is,word) \
|
#define FETCH(is,word) \
|
||||||
if (! (is >> word)) {\
|
if (!(is >> word)) {\
|
||||||
return srs_error_new(ERROR_RTC_SDP_DECODE, "fetch failed");\
|
return srs_error_new(ERROR_RTC_SDP_DECODE, "fetch failed");\
|
||||||
}\
|
}\
|
||||||
|
|
||||||
#define FETCH_WITH_DELIM(is,word,delim) \
|
#define FETCH_WITH_DELIM(is,word,delim) \
|
||||||
if (! getline(is,word,delim)) {\
|
if (!getline(is,word,delim)) {\
|
||||||
return srs_error_new(ERROR_RTC_SDP_DECODE, "fetch with delim failed");\
|
return srs_error_new(ERROR_RTC_SDP_DECODE, "fetch with delim failed");\
|
||||||
}\
|
}\
|
||||||
|
|
||||||
|
@ -111,6 +111,7 @@ SrsSessionInfo::~SrsSessionInfo()
|
||||||
srs_error_t SrsSessionInfo::parse_attribute(const std::string& attribute, const std::string& value)
|
srs_error_t SrsSessionInfo::parse_attribute(const std::string& attribute, const std::string& value)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if (attribute == "ice-ufrag") {
|
if (attribute == "ice-ufrag") {
|
||||||
ice_ufrag_ = value;
|
ice_ufrag_ = value;
|
||||||
} else if (attribute == "ice-pwd") {
|
} else if (attribute == "ice-pwd") {
|
||||||
|
@ -134,23 +135,25 @@ srs_error_t SrsSessionInfo::parse_attribute(const std::string& attribute, const
|
||||||
srs_error_t SrsSessionInfo::encode(std::ostringstream& os)
|
srs_error_t SrsSessionInfo::encode(std::ostringstream& os)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
if (! ice_ufrag_.empty()) {
|
|
||||||
|
if (!ice_ufrag_.empty()) {
|
||||||
os << "a=ice-ufrag:" << ice_ufrag_ << kCRLF;
|
os << "a=ice-ufrag:" << ice_ufrag_ << kCRLF;
|
||||||
}
|
}
|
||||||
if (! ice_pwd_.empty()) {
|
|
||||||
|
if (!ice_pwd_.empty()) {
|
||||||
os << "a=ice-pwd:" << ice_pwd_ << kCRLF;
|
os << "a=ice-pwd:" << ice_pwd_ << kCRLF;
|
||||||
}
|
}
|
||||||
if (! ice_options_.empty()) {
|
|
||||||
|
// For ICE-lite, we never set the trickle.
|
||||||
|
if (!ice_options_.empty()) {
|
||||||
os << "a=ice-options:" << ice_options_ << kCRLF;
|
os << "a=ice-options:" << ice_options_ << kCRLF;
|
||||||
} else {
|
|
||||||
// @see: https://webrtcglossary.com/trickle-ice/
|
|
||||||
// Trickle ICE is an optimization of the ICE specification for NAT traversal.
|
|
||||||
os << "a=ice-options:trickle" << kCRLF;
|
|
||||||
}
|
}
|
||||||
if (! fingerprint_algo_.empty() && ! fingerprint_.empty()) {
|
|
||||||
|
if (!fingerprint_algo_.empty() && ! fingerprint_.empty()) {
|
||||||
os << "a=fingerprint:" << fingerprint_algo_ << " " << fingerprint_ << kCRLF;
|
os << "a=fingerprint:" << fingerprint_algo_ << " " << fingerprint_ << kCRLF;
|
||||||
}
|
}
|
||||||
if (! setup_.empty()) {
|
|
||||||
|
if (!setup_.empty()) {
|
||||||
os << "a=setup:" << setup_ << kCRLF;
|
os << "a=setup:" << setup_ << kCRLF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,22 +182,23 @@ SrsSSRCInfo::~SrsSSRCInfo()
|
||||||
srs_error_t SrsSSRCInfo::encode(std::ostringstream& os)
|
srs_error_t SrsSSRCInfo::encode(std::ostringstream& os)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if (ssrc_ == 0) {
|
if (ssrc_ == 0) {
|
||||||
return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid ssrc");
|
return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid ssrc");
|
||||||
}
|
}
|
||||||
|
|
||||||
os << "a=ssrc:" << ssrc_ << " cname:" << cname_ << kCRLF;
|
os << "a=ssrc:" << ssrc_ << " cname:" << cname_ << kCRLF;
|
||||||
if (! msid_.empty()) {
|
if (!msid_.empty()) {
|
||||||
os << "a=ssrc:" << ssrc_ << " msid:" << msid_;
|
os << "a=ssrc:" << ssrc_ << " msid:" << msid_;
|
||||||
if (! msid_tracker_.empty()) {
|
if (!msid_tracker_.empty()) {
|
||||||
os << " " << msid_tracker_;
|
os << " " << msid_tracker_;
|
||||||
}
|
}
|
||||||
os << kCRLF;
|
os << kCRLF;
|
||||||
}
|
}
|
||||||
if (! mslabel_.empty()) {
|
if (!mslabel_.empty()) {
|
||||||
os << "a=ssrc:" << ssrc_ << " mslabel:" << mslabel_ << kCRLF;
|
os << "a=ssrc:" << ssrc_ << " mslabel:" << mslabel_ << kCRLF;
|
||||||
}
|
}
|
||||||
if (! label_.empty()) {
|
if (!label_.empty()) {
|
||||||
os << "a=ssrc:" << ssrc_ << " label:" << label_ << kCRLF;
|
os << "a=ssrc:" << ssrc_ << " label:" << label_ << kCRLF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,7 +219,7 @@ srs_error_t SrsMediaPayloadType::encode(std::ostringstream& os)
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
os << "a=rtpmap:" << payload_type_ << " " << encoding_name_ << "/" << clock_rate_;
|
os << "a=rtpmap:" << payload_type_ << " " << encoding_name_ << "/" << clock_rate_;
|
||||||
if (! encoding_param_.empty()) {
|
if (!encoding_param_.empty()) {
|
||||||
os << "/" << encoding_param_;
|
os << "/" << encoding_param_;
|
||||||
}
|
}
|
||||||
os << kCRLF;
|
os << kCRLF;
|
||||||
|
@ -224,7 +228,7 @@ srs_error_t SrsMediaPayloadType::encode(std::ostringstream& os)
|
||||||
os << "a=rtcp-fb:" << payload_type_ << " " << *iter << kCRLF;
|
os << "a=rtcp-fb:" << payload_type_ << " " << *iter << kCRLF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! format_specific_param_.empty()) {
|
if (!format_specific_param_.empty()) {
|
||||||
os << "a=fmtp:" << payload_type_ << " " << format_specific_param_
|
os << "a=fmtp:" << payload_type_ << " " << format_specific_param_
|
||||||
// TODO: FIXME: Remove the test code bellow.
|
// TODO: FIXME: Remove the test code bellow.
|
||||||
// << ";x-google-max-bitrate=6000;x-google-min-bitrate=5100;x-google-start-bitrate=5000"
|
// << ";x-google-max-bitrate=6000;x-google-min-bitrate=5100;x-google-start-bitrate=5000"
|
||||||
|
@ -315,10 +319,10 @@ srs_error_t SrsMediaDesc::encode(std::ostringstream& os)
|
||||||
}
|
}
|
||||||
|
|
||||||
os << "a=mid:" << mid_ << kCRLF;
|
os << "a=mid:" << mid_ << kCRLF;
|
||||||
if (! msid_.empty()) {
|
if (!msid_.empty()) {
|
||||||
os << "a=msid:" << msid_;
|
os << "a=msid:" << msid_;
|
||||||
|
|
||||||
if (! msid_tracker_.empty()) {
|
if (!msid_tracker_.empty()) {
|
||||||
os << " " << msid_tracker_;
|
os << " " << msid_tracker_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -658,7 +662,7 @@ srs_error_t SrsSdp::parse(const std::string& sdp_str)
|
||||||
if (line.size() < 2 || line[1] != '=') {
|
if (line.size() < 2 || line[1] != '=') {
|
||||||
return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid sdp line=%s", line.c_str());
|
return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid sdp line=%s", line.c_str());
|
||||||
}
|
}
|
||||||
if (! line.empty() && line[line.size()-1] == '\r') {
|
if (!line.empty() && line[line.size()-1] == '\r') {
|
||||||
line.erase(line.size()-1, 1);
|
line.erase(line.size()-1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -681,7 +685,7 @@ srs_error_t SrsSdp::encode(std::ostringstream& os)
|
||||||
// ice-lite is a minimal version of the ICE specification, intended for servers running on a public IP address.
|
// ice-lite is a minimal version of the ICE specification, intended for servers running on a public IP address.
|
||||||
os << "a=ice-lite" << kCRLF;
|
os << "a=ice-lite" << kCRLF;
|
||||||
|
|
||||||
if (! groups_.empty()) {
|
if (!groups_.empty()) {
|
||||||
os << "a=group:" << group_policy_;
|
os << "a=group:" << group_policy_;
|
||||||
for (std::vector<std::string>::iterator iter = groups_.begin(); iter != groups_.end(); ++iter) {
|
for (std::vector<std::string>::iterator iter = groups_.begin(); iter != groups_.end(); ++iter) {
|
||||||
os << " " << *iter;
|
os << " " << *iter;
|
||||||
|
@ -954,7 +958,7 @@ srs_error_t SrsSdp::parse_media_description(const std::string& content)
|
||||||
media_descs_.back().payload_types_.push_back(SrsMediaPayloadType(fmt));
|
media_descs_.back().payload_types_.push_back(SrsMediaPayloadType(fmt));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! in_media_session_) {
|
if (!in_media_session_) {
|
||||||
in_media_session_ = true;
|
in_media_session_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue