diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 52e25afb6..8042e8766 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -911,7 +911,7 @@ srs_error_t SrsGoApiRtcPlay::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMe string local_sdp_str = os.str(); - srs_trace("local_sdp=%s", local_sdp_str.c_str()); + srs_verbose("local_sdp=%s", local_sdp_str.c_str()); res->set("code", SrsJsonAny::integer(ERROR_SUCCESS)); res->set("server", SrsJsonAny::integer(SrsStatistic::instance()->server_id())); @@ -1036,8 +1036,6 @@ srs_error_t SrsGoApiRtcPlay::exchange_sdp(const std::string& app, const std::str local_media_desc.session_info_.setup_ = "passive"; } - local_sdp.media_descs_.back().session_info_.ice_options_ = "trickle"; - if (remote_media_desc.sendonly_) { local_media_desc.recvonly_ = true; } else if (remote_media_desc.recvonly_) { @@ -1047,9 +1045,11 @@ srs_error_t SrsGoApiRtcPlay::exchange_sdp(const std::string& app, const std::str } local_media_desc.rtcp_mux_ = true; + local_media_desc.rtcp_rsize_ = true; SrsSSRCInfo ssrc_info; ssrc_info.ssrc_ = ++ssrc_num; + // TODO:use formated cname ssrc_info.cname_ = "test_sdp_cname"; local_media_desc.ssrc_infos_.push_back(ssrc_info); } diff --git a/trunk/src/app/srs_app_sdp.cpp b/trunk/src/app/srs_app_sdp.cpp index 6c128c180..30ae9ede6 100644 --- a/trunk/src/app/srs_app_sdp.cpp +++ b/trunk/src/app/srs_app_sdp.cpp @@ -116,7 +116,9 @@ srs_error_t SrsSessionInfo::parse_attribute(const std::string& attribute, const } else if (attribute == "setup") { // @see: https://tools.ietf.org/html/rfc4145#section-4 setup_ = value; - } + } else { + srs_trace("ignore attribute=%s, value=%s", attribute.c_str(), value.c_str()); + } return err; } @@ -132,6 +134,10 @@ srs_error_t SrsSessionInfo::encode(std::ostringstream& os) } if (! ice_options_.empty()) { 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()) { os << "a=fingerprint:" << fingerprint_algo_ << " " << fingerprint_ << kCRLF; @@ -325,6 +331,10 @@ srs_error_t SrsMediaDesc::encode(std::ostringstream& os) os << "a=rtcp-mux" << kCRLF; } + if (rtcp_rsize_) { + os << "a=rtcp-rsize" << kCRLF; + } + for (std::vector::iterator iter = payload_types_.begin(); iter != payload_types_.end(); ++iter) { if ((err = iter->encode(os)) != srs_success) { return srs_error_wrap(err, "encode media payload failed"); @@ -366,6 +376,8 @@ srs_error_t SrsMediaDesc::parse_attribute(const std::string& content) return 0; } else if (attribute == "rtpmap") { return parse_attr_rtpmap(value); + } else if (attribute == "rtcp") { + return parse_attr_rtcp(value); } else if (attribute == "rtcp-fb") { return parse_attr_rtcp_fb(value); } else if (attribute == "fmtp") { @@ -380,6 +392,8 @@ srs_error_t SrsMediaDesc::parse_attribute(const std::string& content) return parse_attr_ssrc_group(value); } else if (attribute == "rtcp-mux") { rtcp_mux_ = true; + } else if (attribute == "rtcp-rsize") { + rtcp_rsize_ = true; } else if (attribute == "recvonly") { recvonly_ = true; } else if (attribute == "sendonly") { @@ -429,6 +443,15 @@ srs_error_t SrsMediaDesc::parse_attr_rtpmap(const std::string& value) return err; } +srs_error_t SrsMediaDesc::parse_attr_rtcp(const std::string& value) +{ + srs_error_t err = srs_success; + + // TODO:parse rtcp attribute + + return err; +} + srs_error_t SrsMediaDesc::parse_attr_rtcp_fb(const std::string& value) { srs_error_t err = srs_success; @@ -633,7 +656,7 @@ srs_error_t SrsSdp::encode(std::ostringstream& os) os << "o=" << username_ << " " << session_id_ << " " << session_version_ << " " << nettype_ << " " << addrtype_ << " " << unicast_address_ << kCRLF; os << "s=" << session_name_ << kCRLF; os << "t=" << start_time_ << " " << end_time_ << kCRLF; - // TODO: ice options + // @see: ice-lite is a minimal version of the ICE specification, intended for servers running on a public IP address. os << "a=ice-lite" << kCRLF; if (! groups_.empty()) { @@ -656,7 +679,7 @@ srs_error_t SrsSdp::encode(std::ostringstream& os) for (std::vector::iterator iter = media_descs_.begin(); iter != media_descs_.end(); ++iter) { if ((err = (*iter).encode(os)) != srs_success) { - return srs_error_wrap(err, "encode media failed"); + return srs_error_wrap(err, "encode media description failed"); } } diff --git a/trunk/src/app/srs_app_sdp.hpp b/trunk/src/app/srs_app_sdp.hpp index 963eb3599..491b28054 100644 --- a/trunk/src/app/srs_app_sdp.hpp +++ b/trunk/src/app/srs_app_sdp.hpp @@ -121,6 +121,7 @@ public: private: srs_error_t parse_attribute(const std::string& content); srs_error_t parse_attr_rtpmap(const std::string& value); + srs_error_t parse_attr_rtcp(const std::string& value); srs_error_t parse_attr_rtcp_fb(const std::string& value); srs_error_t parse_attr_fmtp(const std::string& value); srs_error_t parse_attr_mid(const std::string& value); @@ -136,6 +137,7 @@ public: int port_; bool rtcp_mux_; + bool rtcp_rsize_; bool sendonly_; bool recvonly_;