Browse Source

Added optional parameter for media SDP to setRemoteDescription()

Paul-Louis Ageneau 5 years ago
parent
commit
a6d2729556
2 changed files with 19 additions and 17 deletions
  1. 3 2
      include/rtc/peerconnection.hpp
  2. 16 15
      src/peerconnection.cpp

+ 3 - 2
include/rtc/peerconnection.hpp

@@ -80,8 +80,9 @@ public:
 	std::optional<string> localAddress() const;
 	std::optional<string> localAddress() const;
 	std::optional<string> remoteAddress() const;
 	std::optional<string> remoteAddress() const;
 
 
-	void setLocalDescription(std::optional<Description> description = nullopt);
-	void setRemoteDescription(Description description);
+	void setLocalDescription(std::optional<Description> mediaDescription = nullopt);
+	void setRemoteDescription(Description description,
+	                          std::optional<Description> mediaDescription = nullopt);
 	void addRemoteCandidate(Candidate candidate);
 	void addRemoteCandidate(Candidate candidate);
 
 
 	std::shared_ptr<DataChannel> createDataChannel(const string &label, const string &protocol = "",
 	std::shared_ptr<DataChannel> createDataChannel(const string &label, const string &protocol = "",

+ 16 - 15
src/peerconnection.cpp

@@ -81,25 +81,25 @@ std::optional<Description> PeerConnection::remoteDescription() const {
 	return mRemoteDescription;
 	return mRemoteDescription;
 }
 }
 
 
-void PeerConnection::setLocalDescription(std::optional<Description> description) {
+void PeerConnection::setLocalDescription(std::optional<Description> mediaDescription) {
 	PLOG_VERBOSE << "Setting local description";
 	PLOG_VERBOSE << "Setting local description";
 
 
-	if (auto iceTransport = std::atomic_load(&mIceTransport)) {
+	if (std::atomic_load(&mIceTransport))
 		throw std::logic_error("Local description is already set");
 		throw std::logic_error("Local description is already set");
-	} else {
-		// RFC 5763: The endpoint that is the offerer MUST use the setup attribute value of
-		// setup:actpass.
-		// See https://tools.ietf.org/html/rfc5763#section-5
-		iceTransport = initIceTransport(Description::Role::ActPass);
-		Description localDescription = iceTransport->getLocalDescription(Description::Type::Offer);
-		if (description)
-			localDescription.addMedia(*description);
-		processLocalDescription(localDescription);
-		iceTransport->gatherLocalCandidates();
-	}
+
+	// RFC 5763: The endpoint that is the offerer MUST use the setup attribute value of
+	// setup:actpass.
+	// See https://tools.ietf.org/html/rfc5763#section-5
+	auto iceTransport = initIceTransport(Description::Role::ActPass);
+	Description localDescription = iceTransport->getLocalDescription(Description::Type::Offer);
+	if (mediaDescription)
+		localDescription.addMedia(*mediaDescription);
+	processLocalDescription(localDescription);
+	iceTransport->gatherLocalCandidates();
 }
 }
 
 
-void PeerConnection::setRemoteDescription(Description description) {
+void PeerConnection::setRemoteDescription(Description description,
+                                          std::optional<Description> mediaDescription) {
 	PLOG_VERBOSE << "Setting remote description: " << string(description);
 	PLOG_VERBOSE << "Setting remote description: " << string(description);
 
 
 	description.hintType(localDescription() ? Description::Type::Answer : Description::Type::Offer);
 	description.hintType(localDescription() ? Description::Type::Answer : Description::Type::Offer);
@@ -119,7 +119,8 @@ void PeerConnection::setRemoteDescription(Description description) {
 	if (type == Description::Type::Offer) {
 	if (type == Description::Type::Offer) {
 		// This is an offer and we are the answerer.
 		// This is an offer and we are the answerer.
 		Description localDescription = iceTransport->getLocalDescription(Description::Type::Answer);
 		Description localDescription = iceTransport->getLocalDescription(Description::Type::Answer);
-		localDescription.addMedia(description); // blindly accept media
+		if (mediaDescription)
+			localDescription.addMedia(*mediaDescription);
 		processLocalDescription(localDescription);
 		processLocalDescription(localDescription);
 		iceTransport->gatherLocalCandidates();
 		iceTransport->gatherLocalCandidates();
 	} else {
 	} else {