Browse Source

(Mostly) fixed forwardMedia; It still does not work with chrome compound packets

Staz M 4 years ago
parent
commit
de4192747c
2 changed files with 53 additions and 53 deletions
  1. 6 4
      src/description.cpp
  2. 47 49
      src/peerconnection.cpp

+ 6 - 4
src/description.cpp

@@ -499,6 +499,7 @@ void Description::Entry::parseSdpLine(string_view line) {
 
 void Description::Media::addSSRC(uint32_t ssrc, std::string name) {
     mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + name);
+    mSsrcs.emplace_back(ssrc);
 }
 
 void Description::Media::replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, std::string name) {
@@ -518,7 +519,6 @@ void Description::Media::addSSRC(uint32_t ssrc) {
 
 bool Description::Media::hasSSRC(uint32_t ssrc) {
     return std::find(mSsrcs.begin(), mSsrcs.end(), ssrc) != mSsrcs.end();
-    return false;
 }
 
 Description::Application::Application(string mid)
@@ -669,8 +669,9 @@ void Description::Media::removeFormat(const string &fmt) {
 
 void Description::Video::addVideoCodec(int payloadType, const string &codec) {
 	RTPMap map(std::to_string(payloadType) + ' ' + codec + "/90000");
-        map.addFB("nack");
-	    map.addFB("nack pli");
+    map.addFB("nack");
+    map.addFB("nack pli");
+//    map.addFB("nack fir");
 	map.addFB("goog-remb");
 	if (codec == "H264") {
 		// Use Constrained Baseline profile Level 4.2 (necessary for Firefox)
@@ -682,7 +683,8 @@ void Description::Video::addVideoCodec(int payloadType, const string &codec) {
 		{
 			RTPMap map(std::to_string(payloadType+1) + ' ' + codec + "/90000");
 			map.addFB("nack");
-			    map.addFB("nack pli");
+            map.addFB("nack pli");
+//            map.addFB("nack fir");
 			map.addFB("goog-remb");
 			addRTPMap(map);
 			}

+ 47 - 49
src/peerconnection.cpp

@@ -670,50 +670,64 @@ void PeerConnection::forwardMedia(message_ptr message) {
 
 	// Browsers like to compound their packets with a random SSRC.
 	// we have to do this monstrosity to distribute the report blocks
-//    std::optional<string> mid;
     std::optional<unsigned int> mediaLine;
     if (message->type == Message::Control) {
         unsigned int offset = 0;
         std::vector<SSRC> ssrcsFound;
         bool hasFound = false;
 
-        while ((sizeof(rtc::RTCP_HEADER) + offset) < message->size()) {
+        while ((sizeof(rtc::RTCP_HEADER) + offset) <= message->size()) {
             auto header = (rtc::RTCP_HEADER *) (message->data() + offset);
             if (header->lengthInBytes() > message->size() - offset) {
                 PLOG_WARNING << "Packet was truncated";
                 break;
-            } else {
-                if (header->payloadType() == 205 || header->payloadType() == 206) {
-                    auto rtcpfb = (RTCP_FB_HEADER *) header;
-                    auto ssrc = rtcpfb->getPacketSenderSSRC();
-                    if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) != ssrcsFound.end()) {
-                        mediaLine = getMLineFromSSRC(ssrc);
-                        if (mediaLine.has_value()) {
-                            hasFound = true;
-                            std::shared_lock lock(mTracksMutex); // read-only
-                            if (auto track = mTrackLines[*mediaLine].lock()) {
-                                track->incoming(message);
-                            }
-                            ssrcsFound.emplace_back(ssrc);
+            }
+            offset += header->lengthInBytes();
+            if (header->payloadType() == 205 || header->payloadType() == 206) {
+                auto rtcpfb = (RTCP_FB_HEADER *) header;
+                auto ssrc = rtcpfb->getPacketSenderSSRC();
+                if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
+                    mediaLine = getMLineFromSSRC(ssrc);
+                    if (mediaLine.has_value()) {
+                        hasFound = true;
+                        std::shared_lock lock(mTracksMutex); // read-only
+                        if (auto track = mTrackLines[*mediaLine].lock()) {
+                            track->incoming(message);
                         }
+                        ssrcsFound.emplace_back(ssrc);
                     }
+                }
 
-                    ssrc = rtcpfb->getMediaSourceSSRC();
-                    if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) != ssrcsFound.end()) {
-                        mediaLine = getMLineFromSSRC(ssrc);
-                        if (mediaLine.has_value()) {
-                            hasFound = true;
-                            std::shared_lock lock(mTracksMutex); // read-only
-                            if (auto track = mTrackLines[*mediaLine].lock()) {
-                                track->incoming(message);
-                            }
-                            ssrcsFound.emplace_back(ssrc);
+                ssrc = rtcpfb->getMediaSourceSSRC();
+                if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
+                    mediaLine = getMLineFromSSRC(ssrc);
+                    if (mediaLine.has_value()) {
+                        hasFound = true;
+                        std::shared_lock lock(mTracksMutex); // read-only
+                        if (auto track = mTrackLines[*mediaLine].lock()) {
+                            track->incoming(message);
                         }
+                        ssrcsFound.emplace_back(ssrc);
                     }
-                }else if (header->payloadType() == 200 || header->payloadType() == 201) {
-                    auto rtcpsr = (RTCP_SR*) header;
-                    auto ssrc = rtcpsr->senderSSRC();
-                    if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) != ssrcsFound.end()) {
+                }
+            }else if (header->payloadType() == 200 || header->payloadType() == 201) {
+                auto rtcpsr = (RTCP_SR*) header;
+                auto ssrc = rtcpsr->senderSSRC();
+                if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
+                    mediaLine = getMLineFromSSRC(ssrc);
+                    if (mediaLine.has_value()) {
+                        hasFound = true;
+                        std::shared_lock lock(mTracksMutex); // read-only
+                        if (auto track = mTrackLines[*mediaLine].lock()) {
+                            track->incoming(message);
+                        }
+                        ssrcsFound.emplace_back(ssrc);
+                    }
+                }
+                for (int i = 0; i < rtcpsr->header.reportCount(); i++) {
+                    auto block = rtcpsr->getReportBlock(i);
+                    ssrc = block->getSSRC();
+                    if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) == ssrcsFound.end()) {
                         mediaLine = getMLineFromSSRC(ssrc);
                         if (mediaLine.has_value()) {
                             hasFound = true;
@@ -724,27 +738,11 @@ void PeerConnection::forwardMedia(message_ptr message) {
                             ssrcsFound.emplace_back(ssrc);
                         }
                     }
-                    for (int i = 0; i < rtcpsr->header.reportCount(); i++) {
-                        auto block = rtcpsr->getReportBlock(i);
-                        ssrc = block->getSSRC();
-                        if (std::find(ssrcsFound.begin(), ssrcsFound.end(), ssrc) != ssrcsFound.end()) {
-                            mediaLine = getMLineFromSSRC(ssrc);
-                            if (mediaLine.has_value()) {
-                                hasFound = true;
-                                std::shared_lock lock(mTracksMutex); // read-only
-                                if (auto track = mTrackLines[*mediaLine].lock()) {
-                                    track->incoming(message);
-                                }
-                                ssrcsFound.emplace_back(ssrc);
-                            }
-                        }
-                    }
-                }else {
-		    // This warning is commonly thrown with SDES PT=202
-                    // PLOG_WARNING << "Unknown packet type: " << (int) header->payloadType();
                 }
+            }else {
+        // This warning is commonly thrown with SDES PT=202
+                // PLOG_WARNING << "Unknown packet type: " << (int) header->payloadType();
             }
-            offset += header->lengthInBytes();
         }
 
         if (hasFound)
@@ -761,7 +759,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;
 	}