Browse Source

Merge branch 'v0.20'

Paul-Louis Ageneau 1 year ago
parent
commit
437a758ae8
3 changed files with 15 additions and 1 deletions
  1. 2 0
      include/rtc/message.hpp
  2. 2 1
      src/impl/dtlssrtptransport.cpp
  3. 11 0
      src/message.cpp

+ 2 - 0
include/rtc/message.hpp

@@ -59,6 +59,8 @@ RTC_CPP_EXPORT message_ptr make_message(binary &&data, Message::Type type = Mess
                                         unsigned int stream = 0,
                                         unsigned int stream = 0,
                                         shared_ptr<Reliability> reliability = nullptr);
                                         shared_ptr<Reliability> reliability = nullptr);
 
 
+RTC_CPP_EXPORT message_ptr make_message(size_t size, message_ptr orig);
+
 RTC_CPP_EXPORT message_ptr make_message(message_variant data);
 RTC_CPP_EXPORT message_ptr make_message(message_variant data);
 
 
 #if RTC_ENABLE_MEDIA
 #if RTC_ENABLE_MEDIA

+ 2 - 1
src/impl/dtlssrtptransport.cpp

@@ -104,7 +104,8 @@ bool DtlsSrtpTransport::sendMedia(message_ptr message) {
 
 
 	// srtp_protect() and srtp_protect_rtcp() assume that they can write SRTP_MAX_TRAILER_LEN (for
 	// srtp_protect() and srtp_protect_rtcp() assume that they can write SRTP_MAX_TRAILER_LEN (for
 	// the authentication tag) into the location in memory immediately following the RTP packet.
 	// the authentication tag) into the location in memory immediately following the RTP packet.
-	message->resize(size + SRTP_MAX_TRAILER_LEN);
+	// Copy instead of resizing so we don't interfere with media handlers keeping references
+	message = make_message(size + SRTP_MAX_TRAILER_LEN, message);
 
 
 	if (IsRtcp(*message)) { // Demultiplex RTCP and RTP using payload type
 	if (IsRtcp(*message)) { // Demultiplex RTCP and RTP using payload type
 		if (srtp_err_status_t err = srtp_protect_rtcp(mSrtpOut, message->data(), &size)) {
 		if (srtp_err_status_t err = srtp_protect_rtcp(mSrtpOut, message->data(), &size)) {

+ 11 - 0
src/message.cpp

@@ -26,6 +26,17 @@ message_ptr make_message(binary &&data, Message::Type type, unsigned int stream,
 	return message;
 	return message;
 }
 }
 
 
+message_ptr make_message(size_t size, message_ptr orig) {
+	if(!orig)
+		return nullptr;
+
+	auto message = std::make_shared<Message>(size, orig->type);
+	std::copy(orig->begin(), std::min(orig->end(), orig->begin() + size), message->begin());
+	message->stream = orig->stream;
+	message->reliability = orig->reliability;
+	return message;
+}
+
 message_ptr make_message(message_variant data) {
 message_ptr make_message(message_variant data) {
 	return std::visit( //
 	return std::visit( //
 	    overloaded{
 	    overloaded{