Browse Source

Changed the message stream from being a payloadType to SSRC

Staz M 4 years ago
parent
commit
549e194bb3

+ 1 - 0
include/rtc/description.hpp

@@ -130,6 +130,7 @@ public:
         void removeFormat(const string &fmt);
 
         void addSSRC(uint32_t ssrc, std::string name);
+        bool hasSSRC(uint32_t ssrc);
 
 		void setBitrate(int bitrate);
 		int getBitrate() const;

+ 1 - 1
include/rtc/peerconnection.hpp

@@ -162,7 +162,7 @@ private:
 	std::unordered_map<string, std::weak_ptr<Track>> mTracks;                   // by mid
 	std::shared_mutex mDataChannelsMutex, mTracksMutex;
 
-	std::unordered_map<unsigned int, string> mMidFromPayloadType; // cache
+	std::unordered_map<unsigned int, string> mMidFromSssrc; // cache
 
 	std::atomic<State> mState;
 	std::atomic<GatheringState> mGatheringState;

+ 10 - 0
src/description.cpp

@@ -446,6 +446,14 @@ void Description::Media::addSSRC(uint32_t ssrc, std::string name) {
     mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + name);
 }
 
+bool Description::Media::hasSSRC(uint32_t ssrc) {
+    for (auto &val : mAttributes) {
+        if (val.find("ssrc:" + std::to_string(ssrc)) != std::string ::npos)
+            return true;
+    }
+    return false;
+}
+
 Description::Application::Application(string mid)
     : Entry("application 9 UDP/DTLS/SCTP", std::move(mid), Direction::SendRecv) {}
 
@@ -698,6 +706,8 @@ void Description::Media::addRTPMap(const Description::Media::RTPMap& map) {
     mRtpMap.emplace(map.pt, map);
 }
 
+
+
 Description::Media::RTPMap::RTPMap(string_view mline) {
 	size_t p = mline.find(' ');
 

+ 4 - 2
src/dtlssrtptransport.cpp

@@ -183,7 +183,8 @@ void DtlsSrtpTransport::incoming(message_ptr message) {
 			}
 			PLOG_VERBOSE << "Unprotected SRTCP packet, size=" << size;
 			message->type = Message::Type::Control;
-			message->stream = to_integer<uint8_t>(*(message->begin() + 1)); // Payload Type
+            auto rtp = (RTCP_SR*) message->data();
+			message->stream = ntohl(rtp->senderSSRC);
 		} else {
 			PLOG_VERBOSE << "Incoming SRTP packet, size=" << size;
 			if (srtp_err_status_t err = srtp_unprotect(mSrtpIn, message->data(), &size)) {
@@ -197,7 +198,8 @@ void DtlsSrtpTransport::incoming(message_ptr message) {
 			}
 			PLOG_VERBOSE << "Unprotected SRTP packet, size=" << size;
 			message->type = Message::Type::Binary;
-			message->stream = value2; // Payload Type
+			auto rtp = (RTP*) message->data();
+			message->stream = rtp->ssrc();
 		}
 
 		message->resize(size);

+ 18 - 18
src/peerconnection.cpp

@@ -544,47 +544,47 @@ void PeerConnection::forwardMedia(message_ptr message) {
 	if (!message)
 		return;
 
-	if (message->type == Message::Type::Control) {
-		std::shared_lock lock(mTracksMutex); // read-only
-		for (auto it = mTracks.begin(); it != mTracks.end(); ++it)
-			if (auto track = it->second.lock())
-				return track->incoming(message);
-
-		PLOG_WARNING << "No track available to receive control, dropping";
-		return;
-	}
-
-	unsigned int payloadType = message->stream;
+//	if (message->type == Message::Type::Control) {
+//		std::shared_lock lock(mTracksMutex); // read-only
+//		for (auto it = mTracks.begin(); it != mTracks.end(); ++it)
+//			if (auto track = it->second.lock())
+//				return track->incoming(message);
+//
+//		PLOG_WARNING << "No track available to receive control, dropping";
+//		return;
+//	}
+
+	unsigned int ssrc = message->stream;
 	std::optional<string> mid;
-	if (auto it = mMidFromPayloadType.find(payloadType); it != mMidFromPayloadType.end()) {
+	if (auto it = mMidFromSssrc.find(ssrc); it != mMidFromSssrc.end()) {
 		mid = it->second;
 	} else {
 		std::lock_guard lock(mLocalDescriptionMutex);
 		if (!mLocalDescription)
 			return;
 
-		for (int i = 0; i < mLocalDescription->mediaCount(); ++i) {
+		for (int i = 0; i < mRemoteDescription->mediaCount(); ++i) {
 			if (auto found = std::visit(
 			        rtc::overloaded{[&](Description::Application *) -> std::optional<string> {
 				                        return std::nullopt;
 			                        },
 			                        [&](Description::Media *media) -> std::optional<string> {
-				                        return media->hasPayloadType(payloadType)
+				                        return media->hasSSRC(ssrc)
 				                                   ? std::make_optional(media->mid())
 				                                   : nullopt;
 			                        }},
-			        mLocalDescription->media(i))) {
+                    mRemoteDescription->media(i))) {
 
-				mMidFromPayloadType.emplace(payloadType, *found);
+				mMidFromSssrc.emplace(ssrc, *found);
 				mid = *found;
 				break;
 			}else
-                PLOG_WARNING << "Unknown payload type" << payloadType;
+                PLOG_WARNING << "Unknown SSRC " << ssrc;
 		}
 	}
 
 	if (!mid) {
-		PLOG_WARNING << "Track not found for payload type " << payloadType << ", dropping";
+		PLOG_WARNING << "Track not found for SSRC " << ssrc << ", dropping";
 		return;
 	}