diff --git a/include/rtc/message.hpp b/include/rtc/message.hpp index 4b470fd..fc32cd0 100644 --- a/include/rtc/message.hpp +++ b/include/rtc/message.hpp @@ -43,7 +43,7 @@ struct RTC_CPP_EXPORT Message : binary { Type type; unsigned int stream = 0; // Stream id (SCTP stream or SSRC) - int dscp = 0; // Differentiated Services Code Point + unsigned int dscp = 0; // Differentiated Services Code Point std::shared_ptr reliability; }; diff --git a/include/rtc/rtp.hpp b/include/rtc/rtp.hpp index aa39fda..558b45e 100644 --- a/include/rtc/rtp.hpp +++ b/include/rtc/rtp.hpp @@ -80,14 +80,10 @@ public: void setTimestamp(uint32_t i) { _timestamp = htonl(i); } void log() { - PLOG_VERBOSE << "RTP V: " << (int) version() - << " P: " << (padding() ? "P" : " ") - << " X: " << (extension() ? "X" : " ") - << " CC: " << (int) csrcCount() - << " M: " << (marker() ? "M" : " ") - << " PT: " << (int) payloadType() - << " SEQNO: " << seqNumber() - << " TS: " << timestamp(); + PLOG_VERBOSE << "RTP V: " << (int)version() << " P: " << (padding() ? "P" : " ") + << " X: " << (extension() ? "X" : " ") << " CC: " << (int)csrcCount() + << " M: " << (marker() ? "M" : " ") << " PT: " << (int)payloadType() + << " SEQNO: " << seqNumber() << " TS: " << timestamp(); } }; @@ -199,9 +195,9 @@ public: inline void log() const { PLOG_VERBOSE << "RTCP header: " - << "version=" << unsigned(version()) << ", padding=" << padding() - << ", reportCount=" << unsigned(reportCount()) - << ", payloadType=" << unsigned(payloadType()) << ", length=" << length(); + << "version=" << unsigned(version()) << ", padding=" << padding() + << ", reportCount=" << unsigned(reportCount()) + << ", payloadType=" << unsigned(payloadType()) << ", length=" << length(); } }; @@ -428,7 +424,7 @@ public: public: void preparePacket(SSRC ssrc, unsigned int discreteSeqNoCount) { - header.header.prepareHeader(205, 1, 2 + static_cast(discreteSeqNoCount)); + header.header.prepareHeader(205, 1, 2 + uint16_t(discreteSeqNoCount)); header.setMediaSourceSSRC(ssrc); header.setPacketSenderSSRC(ssrc); } diff --git a/src/dtlssrtptransport.cpp b/src/dtlssrtptransport.cpp index 3621625..636624c 100644 --- a/src/dtlssrtptransport.cpp +++ b/src/dtlssrtptransport.cpp @@ -142,8 +142,13 @@ bool DtlsSrtpTransport::sendMedia(message_ptr message) { message->resize(size); - // DSCP is set by Track according to the type - return outgoing(message); + if (message->dscp == 0) { // Track might override the value + // Set recommended medium-priority DSCP value + // See https://tools.ietf.org/html/draft-ietf-tsvwg-rtcweb-qos-18 + message->dscp = 36; // AF42: Assured Forwarding class 4, medium drop probability + } + + return Transport::outgoing(message); // bypass DTLS DSCP marking } void DtlsSrtpTransport::incoming(message_ptr message) { diff --git a/src/dtlstransport.cpp b/src/dtlstransport.cpp index adfef65..d11322f 100644 --- a/src/dtlstransport.cpp +++ b/src/dtlstransport.cpp @@ -145,7 +145,9 @@ void DtlsTransport::incoming(message_ptr message) { } bool DtlsTransport::outgoing(message_ptr message) { - message->dscp = mCurrentDscp; + if (message->dscp == 0) + message->dscp = mCurrentDscp; + return Transport::outgoing(std::move(message)); } @@ -427,7 +429,9 @@ void DtlsTransport::incoming(message_ptr message) { } bool DtlsTransport::outgoing(message_ptr message) { - message->dscp = mCurrentDscp; + if (message->dscp == 0) + message->dscp = mCurrentDscp; + return Transport::outgoing(std::move(message)); } diff --git a/src/dtlstransport.hpp b/src/dtlstransport.hpp index 89a51d4..fa82995 100644 --- a/src/dtlstransport.hpp +++ b/src/dtlstransport.hpp @@ -63,7 +63,7 @@ protected: Queue mIncomingQueue; std::thread mRecvThread; - std::atomic mCurrentDscp; + std::atomic mCurrentDscp; #if USE_GNUTLS gnutls_session_t mSession; diff --git a/src/icetransport.cpp b/src/icetransport.cpp index 34d5e5b..81d82af 100644 --- a/src/icetransport.cpp +++ b/src/icetransport.cpp @@ -223,7 +223,7 @@ bool IceTransport::send(message_ptr message) { bool IceTransport::outgoing(message_ptr message) { // Explicit Congestion Notification takes the least-significant 2 bits of the DS field - int ds = message->dscp << 2; + int ds = int(message->dscp << 2); return juice_send_diffserv(mAgent.get(), reinterpret_cast(message->data()), message->size(), ds) >= 0; } @@ -623,7 +623,7 @@ bool IceTransport::outgoing(message_ptr message) { if (mOutgoingDscp != message->dscp) { mOutgoingDscp = message->dscp; // Explicit Congestion Notification takes the least-significant 2 bits of the DS field - int ds = message->dscp << 2; + int ds = int(message->dscp << 2); nice_agent_set_stream_tos(mNiceAgent.get(), mStreamId, ds); // ToS is the legacy name for DS } return nice_agent_send(mNiceAgent.get(), mStreamId, 1, message->size(), diff --git a/src/icetransport.hpp b/src/icetransport.hpp index b941418..703e205 100644 --- a/src/icetransport.hpp +++ b/src/icetransport.hpp @@ -101,7 +101,7 @@ private: std::thread mMainLoopThread; guint mTimeoutId = 0; std::mutex mOutgoingMutex; - int mOutgoingDscp; + unsigned int mOutgoingDscp; static string AddressToString(const NiceAddress &addr); diff --git a/src/track.cpp b/src/track.cpp index bea5fb5..869f836 100644 --- a/src/track.cpp +++ b/src/track.cpp @@ -155,7 +155,7 @@ void Track::incoming(message_ptr message) { void Track::setRtcpHandler(std::shared_ptr handler) { mRtcpHandler = std::move(handler); if (mRtcpHandler) { - mRtcpHandler->onOutgoing([&]([[maybe_unused]] const rtc::message_ptr &message) { + mRtcpHandler->onOutgoing([&]([[maybe_unused]] message_ptr message) { #if RTC_ENABLE_MEDIA auto transport = mDtlsSrtpTransport.lock(); if (!transport)