diff --git a/trunk/src/app/srs_app_rtc_sdp.cpp b/trunk/src/app/srs_app_rtc_sdp.cpp index a26195044..4c3d9f53c 100644 --- a/trunk/src/app/srs_app_rtc_sdp.cpp +++ b/trunk/src/app/srs_app_rtc_sdp.cpp @@ -330,6 +330,9 @@ srs_error_t SrsMediaDesc::encode(std::ostringstream& os) os << kCRLF; } + for(map::iterator it = extmaps_.begin(); it != extmaps_.end(); ++it) { + os << "a=extmap:"<< it->first<< " "<< it->second<< kCRLF; + } if (sendonly_) { os << "a=sendonly" << kCRLF; } @@ -399,8 +402,7 @@ srs_error_t SrsMediaDesc::parse_attribute(const std::string& content) } if (attribute == "extmap") { - // TODO:We don't parse "extmap" currently. - return 0; + return parse_attr_extmap(value); } else if (attribute == "rtpmap") { return parse_attr_rtpmap(value); } else if (attribute == "rtcp") { @@ -435,6 +437,20 @@ srs_error_t SrsMediaDesc::parse_attribute(const std::string& content) return err; } +srs_error_t SrsMediaDesc::parse_attr_extmap(const std::string& value) +{ + srs_error_t err = srs_success; + std::istringstream is(value); + int id = 0; + FETCH(is, id); + if(extmaps_.end() != extmaps_.find(id)) { + return srs_error_new(ERROR_RTC_SDP_DECODE, "duplicate ext id: %d", id); + } + string ext; + FETCH(is, ext); + extmaps_[id] = ext; + return err; +} srs_error_t SrsMediaDesc::parse_attr_rtpmap(const std::string& value) { diff --git a/trunk/src/app/srs_app_rtc_sdp.hpp b/trunk/src/app/srs_app_rtc_sdp.hpp index d69293822..b50509f5d 100644 --- a/trunk/src/app/srs_app_rtc_sdp.hpp +++ b/trunk/src/app/srs_app_rtc_sdp.hpp @@ -31,6 +31,8 @@ #include #include +#include +const std::string kTWCCExt = "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"; class SrsSessionInfo { @@ -115,6 +117,7 @@ public: srs_error_t encode(std::ostringstream& os); SrsMediaPayloadType* find_media_with_payload_type(int payload_type); std::vector find_media_with_encoding_name(const std::string& encoding_name) const; + const std::map& get_extmaps() const { return extmaps_; } bool is_audio() const { return type_ == "audio"; } bool is_video() const { return type_ == "video"; } @@ -128,6 +131,7 @@ private: srs_error_t parse_attr_msid(const std::string& value); srs_error_t parse_attr_ssrc(const std::string& value); srs_error_t parse_attr_ssrc_group(const std::string& value); + srs_error_t parse_attr_extmap(const std::string& value); private: SrsSSRCInfo& fetch_or_create_ssrc_info(uint32_t ssrc); @@ -153,6 +157,7 @@ public: std::vector candidates_; std::vector ssrc_groups_; std::vector ssrc_infos_; + std::map extmaps_; }; class SrsSdp