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.
Files changed (72) hide show
  1. package/node/lib/ActiveSpeakerObserver.d.ts +6 -5
  2. package/node/lib/ActiveSpeakerObserver.d.ts.map +1 -1
  3. package/node/lib/AudioLevelObserver.d.ts +6 -5
  4. package/node/lib/AudioLevelObserver.d.ts.map +1 -1
  5. package/node/lib/Consumer.d.ts +8 -7
  6. package/node/lib/Consumer.d.ts.map +1 -1
  7. package/node/lib/Consumer.js +2 -2
  8. package/node/lib/DataConsumer.d.ts +8 -7
  9. package/node/lib/DataConsumer.d.ts.map +1 -1
  10. package/node/lib/DataConsumer.js +2 -2
  11. package/node/lib/DataProducer.d.ts +8 -7
  12. package/node/lib/DataProducer.d.ts.map +1 -1
  13. package/node/lib/DataProducer.js +2 -2
  14. package/node/lib/DirectTransport.d.ts +6 -5
  15. package/node/lib/DirectTransport.d.ts.map +1 -1
  16. package/node/lib/PipeTransport.d.ts +9 -8
  17. package/node/lib/PipeTransport.d.ts.map +1 -1
  18. package/node/lib/PlainTransport.d.ts +6 -5
  19. package/node/lib/PlainTransport.d.ts.map +1 -1
  20. package/node/lib/Producer.d.ts +8 -7
  21. package/node/lib/Producer.d.ts.map +1 -1
  22. package/node/lib/Producer.js +2 -2
  23. package/node/lib/Router.d.ts +14 -13
  24. package/node/lib/Router.d.ts.map +1 -1
  25. package/node/lib/Router.js +2 -2
  26. package/node/lib/RtpObserver.d.ts +8 -7
  27. package/node/lib/RtpObserver.d.ts.map +1 -1
  28. package/node/lib/RtpObserver.js +2 -2
  29. package/node/lib/Transport.d.ts +12 -11
  30. package/node/lib/Transport.d.ts.map +1 -1
  31. package/node/lib/Transport.js +2 -2
  32. package/node/lib/WebRtcServer.d.ts +16 -15
  33. package/node/lib/WebRtcServer.d.ts.map +1 -1
  34. package/node/lib/WebRtcServer.js +2 -2
  35. package/node/lib/WebRtcTransport.d.ts +7 -6
  36. package/node/lib/WebRtcTransport.d.ts.map +1 -1
  37. package/node/lib/Worker.d.ts +12 -11
  38. package/node/lib/Worker.d.ts.map +1 -1
  39. package/node/lib/Worker.js +3 -3
  40. package/node/lib/index.d.ts +3 -2
  41. package/node/lib/index.d.ts.map +1 -1
  42. package/node/lib/index.js +1 -1
  43. package/node/lib/ortc.d.ts +2 -3
  44. package/node/lib/ortc.d.ts.map +1 -1
  45. package/node/lib/ortc.js +2 -3
  46. package/node/lib/tests/test-Router.js +5 -1
  47. package/node/lib/tests/test-Worker.js +2 -2
  48. package/node/lib/types.d.ts +3 -0
  49. package/node/lib/types.d.ts.map +1 -1
  50. package/package.json +5 -5
  51. package/worker/Makefile +1 -1
  52. package/worker/fuzzer/include/RTC/FuzzerSeqManager.hpp +17 -0
  53. package/worker/fuzzer/src/RTC/FuzzerSeqManager.cpp +22 -0
  54. package/worker/fuzzer/src/fuzzer.cpp +2 -0
  55. package/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp +8 -4
  56. package/worker/include/RTC/RtpRetransmissionBuffer.hpp +2 -2
  57. package/worker/include/RTC/RtpStream.hpp +4 -0
  58. package/worker/include/RTC/RtpStreamRecv.hpp +4 -0
  59. package/worker/include/RTC/RtpStreamSend.hpp +4 -0
  60. package/worker/include/RTC/SeqManager.hpp +2 -0
  61. package/worker/meson.build +1 -0
  62. package/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp +26 -0
  63. package/worker/src/RTC/RtpRetransmissionBuffer.cpp +38 -12
  64. package/worker/src/RTC/RtpStream.cpp +4 -0
  65. package/worker/src/RTC/RtpStreamRecv.cpp +7 -0
  66. package/worker/src/RTC/RtpStreamSend.cpp +11 -0
  67. package/worker/src/RTC/SeqManager.cpp +35 -9
  68. package/worker/src/RTC/TransportCongestionControlClient.cpp +21 -4
  69. package/worker/src/RTC/TransportCongestionControlServer.cpp +28 -4
  70. package/worker/test/src/RTC/TestRtpRetransmissionBuffer.cpp +22 -0
  71. package/worker/test/src/RTC/TestRtpStreamSend.cpp +64 -19
  72. 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
- // New input is higher than the maximum seen. But less than acceptable units higher.
117
- // Keep it as the maximum seen. See Drop().
118
- if (IsSeqHigherThan(input, this->maxInput))
119
- this->maxInput = input;
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
- this->dropped.erase(it1, it2);
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 expected_packets = feedback->GetPacketStatusCount();
219
- size_t lost_packets = 0;
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
- lost_packets += 1;
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 expected_packets = this->transportCcFeedbackPacket->GetPacketStatusCount();
236
- size_t lost_packets = 0;
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
- lost_packets += 1;
249
+ {
250
+ lostPackets += 1;
251
+ }
241
252
  }
242
253
 
243
- this->UpdatePacketLoss(static_cast<double>(lost_packets) / expected_packets);
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 testRtpStreamListener1;
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(&testRtpStreamListener1, params1, mid);
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(testRtpStreamListener1.retransmittedPackets.size() == 2);
361
+ REQUIRE(testRtpStreamListener.retransmittedPackets.size() == 2);
362
362
 
363
- auto rtxPacket1 = testRtpStreamListener1.retransmittedPackets[0];
364
- auto rtxPacket2 = testRtpStreamListener1.retransmittedPackets[1];
363
+ auto* rtxPacket1 = testRtpStreamListener.retransmittedPackets[0];
364
+ auto* rtxPacket2 = testRtpStreamListener.retransmittedPackets[1];
365
365
 
366
- testRtpStreamListener1.retransmittedPackets.clear();
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 testRtpStreamListener1;
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(&testRtpStreamListener1, params1, mid);
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 request for all the packets.
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(testRtpStreamListener1.retransmittedPackets.size() == 1);
418
+ REQUIRE(testRtpStreamListener.retransmittedPackets.size() == 1);
419
419
 
420
- auto rtxPacket2 = testRtpStreamListener1.retransmittedPackets[0];
420
+ auto* rtxPacket2 = testRtpStreamListener.retransmittedPackets[0];
421
421
 
422
- testRtpStreamListener1.retransmittedPackets.clear();
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
  }