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
@@ -2,6 +2,7 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter';
2
2
  import { Worker, WorkerSettings } from './Worker';
3
3
  import { RtpCapabilities } from './RtpParameters';
4
4
  import * as types from './types';
5
+ import { AppData } from './types';
5
6
  /**
6
7
  * Expose all types.
7
8
  */
@@ -9,7 +10,7 @@ export { types };
9
10
  /**
10
11
  * Expose mediasoup version.
11
12
  */
12
- export declare const version = "3.11.19";
13
+ export declare const version = "3.11.21";
13
14
  /**
14
15
  * Expose parseScalabilityMode() function.
15
16
  */
@@ -25,7 +26,7 @@ export { observer };
25
26
  /**
26
27
  * Create a Worker.
27
28
  */
28
- export declare function createWorker({ logLevel, logTags, rtcMinPort, rtcMaxPort, dtlsCertificateFile, dtlsPrivateKeyFile, libwebrtcFieldTrials, appData }?: WorkerSettings): Promise<Worker>;
29
+ export declare function createWorker<WorkerAppData extends AppData = AppData>({ logLevel, logTags, rtcMinPort, rtcMaxPort, dtlsCertificateFile, dtlsPrivateKeyFile, libwebrtcFieldTrials, appData }?: WorkerSettings<WorkerAppData>): Promise<Worker<WorkerAppData>>;
29
30
  /**
30
31
  * Get a cloned copy of the mediasoup supported RTP capabilities.
31
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,OAAO,0BAA0B,CAAC;AAE/C;;GAEG;AACH,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAInE,MAAM,MAAM,cAAc,GAC1B;IACC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,QAAQ,sCAA6C,CAAC;AAE5D;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB;;GAEG;AACH,wBAAsB,YAAY,CACjC,EACC,QAAkB,EAClB,OAAO,EACP,UAAkB,EAClB,UAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,OAAO,EACP,GAAE,cAAmB,GACpB,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,eAAe,CAG7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,OAAO,0BAA0B,CAAC;AAE/C;;GAEG;AACH,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAInE,MAAM,MAAM,cAAc,GAC1B;IACC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,QAAQ,sCAA6C,CAAC;AAE5D;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB;;GAEG;AACH,wBAAsB,YAAY,CAAC,aAAa,SAAS,OAAO,GAAG,OAAO,EACzE,EACC,QAAkB,EAClB,OAAO,EACP,UAAkB,EAClB,UAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,OAAO,EACP,GAAE,cAAc,CAAC,aAAa,CAAM,GACnC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAiChC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,eAAe,CAG7D"}
package/node/lib/index.js CHANGED
@@ -11,7 +11,7 @@ exports.types = types;
11
11
  /**
12
12
  * Expose mediasoup version.
13
13
  */
14
- exports.version = '3.11.19';
14
+ exports.version = '3.11.21';
15
15
  /**
16
16
  * Expose parseScalabilityMode() function.
17
17
  */
@@ -49,9 +49,8 @@ export declare function validateRtpParameters(params: RtpParameters): void;
49
49
  */
50
50
  export declare function validateRtpCodecParameters(codec: RtpCodecParameters): void;
51
51
  /**
52
- * Validates RtpHeaderExtensionParameteters. It may modify given data by adding missing
53
- * fields with default values.
54
- * It throws if invalid.
52
+ * Validates RtpHeaderExtensionParameteters. It may modify given data by adding
53
+ * missing fields with default values. It throws if invalid.
55
54
  */
56
55
  export declare function validateRtpHeaderExtensionParameters(ext: RtpHeaderExtensionParameters): void;
57
56
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ortc.d.ts","sourceRoot":"","sources":["../src/ortc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ortc.d.ts","sourceRoot":"","sources":["../src/ortc.ts"],"names":[],"mappings":"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"}
package/node/lib/ortc.js CHANGED
@@ -279,9 +279,8 @@ function validateRtpCodecParameters(codec) {
279
279
  }
