Bladeren bron

Added media constructor from SDP

Paul-Louis Ageneau 5 jaren geleden
bovenliggende
commit
f720cbac0c
2 gewijzigde bestanden met toevoegingen van 34 en 13 verwijderingen
  1. 3 2
      include/rtc/description.hpp
  2. 31 11
      src/description.cpp

+ 3 - 2
include/rtc/description.hpp

@@ -75,7 +75,7 @@ public:
 		virtual string generateSdp(string_view eol) const;
 
 	protected:
-		Entry(string mline, string mid = "", Direction dir = Direction::Unknown);
+		Entry(const string &mline, string mid, Direction dir = Direction::Unknown);
 
 		std::vector<string> mAttributes;
 
@@ -113,7 +113,8 @@ public:
 	// Media (non-data)
 	class Media : public Entry {
 	public:
-		Media(string mline, string mid = "media", Direction dir = Direction::SendOnly);
+		Media(const string &sdp);
+		Media(const string &mline, string mid, Direction dir = Direction::SendOnly);
 		Media(const Media &other) = default;
 		Media(Media &&other) = default;
 		virtual ~Media() = default;

+ 31 - 11
src/description.cpp

@@ -365,13 +365,14 @@ Description::media(int index) const {
 
 int Description::mediaCount() const { return int(mEntries.size()); }
 
-Description::Entry::Entry(string mline, string mid, Direction dir)
+Description::Entry::Entry(const string &mline, string mid, Direction dir)
     : mMid(std::move(mid)), mDirection(dir) {
-	size_t p = mline.find(' ');
-	mType = mline.substr(0, p);
-	if (p != string::npos)
-		if (size_t q = mline.find(' ', p + 1); q != string::npos)
-			mDescription = mline.substr(q + 1, mline.find(' ', q + 1) - (q + 1));
+
+	unsigned int port;
+	std::istringstream ss(mline);
+	ss >> mType;
+	ss >> port; // ignored
+	ss >> mDescription;
 }
 
 void Description::Entry::setDirection(Direction dir) { mDirection = dir; }
@@ -473,10 +474,29 @@ void Description::Application::parseSdpLine(string_view line) {
 	}
 }
 
-Description::Media::Media(string mline, string mid, Direction dir)
-    : Entry(std::move(mline), std::move(mid), dir) {
-	mAttributes.emplace_back("rtcp-mux");
-	mAttributes.emplace_back("rtcp-mux-only");
+Description::Media::Media(const string &sdp) : Entry(sdp, "", Direction::Unknown) {
+	std::istringstream ss(sdp);
+	string line;
+	while (std::getline(ss, line) || !line.empty()) {
+		trim_end(line);
+		parseSdpLine(line);
+	}
+
+	if (mid().empty())
+		throw std::invalid_argument("Missing mid in media SDP");
+
+	const std::array<string, 2> attributes = {"rtcp-mux", "rtcp-mux-only"};
+	for (auto attr : attributes)
+		if (std::find(mAttributes.begin(), mAttributes.end(), attr) != mAttributes.end())
+			mAttributes.emplace_back(attr);
+}
+
+Description::Media::Media(const string &mline, string mid, Direction dir)
+    : Entry(mline, std::move(mid), dir) {
+
+	const std::array<string, 2> attributes = {"rtcp-mux", "rtcp-mux-only"};
+	for (auto attr : attributes)
+		mAttributes.emplace_back(attr);
 }
 
 string Description::Media::description() const {
@@ -512,7 +532,7 @@ Description::Media::RTPMap &Description::Media::getFormat(int fmt) {
 	if (it != mRtpMap.end())
 		return it->second;
 
-	throw std::invalid_argument("mLineIndex is out of bounds");
+	throw std::invalid_argument("m-line index is out of bounds");
 }
 
 Description::Media::RTPMap &Description::Media::getFormat(const string &fmt) {