Browse Source

Moves session-level attributes for `a=setup`, `a=ice-ufrag` and `a=ice-pwd` to the media-level in `Description::generateSdp(...)`. The goal here is to have better general compatibility as RFC 8829 recommends using the media-level attributes even if the information is identical.

William Pfeffer 1 year ago
parent
commit
13daa796e5
1 changed files with 8 additions and 5 deletions
  1. 8 5
      src/description.cpp

+ 8 - 5
src/description.cpp

@@ -310,12 +310,7 @@ string Description::generateSdp(string_view eol) const {
 
 
 	// Session-level attributes
 	// Session-level attributes
 	sdp << "a=msid-semantic:WMS *" << eol;
 	sdp << "a=msid-semantic:WMS *" << eol;
-	sdp << "a=setup:" << mRole << eol;
 
 
-	if (mIceUfrag)
-		sdp << "a=ice-ufrag:" << *mIceUfrag << eol;
-	if (mIcePwd)
-		sdp << "a=ice-pwd:" << *mIcePwd << eol;
 	if (!mIceOptions.empty())
 	if (!mIceOptions.empty())
 		sdp << "a=ice-options:" << utils::implode(mIceOptions, ',') << eol;
 		sdp << "a=ice-options:" << utils::implode(mIceOptions, ',') << eol;
 	if (mFingerprint)
 	if (mFingerprint)
@@ -339,6 +334,14 @@ string Description::generateSdp(string_view eol) const {
 	for (const auto &entry : mEntries) {
 	for (const auto &entry : mEntries) {
 		sdp << entry->generateSdp(eol, addr, port);
 		sdp << entry->generateSdp(eol, addr, port);
 
 
+		// RFC 8829: Attributes that SDP permits to be at either the session level or the media level
+		// SHOULD generally be at the media level even if they are identical.
+		sdp << "a=setup:" << mRole << eol;
+		if (mIceUfrag)
+			sdp << "a=ice-ufrag:" << *mIceUfrag << eol;
+		if (mIcePwd)
+			sdp << "a=ice-pwd:" << *mIcePwd << eol;
+
 		if (!entry->isRemoved() && std::exchange(first, false)) {
 		if (!entry->isRemoved() && std::exchange(first, false)) {
 			// Candidates
 			// Candidates
 			for (const auto &candidate : mCandidates)
 			for (const auto &candidate : mCandidates)