Browse Source

Keep candidates when rolling back the local description

Paul-Louis Ageneau 4 years ago
parent
commit
5ce699d33b
3 changed files with 21 additions and 10 deletions
  1. 1 0
      include/rtc/description.hpp
  2. 5 0
      src/description.cpp
  3. 15 10
      src/peerconnection.cpp

+ 1 - 0
include/rtc/description.hpp

@@ -55,6 +55,7 @@ public:
 	void setFingerprint(string fingerprint);
 	void setFingerprint(string fingerprint);
 
 
 	void addCandidate(Candidate candidate);
 	void addCandidate(Candidate candidate);
+	void addCandidates(std::vector<Candidate> candidates);
 	void endCandidates();
 	void endCandidates();
 	std::vector<Candidate> extractCandidates();
 	std::vector<Candidate> extractCandidates();
 
 

+ 5 - 0
src/description.cpp

@@ -176,6 +176,11 @@ void Description::addCandidate(Candidate candidate) {
 	mCandidates.emplace_back(std::move(candidate));
 	mCandidates.emplace_back(std::move(candidate));
 }
 }
 
 
+void Description::addCandidates(std::vector<Candidate> candidates) {
+	for(auto candidate : candidates)
+		mCandidates.emplace_back(std::move(candidate));
+}
+
 void Description::endCandidates() { mEnded = true; }
 void Description::endCandidates() { mEnded = true; }
 
 
 std::vector<Candidate> Description::extractCandidates() {
 std::vector<Candidate> Description::extractCandidates() {

+ 15 - 10
src/peerconnection.cpp

@@ -109,13 +109,20 @@ void PeerConnection::setLocalDescription(Description::Type type) {
 	if (type == Description::Type::Rollback) {
 	if (type == Description::Type::Rollback) {
 		if (signalingState == SignalingState::HaveLocalOffer ||
 		if (signalingState == SignalingState::HaveLocalOffer ||
 		    signalingState == SignalingState::HaveLocalPranswer) {
 		    signalingState == SignalingState::HaveLocalPranswer) {
-			PLOG_VERBOSE << "Rolling back pending local description";
-			if (mCurrentLocalDescription)
-				mLocalDescription.emplace(std::move(*mCurrentLocalDescription));
-			else
-				mLocalDescription.reset();
+			PLOG_DEBUG << "Rolling back pending local description";
+			
+			std::unique_lock lock(mLocalDescriptionMutex);
+			if (mCurrentLocalDescription) {
+				std::vector<Candidate> existingCandidates;
+				if (mLocalDescription)
+					existingCandidates = mLocalDescription->extractCandidates();
 
 
-			mCurrentLocalDescription.reset();
+				mLocalDescription.emplace(std::move(*mCurrentLocalDescription));
+				mLocalDescription->addCandidates(std::move(existingCandidates));
+				mCurrentLocalDescription.reset();
+			}
+			lock.unlock();
+			
 			changeSignalingState(SignalingState::Stable);
 			changeSignalingState(SignalingState::Stable);
 		}
 		}
 		return;
 		return;
@@ -925,8 +932,7 @@ void PeerConnection::processLocalDescription(Description description) {
 		}
 		}
 
 
 		mLocalDescription.emplace(std::move(description));
 		mLocalDescription.emplace(std::move(description));
-		for (const auto &candidate : existingCandidates)
-			mLocalDescription->addCandidate(candidate);
+		mLocalDescription->addCandidates(std::move(existingCandidates));
 	}
 	}
 
 
 	mProcessor->enqueue([this, description = *mLocalDescription]() {
 	mProcessor->enqueue([this, description = *mLocalDescription]() {
@@ -964,8 +970,7 @@ void PeerConnection::processRemoteDescription(Description description) {
 			existingCandidates = mRemoteDescription->extractCandidates();
 			existingCandidates = mRemoteDescription->extractCandidates();
 
 
 		mRemoteDescription.emplace(std::move(description));
 		mRemoteDescription.emplace(std::move(description));
-		for (const auto &candidate : existingCandidates)
-			mRemoteDescription->addCandidate(candidate);
+		mRemoteDescription->addCandidates(std::move(existingCandidates));
 	}
 	}
 
 
 	if (description.hasApplication()) {
 	if (description.hasApplication()) {