Browse Source

Prefer local media when building local description

Paul-Louis Ageneau 4 years ago
parent
commit
f1fa2abd6e
1 changed files with 48 additions and 7 deletions
  1. 48 7
      src/peerconnection.cpp

+ 48 - 7
src/peerconnection.cpp

@@ -374,12 +374,12 @@ std::shared_ptr<Track> PeerConnection::addTrack(Description::Media description)
 	}
 	}
 #endif
 #endif
 
 
-    std::shared_ptr<Track> track;
+	std::shared_ptr<Track> track;
 	if (auto it = mTracks.find(description.mid()); it != mTracks.end())
 	if (auto it = mTracks.find(description.mid()); it != mTracks.end())
-		if(track = it->second.lock(); track)
+		if (track = it->second.lock(); track)
 			track->setDescription(std::move(description));
 			track->setDescription(std::move(description));
 
 
-	if(!track) {
+	if (!track) {
 		track = std::make_shared<Track>(std::move(description));
 		track = std::make_shared<Track>(std::move(description));
 		mTracks.emplace(std::make_pair(track->mid(), track));
 		mTracks.emplace(std::make_pair(track->mid(), track));
 	}
 	}
@@ -856,8 +856,22 @@ void PeerConnection::processLocalDescription(Description description) {
 		for (int i = 0; i < remote->mediaCount(); ++i)
 		for (int i = 0; i < remote->mediaCount(); ++i)
 			std::visit( // reciprocate each media
 			std::visit( // reciprocate each media
 			    rtc::overloaded{
 			    rtc::overloaded{
-			        [&](Description::Application *app) {
-				        auto reciprocated = app->reciprocate();
+			        [&](Description::Application *remoteApp) {
+				        std::shared_lock lock(mDataChannelsMutex);
+				        if (!mDataChannels.empty()) {
+					        // Prefer local description
+					        Description::Application app(remoteApp->mid());
+					        app.setSctpPort(DEFAULT_SCTP_PORT);
+					        app.setMaxMessageSize(LOCAL_MAX_MESSAGE_SIZE);
+
+					        PLOG_DEBUG << "Adding application to local description, mid=\""
+					                   << app.mid() << "\"";
+
+					        description.addMedia(std::move(app));
+					        return;
+				        }
+
+				        auto reciprocated = remoteApp->reciprocate();
 				        reciprocated.hintSctpPort(DEFAULT_SCTP_PORT);
 				        reciprocated.hintSctpPort(DEFAULT_SCTP_PORT);
 				        reciprocated.setMaxMessageSize(LOCAL_MAX_MESSAGE_SIZE);
 				        reciprocated.setMaxMessageSize(LOCAL_MAX_MESSAGE_SIZE);
 
 
@@ -866,8 +880,35 @@ void PeerConnection::processLocalDescription(Description description) {
 
 
 				        description.addMedia(std::move(reciprocated));
 				        description.addMedia(std::move(reciprocated));
 			        },
 			        },
-			        [&](Description::Media *media) {
-				        auto reciprocated = media->reciprocate();
+			        [&](Description::Media *remoteMedia) {
+				        std::shared_lock lock(mTracksMutex);
+				        if (auto it = mTracks.find(remoteMedia->mid()); it != mTracks.end()) {
+					        // Prefer local description
+					        if (auto track = it->second.lock()) {
+						        auto media = track->description();
+#if !RTC_ENABLE_MEDIA
+						        // No media support, mark as inactive
+						        media.setDirection(Description::Direction::Inactive);
+#endif
+						        PLOG_DEBUG
+						            << "Adding media to local description, mid=\"" << media.mid()
+						            << "\", active=" << std::boolalpha
+						            << (media.direction() != Description::Direction::Inactive);
+
+						        description.addMedia(std::move(media));
+					        } else {
+						        auto reciprocated = remoteMedia->reciprocate();
+						        reciprocated.setDirection(Description::Direction::Inactive);
+
+						        PLOG_DEBUG << "Adding inactive media to local description, mid=\""
+						                   << reciprocated.mid() << "\"";
+
+						        description.addMedia(std::move(reciprocated));
+					        }
+					        return;
+				        }
+
+				        auto reciprocated = remoteMedia->reciprocate();
 #if !RTC_ENABLE_MEDIA
 #if !RTC_ENABLE_MEDIA
 				        // No media support, mark as inactive
 				        // No media support, mark as inactive
 				        reciprocated.setDirection(Description::Direction::Inactive);
 				        reciprocated.setDirection(Description::Direction::Inactive);