Browse Source

Fixed the parsing of m= lines

Staz M 4 years ago
parent
commit
3e53706869
3 changed files with 55 additions and 36 deletions
  1. 4 0
      include/rtc/description.hpp
  2. 42 31
      src/description.cpp
  3. 9 5
      src/peerconnection.cpp

+ 4 - 0
include/rtc/description.hpp

@@ -143,6 +143,7 @@ public:
 
         struct RTPMap {
             RTPMap(string_view mline);
+            RTPMap() {}
 
             void removeFB(const string &string);
             void addFB(const string &string);
@@ -158,6 +159,9 @@ public:
 
             std::vector<string> rtcpFbs;
             std::vector<string> fmtps;
+
+            static int parsePT(string_view view);
+            void setMLine(string_view view);
         };
 
 	private:

+ 42 - 31
src/description.cpp

@@ -759,27 +759,28 @@ void Description::Media::parseSdpLine(string_view line) {
 		auto [key, value] = parse_pair(attr);
 
 		if (key == "rtpmap") {
-			Description::Media::RTPMap map(value);
-			int pt = map.pt;
-			mRtpMap.emplace(pt, std::move(map));
+		    auto pt = Description::Media::RTPMap::parsePT(value);
+            auto it = mRtpMap.find(pt);
+            if (it == mRtpMap.end()) {
+                it = mRtpMap.insert(std::make_pair(pt, Description::Media::RTPMap(value))).first;
+            }else {
+                it->second.setMLine(value);
+            }
 		} else if (key == "rtcp-fb") {
 			size_t p = value.find(' ');
 			int pt = to_integer<int>(value.substr(0, p));
 			auto it = mRtpMap.find(pt);
 			if (it == mRtpMap.end()) {
-				PLOG_WARNING << "rtcp-fb applied before the corresponding rtpmap, ignoring";
-			} else {
-				it->second.rtcpFbs.emplace_back(value.substr(p + 1));
-			}
+			    it = mRtpMap.insert(std::make_pair(pt, Description::Media::RTPMap())).first;
+            }
+            it->second.rtcpFbs.emplace_back(value.substr(p + 1));
 		} else if (key == "fmtp") {
 			size_t p = value.find(' ');
 			int pt = to_integer<int>(value.substr(0, p));
 			auto it = mRtpMap.find(pt);
-			if (it == mRtpMap.end()) {
-				PLOG_WARNING << "fmtp applied before the corresponding rtpmap, ignoring";
-			} else {
-				it->second.fmtps.emplace_back(value.substr(p + 1));
-			}
+			if (it == mRtpMap.end())
+                it = mRtpMap.insert(std::make_pair(pt, Description::Media::RTPMap())).first;
+            it->second.fmtps.emplace_back(value.substr(p + 1));
 		} else if (key == "rtcp-mux") {
             // always added
         }else if (key == "ssrc") {
@@ -812,25 +813,7 @@ std::vector<uint32_t> Description::Media::getSSRCs() {
 
 
 Description::Media::RTPMap::RTPMap(string_view mline) {
-	size_t p = mline.find(' ');
-
-	this->pt = to_integer<int>(mline.substr(0, p));
-
-	string_view line = mline.substr(p + 1);
-	size_t spl = line.find('/');
-	this->format = line.substr(0, spl);
-
-	line = line.substr(spl + 1);
-	spl = line.find('/');
-	if (spl == string::npos) {
-		spl = line.find(' ');
-	}
-	if (spl == string::npos)
-		this->clockRate = to_integer<int>(line);
-	else {
-		this->clockRate = to_integer<int>(line.substr(0, spl));
-		this->encParams = line.substr(spl+1);
-	}
+    setMLine(mline);
 }
 
 void Description::Media::RTPMap::removeFB(const string &str) {
@@ -845,6 +828,34 @@ void Description::Media::RTPMap::removeFB(const string &str) {
 
 void Description::Media::RTPMap::addFB(const string &str) { rtcpFbs.emplace_back(str); }
 
+int Description::Media::RTPMap::parsePT(string_view view) {
+    size_t p = view.find(' ');
+
+    return to_integer<int>(view.substr(0, p));
+}
+
+void Description::Media::RTPMap::setMLine(string_view mline) {
+    size_t p = mline.find(' ');
+
+    this->pt = to_integer<int>(mline.substr(0, p));
+
+    string_view line = mline.substr(p + 1);
+    size_t spl = line.find('/');
+    this->format = line.substr(0, spl);
+
+    line = line.substr(spl + 1);
+    spl = line.find('/');
+    if (spl == string::npos) {
+        spl = line.find(' ');
+    }
+    if (spl == string::npos)
+        this->clockRate = to_integer<int>(line);
+    else {
+        this->clockRate = to_integer<int>(line.substr(0, spl));
+        this->encParams = line.substr(spl+1);
+    }
+}
+
 Description::Audio::Audio(string mid, Direction dir)
     : Media("audio 9 UDP/TLS/RTP/SAVPF", std::move(mid), dir) {}
 

+ 9 - 5
src/peerconnection.cpp

@@ -676,6 +676,7 @@ void PeerConnection::forwardMedia(message_ptr message) {
         std::vector<SSRC> ssrcsFound;
         bool hasFound = false;
 
+        PLOG_INFO << "start";
         while ((sizeof(rtc::RTCP_HEADER) + offset) <= message->size()) {
             auto header = (rtc::RTCP_HEADER *) (message->data() + offset);
             if (header->lengthInBytes() > message->size() - offset) {
@@ -711,7 +712,7 @@ void PeerConnection::forwardMedia(message_ptr message) {
                     }
                 }
             }else if (header->payloadType() == 200 || header->payloadType() == 201) {
-                auto rtcpsr = (RTCP_SR*) header;
+                auto rtcpsr = (RTCP_SR *) header;
                 auto ssrc = rtcpsr->senderSSRC();
                 if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
                     mediaLine = getMLineFromSSRC(ssrc);
@@ -739,9 +740,12 @@ void PeerConnection::forwardMedia(message_ptr message) {
                         }
                     }
                 }
-            }else {
-        // This warning is commonly thrown with SDES PT=202
-                // PLOG_WARNING << "Unknown packet type: " << (int) header->payloadType();
+            } else {
+                //PT=202 == SDES
+                //PT=207 == Extended Report
+                if (header->payloadType() != 202 && header->payloadType() != 207) {
+                    PLOG_WARNING << "Unknown packet type: " << (int) header->version() << " " << header->payloadType() << "";
+                }
             }
         }
 
@@ -759,7 +763,7 @@ void PeerConnection::forwardMedia(message_ptr message) {
 	     *   Therefore, it is expected that we don't know where to forward packets.
 	     *   Is this ideal? No! Do I know how to fix it? No!
 	     */
-		PLOG_WARNING << "Track not found for SSRC " << ssrc << ", dropping";
+	//	PLOG_WARNING << "Track not found for SSRC " << ssrc << ", dropping";
 		return;
 	}