From 0d1dfa7fbfa4b61a429596c6c29d9da4bcf333d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 20 Feb 2024 14:20:49 +0100 Subject: [PATCH 1/6] Fix regression (crash) in Transport CC handling - Fixes #1336 ### Details - Regression introduced in PR #1088, which has many issues. - Basically there are cases in which `this->transportCcFeedbackPacket` is reset so it's a complete new packet and hence its `baseSet` is `false`. - However in `TransportCongestionControlServer::FillAndSendTransportCcFeedback()` in which we just call `this->transportCcFeedbackPacket.SetBase()` once at the top, but then we enter a loop in which the packet maybe full so it's sent (or other things) and hence we **reset** the packet while in the loop. And then at the top of the loop `this->transportCcFeedbackPacket.AddPacket()` is called so the assertion fails because its `SetBase()` was not called on that fresh packet. - Also add a missing `break` in a `case` block in that loop. - Also set proper packet count in all cases in which we reset `this->transportCcFeedbackPacket`. ### TODO This is not done yet. The issue is mainly identified but I don't know yet how to properly fix it without doing other wrong things. Basically I'm not sure if the whole logic is ok after PR #1088: - As said before we only set the base of the packet once at the beginning of the loop, and such a `SetBase()` is called with `this->transportCcFeedbackWideSeqNumStart` and a computed `timestamp`. - However, within the loop below, the packet may become full and hence `SendTransportCcFeedback()` is called, which updates `++this->transportCcFeedbackPacketCount` and `this->transportCcFeedbackWideSeqNumStart`, and **also** resets the packet (so missing base again). - So in order to fix the crash, we must call `SetBase()` again, but which which values? Because the values given initially at the top of `TransportCongestionControlServer::FillAndSendTransportCcFeedback()` were the value of `this->transportCcFeedbackWideSeqNumStart` at that time and a timestamp. But that `this->transportCcFeedbackWideSeqNumStart` has now changed, so then what? - Basically every time `this->transportCcFeedbackPacket.reset()` is called (and there are various cases in the whole `TransportCongestionControlServer.cpp` file) **we must** call ``SetBase()` on the fresh packet **with** proper values. And which are those proper values if we are within that loop? --- .../RTC/TransportCongestionControlServer.hpp | 1 + .../RTC/TransportCongestionControlServer.cpp | 43 +++++++++++++------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/worker/include/RTC/TransportCongestionControlServer.hpp b/worker/include/RTC/TransportCongestionControlServer.hpp index 5cfd676796..706ff7d54c 100644 --- a/worker/include/RTC/TransportCongestionControlServer.hpp +++ b/worker/include/RTC/TransportCongestionControlServer.hpp @@ -95,6 +95,7 @@ namespace RTC // Whether any packet with transport wide sequence number was received. bool transportWideSeqNumberReceived{ false }; uint16_t transportCcFeedbackWideSeqNumStart{ 0u }; + // Map of arrival timestamp (ms) indexed by wide seq number. std::map::SeqLowerThan> mapPacketArrivalTimes; }; } // namespace RTC diff --git a/worker/src/RTC/TransportCongestionControlServer.cpp b/worker/src/RTC/TransportCongestionControlServer.cpp index 6fe639e175..aa1742f8dc 100644 --- a/worker/src/RTC/TransportCongestionControlServer.cpp +++ b/worker/src/RTC/TransportCongestionControlServer.cpp @@ -96,6 +96,9 @@ namespace RTC // Create a new feedback packet. this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket(0u, 0u)); + // Set current packet count. + this->transportCcFeedbackPacket->SetFeedbackPacketCount(this->transportCcFeedbackPacketCount); + break; } @@ -131,9 +134,10 @@ namespace RTC break; } - // We may receive packets with sequence number lower than the one in previous - // tcc feedback, these packets may have been reported as lost previously, - // therefore we need to reset the start sequence num for the next tcc feedback. + // We may receive packets with sequence number lower than the one in + // previous tcc feedback, these packets may have been reported as lost + // previously, therefore we need to reset the start sequence num for the + // next tcc feedback. if ( !this->transportWideSeqNumberReceived || RTC::SeqManager::IsSeqLowerThan( @@ -192,13 +196,17 @@ namespace RTC return; } + auto baseTimestamp = it->second; + // Set base sequence num and reference time. - this->transportCcFeedbackPacket->SetBase(this->transportCcFeedbackWideSeqNumStart, it->second); + this->transportCcFeedbackPacket->SetBase(this->transportCcFeedbackWideSeqNumStart, baseTimestamp); for (; it != this->mapPacketArrivalTimes.end(); ++it) { - auto result = - this->transportCcFeedbackPacket->AddPacket(it->first, it->second, this->maxRtcpPacketLen); + auto sequenceNumber = it->first; + auto timestamp = it->second; + auto result = this->transportCcFeedbackPacket->AddPacket( + sequenceNumber, timestamp, this->maxRtcpPacketLen); switch (result) { @@ -223,6 +231,14 @@ namespace RTC // Create a new feedback packet. this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); + + // Set current packet count. + // NOTE: Do not increment it since the previous ongoing feedback + // packet was not sent. + this->transportCcFeedbackPacket->SetFeedbackPacketCount( + this->transportCcFeedbackPacketCount); + + break; } case RTC::RTCP::FeedbackRtpTransportPacket::AddPacketResult::FATAL: @@ -231,7 +247,7 @@ namespace RTC this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); - // Use current packet count. + // Set current packet count. // NOTE: Do not increment it since the previous ongoing feedback // packet was not sent. this->transportCcFeedbackPacket->SetFeedbackPacketCount( @@ -242,6 +258,8 @@ namespace RTC } } + // It may happen that the packet is empty (no deltas) but in that case + // SendTransportCcFeedback() won't send it so we are safe. SendTransportCcFeedback(); } @@ -264,7 +282,7 @@ namespace RTC } } - inline void TransportCongestionControlServer::SendTransportCcFeedback() + void TransportCongestionControlServer::SendTransportCcFeedback() { MS_TRACE(); @@ -307,8 +325,7 @@ namespace RTC this->transportCcFeedbackWideSeqNumStart = latestWideSeqNumber + 1; } - inline void TransportCongestionControlServer::MayDropOldPacketArrivalTimes( - uint16_t seqNum, uint64_t nowMs) + void TransportCongestionControlServer::MayDropOldPacketArrivalTimes(uint16_t seqNum, uint64_t nowMs) { MS_TRACE(); @@ -330,7 +347,7 @@ namespace RTC } } - inline void TransportCongestionControlServer::MaySendLimitationRembFeedback(uint64_t nowMs) + void TransportCongestionControlServer::MaySendLimitationRembFeedback(uint64_t nowMs) { MS_TRACE(); @@ -402,7 +419,7 @@ namespace RTC this->packetLoss = totalPacketLoss / samples; } - inline void TransportCongestionControlServer::OnRembServerAvailableBitrate( + void TransportCongestionControlServer::OnRembServerAvailableBitrate( const webrtc::RemoteBitrateEstimator* /*rembServer*/, const std::vector& ssrcs, uint32_t availableBitrate) @@ -440,7 +457,7 @@ namespace RTC this->listener->OnTransportCongestionControlServerSendRtcpPacket(this, &packet); } - inline void TransportCongestionControlServer::OnTimer(TimerHandle* timer) + void TransportCongestionControlServer::OnTimer(TimerHandle* timer) { MS_TRACE(); From 42a0968e47ca104b13efb8ab06f552ba0524161c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 20 Feb 2024 14:54:40 +0100 Subject: [PATCH 2/6] Call this->transportCcFeedbackPacket->SetBase() when needed --- .../include/RTC/RTCP/FeedbackRtpTransport.hpp | 4 +++ worker/src/RTC/RTCP/FeedbackRtpTransport.cpp | 2 ++ .../RTC/TransportCongestionControlServer.cpp | 25 +++++++++++-------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp b/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp index 901df0c46c..fff4d3fbe0 100644 --- a/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp +++ b/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp @@ -212,6 +212,10 @@ namespace RTC ~FeedbackRtpTransportPacket() override; public: + bool IsBaseSet() const + { + return this->baseSet; + } void SetBase(uint16_t sequenceNumber, uint64_t timestamp); AddPacketResult AddPacket(uint16_t sequenceNumber, uint64_t timestamp, size_t maxRtcpPacketLen); // Just for locally generated packets. diff --git a/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp b/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp index efd9d591bc..601af63754 100644 --- a/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp +++ b/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp @@ -282,6 +282,8 @@ namespace RTC { MS_TRACE(); + MS_ASSERT(!this->baseSet, "base already set"); + this->baseSet = true; this->baseSequenceNumber = sequenceNumber; this->referenceTime = static_cast((timestamp & 0x1FFFFFC0) / 64); diff --git a/worker/src/RTC/TransportCongestionControlServer.cpp b/worker/src/RTC/TransportCongestionControlServer.cpp index aa1742f8dc..1cce281109 100644 --- a/worker/src/RTC/TransportCongestionControlServer.cpp +++ b/worker/src/RTC/TransportCongestionControlServer.cpp @@ -35,9 +35,6 @@ namespace RTC // Create a feedback packet. this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket(0u, 0u)); - // Set initial packet count. - this->transportCcFeedbackPacket->SetFeedbackPacketCount(this->transportCcFeedbackPacketCount); - // Create the feedback send periodic timer. this->transportCcFeedbackSendPeriodicTimer = new TimerHandle(this); @@ -196,17 +193,23 @@ namespace RTC return; } - auto baseTimestamp = it->second; - - // Set base sequence num and reference time. - this->transportCcFeedbackPacket->SetBase(this->transportCcFeedbackWideSeqNumStart, baseTimestamp); - for (; it != this->mapPacketArrivalTimes.end(); ++it) { auto sequenceNumber = it->first; auto timestamp = it->second; - auto result = this->transportCcFeedbackPacket->AddPacket( - sequenceNumber, timestamp, this->maxRtcpPacketLen); + + // If the base is not set in this packet let's set it. + // NOTE: This maybe needed many times during this loop since the current + // feedback packet maybe a fresh new one if the previous one was full (so + // already sent) or failed to be built. + if (!this->transportCcFeedbackPacket->IsBaseSet()) + { + // Set base sequence num and reference time. + this->transportCcFeedbackPacket->SetBase(this->transportCcFeedbackWideSeqNumStart, timestamp); + } + + auto result = this->transportCcFeedbackPacket->AddPacket( + sequenceNumber, timestamp, this->maxRtcpPacketLen); switch (result) { @@ -226,7 +229,7 @@ namespace RTC case RTC::RTCP::FeedbackRtpTransportPacket::AddPacketResult::MAX_SIZE_EXCEEDED: { // This should not happen. - MS_WARN_DEV("transport-cc feedback packet is exceeded"); + MS_WARN_TAG(rtcp, "transport-cc feedback packet is exceeded"); // Create a new feedback packet. this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( From d1d12315c82e1cc2b2e220ec6dbdf8287dcfa5b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 20 Feb 2024 16:19:07 +0100 Subject: [PATCH 3/6] cosmetic --- worker/src/RTC/RTCP/FeedbackRtpTransport.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp b/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp index 601af63754..9d497677b4 100644 --- a/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp +++ b/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp @@ -299,8 +299,8 @@ namespace RTC MS_ASSERT(this->baseSet, "base not set"); MS_ASSERT(!IsFull(), "packet is full"); - // If the wide sequence number of the new packet is lower than the latest seen, - // ignore it. + // If the wide sequence number of the new packet is lower than the latest + // seen, ignore it. // NOTE: Not very spec compliant but libwebrtc does it. // Also ignore if the sequence number matches the latest seen. if (!RTC::SeqManager::IsSeqHigherThan(sequenceNumber, this->latestSequenceNumber)) @@ -342,7 +342,8 @@ namespace RTC // Delta in 16 bits signed. auto delta = static_cast(delta64); - // Check whether another chunks and corresponding delta infos could be added. + // Check whether another chunks and corresponding delta infos could be + // added. { // Fixed packet size. size_t size = FeedbackRtpPacket::GetSize(); From a975137a8f50579fcca1d02cc23a3a4783ae379a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 20 Feb 2024 16:44:05 +0100 Subject: [PATCH 4/6] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e81b85c00..45b24b01b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +### Next + +- Fix regression (crash) in transport-cc feedback generation ([PR #1339](https://github.com/versatica/mediasoup/pull/1339)). + ### 3.13.19 - Node: Fix `router.createWebRtcTransport()` with `listenIps` ([PR #1330](https://github.com/versatica/mediasoup/pull/1330)). From b8a411b1d2b200040f053a1a79649b96f68d2085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 20 Feb 2024 17:39:32 +0100 Subject: [PATCH 5/6] fix scenario in which feedback-cc packet is full but cannot be sent --- .../RTC/TransportCongestionControlServer.hpp | 3 ++- .../RTC/TransportCongestionControlServer.cpp | 22 ++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/worker/include/RTC/TransportCongestionControlServer.hpp b/worker/include/RTC/TransportCongestionControlServer.hpp index 706ff7d54c..61c173feb5 100644 --- a/worker/include/RTC/TransportCongestionControlServer.hpp +++ b/worker/include/RTC/TransportCongestionControlServer.hpp @@ -58,7 +58,8 @@ namespace RTC void FillAndSendTransportCcFeedback(); private: - void SendTransportCcFeedback(); + // Returns true if a feedback packet was sent. + bool SendTransportCcFeedback(); void MayDropOldPacketArrivalTimes(uint16_t seqNum, uint64_t nowMs); void MaySendLimitationRembFeedback(uint64_t nowMs); void UpdatePacketLoss(double packetLoss); diff --git a/worker/src/RTC/TransportCongestionControlServer.cpp b/worker/src/RTC/TransportCongestionControlServer.cpp index 1cce281109..454292d1d5 100644 --- a/worker/src/RTC/TransportCongestionControlServer.cpp +++ b/worker/src/RTC/TransportCongestionControlServer.cpp @@ -220,7 +220,19 @@ namespace RTC { MS_DEBUG_DEV("transport-cc feedback packet is full, sending feedback now"); - SendTransportCcFeedback(); + if (!SendTransportCcFeedback()) + { + // If no feedback packet was sent then the feedback packet was + // not reset and hence it remains full so we cannot add more + // packets on it, so we have to reset it. + this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( + this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); + + // Set current packet count. + // NOTE: Do not increment it since no feedback packet was sent. + this->transportCcFeedbackPacket->SetFeedbackPacketCount( + this->transportCcFeedbackPacketCount); + } } break; @@ -285,7 +297,7 @@ namespace RTC } } - void TransportCongestionControlServer::SendTransportCcFeedback() + bool TransportCongestionControlServer::SendTransportCcFeedback() { MS_TRACE(); @@ -293,7 +305,9 @@ namespace RTC if (!this->transportCcFeedbackPacket->IsSerializable()) { - return; + MS_WARN_DEV("couldn't send feedback packet (not serializable)"); + + return false; } auto latestWideSeqNumber = this->transportCcFeedbackPacket->GetLatestSequenceNumber(); @@ -326,6 +340,8 @@ namespace RTC // Increment packet count. this->transportCcFeedbackPacket->SetFeedbackPacketCount(++this->transportCcFeedbackPacketCount); this->transportCcFeedbackWideSeqNumStart = latestWideSeqNumber + 1; + + return true; } void TransportCongestionControlServer::MayDropOldPacketArrivalTimes(uint16_t seqNum, uint64_t nowMs) From 77d0df212212600c1d40126f9cba669cc12a1782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Tue, 20 Feb 2024 18:32:04 +0100 Subject: [PATCH 6/6] Add private TransportCongestionControlServer::ResetTransportCcFeedback() method --- .../RTC/TransportCongestionControlServer.hpp | 1 + .../RTC/TransportCongestionControlServer.cpp | 75 +++++++++---------- 2 files changed, 36 insertions(+), 40 deletions(-) diff --git a/worker/include/RTC/TransportCongestionControlServer.hpp b/worker/include/RTC/TransportCongestionControlServer.hpp index 61c173feb5..af5e6d7482 100644 --- a/worker/include/RTC/TransportCongestionControlServer.hpp +++ b/worker/include/RTC/TransportCongestionControlServer.hpp @@ -63,6 +63,7 @@ namespace RTC void MayDropOldPacketArrivalTimes(uint16_t seqNum, uint64_t nowMs); void MaySendLimitationRembFeedback(uint64_t nowMs); void UpdatePacketLoss(double packetLoss); + void ResetTransportCcFeedback(uint8_t feedbackPacketCount); /* Pure virtual methods inherited from webrtc::RemoteBitrateEstimator::Listener. */ public: diff --git a/worker/src/RTC/TransportCongestionControlServer.cpp b/worker/src/RTC/TransportCongestionControlServer.cpp index 454292d1d5..001bf6b9e0 100644 --- a/worker/src/RTC/TransportCongestionControlServer.cpp +++ b/worker/src/RTC/TransportCongestionControlServer.cpp @@ -33,7 +33,7 @@ namespace RTC case RTC::BweType::TRANSPORT_CC: { // Create a feedback packet. - this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket(0u, 0u)); + ResetTransportCcFeedback(0u); // Create the feedback send periodic timer. this->transportCcFeedbackSendPeriodicTimer = new TimerHandle(this); @@ -91,10 +91,7 @@ namespace RTC this->transportCcFeedbackSendPeriodicTimer->Stop(); // Create a new feedback packet. - this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket(0u, 0u)); - - // Set current packet count. - this->transportCcFeedbackPacket->SetFeedbackPacketCount(this->transportCcFeedbackPacketCount); + ResetTransportCcFeedback(this->transportCcFeedbackPacketCount); break; } @@ -220,19 +217,15 @@ namespace RTC { MS_DEBUG_DEV("transport-cc feedback packet is full, sending feedback now"); - if (!SendTransportCcFeedback()) + auto sent = SendTransportCcFeedback(); + + if (sent) { - // If no feedback packet was sent then the feedback packet was - // not reset and hence it remains full so we cannot add more - // packets on it, so we have to reset it. - this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( - this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); - - // Set current packet count. - // NOTE: Do not increment it since no feedback packet was sent. - this->transportCcFeedbackPacket->SetFeedbackPacketCount( - this->transportCcFeedbackPacketCount); + ++this->transportCcFeedbackPacketCount; } + + // Create a new feedback packet. + ResetTransportCcFeedback(this->transportCcFeedbackPacketCount); } break; @@ -244,14 +237,9 @@ namespace RTC MS_WARN_TAG(rtcp, "transport-cc feedback packet is exceeded"); // Create a new feedback packet. - this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( - this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); - - // Set current packet count. - // NOTE: Do not increment it since the previous ongoing feedback - // packet was not sent. - this->transportCcFeedbackPacket->SetFeedbackPacketCount( - this->transportCcFeedbackPacketCount); + // NOTE: Do not increment packet count it since the previous ongoing + // feedback packet was not sent. + ResetTransportCcFeedback(this->transportCcFeedbackPacketCount); break; } @@ -259,14 +247,9 @@ namespace RTC case RTC::RTCP::FeedbackRtpTransportPacket::AddPacketResult::FATAL: { // Create a new feedback packet. - this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( - this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); - - // Set current packet count. - // NOTE: Do not increment it since the previous ongoing feedback - // packet was not sent. - this->transportCcFeedbackPacket->SetFeedbackPacketCount( - this->transportCcFeedbackPacketCount); + // NOTE: Do not increment packet count it since the previous ongoing + // feedback packet was not sent. + ResetTransportCcFeedback(this->transportCcFeedbackPacketCount); break; } @@ -275,7 +258,15 @@ namespace RTC // It may happen that the packet is empty (no deltas) but in that case // SendTransportCcFeedback() won't send it so we are safe. - SendTransportCcFeedback(); + auto sent = SendTransportCcFeedback(); + + if (sent) + { + ++this->transportCcFeedbackPacketCount; + } + + // Create a new feedback packet. + ResetTransportCcFeedback(this->transportCcFeedbackPacketCount); } void TransportCongestionControlServer::SetMaxIncomingBitrate(uint32_t bitrate) @@ -305,7 +296,7 @@ namespace RTC if (!this->transportCcFeedbackPacket->IsSerializable()) { - MS_WARN_DEV("couldn't send feedback packet (not serializable)"); + MS_WARN_TAG(rtcp, "couldn't send feedback-cc packet because it is not serializable"); return false; } @@ -333,12 +324,6 @@ namespace RTC this->UpdatePacketLoss(static_cast(lostPackets) / expectedPackets); } - // Create a new feedback packet. - this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( - this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); - - // Increment packet count. - this->transportCcFeedbackPacket->SetFeedbackPacketCount(++this->transportCcFeedbackPacketCount); this->transportCcFeedbackWideSeqNumStart = latestWideSeqNumber + 1; return true; @@ -438,6 +423,16 @@ namespace RTC this->packetLoss = totalPacketLoss / samples; } + void TransportCongestionControlServer::ResetTransportCcFeedback(uint8_t feedbackPacketCount) + { + MS_TRACE(); + + this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket( + this->transportCcFeedbackSenderSsrc, this->transportCcFeedbackMediaSsrc)); + + this->transportCcFeedbackPacket->SetFeedbackPacketCount(feedbackPacketCount); + } + void TransportCongestionControlServer::OnRembServerAvailableBitrate( const webrtc::RemoteBitrateEstimator* /*rembServer*/, const std::vector& ssrcs,