mediasoup 3.27.1 → 3.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/node/lib/Consumer.d.ts.map +1 -1
- package/node/lib/Consumer.js +4 -51
- package/node/lib/Producer.d.ts.map +1 -1
- package/node/lib/Producer.js +4 -8
- package/node/lib/ProducerTypes.d.ts +4 -2
- package/node/lib/ProducerTypes.d.ts.map +1 -1
- package/node/lib/Router.d.ts.map +1 -1
- package/node/lib/Router.js +4 -0
- package/node/lib/Transport.d.ts.map +1 -1
- package/node/lib/Transport.js +7 -10
- package/node/lib/fbs/rtp-parameters/rtp-header-extension-uri.d.ts +3 -4
- package/node/lib/fbs/rtp-parameters/rtp-header-extension-uri.d.ts.map +1 -1
- package/node/lib/fbs/rtp-parameters/rtp-header-extension-uri.js +3 -4
- package/node/lib/ortc.d.ts +0 -2
- package/node/lib/ortc.d.ts.map +1 -1
- package/node/lib/ortc.js +11 -21
- package/node/lib/rtpMappingFbsUtils.d.ts +6 -0
- package/node/lib/rtpMappingFbsUtils.d.ts.map +1 -0
- package/node/lib/rtpMappingFbsUtils.js +65 -0
- package/node/lib/rtpParametersFbsUtils.d.ts.map +1 -1
- package/node/lib/rtpParametersFbsUtils.js +0 -6
- package/node/lib/rtpParametersTypes.d.ts +1 -1
- package/node/lib/rtpParametersTypes.d.ts.map +1 -1
- package/node/lib/rtpStreamFbsUtils.d.ts +4 -0
- package/node/lib/rtpStreamFbsUtils.d.ts.map +1 -0
- package/node/lib/rtpStreamFbsUtils.js +51 -0
- package/node/lib/supportedRtpCapabilities.d.ts.map +1 -1
- package/node/lib/supportedRtpCapabilities.js +6 -13
- package/node/lib/test/test-Consumer.js +1 -13
- package/node/lib/test/test-DataConsumer.js +9 -0
- package/node/lib/test/test-DataProducer.js +38 -0
- package/node/lib/test/test-PipeTransport.js +27 -29
- package/node/lib/test/test-Producer.js +97 -0
- package/node/lib/test/test-ortc.js +34 -14
- package/package.json +10 -10
- package/worker/fbs/rtpParameters.fbs +0 -1
- package/worker/fuzzer/src/FuzzerUtils.cpp +5 -3
- package/worker/fuzzer/src/RTC/RTP/FuzzerPacket.cpp +16 -2
- package/worker/include/DepLibUV.hpp +13 -0
- package/worker/include/RTC/BWE/AlrDetector.hpp +97 -0
- package/worker/include/RTC/BWE/BitrateProber.hpp +217 -0
- package/worker/include/RTC/BWE/{Utils.hpp → BitrateUtils.hpp} +3 -3
- package/worker/include/RTC/BWE/BweTypes.hpp +170 -2
- package/worker/include/RTC/BWE/FeedbackAdapter.hpp +0 -14
- package/worker/include/RTC/BWE/InterArrival.hpp +117 -0
- package/worker/include/RTC/BWE/IntervalBudget.hpp +81 -0
- package/worker/include/RTC/BWE/LossBasedController.hpp +105 -0
- package/worker/include/RTC/BWE/OveruseDetector.hpp +71 -0
- package/worker/include/RTC/BWE/OveruseEstimator.hpp +115 -0
- package/worker/include/RTC/BWE/ProbeBitrateEstimator.hpp +84 -0
- package/worker/include/RTC/BWE/ProbeController.hpp +379 -0
- package/worker/include/RTC/BWE/ProbePacketGenerator.hpp +130 -0
- package/worker/include/RTC/BWE/ProbingScheduler.hpp +187 -0
- package/worker/include/RTC/BWE/RembGenerator.hpp +96 -0
- package/worker/include/RTC/BWE/RemoteBitrateEstimatorAbsSendTime.hpp +237 -0
- package/worker/include/RTC/BWE/RobustThroughputEstimator.hpp +26 -0
- package/worker/include/RTC/BWE/SendPacketHistory.hpp +161 -25
- package/worker/include/RTC/BWE/TransportWideCcFeedbackGenerator.hpp +146 -0
- package/worker/include/RTC/BWE/TrendlineEstimator.hpp +15 -0
- package/worker/include/RTC/Consts.hpp +70 -0
- package/worker/include/RTC/DataConsumer.hpp +3 -5
- package/worker/include/RTC/DirectTransport.hpp +4 -5
- package/worker/include/RTC/PipeTransport.hpp +4 -5
- package/worker/include/RTC/PlainTransport.hpp +4 -5
- package/worker/include/RTC/RTCP/FeedbackPsRemb.hpp +6 -7
- package/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp +3 -1
- package/worker/include/RTC/RTP/Codecs/Tools.hpp +1 -1
- package/worker/include/RTC/RTP/HeaderExtensionIds.hpp +0 -1
- package/worker/include/RTC/RTP/Packet.hpp +16 -4
- package/worker/include/RTC/RTP/ProbationGenerator.hpp +0 -8
- package/worker/include/RTC/RTP/RtpStream.hpp +12 -9
- package/worker/include/RTC/RTP/RtpStreamRecv.hpp +22 -4
- package/worker/include/RTC/RTP/RtpStreamSend.hpp +4 -2
- package/worker/include/RTC/RTP/RtxStream.hpp +10 -4
- package/worker/include/RTC/RateCalculator.hpp +103 -24
- package/worker/include/RTC/RemoteCaptureTimeEstimator.hpp +33 -3
- package/worker/include/RTC/{RtcLogger.hpp → RtcLogger/RtpPacket.hpp} +5 -3
- package/worker/include/RTC/RtcLogger/SendBurst.hpp +88 -0
- package/worker/include/RTC/RtpDictionaries.hpp +3 -4
- package/worker/include/RTC/SCTP/association/Association.hpp +1 -1
- package/worker/include/RTC/SCTP/public/AssociationMetrics.hpp +0 -1
- package/worker/include/RTC/SCTP/public/SctpTypes.hpp +4 -4
- package/worker/include/RTC/SCTP/rx/DataTracker.hpp +1 -1
- package/worker/include/RTC/SCTP/rx/ReassemblyQueue.hpp +1 -1
- package/worker/include/RTC/SctpDictionaries.hpp +2 -2
- package/worker/include/RTC/TcpConnection.hpp +2 -1
- package/worker/include/RTC/Transport.hpp +23 -8
- package/worker/include/RTC/TransportTuple.hpp +61 -6
- package/worker/include/RTC/WebRtcTransport.hpp +4 -5
- package/worker/include/Shared.hpp +5 -0
- package/worker/include/SharedInterface.hpp +10 -0
- package/worker/include/Utils.hpp +72 -3
- package/worker/include/common.hpp +12 -4
- package/worker/include/handles/SendCallbacks.hpp +34 -0
- package/worker/include/handles/TcpConnectionHandle.hpp +4 -12
- package/worker/include/handles/UdpSocketHandle.hpp +4 -8
- package/worker/meson.build +41 -3
- package/worker/meson_options.txt +1 -0
- package/worker/mocks/include/MockShared.hpp +16 -2
- package/worker/mocks/include/handles/MockBackoffTimerHandle.hpp +1 -1
- package/worker/scripts/package-lock.json +6 -6
- package/worker/src/RTC/BWE/AimdRateControl.cpp +4 -5
- package/worker/src/RTC/BWE/AlrDetector.cpp +80 -0
- package/worker/src/RTC/BWE/BitrateProber.cpp +256 -0
- package/worker/src/RTC/BWE/{Utils.cpp → BitrateUtils.cpp} +4 -4
- package/worker/src/RTC/BWE/DelayBasedBwe.cpp +2 -2
- package/worker/src/RTC/BWE/FeedbackAdapter.cpp +20 -37
- package/worker/src/RTC/BWE/InterArrival.cpp +216 -0
- package/worker/src/RTC/BWE/IntervalBudget.cpp +93 -0
- package/worker/src/RTC/BWE/LossBasedController.cpp +189 -41
- package/worker/src/RTC/BWE/OveruseDetector.cpp +128 -0
- package/worker/src/RTC/BWE/OveruseEstimator.cpp +166 -0
- package/worker/src/RTC/BWE/ProbeBitrateEstimator.cpp +222 -0
- package/worker/src/RTC/BWE/ProbeController.cpp +645 -0
- package/worker/src/RTC/BWE/ProbePacketGenerator.cpp +140 -0
- package/worker/src/RTC/BWE/ProbingScheduler.cpp +196 -0
- package/worker/src/RTC/BWE/RembGenerator.cpp +169 -0
- package/worker/src/RTC/BWE/RemoteBitrateEstimatorAbsSendTime.cpp +497 -0
- package/worker/src/RTC/BWE/RobustThroughputEstimator.cpp +47 -0
- package/worker/src/RTC/BWE/SendPacketHistory.cpp +173 -50
- package/worker/src/RTC/BWE/TargetRateController.cpp +12 -14
- package/worker/src/RTC/BWE/TransportWideCcFeedbackGenerator.cpp +377 -0
- package/worker/src/RTC/BWE/TrendlineEstimator.cpp +19 -0
- package/worker/src/RTC/Consumer.cpp +7 -5
- package/worker/src/RTC/DataConsumer.cpp +8 -10
- package/worker/src/RTC/DirectTransport.cpp +14 -8
- package/worker/src/RTC/DtlsTransport.cpp +8 -8
- package/worker/src/RTC/ICE/IceCandidate.cpp +4 -4
- package/worker/src/RTC/ICE/IceServer.cpp +1 -1
- package/worker/src/RTC/PipeTransport.cpp +13 -8
- package/worker/src/RTC/PlainTransport.cpp +13 -8
- package/worker/src/RTC/Producer.cpp +14 -31
- package/worker/src/RTC/RTCP/Bye.cpp +1 -1
- package/worker/src/RTC/RTCP/FeedbackPsRemb.cpp +18 -0
- package/worker/src/RTC/RTCP/FeedbackPsRpsi.cpp +2 -2
- package/worker/src/RTC/RTCP/FeedbackPsVbcm.cpp +2 -1
- package/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp +2 -2
- package/worker/src/RTC/RTCP/Sdes.cpp +1 -1
- package/worker/src/RTC/RTP/Codecs/DependencyDescriptor.cpp +2 -1
- package/worker/src/RTC/RTP/Packet.cpp +26 -11
- package/worker/src/RTC/RTP/ProbationGenerator.cpp +5 -6
- package/worker/src/RTC/RTP/RtpStream.cpp +1 -1
- package/worker/src/RTC/RTP/RtpStreamRecv.cpp +69 -48
- package/worker/src/RTC/RTP/RtpStreamSend.cpp +31 -31
- package/worker/src/RTC/RTP/RtxStream.cpp +22 -7
- package/worker/src/RTC/RateCalculator.cpp +133 -28
- package/worker/src/RTC/RemoteCaptureTimeEstimator.cpp +56 -1
- package/worker/src/RTC/{RtcLogger.cpp → RtcLogger/RtpPacket.cpp} +2 -2
- package/worker/src/RTC/RtcLogger/SendBurst.cpp +124 -0
- package/worker/src/RTC/RtpDictionaries/RtpHeaderExtensionUri.cpp +2 -12
- package/worker/src/RTC/RtpDictionaries/RtpParameters.cpp +1 -1
- package/worker/src/RTC/SCTP/association/Association.cpp +1 -1
- package/worker/src/RTC/SCTP/rx/InterleavedReassemblyStreams.cpp +3 -3
- package/worker/src/RTC/SCTP/rx/ReassemblyQueue.cpp +2 -1
- package/worker/src/RTC/SCTP/rx/TraditionalReassemblyStreams.cpp +4 -4
- package/worker/src/RTC/SCTP/tx/RetransmissionTimeout.cpp +4 -4
- package/worker/src/RTC/SctpDictionaries/SctpStreamParameters.cpp +6 -10
- package/worker/src/RTC/SimulcastProducerStreamManager.cpp +2 -2
- package/worker/src/RTC/SrtpSession.cpp +2 -2
- package/worker/src/RTC/SvcProducerStreamManager.cpp +2 -2
- package/worker/src/RTC/TcpConnection.cpp +2 -2
- package/worker/src/RTC/Transport.cpp +111 -93
- package/worker/src/RTC/TransportTuple.cpp +4 -4
- package/worker/src/RTC/WebRtcServer.cpp +4 -3
- package/worker/src/RTC/WebRtcTransport.cpp +20 -13
- package/worker/src/Utils/BitStream.cpp +24 -0
- package/worker/src/handles/BackoffTimerHandle.cpp +1 -1
- package/worker/src/handles/TcpConnectionHandle.cpp +13 -23
- package/worker/src/handles/UdpSocketHandle.cpp +14 -21
- package/worker/test/include/RTC/BWE/helpers/LinkSimulator.hpp +68 -14
- package/worker/test/include/RTC/BWE/helpers/RemoteBitrateEstimatorAbsSendTimeTestHelper.hpp +125 -0
- package/worker/test/src/RTC/BWE/TestAlrDetector.cpp +110 -0
- package/worker/test/src/RTC/BWE/TestBitrateProber.cpp +418 -0
- package/worker/test/src/RTC/BWE/TestBitrateUtils.cpp +61 -0
- package/worker/test/src/RTC/BWE/TestDelayBasedBwe.cpp +4 -4
- package/worker/test/src/RTC/BWE/TestFeedbackAdapter.cpp +53 -37
- package/worker/test/src/RTC/BWE/TestInterArrival.cpp +643 -0
- package/worker/test/src/RTC/BWE/TestIntervalBudget.cpp +130 -0
- package/worker/test/src/RTC/BWE/TestOveruseDetector.cpp +519 -0
- package/worker/test/src/RTC/BWE/TestProbeBitrateEstimator.cpp +266 -0
- package/worker/test/src/RTC/BWE/TestProbeController.cpp +1682 -0
- package/worker/test/src/RTC/BWE/TestProbePacketGenerator.cpp +265 -0
- package/worker/test/src/RTC/BWE/TestProbingScheduler.cpp +260 -0
- package/worker/test/src/RTC/BWE/TestRembGenerator.cpp +285 -0
- package/worker/test/src/RTC/BWE/TestRemoteBitrateEstimatorAbsSendTime.cpp +414 -0
- package/worker/test/src/RTC/BWE/TestSendPacketHistory.cpp +296 -77
- package/worker/test/src/RTC/BWE/TestTransportWideCcFeedbackGenerator.cpp +578 -0
- package/worker/test/src/RTC/BWE/helpers/LinkSimulator.cpp +133 -29
- package/worker/test/src/RTC/BWE/helpers/RemoteBitrateEstimatorAbsSendTimeTestHelper.cpp +625 -0
- package/worker/test/src/RTC/RTCP/TestFeedbackPsRemb.cpp +19 -0
- package/worker/test/src/RTC/RTP/TestPacket.cpp +58 -4
- package/worker/test/src/RTC/RTP/TestProbationGenerator.cpp +3 -2
- package/worker/test/src/RTC/RTP/TestRtpStreamRecv.cpp +50 -0
- package/worker/test/src/RTC/RTP/TestRtpStreamSend.cpp +59 -0
- package/worker/test/src/RTC/TestRateCalculator.cpp +322 -60
- package/worker/test/src/RTC/TestRemoteCaptureTimeEstimator.cpp +95 -7
- package/worker/test/src/RTC/TestSimpleProducerStreamManager.cpp +34 -16
- package/worker/test/src/RTC/TestSimulcastProducerStreamManager.cpp +31 -13
- package/worker/test/src/RTC/TestSvcProducerStreamManager.cpp +37 -19
- package/worker/test/src/RTC/TestTransportCongestionControlServer.cpp +10 -10
- package/worker/test/src/Utils/TestTime.cpp +120 -21
- package/worker/test/src/RTC/BWE/TestUtils.cpp +0 -61
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
#include "common.hpp"
|
|
2
|
+
#include "RTC/BWE/TransportWideCcFeedbackGenerator.hpp"
|
|
3
|
+
#include "RTC/Consts.hpp"
|
|
4
|
+
#include "RTC/RTCP/FeedbackRtpTransport.hpp"
|
|
5
|
+
#include "RTC/RTP/HeaderExtensionIds.hpp"
|
|
6
|
+
#include "RTC/RTP/Packet.hpp"
|
|
7
|
+
#include "RTC/RtpDictionaries.hpp"
|
|
8
|
+
#include "test/include/RTC/RTP/rtpCommon.hpp"
|
|
9
|
+
#include "mocks/include/MockShared.hpp"
|
|
10
|
+
#include <catch2/catch_test_macros.hpp>
|
|
11
|
+
#include <deque>
|
|
12
|
+
#include <string_view>
|
|
13
|
+
#include <vector>
|
|
14
|
+
|
|
15
|
+
SCENARIO("BWE TransportWideCcFeedbackGenerator", "[bwe][transportwideccfeedbackgenerator]")
|
|
16
|
+
{
|
|
17
|
+
struct TestInput
|
|
18
|
+
{
|
|
19
|
+
uint16_t wideSeqNumber;
|
|
20
|
+
int64_t arrivalTimeUs;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
struct TestPacketStatus
|
|
24
|
+
{
|
|
25
|
+
uint16_t wideSeqNumber;
|
|
26
|
+
bool received;
|
|
27
|
+
int64_t timestampUs;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
using TestResults = std::deque<std::vector<TestPacketStatus>>;
|
|
31
|
+
|
|
32
|
+
class TestTransportWideCcFeedbackGeneratorListener
|
|
33
|
+
: public RTC::BWE::TransportWideCcFeedbackGenerator::Listener
|
|
34
|
+
{
|
|
35
|
+
public:
|
|
36
|
+
void OnTransportWideCcFeedbackGeneratorSendRtcpPacket(
|
|
37
|
+
RTC::BWE::TransportWideCcFeedbackGenerator* /*transportWideCcFeedbackGenerator*/,
|
|
38
|
+
RTC::RTCP::FeedbackRtpTransportPacket* packet) override
|
|
39
|
+
{
|
|
40
|
+
std::vector<TestPacketStatus> statuses;
|
|
41
|
+
|
|
42
|
+
for (const auto& packetStatus : packet->GetPacketStatuses())
|
|
43
|
+
{
|
|
44
|
+
// The reconstructed times sit in the frame of the reference time,
|
|
45
|
+
// which is shifted by a whole wrap period so that it's positive
|
|
46
|
+
// regardless of the sign of the reference time on the wire.
|
|
47
|
+
statuses.push_back(
|
|
48
|
+
TestPacketStatus{ .wideSeqNumber = packetStatus.sequenceNumber,
|
|
49
|
+
.received = packetStatus.received,
|
|
50
|
+
.timestampUs = packetStatus.received
|
|
51
|
+
? packetStatus.receivedAtUs -
|
|
52
|
+
RTC::RTCP::FeedbackRtpTransportPacket::TimeWrapPeriodUs
|
|
53
|
+
: 0 });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
this->baseSequenceNumbers.push_back(packet->GetBaseSequenceNumber());
|
|
57
|
+
this->feedbacks.push_back(statuses);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public:
|
|
61
|
+
std::vector<uint16_t> baseSequenceNumbers;
|
|
62
|
+
std::vector<std::vector<TestPacketStatus>> feedbacks;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
constexpr uint32_t Ssrc{ 1111 };
|
|
66
|
+
constexpr uint8_t TransportWideCc01Id{ 5 };
|
|
67
|
+
// Instant the scenarios below start at, which is irrelevant other than for
|
|
68
|
+
// being far from zero.
|
|
69
|
+
constexpr int64_t BaseTimeUs{ 1000 * 1000 };
|
|
70
|
+
// Size used by the scenarios that don't care about it.
|
|
71
|
+
constexpr size_t DefaultPayloadSize{ 1000 };
|
|
72
|
+
constexpr std::string_view TimerLabel{ "transport-wide-cc-feedback-generator-send" };
|
|
73
|
+
|
|
74
|
+
int64_t nowUs{ BaseTimeUs };
|
|
75
|
+
|
|
76
|
+
mocks::MockShared shared(
|
|
77
|
+
[&nowUs]() -> int64_t
|
|
78
|
+
{
|
|
79
|
+
return nowUs;
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Builds a packet of the given size carrying the given transport wide
|
|
83
|
+
// sequence number.
|
|
84
|
+
//
|
|
85
|
+
// NOTE: Every scenario reuses `rtpCommon::FactoryBuffer`, so the returned
|
|
86
|
+
// packet is only valid until the next call.
|
|
87
|
+
auto buildPacket = [](size_t payloadSize, uint16_t wideSeqNumber) -> std::unique_ptr<RTC::RTP::Packet>
|
|
88
|
+
{
|
|
89
|
+
std::unique_ptr<RTC::RTP::Packet> packet(
|
|
90
|
+
RTC::RTP::Packet::Factory(rtpCommon::FactoryBuffer, sizeof(rtpCommon::FactoryBuffer)));
|
|
91
|
+
|
|
92
|
+
REQUIRE(packet);
|
|
93
|
+
|
|
94
|
+
packet->SetSsrc(Ssrc);
|
|
95
|
+
|
|
96
|
+
const std::vector<RTC::RTP::Packet::Extension> extensions{
|
|
97
|
+
{ RTC::RtpHeaderExtensionUri::Type::TRANSPORT_WIDE_CC_01,
|
|
98
|
+
TransportWideCc01Id, /*len*/ 2,
|
|
99
|
+
rtpCommon::DataBuffer }
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
packet->SetExtensions(RTC::RTP::Packet::ExtensionsType::OneByte, extensions);
|
|
103
|
+
|
|
104
|
+
RTC::RTP::HeaderExtensionIds headerExtensionIds;
|
|
105
|
+
|
|
106
|
+
headerExtensionIds.transportWideCc01 = TransportWideCc01Id;
|
|
107
|
+
|
|
108
|
+
packet->AssignExtensionIds(headerExtensionIds);
|
|
109
|
+
|
|
110
|
+
packet->SetPayloadLength(payloadSize);
|
|
111
|
+
|
|
112
|
+
REQUIRE(packet->UpdateTransportWideCc01(wideSeqNumber));
|
|
113
|
+
|
|
114
|
+
return packet;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// Feeds a packet that arrived at the given instant, which is also taken as
|
|
118
|
+
// the current one since the meter of incoming data reads the clock itself.
|
|
119
|
+
auto feedPacket = [&buildPacket, &nowUs](
|
|
120
|
+
RTC::BWE::TransportWideCcFeedbackGenerator& transportWideCcFeedbackGenerator,
|
|
121
|
+
uint16_t wideSeqNumber,
|
|
122
|
+
int64_t arrivalTimeUs,
|
|
123
|
+
size_t payloadSize) -> void
|
|
124
|
+
{
|
|
125
|
+
nowUs = arrivalTimeUs;
|
|
126
|
+
|
|
127
|
+
const auto packet = buildPacket(payloadSize, wideSeqNumber);
|
|
128
|
+
|
|
129
|
+
transportWideCcFeedbackGenerator.IncomingPacket(arrivalTimeUs, packet.get());
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// Checks that the feedback packets the listener got are the expected ones,
|
|
133
|
+
// status by status.
|
|
134
|
+
auto checkFeedbacks = [](
|
|
135
|
+
const TestTransportWideCcFeedbackGeneratorListener& listener,
|
|
136
|
+
const TestResults& expectedResults) -> void
|
|
137
|
+
{
|
|
138
|
+
REQUIRE(listener.feedbacks.size() == expectedResults.size());
|
|
139
|
+
|
|
140
|
+
for (size_t idx{ 0 }; idx < expectedResults.size(); ++idx)
|
|
141
|
+
{
|
|
142
|
+
const auto& statuses = listener.feedbacks.at(idx);
|
|
143
|
+
const auto& expectedStatuses = expectedResults.at(idx);
|
|
144
|
+
|
|
145
|
+
REQUIRE(statuses.size() == expectedStatuses.size());
|
|
146
|
+
|
|
147
|
+
for (size_t statusIdx{ 0 }; statusIdx < expectedStatuses.size(); ++statusIdx)
|
|
148
|
+
{
|
|
149
|
+
const auto& status = statuses.at(statusIdx);
|
|
150
|
+
const auto& expectedStatus = expectedStatuses.at(statusIdx);
|
|
151
|
+
|
|
152
|
+
REQUIRE(status.wideSeqNumber == expectedStatus.wideSeqNumber);
|
|
153
|
+
REQUIRE(status.received == expectedStatus.received);
|
|
154
|
+
|
|
155
|
+
if (status.received)
|
|
156
|
+
{
|
|
157
|
+
REQUIRE(status.timestampUs == expectedStatus.timestampUs);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// Feeds the given packets, emitting a feedback every time 100 ms have gone by
|
|
164
|
+
// since the previous one, and checks what came out.
|
|
165
|
+
auto validate = [&shared, &feedPacket, &checkFeedbacks](
|
|
166
|
+
const std::vector<TestInput>& inputs, const TestResults& expectedResults) -> void
|
|
167
|
+
{
|
|
168
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
169
|
+
RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
170
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
171
|
+
|
|
172
|
+
static constexpr int64_t FeedbackSendIntervalUs{ 100 * 1000 };
|
|
173
|
+
|
|
174
|
+
int64_t startTsUs = inputs.at(0).arrivalTimeUs;
|
|
175
|
+
|
|
176
|
+
for (const auto& input : inputs)
|
|
177
|
+
{
|
|
178
|
+
if (input.arrivalTimeUs - startTsUs >= FeedbackSendIntervalUs)
|
|
179
|
+
{
|
|
180
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
181
|
+
|
|
182
|
+
startTsUs = input.arrivalTimeUs;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
feedPacket(
|
|
186
|
+
transportWideCcFeedbackGenerator, input.wideSeqNumber, input.arrivalTimeUs, DefaultPayloadSize);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
190
|
+
|
|
191
|
+
checkFeedbacks(listener, expectedResults);
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
SECTION("normal time and sequence")
|
|
195
|
+
{
|
|
196
|
+
const std::vector<TestInput> inputs{
|
|
197
|
+
{ .wideSeqNumber = 1, .arrivalTimeUs = 1000000 },
|
|
198
|
+
{ .wideSeqNumber = 2, .arrivalTimeUs = 1050000 },
|
|
199
|
+
{ .wideSeqNumber = 3, .arrivalTimeUs = 1100000 },
|
|
200
|
+
{ .wideSeqNumber = 4, .arrivalTimeUs = 1150000 },
|
|
201
|
+
{ .wideSeqNumber = 5, .arrivalTimeUs = 1200000 },
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const TestResults expectedResults{
|
|
205
|
+
{
|
|
206
|
+
{ .wideSeqNumber = 1, .received = true, .timestampUs = 1000000 },
|
|
207
|
+
{ .wideSeqNumber = 2, .received = true, .timestampUs = 1050000 },
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
{ .wideSeqNumber = 3, .received = true, .timestampUs = 1100000 },
|
|
211
|
+
{ .wideSeqNumber = 4, .received = true, .timestampUs = 1150000 },
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
{ .wideSeqNumber = 5, .received = true, .timestampUs = 1200000 },
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
validate(inputs, expectedResults);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
SECTION("lost packets")
|
|
222
|
+
{
|
|
223
|
+
const std::vector<TestInput> inputs{
|
|
224
|
+
{ .wideSeqNumber = 1, .arrivalTimeUs = 1000000 },
|
|
225
|
+
{ .wideSeqNumber = 3, .arrivalTimeUs = 1050000 },
|
|
226
|
+
{ .wideSeqNumber = 5, .arrivalTimeUs = 1100000 },
|
|
227
|
+
{ .wideSeqNumber = 6, .arrivalTimeUs = 1150000 },
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const TestResults expectedResults{
|
|
231
|
+
{
|
|
232
|
+
{ .wideSeqNumber = 1, .received = true, .timestampUs = 1000000 },
|
|
233
|
+
{ .wideSeqNumber = 2, .received = false, .timestampUs = 0 },
|
|
234
|
+
{ .wideSeqNumber = 3, .received = true, .timestampUs = 1050000 },
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
{ .wideSeqNumber = 4, .received = false, .timestampUs = 0 },
|
|
238
|
+
{ .wideSeqNumber = 5, .received = true, .timestampUs = 1100000 },
|
|
239
|
+
{ .wideSeqNumber = 6, .received = true, .timestampUs = 1150000 },
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
validate(inputs, expectedResults);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
SECTION("duplicate packets")
|
|
247
|
+
{
|
|
248
|
+
const std::vector<TestInput> inputs{
|
|
249
|
+
{ .wideSeqNumber = 1, .arrivalTimeUs = 1000000 },
|
|
250
|
+
{ .wideSeqNumber = 1, .arrivalTimeUs = 1050000 },
|
|
251
|
+
{ .wideSeqNumber = 2, .arrivalTimeUs = 1100000 },
|
|
252
|
+
{ .wideSeqNumber = 3, .arrivalTimeUs = 1150000 },
|
|
253
|
+
{ .wideSeqNumber = 3, .arrivalTimeUs = 1200000 },
|
|
254
|
+
{ .wideSeqNumber = 4, .arrivalTimeUs = 1250000 },
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
const TestResults expectedResults{
|
|
258
|
+
{
|
|
259
|
+
{ .wideSeqNumber = 1, .received = true, .timestampUs = 1000000 },
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
{ .wideSeqNumber = 2, .received = true, .timestampUs = 1100000 },
|
|
263
|
+
{ .wideSeqNumber = 3, .received = true, .timestampUs = 1150000 },
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
{ .wideSeqNumber = 4, .received = true, .timestampUs = 1250000 },
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
validate(inputs, expectedResults);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
SECTION("packets arrive out of order")
|
|
274
|
+
{
|
|
275
|
+
const std::vector<TestInput> inputs{
|
|
276
|
+
{ .wideSeqNumber = 1, .arrivalTimeUs = 1000000 },
|
|
277
|
+
{ .wideSeqNumber = 2, .arrivalTimeUs = 1050000 },
|
|
278
|
+
{ .wideSeqNumber = 4, .arrivalTimeUs = 1100000 },
|
|
279
|
+
{ .wideSeqNumber = 5, .arrivalTimeUs = 1150000 },
|
|
280
|
+
// Out of order.
|
|
281
|
+
{ .wideSeqNumber = 3, .arrivalTimeUs = 1200000 },
|
|
282
|
+
{ .wideSeqNumber = 6, .arrivalTimeUs = 1250000 },
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
const TestResults expectedResults{
|
|
286
|
+
{
|
|
287
|
+
{ .wideSeqNumber = 1, .received = true, .timestampUs = 1000000 },
|
|
288
|
+
{ .wideSeqNumber = 2, .received = true, .timestampUs = 1050000 },
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
{ .wideSeqNumber = 3, .received = false, .timestampUs = 0 },
|
|
292
|
+
{ .wideSeqNumber = 4, .received = true, .timestampUs = 1100000 },
|
|
293
|
+
{ .wideSeqNumber = 5, .received = true, .timestampUs = 1150000 },
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
{ .wideSeqNumber = 3, .received = true, .timestampUs = 1200000 },
|
|
297
|
+
{ .wideSeqNumber = 4, .received = true, .timestampUs = 1100000 },
|
|
298
|
+
{ .wideSeqNumber = 5, .received = true, .timestampUs = 1150000 },
|
|
299
|
+
{ .wideSeqNumber = 6, .received = true, .timestampUs = 1250000 },
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
validate(inputs, expectedResults);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
SECTION("arrival times older than the window are forgotten")
|
|
307
|
+
{
|
|
308
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
309
|
+
RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
310
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
311
|
+
|
|
312
|
+
feedPacket(transportWideCcFeedbackGenerator, 12, 1000000, DefaultPayloadSize);
|
|
313
|
+
|
|
314
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
315
|
+
|
|
316
|
+
// Exactly the 500 ms of the window later, so packet 12 is forgotten here.
|
|
317
|
+
feedPacket(transportWideCcFeedbackGenerator, 13, 1500000, DefaultPayloadSize);
|
|
318
|
+
|
|
319
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
320
|
+
|
|
321
|
+
// Below the sequence the next feedback starts at, so that they are reported
|
|
322
|
+
// along with whatever is still known.
|
|
323
|
+
feedPacket(transportWideCcFeedbackGenerator, 10, 1499000, DefaultPayloadSize);
|
|
324
|
+
feedPacket(transportWideCcFeedbackGenerator, 11, 1499500, DefaultPayloadSize);
|
|
325
|
+
|
|
326
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
327
|
+
|
|
328
|
+
const TestResults expectedResults{
|
|
329
|
+
{
|
|
330
|
+
{ .wideSeqNumber = 12, .received = true, .timestampUs = 1000000 },
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
{ .wideSeqNumber = 13, .received = true, .timestampUs = 1500000 },
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
{ .wideSeqNumber = 10, .received = true, .timestampUs = 1499000 },
|
|
337
|
+
{ .wideSeqNumber = 11, .received = true, .timestampUs = 1499500 },
|
|
338
|
+
// Forgotten above, so no longer known to have arrived.
|
|
339
|
+
{ .wideSeqNumber = 12, .received = false, .timestampUs = 0 },
|
|
340
|
+
{ .wideSeqNumber = 13, .received = true, .timestampUs = 1500000 },
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
checkFeedbacks(listener, expectedResults);
|
|
345
|
+
|
|
346
|
+
REQUIRE(listener.baseSequenceNumbers.at(0) == 12);
|
|
347
|
+
REQUIRE(listener.baseSequenceNumbers.at(1) == 13);
|
|
348
|
+
REQUIRE(listener.baseSequenceNumbers.at(2) == 10);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
SECTION("what was forgotten is not reported as lost")
|
|
352
|
+
{
|
|
353
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
354
|
+
RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
355
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
356
|
+
|
|
357
|
+
feedPacket(transportWideCcFeedbackGenerator, 1, 1000000, DefaultPayloadSize);
|
|
358
|
+
feedPacket(transportWideCcFeedbackGenerator, 2, 1000000, DefaultPayloadSize);
|
|
359
|
+
|
|
360
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
361
|
+
|
|
362
|
+
feedPacket(transportWideCcFeedbackGenerator, 5, 1000000, DefaultPayloadSize);
|
|
363
|
+
|
|
364
|
+
// Everything known is reported here, so the next feedback would start at 6.
|
|
365
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
366
|
+
|
|
367
|
+
// Past the window, so 1, 2 and 5 are forgotten.
|
|
368
|
+
feedPacket(transportWideCcFeedbackGenerator, 10, 1600000, DefaultPayloadSize);
|
|
369
|
+
|
|
370
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
371
|
+
|
|
372
|
+
const TestResults expectedResults{
|
|
373
|
+
{
|
|
374
|
+
{ .wideSeqNumber = 1, .received = true, .timestampUs = 1000000 },
|
|
375
|
+
{ .wideSeqNumber = 2, .received = true, .timestampUs = 1000000 },
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
{ .wideSeqNumber = 3, .received = false, .timestampUs = 0 },
|
|
379
|
+
{ .wideSeqNumber = 4, .received = false, .timestampUs = 0 },
|
|
380
|
+
{ .wideSeqNumber = 5, .received = true, .timestampUs = 1000000 },
|
|
381
|
+
},
|
|
382
|
+
// Only the one still known. Without moving the start up to it, 6 to 9
|
|
383
|
+
// would go out as lost having merely been forgotten.
|
|
384
|
+
{
|
|
385
|
+
{ .wideSeqNumber = 10, .received = true, .timestampUs = 1600000 },
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
checkFeedbacks(listener, expectedResults);
|
|
390
|
+
|
|
391
|
+
REQUIRE(listener.baseSequenceNumbers.at(2) == 10);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
SECTION("what has not been reported yet is not forgotten")
|
|
395
|
+
{
|
|
396
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
397
|
+
RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
398
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
399
|
+
|
|
400
|
+
feedPacket(transportWideCcFeedbackGenerator, 1, 1000000, DefaultPayloadSize);
|
|
401
|
+
feedPacket(transportWideCcFeedbackGenerator, 2, 1000000, DefaultPayloadSize);
|
|
402
|
+
|
|
403
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
404
|
+
|
|
405
|
+
// Not reported, so the next feedback still has to carry it.
|
|
406
|
+
feedPacket(transportWideCcFeedbackGenerator, 5, 1000000, DefaultPayloadSize);
|
|
407
|
+
|
|
408
|
+
// Past the window, but nothing may be forgotten while 5 is still pending.
|
|
409
|
+
feedPacket(transportWideCcFeedbackGenerator, 10, 1600000, DefaultPayloadSize);
|
|
410
|
+
|
|
411
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
412
|
+
|
|
413
|
+
const TestResults expectedResults{
|
|
414
|
+
{
|
|
415
|
+
{ .wideSeqNumber = 1, .received = true, .timestampUs = 1000000 },
|
|
416
|
+
{ .wideSeqNumber = 2, .received = true, .timestampUs = 1000000 },
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
{ .wideSeqNumber = 3, .received = false, .timestampUs = 0 },
|
|
420
|
+
{ .wideSeqNumber = 4, .received = false, .timestampUs = 0 },
|
|
421
|
+
{ .wideSeqNumber = 5, .received = true, .timestampUs = 1000000 },
|
|
422
|
+
{ .wideSeqNumber = 6, .received = false, .timestampUs = 0 },
|
|
423
|
+
{ .wideSeqNumber = 7, .received = false, .timestampUs = 0 },
|
|
424
|
+
{ .wideSeqNumber = 8, .received = false, .timestampUs = 0 },
|
|
425
|
+
{ .wideSeqNumber = 9, .received = false, .timestampUs = 0 },
|
|
426
|
+
{ .wideSeqNumber = 10, .received = true, .timestampUs = 1600000 },
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
checkFeedbacks(listener, expectedResults);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
SECTION("a sequence number that wrapped backwards is reported first")
|
|
434
|
+
{
|
|
435
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
436
|
+
RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
437
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
438
|
+
|
|
439
|
+
feedPacket(transportWideCcFeedbackGenerator, 10, 1000000, DefaultPayloadSize);
|
|
440
|
+
// Ahead of the one above by more than half the sequence space, so it goes
|
|
441
|
+
// before it rather than after.
|
|
442
|
+
feedPacket(transportWideCcFeedbackGenerator, 62762, 1001000, DefaultPayloadSize);
|
|
443
|
+
|
|
444
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
445
|
+
|
|
446
|
+
REQUIRE(listener.baseSequenceNumbers.at(0) == 62762);
|
|
447
|
+
|
|
448
|
+
// Everything in between is reported as missing, so only the two that did
|
|
449
|
+
// arrive are looked at.
|
|
450
|
+
std::vector<TestPacketStatus> receivedStatuses;
|
|
451
|
+
|
|
452
|
+
for (const auto& statuses : listener.feedbacks)
|
|
453
|
+
{
|
|
454
|
+
for (const auto& status : statuses)
|
|
455
|
+
{
|
|
456
|
+
if (status.received)
|
|
457
|
+
{
|
|
458
|
+
receivedStatuses.push_back(status);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
REQUIRE(receivedStatuses.size() == 2);
|
|
464
|
+
REQUIRE(receivedStatuses.at(0).wideSeqNumber == 62762);
|
|
465
|
+
REQUIRE(receivedStatuses.at(0).timestampUs == 1001000);
|
|
466
|
+
REQUIRE(receivedStatuses.at(1).wideSeqNumber == 10);
|
|
467
|
+
REQUIRE(receivedStatuses.at(1).timestampUs == 1000000);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
SECTION("a delta too large to encode splits the report in two")
|
|
471
|
+
{
|
|
472
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
473
|
+
RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
474
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
475
|
+
|
|
476
|
+
feedPacket(transportWideCcFeedbackGenerator, 1, 1000000, DefaultPayloadSize);
|
|
477
|
+
// Nine seconds later, which no delta of a feedback packet can express.
|
|
478
|
+
feedPacket(transportWideCcFeedbackGenerator, 2, 10000000, DefaultPayloadSize);
|
|
479
|
+
|
|
480
|
+
transportWideCcFeedbackGenerator.FillAndSendFeedback();
|
|
481
|
+
|
|
482
|
+
const TestResults expectedResults{
|
|
483
|
+
{
|
|
484
|
+
{ .wideSeqNumber = 1, .received = true, .timestampUs = 1000000 },
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
{ .wideSeqNumber = 2, .received = true, .timestampUs = 10000000 },
|
|
488
|
+
},
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
checkFeedbacks(listener, expectedResults);
|
|
492
|
+
|
|
493
|
+
REQUIRE(listener.baseSequenceNumbers.at(0) == 1);
|
|
494
|
+
REQUIRE(listener.baseSequenceNumbers.at(1) == 2);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
SECTION("the send interval follows the bitrate it reports on")
|
|
498
|
+
{
|
|
499
|
+
// 80000 * 0.05 = 68 bytes * 8 bits * 1000 ms / 136 ms.
|
|
500
|
+
REQUIRE(RTC::BWE::TransportWideCcFeedbackGenerator::ComputeSendIntervalMs(80000) == 136);
|
|
501
|
+
// Reporting on this much would fit in less than the shortest interval, so
|
|
502
|
+
// the shortest one stands.
|
|
503
|
+
REQUIRE(RTC::BWE::TransportWideCcFeedbackGenerator::ComputeSendIntervalMs(300000) == 50);
|
|
504
|
+
// Too little coming in for the reporting to be spread any thinner than the
|
|
505
|
+
// longest interval.
|
|
506
|
+
REQUIRE(RTC::BWE::TransportWideCcFeedbackGenerator::ComputeSendIntervalMs(20000) == 250);
|
|
507
|
+
// Nothing at all, which is what the guard against dividing by the bitrate
|
|
508
|
+
// is there for.
|
|
509
|
+
REQUIRE(RTC::BWE::TransportWideCcFeedbackGenerator::ComputeSendIntervalMs(0) == 250);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
SECTION("with nothing coming in the send interval stays at its default")
|
|
513
|
+
{
|
|
514
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
515
|
+
const RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
516
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
517
|
+
|
|
518
|
+
auto* timer = shared.GetTimer(TimerLabel);
|
|
519
|
+
|
|
520
|
+
REQUIRE(timer);
|
|
521
|
+
REQUIRE(timer->GetRepeatMs() == 100);
|
|
522
|
+
|
|
523
|
+
nowUs = BaseTimeUs + (100 * 1000);
|
|
524
|
+
|
|
525
|
+
REQUIRE(timer->EvaluateHasExpired());
|
|
526
|
+
|
|
527
|
+
REQUIRE(transportWideCcFeedbackGenerator.GetSendIntervalMs() == 100);
|
|
528
|
+
REQUIRE(timer->GetRepeatMs() == 100);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
SECTION("plenty coming in brings the send interval down to its shortest")
|
|
532
|
+
{
|
|
533
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
534
|
+
RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
535
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
536
|
+
|
|
537
|
+
// A thousand bytes every 20 ms is around 400 kbps, well past what the
|
|
538
|
+
// shortest interval covers.
|
|
539
|
+
for (uint16_t wideSeqNumber{ 1 }; wideSeqNumber <= 50; ++wideSeqNumber)
|
|
540
|
+
{
|
|
541
|
+
feedPacket(
|
|
542
|
+
transportWideCcFeedbackGenerator, wideSeqNumber, BaseTimeUs + (wideSeqNumber * 20 * 1000), 1000);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
auto* timer = shared.GetTimer(TimerLabel);
|
|
546
|
+
|
|
547
|
+
REQUIRE(timer);
|
|
548
|
+
REQUIRE(timer->EvaluateHasExpired());
|
|
549
|
+
|
|
550
|
+
REQUIRE(transportWideCcFeedbackGenerator.GetSendIntervalMs() == 50);
|
|
551
|
+
REQUIRE(timer->GetTimeoutMs() == 50);
|
|
552
|
+
REQUIRE(timer->GetRepeatMs() == 50);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
SECTION("little coming in pushes the send interval up to its longest")
|
|
556
|
+
{
|
|
557
|
+
TestTransportWideCcFeedbackGeneratorListener listener;
|
|
558
|
+
RTC::BWE::TransportWideCcFeedbackGenerator transportWideCcFeedbackGenerator(
|
|
559
|
+
std::addressof(listener), std::addressof(shared), RTC::Consts::MtuSize);
|
|
560
|
+
|
|
561
|
+
// Two hundred and fifty bytes every 100 ms is around 20 kbps, well below
|
|
562
|
+
// what the longest interval covers.
|
|
563
|
+
for (uint16_t wideSeqNumber{ 1 }; wideSeqNumber <= 50; ++wideSeqNumber)
|
|
564
|
+
{
|
|
565
|
+
feedPacket(
|
|
566
|
+
transportWideCcFeedbackGenerator, wideSeqNumber, BaseTimeUs + (wideSeqNumber * 100 * 1000), 250);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
auto* timer = shared.GetTimer(TimerLabel);
|
|
570
|
+
|
|
571
|
+
REQUIRE(timer);
|
|
572
|
+
REQUIRE(timer->EvaluateHasExpired());
|
|
573
|
+
|
|
574
|
+
REQUIRE(transportWideCcFeedbackGenerator.GetSendIntervalMs() == 250);
|
|
575
|
+
REQUIRE(timer->GetTimeoutMs() == 250);
|
|
576
|
+
REQUIRE(timer->GetRepeatMs() == 250);
|
|
577
|
+
}
|
|
578
|
+
}
|