|
@@ -369,21 +369,24 @@ void PeerConnection::onSignalingStateChange(std::function<void(SignalingState st
|
|
}
|
|
}
|
|
|
|
|
|
std::shared_ptr<Track> PeerConnection::addTrack(Description::Media description) {
|
|
std::shared_ptr<Track> PeerConnection::addTrack(Description::Media description) {
|
|
-
|
|
|
|
- if (auto it = mTracks.find(description.mid()); it != mTracks.end())
|
|
|
|
- if (auto track = it->second.lock())
|
|
|
|
- return track;
|
|
|
|
-
|
|
|
|
#if !RTC_ENABLE_MEDIA
|
|
#if !RTC_ENABLE_MEDIA
|
|
if (mTracks.empty()) {
|
|
if (mTracks.empty()) {
|
|
PLOG_WARNING << "Tracks will be inative (not compiled with SRTP support)";
|
|
PLOG_WARNING << "Tracks will be inative (not compiled with SRTP support)";
|
|
}
|
|
}
|
|
#endif
|
|
#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
|
|
|
|
|
|
+ std::shared_ptr<Track> track;
|
|
|
|
+ if (auto it = mTracks.find(description.mid()); it != mTracks.end())
|
|
|
|
+ if (track = it->second.lock(); track)
|
|
|
|
+ track->setDescription(std::move(description));
|
|
|
|
+
|
|
|
|
+ if (!track) {
|
|
|
|
+ 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 or updated track
|
|
mNegotiationNeeded = true;
|
|
mNegotiationNeeded = true;
|
|
|
|
|
|
return track;
|
|
return track;
|
|
@@ -949,24 +952,65 @@ void PeerConnection::validateRemoteDescription(const Description &description) {
|
|
}
|
|
}
|
|
|
|
|
|
void PeerConnection::processLocalDescription(Description description) {
|
|
void PeerConnection::processLocalDescription(Description description) {
|
|
- 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 (auto remote = remoteDescription()) {
|
|
|
|
+ // Reciprocate remote description
|
|
|
|
+ for (size_t i = 0; i < remote->mediaCount(); ++i)
|
|
|
|
+ std::visit( // reciprocate each media
|
|
|
|
+ rtc::overloaded{
|
|
|
|
+ [&](Description::Application *remoteApp) {
|
|
|
|
+ std::shared_lock lock(mDataChannelsMutex);
|
|
|
|
+ if (!mDataChannels.empty()) {
|
|
|
|
+ // Prefer local description
|
|
|
|
+ Description::Application app(remoteApp->mid());
|
|
|
|
+ app.setSctpPort(DEFAULT_SCTP_PORT);
|
|
|
|
+ app.setMaxMessageSize(LOCAL_MAX_MESSAGE_SIZE);
|
|
|
|
+
|
|
|
|
+ PLOG_DEBUG << "Adding application to local description, mid=\""
|
|
|
|
+ << app.mid() << "\"";
|
|
|
|
+
|
|
|
|
+ description.addMedia(std::move(app));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ auto reciprocated = remoteApp->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 *remoteMedia) {
|
|
|
|
+ std::shared_lock lock(mTracksMutex);
|
|
|
|
+ if (auto it = mTracks.find(remoteMedia->mid()); it != mTracks.end()) {
|
|
|
|
+ // Prefer local description
|
|
|
|
+ if (auto track = it->second.lock()) {
|
|
|
|
+ auto media = track->description();
|
|
|
|
+#if !RTC_ENABLE_MEDIA
|
|
|
|
+ // 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);
|
|
|
|
+
|
|
|
|
+ description.addMedia(std::move(media));
|
|
|
|
+ } else {
|
|
|
|
+ auto reciprocated = remoteMedia->reciprocate();
|
|
|
|
+ reciprocated.setDirection(Description::Direction::Inactive);
|
|
|
|
+
|
|
|
|
+ PLOG_DEBUG << "Adding inactive media to local description, mid=\""
|
|
|
|
+ << reciprocated.mid() << "\"";
|
|
|
|
+
|
|
|
|
+ description.addMedia(std::move(reciprocated));
|
|
|
|
+ }
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ auto reciprocated = remoteMedia->reciprocate();
|
|
#if !RTC_ENABLE_MEDIA
|
|
#if !RTC_ENABLE_MEDIA
|
|
// No media support, mark as inactive
|
|
// No media support, mark as inactive
|
|
reciprocated.setDirection(Description::Direction::Inactive);
|
|
reciprocated.setDirection(Description::Direction::Inactive);
|
|
@@ -983,7 +1027,6 @@ void PeerConnection::processLocalDescription(Description description) {
|
|
},
|
|
},
|
|
remote->media(i));
|
|
remote->media(i));
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
|
|
if (description.type() == Description::Type::Offer) {
|
|
if (description.type() == Description::Type::Offer) {
|
|
// This is an offer, add locally created data channels and tracks
|
|
// This is an offer, add locally created data channels and tracks
|
|
@@ -1156,7 +1199,7 @@ bool PeerConnection::changeState(State state) {
|
|
bool PeerConnection::changeGatheringState(GatheringState state) {
|
|
bool PeerConnection::changeGatheringState(GatheringState state) {
|
|
if (mGatheringState.exchange(state) == state)
|
|
if (mGatheringState.exchange(state) == state)
|
|
return false;
|
|
return false;
|
|
-
|
|
|
|
|
|
+
|
|
std::ostringstream s;
|
|
std::ostringstream s;
|
|
s << state;
|
|
s << state;
|
|
PLOG_INFO << "Changed gathering state to " << s.str();
|
|
PLOG_INFO << "Changed gathering state to " << s.str();
|
|
@@ -1165,9 +1208,9 @@ bool PeerConnection::changeGatheringState(GatheringState state) {
|
|
}
|
|
}
|
|
|
|
|
|
bool PeerConnection::changeSignalingState(SignalingState state) {
|
|
bool PeerConnection::changeSignalingState(SignalingState state) {
|
|
- if (mSignalingState.exchange(state) == state)
|
|
|
|
|
|
+ if (mSignalingState.exchange(state) == state)
|
|
return false;
|
|
return false;
|
|
-
|
|
|
|
|
|
+
|
|
std::ostringstream s;
|
|
std::ostringstream s;
|
|
s << state;
|
|
s << state;
|
|
PLOG_INFO << "Changed signaling state to " << s.str();
|
|
PLOG_INFO << "Changed signaling state to " << s.str();
|