mediasoup 3.11.19 → 3.11.21
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/node/lib/ActiveSpeakerObserver.d.ts +6 -5
- package/node/lib/ActiveSpeakerObserver.d.ts.map +1 -1
- package/node/lib/AudioLevelObserver.d.ts +6 -5
- package/node/lib/AudioLevelObserver.d.ts.map +1 -1
- package/node/lib/Consumer.d.ts +8 -7
- package/node/lib/Consumer.d.ts.map +1 -1
- package/node/lib/Consumer.js +2 -2
- package/node/lib/DataConsumer.d.ts +8 -7
- package/node/lib/DataConsumer.d.ts.map +1 -1
- package/node/lib/DataConsumer.js +2 -2
- package/node/lib/DataProducer.d.ts +8 -7
- package/node/lib/DataProducer.d.ts.map +1 -1
- package/node/lib/DataProducer.js +2 -2
- package/node/lib/DirectTransport.d.ts +6 -5
- package/node/lib/DirectTransport.d.ts.map +1 -1
- package/node/lib/PipeTransport.d.ts +9 -8
- package/node/lib/PipeTransport.d.ts.map +1 -1
- package/node/lib/PlainTransport.d.ts +6 -5
- package/node/lib/PlainTransport.d.ts.map +1 -1
- package/node/lib/Producer.d.ts +8 -7
- package/node/lib/Producer.d.ts.map +1 -1
- package/node/lib/Producer.js +2 -2
- package/node/lib/Router.d.ts +14 -13
- package/node/lib/Router.d.ts.map +1 -1
- package/node/lib/Router.js +2 -2
- package/node/lib/RtpObserver.d.ts +8 -7
- package/node/lib/RtpObserver.d.ts.map +1 -1
- package/node/lib/RtpObserver.js +2 -2
- package/node/lib/Transport.d.ts +12 -11
- package/node/lib/Transport.d.ts.map +1 -1
- package/node/lib/Transport.js +2 -2
- package/node/lib/WebRtcServer.d.ts +16 -15
- package/node/lib/WebRtcServer.d.ts.map +1 -1
- package/node/lib/WebRtcServer.js +2 -2
- package/node/lib/WebRtcTransport.d.ts +7 -6
- package/node/lib/WebRtcTransport.d.ts.map +1 -1
- package/node/lib/Worker.d.ts +12 -11
- package/node/lib/Worker.d.ts.map +1 -1
- package/node/lib/Worker.js +3 -3
- package/node/lib/index.d.ts +3 -2
- package/node/lib/index.d.ts.map +1 -1
- package/node/lib/index.js +1 -1
- package/node/lib/ortc.d.ts +2 -3
- package/node/lib/ortc.d.ts.map +1 -1
- package/node/lib/ortc.js +2 -3
- package/node/lib/tests/test-Router.js +5 -1
- package/node/lib/tests/test-Worker.js +2 -2
- package/node/lib/types.d.ts +3 -0
- package/node/lib/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/worker/Makefile +1 -1
- package/worker/fuzzer/include/RTC/FuzzerSeqManager.hpp +17 -0
- package/worker/fuzzer/src/RTC/FuzzerSeqManager.cpp +22 -0
- package/worker/fuzzer/src/fuzzer.cpp +2 -0
- package/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp +8 -4
- package/worker/include/RTC/RtpRetransmissionBuffer.hpp +2 -2
- package/worker/include/RTC/RtpStream.hpp +4 -0
- package/worker/include/RTC/RtpStreamRecv.hpp +4 -0
- package/worker/include/RTC/RtpStreamSend.hpp +4 -0
- package/worker/include/RTC/SeqManager.hpp +2 -0
- package/worker/meson.build +1 -0
- package/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp +26 -0
- package/worker/src/RTC/RtpRetransmissionBuffer.cpp +38 -12
- package/worker/src/RTC/RtpStream.cpp +4 -0
- package/worker/src/RTC/RtpStreamRecv.cpp +7 -0
- package/worker/src/RTC/RtpStreamSend.cpp +11 -0
- package/worker/src/RTC/SeqManager.cpp +35 -9
- package/worker/src/RTC/TransportCongestionControlClient.cpp +21 -4
- package/worker/src/RTC/TransportCongestionControlServer.cpp +28 -4
- package/worker/test/src/RTC/TestRtpRetransmissionBuffer.cpp +22 -0
- package/worker/test/src/RTC/TestRtpStreamSend.cpp +64 -19
- package/worker/test/src/RTC/TestSeqManager.cpp +79 -0
|
@@ -113,15 +113,29 @@ namespace RTC
|
|
|
113
113
|
|
|
114
114
|
output = (input + base) & MaxValue;
|
|
115
115
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
// New output is higher than the maximum seen. But less than acceptable units higher.
|
|
122
|
-
// Keep it as the maximum seen. See Sync().
|
|
123
|
-
if (IsSeqHigherThan(output, this->maxOutput))
|
|
116
|
+
if (!this->started)
|
|
117
|
+
{
|
|
118
|
+
this->started = true;
|
|
119
|
+
|
|
120
|
+
this->maxInput = input;
|
|
124
121
|
this->maxOutput = output;
|
|
122
|
+
}
|
|
123
|
+
else
|
|
124
|
+
{
|
|
125
|
+
// New input is higher than the maximum seen. But less than acceptable units higher.
|
|
126
|
+
// Keep it as the maximum seen. See Drop().
|
|
127
|
+
if (IsSeqHigherThan(input, this->maxInput))
|
|
128
|
+
{
|
|
129
|
+
this->maxInput = input;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// New output is higher than the maximum seen. But less than acceptable units higher.
|
|
133
|
+
// Keep it as the maximum seen. See Sync().
|
|
134
|
+
if (IsSeqHigherThan(output, this->maxOutput))
|
|
135
|
+
{
|
|
136
|
+
this->maxOutput = output;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
125
139
|
|
|
126
140
|
ClearDropped();
|
|
127
141
|
|
|
@@ -172,7 +186,19 @@ namespace RTC
|
|
|
172
186
|
// There are many values in the range.
|
|
173
187
|
else
|
|
174
188
|
{
|
|
175
|
-
|
|
189
|
+
// Measure the distance of it1 and it2 to the beggining of dropped.
|
|
190
|
+
auto distanceIt1 = std::distance(this->dropped.begin(), it1);
|
|
191
|
+
auto distanceIt2 = std::distance(this->dropped.begin(), it2);
|
|
192
|
+
|
|
193
|
+
// it2 goes out of range, only it1 is within the range.
|
|
194
|
+
if (distanceIt2 < distanceIt1)
|
|
195
|
+
{
|
|
196
|
+
this->dropped.erase(it1);
|
|
197
|
+
}
|
|
198
|
+
else
|
|
199
|
+
{
|
|
200
|
+
this->dropped.erase(it1, it2);
|
|
201
|
+
}
|
|
176
202
|
}
|
|
177
203
|
|
|
178
204
|
// Adapt base.
|
|
@@ -215,14 +215,21 @@ namespace RTC
|
|
|
215
215
|
MS_TRACE();
|
|
216
216
|
|
|
217
217
|
// Update packet loss history.
|
|
218
|
-
const size_t
|
|
219
|
-
size_t
|
|
218
|
+
const size_t expectedPackets = feedback->GetPacketStatusCount();
|
|
219
|
+
size_t lostPackets = 0;
|
|
220
|
+
|
|
220
221
|
for (const auto& result : feedback->GetPacketResults())
|
|
221
222
|
{
|
|
222
223
|
if (!result.received)
|
|
223
|
-
|
|
224
|
+
{
|
|
225
|
+
lostPackets += 1;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (expectedPackets > 0)
|
|
230
|
+
{
|
|
231
|
+
this->UpdatePacketLoss(static_cast<double>(lostPackets) / expectedPackets);
|
|
224
232
|
}
|
|
225
|
-
this->UpdatePacketLoss(static_cast<double>(lost_packets) / expected_packets);
|
|
226
233
|
|
|
227
234
|
if (this->rtpTransportControllerSend == nullptr)
|
|
228
235
|
{
|
|
@@ -236,7 +243,9 @@ namespace RTC
|
|
|
236
243
|
{
|
|
237
244
|
// Add the score into the histogram.
|
|
238
245
|
if (this->packetLossHistory.size() == PacketLossHistogramLength)
|
|
246
|
+
{
|
|
239
247
|
this->packetLossHistory.pop_front();
|
|
248
|
+
}
|
|
240
249
|
|
|
241
250
|
this->packetLossHistory.push_back(packetLoss);
|
|
242
251
|
|
|
@@ -303,9 +312,13 @@ namespace RTC
|
|
|
303
312
|
// Manage it via trending and increase it a bit to avoid immediate oscillations.
|
|
304
313
|
#ifdef USE_TREND_CALCULATOR
|
|
305
314
|
if (!force)
|
|
315
|
+
{
|
|
306
316
|
this->desiredBitrateTrend.Update(desiredBitrate, nowMs);
|
|
317
|
+
}
|
|
307
318
|
else
|
|
319
|
+
{
|
|
308
320
|
this->desiredBitrateTrend.ForceUpdate(desiredBitrate, nowMs);
|
|
321
|
+
}
|
|
309
322
|
#endif
|
|
310
323
|
|
|
311
324
|
this->bitrates.desiredBitrate = desiredBitrate;
|
|
@@ -512,9 +525,13 @@ namespace RTC
|
|
|
512
525
|
// Update availableBitrate.
|
|
513
526
|
// NOTE: Just in case.
|
|
514
527
|
if (targetTransferRate.target_rate.bps() > std::numeric_limits<uint32_t>::max())
|
|
528
|
+
{
|
|
515
529
|
this->bitrates.availableBitrate = std::numeric_limits<uint32_t>::max();
|
|
530
|
+
}
|
|
516
531
|
else
|
|
532
|
+
{
|
|
517
533
|
this->bitrates.availableBitrate = static_cast<uint32_t>(targetTransferRate.target_rate.bps());
|
|
534
|
+
}
|
|
518
535
|
|
|
519
536
|
MS_DEBUG_DEV("new available bitrate:%" PRIu32, this->bitrates.availableBitrate);
|
|
520
537
|
|
|
@@ -120,7 +120,9 @@ namespace RTC
|
|
|
120
120
|
uint16_t wideSeqNumber;
|
|
121
121
|
|
|
122
122
|
if (!packet->ReadTransportWideCc01(wideSeqNumber))
|
|
123
|
+
{
|
|
123
124
|
break;
|
|
125
|
+
}
|
|
124
126
|
|
|
125
127
|
// Update the RTCP media SSRC of the ongoing Transport-CC Feedback packet.
|
|
126
128
|
this->transportCcFeedbackSenderSsrc = 0u;
|
|
@@ -186,7 +188,9 @@ namespace RTC
|
|
|
186
188
|
uint32_t absSendTime;
|
|
187
189
|
|
|
188
190
|
if (!packet->ReadAbsSendTime(absSendTime))
|
|
191
|
+
{
|
|
189
192
|
break;
|
|
193
|
+
}
|
|
190
194
|
|
|
191
195
|
// NOTE: nowMs is uint64_t but we need to "convert" it to int64_t before
|
|
192
196
|
// we give it to libwebrtc lib (althought this is implicit in the
|
|
@@ -221,8 +225,12 @@ namespace RTC
|
|
|
221
225
|
{
|
|
222
226
|
MS_TRACE();
|
|
223
227
|
|
|
228
|
+
this->transportCcFeedbackPacket->Finish();
|
|
229
|
+
|
|
224
230
|
if (!this->transportCcFeedbackPacket->IsSerializable())
|
|
231
|
+
{
|
|
225
232
|
return;
|
|
233
|
+
}
|
|
226
234
|
|
|
227
235
|
auto latestWideSeqNumber = this->transportCcFeedbackPacket->GetLatestSequenceNumber();
|
|
228
236
|
auto latestTimestamp = this->transportCcFeedbackPacket->GetLatestTimestamp();
|
|
@@ -232,15 +240,21 @@ namespace RTC
|
|
|
232
240
|
this, this->transportCcFeedbackPacket.get());
|
|
233
241
|
|
|
234
242
|
// Update packet loss history.
|
|
235
|
-
const size_t
|
|
236
|
-
size_t
|
|
243
|
+
const size_t expectedPackets = this->transportCcFeedbackPacket->GetPacketStatusCount();
|
|
244
|
+
size_t lostPackets = 0;
|
|
245
|
+
|
|
237
246
|
for (const auto& result : this->transportCcFeedbackPacket->GetPacketResults())
|
|
238
247
|
{
|
|
239
248
|
if (!result.received)
|
|
240
|
-
|
|
249
|
+
{
|
|
250
|
+
lostPackets += 1;
|
|
251
|
+
}
|
|
241
252
|
}
|
|
242
253
|
|
|
243
|
-
|
|
254
|
+
if (expectedPackets > 0)
|
|
255
|
+
{
|
|
256
|
+
this->UpdatePacketLoss(static_cast<double>(lostPackets) / expectedPackets);
|
|
257
|
+
}
|
|
244
258
|
|
|
245
259
|
// Create a new feedback packet.
|
|
246
260
|
this->transportCcFeedbackPacket.reset(new RTC::RTCP::FeedbackRtpTransportPacket(
|
|
@@ -265,7 +279,9 @@ namespace RTC
|
|
|
265
279
|
|
|
266
280
|
// May fix unlimitedRembCounter.
|
|
267
281
|
if (this->unlimitedRembCounter > 0u && this->maxIncomingBitrate != 0u)
|
|
282
|
+
{
|
|
268
283
|
this->unlimitedRembCounter = 0u;
|
|
284
|
+
}
|
|
269
285
|
|
|
270
286
|
// In case this is the first unlimited REMB packet, send it fast.
|
|
271
287
|
// clang-format off
|
|
@@ -295,7 +311,9 @@ namespace RTC
|
|
|
295
311
|
this->limitationRembSentAtMs = nowMs;
|
|
296
312
|
|
|
297
313
|
if (this->unlimitedRembCounter > 0u)
|
|
314
|
+
{
|
|
298
315
|
this->unlimitedRembCounter--;
|
|
316
|
+
}
|
|
299
317
|
}
|
|
300
318
|
}
|
|
301
319
|
|
|
@@ -303,7 +321,9 @@ namespace RTC
|
|
|
303
321
|
{
|
|
304
322
|
// Add the score into the histogram.
|
|
305
323
|
if (this->packetLossHistory.size() == PacketLossHistogramLength)
|
|
324
|
+
{
|
|
306
325
|
this->packetLossHistory.pop_front();
|
|
326
|
+
}
|
|
307
327
|
|
|
308
328
|
this->packetLossHistory.push_back(packetLoss);
|
|
309
329
|
|
|
@@ -334,7 +354,9 @@ namespace RTC
|
|
|
334
354
|
|
|
335
355
|
// Limit announced bitrate if requested via API.
|
|
336
356
|
if (this->maxIncomingBitrate != 0u)
|
|
357
|
+
{
|
|
337
358
|
availableBitrate = std::min(availableBitrate, this->maxIncomingBitrate);
|
|
359
|
+
}
|
|
338
360
|
|
|
339
361
|
#if MS_LOG_DEV_LEVEL == 3
|
|
340
362
|
std::ostringstream ssrcsStream;
|
|
@@ -366,6 +388,8 @@ namespace RTC
|
|
|
366
388
|
MS_TRACE();
|
|
367
389
|
|
|
368
390
|
if (timer == this->transportCcFeedbackSendPeriodicTimer)
|
|
391
|
+
{
|
|
369
392
|
SendTransportCcFeedback();
|
|
393
|
+
}
|
|
370
394
|
}
|
|
371
395
|
} // namespace RTC
|
|
@@ -253,6 +253,28 @@ SCENARIO("RtpRetransmissionBuffer", "[rtp][rtx]")
|
|
|
253
253
|
// clang-format on
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
+
SECTION(
|
|
257
|
+
"packet with lower seq than newest packet in the buffer and higher timestamp forces buffer emptying")
|
|
258
|
+
{
|
|
259
|
+
uint16_t maxItems{ 4 };
|
|
260
|
+
uint32_t maxRetransmissionDelayMs{ 2000u };
|
|
261
|
+
uint32_t clockRate{ 90000 };
|
|
262
|
+
|
|
263
|
+
RtpMyRetransmissionBuffer myRetransmissionBuffer(maxItems, maxRetransmissionDelayMs, clockRate);
|
|
264
|
+
|
|
265
|
+
myRetransmissionBuffer.Insert(33331, 1000000001);
|
|
266
|
+
myRetransmissionBuffer.Insert(33332, 1000000002);
|
|
267
|
+
myRetransmissionBuffer.Insert(33330, 1000000003);
|
|
268
|
+
|
|
269
|
+
// clang-format off
|
|
270
|
+
myRetransmissionBuffer.AssertBuffer(
|
|
271
|
+
{
|
|
272
|
+
{ true, 33330, 1000000003 }
|
|
273
|
+
}
|
|
274
|
+
);
|
|
275
|
+
// clang-format on
|
|
276
|
+
}
|
|
277
|
+
|
|
256
278
|
SECTION("fuzzer generated packets")
|
|
257
279
|
{
|
|
258
280
|
uint16_t maxItems{ 2500u };
|
|
@@ -123,11 +123,11 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
123
123
|
|
|
124
124
|
REQUIRE(testRtpStreamListener.retransmittedPackets.size() == 5);
|
|
125
125
|
|
|
126
|
-
auto rtxPacket1 = testRtpStreamListener.retransmittedPackets[0];
|
|
127
|
-
auto rtxPacket2 = testRtpStreamListener.retransmittedPackets[1];
|
|
128
|
-
auto rtxPacket3 = testRtpStreamListener.retransmittedPackets[2];
|
|
129
|
-
auto rtxPacket4 = testRtpStreamListener.retransmittedPackets[3];
|
|
130
|
-
auto rtxPacket5 = testRtpStreamListener.retransmittedPackets[4];
|
|
126
|
+
auto* rtxPacket1 = testRtpStreamListener.retransmittedPackets[0];
|
|
127
|
+
auto* rtxPacket2 = testRtpStreamListener.retransmittedPackets[1];
|
|
128
|
+
auto* rtxPacket3 = testRtpStreamListener.retransmittedPackets[2];
|
|
129
|
+
auto* rtxPacket4 = testRtpStreamListener.retransmittedPackets[3];
|
|
130
|
+
auto* rtxPacket5 = testRtpStreamListener.retransmittedPackets[4];
|
|
131
131
|
|
|
132
132
|
testRtpStreamListener.retransmittedPackets.clear();
|
|
133
133
|
|
|
@@ -294,8 +294,8 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
294
294
|
|
|
295
295
|
REQUIRE(testRtpStreamListener1.retransmittedPackets.size() == 2);
|
|
296
296
|
|
|
297
|
-
auto rtxPacket1 = testRtpStreamListener1.retransmittedPackets[0];
|
|
298
|
-
auto rtxPacket2 = testRtpStreamListener1.retransmittedPackets[1];
|
|
297
|
+
auto* rtxPacket1 = testRtpStreamListener1.retransmittedPackets[0];
|
|
298
|
+
auto* rtxPacket2 = testRtpStreamListener1.retransmittedPackets[1];
|
|
299
299
|
|
|
300
300
|
testRtpStreamListener1.retransmittedPackets.clear();
|
|
301
301
|
|
|
@@ -330,7 +330,7 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
330
330
|
auto* packet2 = CreateRtpPacket(rtpBuffer2, 21007, secondTs - 1);
|
|
331
331
|
|
|
332
332
|
// Create a RtpStreamSend instance.
|
|
333
|
-
TestRtpStreamListener
|
|
333
|
+
TestRtpStreamListener testRtpStreamListener;
|
|
334
334
|
|
|
335
335
|
RtpStream::Params params1;
|
|
336
336
|
|
|
@@ -340,7 +340,7 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
340
340
|
params1.mimeType.type = RTC::RtpCodecMimeType::Type::VIDEO;
|
|
341
341
|
|
|
342
342
|
std::string mid;
|
|
343
|
-
auto* stream = new RtpStreamSend(&
|
|
343
|
+
auto* stream = new RtpStreamSend(&testRtpStreamListener, params1, mid);
|
|
344
344
|
|
|
345
345
|
// Receive all the packets.
|
|
346
346
|
SendRtpPacket({ { stream, params1.ssrc } }, packet1);
|
|
@@ -358,12 +358,12 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
358
358
|
// Process the NACK packet on stream1.
|
|
359
359
|
stream->ReceiveNack(&nackPacket);
|
|
360
360
|
|
|
361
|
-
REQUIRE(
|
|
361
|
+
REQUIRE(testRtpStreamListener.retransmittedPackets.size() == 2);
|
|
362
362
|
|
|
363
|
-
auto rtxPacket1 =
|
|
364
|
-
auto rtxPacket2 =
|
|
363
|
+
auto* rtxPacket1 = testRtpStreamListener.retransmittedPackets[0];
|
|
364
|
+
auto* rtxPacket2 = testRtpStreamListener.retransmittedPackets[1];
|
|
365
365
|
|
|
366
|
-
|
|
366
|
+
testRtpStreamListener.retransmittedPackets.clear();
|
|
367
367
|
|
|
368
368
|
CheckRtxPacket(rtxPacket1, packet1->GetSequenceNumber(), packet1->GetTimestamp());
|
|
369
369
|
CheckRtxPacket(rtxPacket2, packet2->GetSequenceNumber(), packet2->GetTimestamp());
|
|
@@ -386,7 +386,7 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
386
386
|
auto* packet3 = CreateRtpPacket(rtpBuffer3, 21008, thirdTs);
|
|
387
387
|
|
|
388
388
|
// Create a RtpStreamSend instance.
|
|
389
|
-
TestRtpStreamListener
|
|
389
|
+
TestRtpStreamListener testRtpStreamListener;
|
|
390
390
|
|
|
391
391
|
RtpStream::Params params1;
|
|
392
392
|
|
|
@@ -396,14 +396,14 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
396
396
|
params1.mimeType.type = RTC::RtpCodecMimeType::Type::VIDEO;
|
|
397
397
|
|
|
398
398
|
std::string mid;
|
|
399
|
-
auto* stream = new RtpStreamSend(&
|
|
399
|
+
auto* stream = new RtpStreamSend(&testRtpStreamListener, params1, mid);
|
|
400
400
|
|
|
401
401
|
// Receive all the packets.
|
|
402
402
|
SendRtpPacket({ { stream, params1.ssrc } }, packet1);
|
|
403
403
|
SendRtpPacket({ { stream, params1.ssrc } }, packet2);
|
|
404
404
|
SendRtpPacket({ { stream, params1.ssrc } }, packet3);
|
|
405
405
|
|
|
406
|
-
// Create a NACK item that
|
|
406
|
+
// Create a NACK item that requests for all packets.
|
|
407
407
|
RTCP::FeedbackRtpNackPacket nackPacket(0, params1.ssrc);
|
|
408
408
|
auto* nackItem = new RTCP::FeedbackRtpNackItem(21006, 0b0000000000000001);
|
|
409
409
|
|
|
@@ -415,17 +415,62 @@ SCENARIO("NACK and RTP packets retransmission", "[rtp][rtcp][nack]")
|
|
|
415
415
|
// Process the NACK packet on stream1.
|
|
416
416
|
stream->ReceiveNack(&nackPacket);
|
|
417
417
|
|
|
418
|
-
REQUIRE(
|
|
418
|
+
REQUIRE(testRtpStreamListener.retransmittedPackets.size() == 1);
|
|
419
419
|
|
|
420
|
-
auto rtxPacket2 =
|
|
420
|
+
auto* rtxPacket2 = testRtpStreamListener.retransmittedPackets[0];
|
|
421
421
|
|
|
422
|
-
|
|
422
|
+
testRtpStreamListener.retransmittedPackets.clear();
|
|
423
423
|
|
|
424
424
|
CheckRtxPacket(rtxPacket2, packet2->GetSequenceNumber(), packet2->GetTimestamp());
|
|
425
425
|
|
|
426
426
|
delete stream;
|
|
427
427
|
}
|
|
428
428
|
|
|
429
|
+
SECTION("packets get removed from the retransmission buffer if seq number of the stream is reset")
|
|
430
|
+
{
|
|
431
|
+
// This scenario reproduce the "too bad sequence number" and "bad sequence
|
|
432
|
+
// number" scenarios in RtpStream::UpdateSeq().
|
|
433
|
+
auto* packet1 = CreateRtpPacket(rtpBuffer1, 50001, 1000001);
|
|
434
|
+
auto* packet2 = CreateRtpPacket(rtpBuffer2, 50002, 1000002);
|
|
435
|
+
// Third packet has bad sequence number (its seq is more than MaxDropout=3000
|
|
436
|
+
// older than current max seq) and will be dropped.
|
|
437
|
+
auto* packet3 = CreateRtpPacket(rtpBuffer3, 40003, 1000003);
|
|
438
|
+
// Forth packet has seq=badSeq+1 so will be accepted and will trigger a
|
|
439
|
+
// stream reset.
|
|
440
|
+
auto* packet4 = CreateRtpPacket(rtpBuffer4, 40004, 1000004);
|
|
441
|
+
|
|
442
|
+
// Create a RtpStreamSend instance.
|
|
443
|
+
TestRtpStreamListener testRtpStreamListener;
|
|
444
|
+
|
|
445
|
+
RtpStream::Params params1;
|
|
446
|
+
|
|
447
|
+
params1.ssrc = 1111;
|
|
448
|
+
params1.clockRate = 90000;
|
|
449
|
+
params1.useNack = true;
|
|
450
|
+
params1.mimeType.type = RTC::RtpCodecMimeType::Type::VIDEO;
|
|
451
|
+
|
|
452
|
+
std::string mid;
|
|
453
|
+
auto* stream = new RtpStreamSend(&testRtpStreamListener, params1, mid);
|
|
454
|
+
|
|
455
|
+
SendRtpPacket({ { stream, params1.ssrc } }, packet1);
|
|
456
|
+
SendRtpPacket({ { stream, params1.ssrc } }, packet2);
|
|
457
|
+
SendRtpPacket({ { stream, params1.ssrc } }, packet3);
|
|
458
|
+
SendRtpPacket({ { stream, params1.ssrc } }, packet4);
|
|
459
|
+
|
|
460
|
+
// Create a NACK item that requests for packets 1 and 2.
|
|
461
|
+
RTCP::FeedbackRtpNackPacket nackPacket2(0, params1.ssrc);
|
|
462
|
+
auto* nackItem2 = new RTCP::FeedbackRtpNackItem(50001, 0b0000000000000001);
|
|
463
|
+
|
|
464
|
+
nackPacket2.AddItem(nackItem2);
|
|
465
|
+
|
|
466
|
+
// Process the NACK packet on stream1.
|
|
467
|
+
stream->ReceiveNack(&nackPacket2);
|
|
468
|
+
|
|
469
|
+
REQUIRE(testRtpStreamListener.retransmittedPackets.size() == 0);
|
|
470
|
+
|
|
471
|
+
delete stream;
|
|
472
|
+
}
|
|
473
|
+
|
|
429
474
|
#ifdef PERFORMANCE_TEST
|
|
430
475
|
SECTION("Performance")
|
|
431
476
|
{
|
|
@@ -649,4 +649,83 @@ SCENARIO("SeqManager", "[rtc][SeqMananger]")
|
|
|
649
649
|
SeqManager<uint8_t, 3> seqManager;
|
|
650
650
|
validate(seqManager, inputs);
|
|
651
651
|
}
|
|
652
|
+
|
|
653
|
+
SECTION("dropped inputs to be removed going out of range, 1.")
|
|
654
|
+
{
|
|
655
|
+
// clang-format off
|
|
656
|
+
std::vector<TestSeqManagerInput<uint16_t>> inputs =
|
|
657
|
+
{
|
|
658
|
+
{ 36964, 36964, false, false, 0 },
|
|
659
|
+
{ 25923, 0, false, true, 0 }, // Drop.
|
|
660
|
+
{ 25701, 25701, false, false, 0 },
|
|
661
|
+
{ 17170, 0, false, true, 0 }, // Drop.
|
|
662
|
+
{ 25923, 25923, false, false, 0 },
|
|
663
|
+
{ 4728, 0, false, true, 0 }, // Drop.
|
|
664
|
+
{ 17170, 17170, false, false, 0 },
|
|
665
|
+
{ 30738, 0, false, true, 0 }, // Drop.
|
|
666
|
+
{ 4728, 4728, false, false, 0 },
|
|
667
|
+
{ 4806, 0, false, true, 0 }, // Drop.
|
|
668
|
+
{ 30738, 30738, false, false, 0 },
|
|
669
|
+
{ 50886, 0, false, true, 0 }, // Drop.
|
|
670
|
+
{ 4806, 4805, false, false, 0 }, // Previously dropped.
|
|
671
|
+
{ 50774, 0, false, true, 0 }, // Drop.
|
|
672
|
+
{ 50886, 50884, false, false, 0 }, // Previously dropped.
|
|
673
|
+
{ 22136, 0, false, true, 0 }, // Drop.
|
|
674
|
+
{ 50774, 50884, false, false, 0 }, // Previously dropped.
|
|
675
|
+
{ 30910, 0, false, true, 0 }, // Drop.
|
|
676
|
+
{ 22136, 22134, false, false, 0 },
|
|
677
|
+
{ 48862, 0, false, true, 0 }, // Drop.
|
|
678
|
+
{ 30910, 30909, false, false, 0 },
|
|
679
|
+
{ 56832, 0, false, true, 0 }, // Drop.
|
|
680
|
+
{ 48862, 48861, false, false, 0 },
|
|
681
|
+
{ 2, 0, false, true, 0 }, // Drop.
|
|
682
|
+
{ 56832, 56828, false, false, 0 },
|
|
683
|
+
{ 530, 0, false, true, 0 }, // Drop.
|
|
684
|
+
{ 2, 65534, false, false, 0 },
|
|
685
|
+
};
|
|
686
|
+
// clang-format on
|
|
687
|
+
|
|
688
|
+
SeqManager<uint16_t> seqManager;
|
|
689
|
+
validate(seqManager, inputs);
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
SECTION("dropped inputs to be removed go out of range, 2.")
|
|
693
|
+
{
|
|
694
|
+
// clang-format off
|
|
695
|
+
std::vector<TestSeqManagerInput<uint16_t>> inputs =
|
|
696
|
+
{
|
|
697
|
+
{ 36960, 36960, false, false, 0 },
|
|
698
|
+
{ 3328, 0, false, true, 0 }, // Drop.
|
|
699
|
+
{ 24589, 24588, false, false, 0 },
|
|
700
|
+
{ 120, 0, false, true, 0 }, // Drop.
|
|
701
|
+
{ 3328, 3326, false, false, 0 },
|
|
702
|
+
{ 30848, 0, false, true, 0 }, // Drop.
|
|
703
|
+
{ 120, 3326, false, false, 0 }, // Previously dropped.
|
|
704
|
+
};
|
|
705
|
+
// clang-format on
|
|
706
|
+
|
|
707
|
+
SeqManager<uint16_t> seqManager;
|
|
708
|
+
validate(seqManager, inputs);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
SECTION("dropped inputs to be removed go out of range, 3.")
|
|
712
|
+
{
|
|
713
|
+
// clang-format off
|
|
714
|
+
std::vector<TestSeqManagerInput<uint16_t>> inputs =
|
|
715
|
+
{
|
|
716
|
+
{ 36964, 36964, false, false, 0 },
|
|
717
|
+
{ 65396 , 0, false, true, 0 }, // Drop.
|
|
718
|
+
{ 25855, 25854, false, false, 0 },
|
|
719
|
+
{ 29793 , 0, false, true, 0 }, // Drop.
|
|
720
|
+
{ 65396, 65395, false, false, 0 },
|
|
721
|
+
{ 25087, 0, false, true, 0 }, // Drop.
|
|
722
|
+
{ 29793, 29791, false, false, 0 },
|
|
723
|
+
{ 65535 , 0, false, true, 0 }, // Drop.
|
|
724
|
+
{ 25087, 29791, false, false, 0 }, // Previously dropped.
|
|
725
|
+
};
|
|
726
|
+
// clang-format on
|
|
727
|
+
|
|
728
|
+
SeqManager<uint16_t> seqManager;
|
|
729
|
+
validate(seqManager, inputs);
|
|
730
|
+
}
|
|
652
731
|
}
|