Browse Source

Merge branch 'v0.18'

Paul-Louis Ageneau 1 year ago
parent
commit
f8c9869f09

+ 1 - 1
include/rtc/rtcpnackresponder.hpp

@@ -37,9 +37,9 @@ class RTC_CPP_EXPORT RtcpNackResponder final : public MediaHandlerElement {
 		shared_ptr<Element> oldest = nullptr;
 		/// Newest packet in storage
 		shared_ptr<Element> newest = nullptr;
-
 		/// Inner storage
 		std::unordered_map<uint16_t, shared_ptr<Element>> storage{};
+		std::mutex mutex;
 
 		/// Maximum storage size
 		const unsigned maximumSize;

+ 5 - 4
src/impl/datachannel.cpp

@@ -95,11 +95,12 @@ void DataChannel::close() {
 		transport = mSctpTransport.lock();
 	}
 
-	if (mIsOpen.exchange(false) && transport && mStream.has_value())
-		transport->closeStream(mStream.value());
+	if (!mIsClosed.exchange(true)) {
+		if (transport && mStream.has_value())
+			transport->closeStream(mStream.value());
 
-	if (!mIsClosed.exchange(true))
 		triggerClosed();
+	}
 
 	resetCallbacks();
 }
@@ -140,7 +141,7 @@ Reliability DataChannel::reliability() const {
 	return *mReliability;
 }
 
-bool DataChannel::isOpen(void) const { return mIsOpen; }
+bool DataChannel::isOpen(void) const { return !mIsClosed && mIsOpen; }
 
 bool DataChannel::isClosed(void) const { return mIsClosed; }
 

+ 1 - 1
src/impl/peerconnection.cpp

@@ -446,7 +446,7 @@ void PeerConnection::forwardMessage(message_ptr message) {
 		if (found) {
 			// The stream is already used, the receiver must close the DataChannel
 			PLOG_WARNING << "Got open message on already used stream " << stream;
-			if(channel && channel->isOpen())
+			if(channel && !channel->isClosed())
 				channel->close();
 			else
 				sctpTransport->closeStream(message->stream);

+ 2 - 0
src/rtcpnackresponder.cpp

@@ -28,6 +28,7 @@ RtcpNackResponder::Storage::Storage(unsigned _maximumSize) : maximumSize(_maximu
 }
 
 optional<binary_ptr> RtcpNackResponder::Storage::get(uint16_t sequenceNumber) {
+	std::lock_guard lock(mutex);
 	auto position = storage.find(sequenceNumber);
 	return position != storage.end() ? std::make_optional(storage.at(sequenceNumber)->packet)
 	                                 : nullopt;
@@ -40,6 +41,7 @@ void RtcpNackResponder::Storage::store(binary_ptr packet) {
 	auto rtp = reinterpret_cast<RtpHeader *>(packet->data());
 	auto sequenceNumber = rtp->seqNumber();
 
+	std::lock_guard lock(mutex);
 	assert((storage.empty() && !oldest && !newest) || (!storage.empty() && oldest && newest));
 
 	if (size() == 0) {