From 6662568c1154d1bc2a835255576dd258510ea8fb Mon Sep 17 00:00:00 2001 From: "jinxue.cgh" Date: Sat, 27 Jun 2020 17:06:33 +0800 Subject: [PATCH] RTC: sdp surpport ssrc group encode and decode --- trunk/src/app/srs_app_rtc_sdp.cpp | 52 +++++++++++++++++++++++++++++-- trunk/src/app/srs_app_rtc_sdp.hpp | 11 +++++++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_sdp.cpp b/trunk/src/app/srs_app_rtc_sdp.cpp index 4c3d9f53c..5e2a584fd 100644 --- a/trunk/src/app/srs_app_rtc_sdp.cpp +++ b/trunk/src/app/srs_app_rtc_sdp.cpp @@ -206,6 +206,40 @@ srs_error_t SrsSSRCInfo::encode(std::ostringstream& os) return err; } +SrsSSRCGroup::SrsSSRCGroup() +{ +} + +SrsSSRCGroup::~SrsSSRCGroup() +{ +} + +SrsSSRCGroup::SrsSSRCGroup(const std::string& semantic, const std::vector& ssrcs) +{ + semantic_ = semantic; + ssrcs_ = ssrcs; +} + +srs_error_t SrsSSRCGroup::encode(std::ostringstream& os) +{ + srs_error_t err = srs_success; + + if (semantic_.empty()) { + return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid semantics"); + } + + if (ssrcs_.size() == 0) { + return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid ssrcs"); + } + + os << "a=ssrc-group:" << semantic_; + for (int i = 0; i < (int)ssrcs_.size(); i++) { + os << " " << ssrcs_[i]; + } + + return err; +} + SrsMediaPayloadType::SrsMediaPayloadType(int payload_type) { payload_type_ = payload_type; @@ -589,6 +623,7 @@ srs_error_t SrsMediaDesc::parse_attr_ssrc(const std::string& value) ssrc_info.cname_ = ssrc_value; ssrc_info.ssrc_ = ssrc; } else if (ssrc_attr == "msid") { + // @see: https://tools.ietf.org/html/draft-alvestrand-mmusic-msid-00#section-2 std::vector vec = split_str(ssrc_value, " "); if (vec.empty()) { return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid ssrc line=%s", value.c_str()); @@ -618,10 +653,23 @@ srs_error_t SrsMediaDesc::parse_attr_ssrc_group(const std::string& value) std::string semantics; FETCH(is, semantics); - // TODO: ssrc group process - if (semantics == "FID") { + std::string ssrc_ids = is.str().substr(is.tellg()); + skip_first_spaces(ssrc_ids); + + std::vector vec = split_str(ssrc_ids, " "); + if (vec.size() == 0) { + return srs_error_new(ERROR_RTC_SDP_DECODE, "invalid ssrc-group line=%s", value.c_str()); } + std::vector ssrcs; + for (size_t i = 0; i < vec.size(); ++i) { + std::istringstream in_stream(vec[i]); + uint32_t ssrc = 0; + in_stream >> ssrc; + ssrcs.push_back(ssrc); + } + ssrc_groups_.push_back(SrsSSRCGroup(semantics, ssrcs)); + return err; } diff --git a/trunk/src/app/srs_app_rtc_sdp.hpp b/trunk/src/app/srs_app_rtc_sdp.hpp index b923affc5..c09af3ee0 100644 --- a/trunk/src/app/srs_app_rtc_sdp.hpp +++ b/trunk/src/app/srs_app_rtc_sdp.hpp @@ -78,6 +78,17 @@ public: class SrsSSRCGroup { +public: + SrsSSRCGroup(); + SrsSSRCGroup(const std::string& usage, const std::vector& ssrcs); + virtual ~SrsSSRCGroup(); +public: + srs_error_t encode(std::ostringstream& os); +public: + // e.g FIX, FEC, SIM. + std::string semantic_; + // SSRCs of this type. + std::vector ssrcs_; }; struct H264SpecificParam