Browse Source

Pass RTCP messages to first track and do not start SCTP without application

Paul-Louis Ageneau 5 years ago
parent
commit
d836b95c5d
3 changed files with 24 additions and 8 deletions
  1. 1 0
      include/rtc/description.hpp
  2. 6 3
      src/description.cpp
  3. 17 5
      src/peerconnection.cpp

+ 1 - 0
include/rtc/description.hpp

@@ -168,6 +168,7 @@ public:
 		Video(string mid = "video", Direction dir = Direction::SendOnly);
 	};
 
+	bool hasApplication() const;
 	bool hasAudioOrVideo() const;
 
 	int addMedia(Media media);

+ 6 - 3
src/description.cpp

@@ -208,12 +208,12 @@ string Description::generateSdp(string_view eol) const {
 	sdp << "a=ice-ufrag:" << mIceUfrag << eol;
 	sdp << "a=ice-pwd:" << mIcePwd << eol;
 
-	if (mFingerprint)
-		sdp << "a=fingerprint:sha-256 " << *mFingerprint << eol;
-
 	if (!mEnded)
 		sdp << "a=ice-options:trickle" << eol;
 
+	if (mFingerprint)
+		sdp << "a=fingerprint:sha-256 " << *mFingerprint << eol;
+
 	// Entries
 	bool first = true;
 	for (const auto &entry : mEntries) {
@@ -292,6 +292,8 @@ void Description::removeApplication() {
 	mApplication.reset();
 }
 
+bool Description::hasApplication() const { return mApplication != nullptr; }
+
 bool Description::hasAudioOrVideo() const {
 	for (auto entry : mEntries)
 		if (entry != mApplication)
@@ -466,6 +468,7 @@ void Description::Application::parseSdpLine(string_view line) {
 Description::Media::Media(string mline, string mid, Direction dir)
     : Entry(std::move(mline), std::move(mid), dir) {
 	mAttributes.emplace_back("rtcp-mux");
+	mAttributes.emplace_back("rtcp-mux-only");
 }
 
 string Description::Media::description() const {

+ 17 - 5
src/peerconnection.cpp

@@ -233,8 +233,7 @@ void PeerConnection::onGatheringStateChange(std::function<void(GatheringState st
 
 bool PeerConnection::hasMedia() const {
 	auto local = localDescription();
-	auto remote = remoteDescription();
-	return (local && local->hasAudioOrVideo()) || (remote && remote->hasAudioOrVideo());
+	return local && local->hasAudioOrVideo();
 }
 
 std::shared_ptr<Track> PeerConnection::createTrack(Description::Media description) {
@@ -328,7 +327,10 @@ shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
 
 			switch (state) {
 			case DtlsTransport::State::Connected:
-				initSctpTransport();
+				if (auto local = localDescription())
+					if (local->hasApplication())
+						initSctpTransport();
+
 				openTracks();
 				break;
 			case DtlsTransport::State::Failed:
@@ -519,6 +521,16 @@ void PeerConnection::forwardMedia(message_ptr message) {
 	if (!message)
 		return;
 
+	if (message->type == Message::Type::Control) {
+		std::shared_lock lock(mTracksMutex); // read-only
+		for (auto it = mTracks.begin(); it != mTracks.end(); ++it)
+			if (auto track = it->second.lock())
+				return track->incoming(message);
+
+		PLOG_WARNING << "No track available to receive control, dropping";
+		return;
+	}
+
 	unsigned int payloadType = message->stream;
 	std::optional<string> mid;
 	if (auto it = mMidFromPayloadType.find(payloadType); it != mMidFromPayloadType.end()) {
@@ -529,7 +541,7 @@ void PeerConnection::forwardMedia(message_ptr message) {
 			return;
 
 		for (int i = 0; i < mLocalDescription->mediaCount(); ++i) {
-			if (auto found = std::visit( // reciprocate each media
+			if (auto found = std::visit(
 			        rtc::overloaded{[&](Description::Application *) -> std::optional<string> {
 				                        return std::nullopt;
 			                        },
@@ -548,7 +560,7 @@ void PeerConnection::forwardMedia(message_ptr message) {
 	}
 
 	if (!mid) {
-		PLOG_WARNING << "Track not found for payload type " << payloadType;
+		PLOG_WARNING << "Track not found for payload type " << payloadType << ", dropping";
 		return;
 	}