280
280
  exports.validateRtpCodecParameters = validateRtpCodecParameters;
281
281
  /**
282
- * Validates RtpHeaderExtensionParameteters. It may modify given data by adding missing
283
- * fields with default values.
284
- * It throws if invalid.
282
+ * Validates RtpHeaderExtensionParameteters. It may modify given data by adding
283
+ * missing fields with default values. It throws if invalid.
285
284
  */
286
285
  function validateRtpHeaderExtensionParameters(ext) {
287
286
  if (typeof ext !== 'object') {
@@ -38,7 +38,10 @@ test('worker.createRouter() succeeds', async () => {
38
38
  worker = await createWorker();
39
39
  const onObserverNewRouter = jest.fn();
40
40
  worker.observer.once('newrouter', onObserverNewRouter);
41
- const router = await worker.createRouter({ mediaCodecs, appData: { foo: 123 } });
41
+ const router = await worker.createRouter({
42
+ mediaCodecs,
43
+ appData: { foo: 123 }
44
+ });
42
45
  expect(onObserverNewRouter).toHaveBeenCalledTimes(1);
43
46
  expect(onObserverNewRouter).toHaveBeenCalledWith(router);
44
47
  expect(typeof router.id).toBe('string');
@@ -47,6 +50,7 @@ test('worker.createRouter() succeeds', async () => {
47
50
  expect(Array.isArray(router.rtpCapabilities.codecs)).toBe(true);
48
51
  expect(Array.isArray(router.rtpCapabilities.headerExtensions)).toBe(true);
49
52
  expect(router.appData).toEqual({ foo: 123 });
53
+ expect(() => (router.appData = { foo: 222, bar: 'BBB' })).not.toThrow();
50
54
  await expect(worker.dump())
51
55
  .resolves
52
56
  .toEqual({
@@ -31,13 +31,13 @@ test('createWorker() succeeds', async () => {
31
31
  dtlsCertificateFile: path.join(__dirname, 'data', 'dtls-cert.pem'),
32
32
  dtlsPrivateKeyFile: path.join(__dirname, 'data', 'dtls-key.pem'),
33
33
  libwebrtcFieldTrials: 'WebRTC-Bwe-AlrLimitedBackoff/Disabled/',
34
- appData: { bar: 456 }
34
+ appData: { foo: 456 }
35
35
  });
36
36
  expect(worker.constructor.name).toBe('Worker');
37
37
  expect(typeof worker.pid).toBe('number');
38
38
  expect(worker.closed).toBe(false);
39
39
  expect(worker.died).toBe(false);
40
- expect(worker.appData).toEqual({ bar: 456 });
40
+ expect(worker.appData).toEqual({ foo: 456 });
41
41
  worker.close();
42
42
  expect(worker.closed).toBe(true);
43
43
  expect(worker.died).toBe(false);
@@ -18,4 +18,7 @@ export * from './SctpParameters';
18
18
  export * from './SrtpParameters';
19
19
  export * from './errors';
20
20
  export { ScalabilityMode } from './scalabilityModes';
21
+ export type AppData = {
22
+ [key: string]: unknown;
23
+ };
21
24
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,MAAM,OAAO,GACnB;IACC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mediasoup",
3
- "version": "3.11.19",
3
+ "version": "3.11.21",
4
4
  "description": "Cutting Edge WebRTC Video Conferencing",
5
5
  "contributors": [
6
6
  "Iñaki Baz Castillo <ibc@aliax.net> (https://inakibaz.me)",
@@ -95,16 +95,16 @@
95
95
  "@types/jest": "^29.5.0",
96
96
  "@types/node": "^18.15.11",
97
97
  "@types/uuid": "^9.0.1",
98
- "@typescript-eslint/eslint-plugin": "^5.57.0",
99
- "@typescript-eslint/parser": "^5.57.0",
98
+ "@typescript-eslint/eslint-plugin": "^5.57.1",
99
+ "@typescript-eslint/parser": "^5.57.1",
100
100
  "eslint": "^8.37.0",
101
101
  "eslint-plugin-jest": "^27.2.1",
102
102
  "jest": "^29.5.0",
103
103
  "open-cli": "^7.2.0",
104
104
  "pick-port": "^1.0.1",
105
105
  "sctp": "^1.0.0",
106
- "ts-jest": "^29.0.5",
106
+ "ts-jest": "^29.1.0",
107
107
  "tsc-watch": "^6.0.0",
108
- "typescript": "^5.0.2"
108
+ "typescript": "^5.0.3"
109
109
  }
110
110
  }
package/worker/Makefile CHANGED
@@ -216,9 +216,9 @@ format:
216
216
  test: setup
217
217
  $(MESON) compile -C $(BUILD_DIR) -j $(CORES) mediasoup-worker-test
218
218
  $(MESON) install -C $(BUILD_DIR) --no-rebuild --tags mediasoup-worker-test
219
+ ifeq ($(OS),Windows_NT)
219
220
  # On Windows lcov doesn't work (at least not yet) and we need to add `.exe` to
220
221
  # the binary path.
221
- ifeq ($(OS),Windows_NT)
222
222
  $(BUILD_DIR)/mediasoup-worker-test.exe --invisibles --use-colour=yes $(MEDIASOUP_TEST_TAGS)
223
223
  else
224
224
  $(LCOV) --directory ./ --zerocounters
@@ -0,0 +1,17 @@
1
+ #ifndef MS_FUZZER_RTC_SEQ_MANAGER_HPP
2
+ #define MS_FUZZER_RTC_SEQ_MANAGER_HPP
3
+
4
+ #include "common.hpp"
5
+
6
+ namespace Fuzzer
7
+ {
8
+ namespace RTC
9
+ {
10
+ namespace SeqManager
11
+ {
12
+ void Fuzz(const uint8_t* data, size_t len);
13
+ }
14
+ } // namespace RTC
15
+ } // namespace Fuzzer
16
+
17
+ #endif
@@ -0,0 +1,22 @@
1
+ #include "RTC/FuzzerSeqManager.hpp"
2
+ #include "Utils.hpp"
3
+ #include "RTC/SeqManager.hpp"
4
+ #include <iostream>
5
+
6
+ void Fuzzer::RTC::SeqManager::Fuzz(const uint8_t* data, size_t len)
7
+ {
8
+ if (len < 10)
9
+ {
10
+ return;
11
+ }
12
+
13
+ ::RTC::SeqManager<uint16_t> seqManager;
14
+
15
+ uint16_t output;
16
+
17
+ for (size_t count = 0; count < 7; count++)
18
+ {
19
+ seqManager.Input(Utils::Byte::Get2Bytes(data, count), output);
20
+ seqManager.Drop(Utils::Byte::Get2Bytes(data, count + 2));
21
+ }
22
+ }
@@ -12,6 +12,7 @@
12
12
  #include "RTC/FuzzerRtpPacket.hpp"
13
13
  #include "RTC/FuzzerRtpRetransmissionBuffer.hpp"
14
14
  #include "RTC/FuzzerRtpStreamSend.hpp"
15
+ #include "RTC/FuzzerSeqManager.hpp"
15
16
  #include "RTC/FuzzerStunPacket.hpp"
16
17
  #include "RTC/FuzzerTrendCalculator.hpp"
17
18
  #include "RTC/RTCP/FuzzerPacket.hpp"
@@ -45,6 +46,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t len)
45
46
  Fuzzer::RTC::RtpPacket::Fuzz(data, len);
46
47
  Fuzzer::RTC::RtpStreamSend::Fuzz(data, len);
47
48
  Fuzzer::RTC::RtpRetransmissionBuffer::Fuzz(data, len);
49
+ Fuzzer::RTC::SeqManager::Fuzz(data, len);
48
50
  }
49
51
 
50
52
  if (fuzzRtcp)
@@ -213,7 +213,8 @@ namespace RTC
213
213
 
214
214
  public:
215
215
  AddPacketResult AddPacket(uint16_t sequenceNumber, uint64_t timestamp, size_t maxRtcpPacketLen);
216
- void Finish(); // Just for locally generated packets.
216
+ // Just for locally generated packets.
217
+ void Finish();
217
218
  bool IsFull()
218
219
  {
219
220
  // NOTE: Since AddPendingChunks() is called at the end, we cannot track
@@ -315,13 +316,16 @@ namespace RTC
315
316
  private:
316
317
  uint16_t baseSequenceNumber{ 0u };
317
318
  uint32_t referenceTime{ 0 };
318
- uint16_t latestSequenceNumber{ 0u }; // Just for locally generated packets.
319
- uint64_t latestTimestamp{ 0u }; // Just for locally generated packets.
319
+ // Just for locally generated packets.
320
+ uint16_t latestSequenceNumber{ 0u };
321
+ // Just for locally generated packets.
322
+ uint64_t latestTimestamp{ 0u };
320
323
  uint16_t packetStatusCount{ 0u };
321
324
  uint8_t feedbackPacketCount{ 0u };
322
325
  std::vector<Chunk*> chunks;
323
326
  std::vector<int16_t> deltas;
324
- Context context; // Just for locally generated packets.
327
+ // Just for locally generated packets.
328
+ Context context;
325
329
  size_t deltasAndChunksSize{ 0u };
326
330
  size_t size{ 0 };
327
331
  bool isCorrect{ true };
@@ -46,8 +46,8 @@ namespace RTC
46
46
  Item* GetNewest() const;
47
47
  void RemoveOldest();
48
48
  void RemoveOldest(uint16_t numItems);
49
- bool ClearTooOld(uint32_t newestTimestamp);
50
- bool IsTooOld(uint32_t timestamp, uint32_t newestTimestamp) const;
49
+ bool ClearTooOldByTimestamp(uint32_t newestTimestamp);
50
+ bool IsTooOldTimestamp(uint32_t timestamp, uint32_t newestTimestamp) const;
51
51
  Item* FillItem(
52
52
  Item* item, RTC::RtpPacket* packet, std::shared_ptr<RTC::RtpPacket>& sharedPacket) const;
53
53
 
@@ -175,6 +175,10 @@ namespace RTC
175
175
  private:
176
176
  void InitSeq(uint16_t seq);
177
177
 
178
+ /* Pure virtual method that must be implemented by the subclass. */
179
+ protected:
180
+ virtual void UserOnSequenceNumberReset() = 0;
181
+
178
182
  protected:
179
183
  // Given as argument.
180
184
  RTC::RtpStream::Listener* listener{ nullptr };
@@ -80,6 +80,10 @@ namespace RTC
80
80
  void CalculateJitter(uint32_t rtpTimestamp);
81
81
  void UpdateScore();
82
82
 
83
+ /* Pure virtual methods inherited from RTC::RtpStream. */
84
+ public:
85
+ void UserOnSequenceNumberReset() override;
86
+
83
87
  /* Pure virtual methods inherited from Timer. */
84
88
  protected:
85
89
  void OnTimer(Timer* timer) override;
@@ -53,6 +53,10 @@ namespace RTC
53
53
  void FillRetransmissionContainer(uint16_t seq, uint16_t bitmask);
54
54
  void UpdateScore(RTC::RTCP::ReceiverReport* report);
55
55
 
56
+ /* Pure virtual methods inherited from RTC::RtpStream. */
57
+ public:
58
+ void UserOnSequenceNumberReset() override;
59
+
56
60
  private:
57
61
  // Packets lost at last interval for score calculation.
58
62
  uint32_t lostPriorScore{ 0u };
@@ -49,6 +49,8 @@ namespace RTC
49
49
  void ClearDropped();
50
50
 
51
51
  private:
52
+ // Whether at least a sequence number has been inserted.
53
+ bool started{ false };
52
54
  T base{ 0 };
53
55
  T maxOutput{ 0 };
54
56
  T maxInput{ 0 };
@@ -356,6 +356,7 @@ executable(
356
356
  'fuzzer/src/RTC/FuzzerRtpPacket.cpp',
357
357
  'fuzzer/src/RTC/FuzzerRtpRetransmissionBuffer.cpp',
358
358
  'fuzzer/src/RTC/FuzzerRtpStreamSend.cpp',
359
+ 'fuzzer/src/RTC/FuzzerSeqManager.cpp',
359
360
  'fuzzer/src/RTC/FuzzerTrendCalculator.cpp',
360
361
  'fuzzer/src/RTC/RTCP/FuzzerBye.cpp',
361
362
  'fuzzer/src/RTC/RTCP/FuzzerFeedbackPs.cpp',
@@ -48,7 +48,9 @@ namespace RTC
48
48
  new FeedbackRtpTransportPacket(commonHeader, len));
49
49
 
50
50
  if (!packet->IsCorrect())
51
+ {
51
52
  return nullptr;
53
+ }
52
54
 
53
55
  return packet.release();
54
56
  }
@@ -399,7 +401,9 @@ namespace RTC
399
401
  auto& packetResult = packetResults[idx];
400
402
 
401
403
  if (!packetResult.received)
404
+ {
402
405
  continue;
406
+ }
403
407
 
404
408
  currentReceivedAtMs += this->deltas.at(deltaIdx) / 4;
405
409
  packetResult.delta = this->deltas.at(deltaIdx);
@@ -418,7 +422,9 @@ namespace RTC
418
422
  uint16_t lost{ 0u };
419
423
 
420
424
  if (expected == 0u)
425
+ {
421
426
  return 0u;
427
+ }
422
428
 
423
429
  for (auto* chunk : this->chunks)
424
430
  {
@@ -428,7 +434,9 @@ namespace RTC
428
434
  // NOTE: If lost equals expected, the math below would produce 256, which
429
435
  // becomes 0 in uint8_t.
430
436
  if (lost == expected)
437
+ {
431
438
  return 255u;
439
+ }
432
440
 
433
441
  return (lost << 8) / expected;
434
442
  }
@@ -487,9 +495,13 @@ namespace RTC
487
495
  Status status;
488
496
 
489
497
  if (delta >= 0 && delta <= 255)
498
+ {
490
499
  status = Status::SmallDelta;
500
+ }
491
501
  else
502
+ {
492
503
  status = Status::LargeDelta;
504
+ }
493
505
 
494
506
  // Create a long run chunk before processing this packet, if needed.
495
507
  // clang-format off
@@ -576,7 +588,9 @@ namespace RTC
576
588
  {
577
589
  // No pending status packets.
578
590
  if (this->context.statuses.empty())
591
+ {
579
592
  return;
593
+ }
580
594
 
581
595
  if (this->context.allSameStatus)
582
596
  {
@@ -638,9 +652,13 @@ namespace RTC
638
652
  uint8_t symbolSize = data[0] & 0x40;
639
653
 
640
654
  if (symbolSize == 0)
655
+ {
641
656
  return new OneBitVectorChunk(bytes, count);
657
+ }
642
658
  else
659
+ {
643
660
  return new TwoBitVectorChunk(bytes, count);
661
+ }
644
662
  }
645
663
 
646
664
  return nullptr;
@@ -717,9 +735,13 @@ namespace RTC
717
735
  MS_TRACE();
718
736
 
719
737
  if (this->status == Status::SmallDelta || this->status == Status::LargeDelta)
738
+ {
720
739
  return this->count;
740
+ }
721
741
  else
742
+ {
722
743
  return 0u;
744
+ }
723
745
  }
724
746
 
725
747
  void FeedbackRtpTransportPacket::RunLengthChunk::FillResults(
@@ -837,7 +859,9 @@ namespace RTC
837
859
  for (auto status : this->statuses)
838
860
  {
839
861
  if (status == Status::SmallDelta || status == Status::LargeDelta)
862
+ {
840
863
  count++;
864
+ }
841
865
  }
842
866
 
843
867
  return count;
@@ -975,7 +999,9 @@ namespace RTC
975
999
  for (auto status : this->statuses)
976
1000
  {
977
1001
  if (status == Status::SmallDelta || status == Status::LargeDelta)
1002
+ {
978
1003
  count++;
1004
+ }
979
1005
  }
980
1006
 
981
1007
  return count;
@@ -84,6 +84,29 @@ namespace RTC
84
84
  auto* oldestItem = GetOldest();
85
85
  auto* newestItem = GetNewest();
86
86
 
87
+ // Special case: Received packet has lower seq than newest packet in the
88
+ // buffer, however its timestamp is higher. If so, clear the whole buffer.
89
+ if (
90
+ RTC::SeqManager<uint16_t>::IsSeqLowerThan(seq, newestItem->sequenceNumber) &&
91
+ RTC::SeqManager<uint32_t>::IsSeqHigherThan(timestamp, newestItem->timestamp))
92
+ {
93
+ MS_WARN_TAG(
94
+ rtp,
95
+ "packet has lower seq but higher timestamp than newest packet in the buffer, emptying the buffer [ssrc:%" PRIu32
96
+ ", seq:%" PRIu16 ", timestamp:%" PRIu32 "]",
97
+ ssrc,
98
+ seq,
99
+ timestamp);
100
+
101
+ Clear();
102
+
103
+ auto* item = new Item();
104
+
105
+ this->buffer.push_back(FillItem(item, packet, sharedPacket));
106
+
107
+ return;
108
+ }
109
+
87
110
  // Clear too old packets in the buffer.
88
111
  // NOTE: Here we must consider the case in which, due for example to huge
89
112
  // packet loss, received packet has higher timestamp but "older" seq number
@@ -94,14 +117,15 @@ namespace RTC
94
117
  ? timestamp
95
118
  : newestItem->timestamp;
96
119
 
97
- // ClearTooOld() returns true if at least one packet has been removed from
98
- // the front.
99
- if (ClearTooOld(newestTimestamp))
120
+ // ClearTooOldByTimestamp() returns true if at least one packet has been
121
+ // removed from the front.
122
+ if (ClearTooOldByTimestamp(newestTimestamp))
100
123
  {
101
124
  // Buffer content has been modified so we must check it again.
102
125
  if (this->buffer.empty())
103
126
  {
104
- MS_DEBUG_DEV(
127
+ MS_WARN_TAG(
128
+ rtp,
105
129
  "buffer empty after clearing too old packets [seq:%" PRIu16 ", timestamp:%" PRIu32 "]",
106
130
  seq,
107
131
  timestamp);
@@ -132,7 +156,7 @@ namespace RTC
132
156
  {
133
157
  MS_WARN_TAG(
134
158
  rtp,
135
- "packet has higher seq but less timestamp than newest packet in the buffer, discarding it [ssrc:%" PRIu32
159
+ "packet has higher seq but lower timestamp than newest packet in the buffer, discarding it [ssrc:%" PRIu32
136
160
  ", seq:%" PRIu16 ", timestamp:%" PRIu32 "]",
137
161
  ssrc,
138
162
  seq,
@@ -204,10 +228,12 @@ namespace RTC
204
228
  timestamp);
205
229
 
206
230
  // Ensure that packet is not too old to be stored.
207
- if (IsTooOld(timestamp, newestItem->timestamp))
231
+ if (IsTooOldTimestamp(timestamp, newestItem->timestamp))
208
232
  {
209
233
  MS_WARN_DEV(
210
- "packet too old, discarding it [seq:%" PRIu16 ", timestamp:%" PRIu32 "]", seq, timestamp);
234
+ "packet's timestamp too old, discarding it [seq:%" PRIu16 ", timestamp:%" PRIu32 "]",
235
+ seq,
236
+ timestamp);
211
237
 
212
238
  return;
213
239
  }
@@ -218,7 +244,7 @@ namespace RTC
218
244
  {
219
245
  MS_WARN_TAG(
220
246
  rtp,
221
- "packet has less seq but higher timestamp than oldest packet in the buffer, discarding it [ssrc:%" PRIu32
247
+ "packet has lower seq but higher timestamp than oldest packet in the buffer, discarding it [ssrc:%" PRIu32
222
248
  ", seq:%" PRIu16 ", timestamp:%" PRIu32 "]",
223
249
  ssrc,
224
250
  seq,
@@ -305,7 +331,7 @@ namespace RTC
305
331
  {
306
332
  MS_WARN_TAG(
307
333
  rtp,
308
- "packet timestamp is less than timestamp of immediate older packet in the buffer, discarding it [ssrc:%" PRIu32
334
+ "packet timestamp is lower than timestamp of immediate older packet in the buffer, discarding it [ssrc:%" PRIu32
309
335
  ", seq:%" PRIu16 ", timestamp:%" PRIu32 "]",
310
336
  ssrc,
311
337
  seq,
@@ -486,7 +512,7 @@ namespace RTC
486
512
  }
487
513
  }
488
514
 
489
- bool RtpRetransmissionBuffer::ClearTooOld(uint32_t newestTimestamp)
515
+ bool RtpRetransmissionBuffer::ClearTooOldByTimestamp(uint32_t newestTimestamp)
490
516
  {
491
517
  MS_TRACE();
492
518
 
@@ -497,7 +523,7 @@ namespace RTC
497
523
  // that contain too old packets.
498
524
  while ((oldestItem = GetOldest()))
499
525
  {
500
- if (IsTooOld(oldestItem->timestamp, newestTimestamp))
526
+ if (IsTooOldTimestamp(oldestItem->timestamp, newestTimestamp))
501
527
  {
502
528
  RemoveOldest();
503
529
 
@@ -514,7 +540,7 @@ namespace RTC
514
540
  return itemsRemoved;
515
541
  }
516
542
 
517
- bool RtpRetransmissionBuffer::IsTooOld(uint32_t timestamp, uint32_t newestTimestamp) const
543
+ bool RtpRetransmissionBuffer::IsTooOldTimestamp(uint32_t timestamp, uint32_t newestTimestamp) const
518
544
  {
519
545
  MS_TRACE();
520
546
 
@@ -28,6 +28,7 @@ namespace RTC
28
28
  MS_TRACE();
29
29
 
30
30
  delete this->rtxStream;
31
+ this->rtxStream = nullptr;
31
32
  }
32
33
 
33
34
  void RtpStream::FillJson(json& jsonObject) const
@@ -212,6 +213,9 @@ namespace RTC
212
213
 
213
214
  this->maxPacketTs = packet->GetTimestamp();
214
215
  this->maxPacketMs = DepLibUV::GetTimeMs();
216
+
217
+ // Notify the subclass about it.
218
+ UserOnSequenceNumberReset();
215
219
  }
216
220
  else
217
221
  {
@@ -836,6 +836,13 @@ namespace RTC
836
836
  RtpStream::UpdateScore(score);
837
837
  }
838
838
 
839
+ void RtpStreamRecv::UserOnSequenceNumberReset()
840
+ {
841
+ MS_TRACE();
842
+
843
+ // Nothing to do.
844
+ }
845
+
839
846
  inline void RtpStreamRecv::OnTimer(Timer* timer)
840
847
  {
841
848
  MS_TRACE();
@@ -627,4 +627,15 @@ namespace RTC
627
627
 
628
628
  RtpStream::UpdateScore(score);
629
629
  }
630
+
631
+ void RtpStreamSend::UserOnSequenceNumberReset()
632
+ {
633
+ MS_TRACE();
634
+
635
+ // Clear retransmission buffer.
636
+ if (this->retransmissionBuffer)
637
+ {
638
+ this->retransmissionBuffer->Clear();
639
+ }
640
+ }
630
641
  } // namespace RTC