Browse Source

Fixed how media is offered during renegotiations

Staz M 4 years ago
parent
commit
3faf053bbd
1 changed files with 45 additions and 42 deletions
  1. 45 42
      src/peerconnection.cpp

+ 45 - 42
src/peerconnection.cpp

@@ -381,6 +381,7 @@ std::shared_ptr<Track> PeerConnection::addTrack(Description::Media description)
 #endif
 	auto track = std::make_shared<Track>(std::move(description));
 	mTracks.emplace(std::make_pair(track->mid(), track));
+    mTrackLines.emplace_back(track);
 
 	// Renegotiation is needed for the new track
 	mNegotiationNeeded = true;
@@ -948,39 +949,41 @@ void PeerConnection::validateRemoteDescription(const Description &description) {
 }
 
 void PeerConnection::processLocalDescription(Description description) {
-	if (auto remote = remoteDescription()) {
-		// Reciprocate remote description
-		for (unsigned int i = 0; i < remote->mediaCount(); ++i)
-			std::visit( // reciprocate each media
-			    rtc::overloaded{
-			        [&](Description::Application *app) {
-				        auto reciprocated = app->reciprocate();
-				        reciprocated.hintSctpPort(DEFAULT_SCTP_PORT);
-				        reciprocated.setMaxMessageSize(LOCAL_MAX_MESSAGE_SIZE);
-
-				        PLOG_DEBUG << "Reciprocating application in local description, mid=\""
-				                   << reciprocated.mid() << "\"";
-
-				        description.addMedia(std::move(reciprocated));
-			        },
-			        [&](Description::Media *media) {
-				        auto reciprocated = media->reciprocate();
+	if (mSignalingState == SignalingState::HaveRemoteOffer) {
+        if (auto remote = remoteDescription()) {
+            // Reciprocate remote description
+            for (unsigned int i = 0; i < remote->mediaCount(); ++i)
+                std::visit( // reciprocate each media
+                        rtc::overloaded{
+                                [&](Description::Application *app) {
+                                    auto reciprocated = app->reciprocate();
+                                    reciprocated.hintSctpPort(DEFAULT_SCTP_PORT);
+                                    reciprocated.setMaxMessageSize(LOCAL_MAX_MESSAGE_SIZE);
+
+                                    PLOG_DEBUG << "Reciprocating application in local description, mid=\""
+                                               << reciprocated.mid() << "\"";
+
+                                    description.addMedia(std::move(reciprocated));
+                                },
+                                [&](Description::Media *media) {
+                                    auto reciprocated = media->reciprocate();
 #if !RTC_ENABLE_MEDIA
-				        // No media support, mark as inactive
-				        reciprocated.setDirection(Description::Direction::Inactive);
+                                    // No media support, mark as inactive
+                                    reciprocated.setDirection(Description::Direction::Inactive);
 #endif
-				        incomingTrack(reciprocated);
+                                    incomingTrack(reciprocated);
 
-				        PLOG_DEBUG
-				            << "Reciprocating media in local description, mid=\""
-				            << reciprocated.mid() << "\", active=" << std::boolalpha
-				            << (reciprocated.direction() != Description::Direction::Inactive);
+                                    PLOG_DEBUG
+                                                << "Reciprocating media in local description, mid=\""
+                                                << reciprocated.mid() << "\", active=" << std::boolalpha
+                                                << (reciprocated.direction() != Description::Direction::Inactive);
 
-				        description.addMedia(std::move(reciprocated));
-			        },
-			    },
-			    remote->media(i));
-	}
+                                    description.addMedia(std::move(reciprocated));
+                                },
+                        },
+                        remote->media(i));
+        }
+    }
 
 	if (description.type() == Description::Type::Offer) {
 		// This is an offer, add locally created data channels and tracks
@@ -1002,23 +1005,23 @@ void PeerConnection::processLocalDescription(Description description) {
 		// Add media for local tracks
 
 		std::shared_lock lock(mTracksMutex);
-		for (auto it = mTracks.begin(); it != mTracks.end(); ++it) {
-			if (description.hasMid(it->first))
-				continue;
+        for (auto it = mTrackLines.begin(); it != mTrackLines.end(); ++it) {
+            if (auto track = it->lock()) {
+                if (description.hasMid(track->mid()))
+                    continue;
 
-			if (auto track = it->second.lock()) {
-				auto media = track->description();
+                auto media = track->description();
 #if !RTC_ENABLE_MEDIA
-				// No media support, mark as inactive
-				media.setDirection(Description::Direction::Inactive);
+                // 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);
+                PLOG_DEBUG << "Adding media to local description, mid=\"" << media.mid()
+                           << "\", active=" << std::boolalpha
+                           << (media.direction() != Description::Direction::Inactive);
 
-				description.addMedia(std::move(media));
-			}
-		}
+                description.addMedia(std::move(media));
+            }
+        }
 	}
 
 	// Set local fingerprint (wait for certificate if necessary)