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
package/node/lib/index.d.ts
CHANGED
|
@@ -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.
|
|
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
|
*/
|
package/node/lib/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
package/node/lib/ortc.d.ts
CHANGED
|
@@ -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
|
|
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
|
/**
|
package/node/lib/ortc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ortc.d.ts","sourceRoot":"","sources":["../src/ortc.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,eAAe,EAEf,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,EAC5B,cAAc,EACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,KAAK,UAAU,GACf;IACC,MAAM,EACN;QACC,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;IAEJ,SAAS,EACT;QACC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;CACJ,CAAC;AASF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAoCnE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CA4F1E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAkB3D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,CA4CxE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAiEjE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CA2F1E;AAED
|
|
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
|
|
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({
|
|
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: {
|
|
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({
|
|
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);
|
package/node/lib/types.d.ts
CHANGED
package/node/lib/types.d.ts.map
CHANGED
|
@@ -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.
|
|
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.
|
|
99
|
-
"@typescript-eslint/parser": "^5.57.
|
|
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
|
|
106
|
+
"ts-jest": "^29.1.0",
|
|
107
107
|
"tsc-watch": "^6.0.0",
|
|
108
|
-
"typescript": "^5.0.
|
|
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
|
-
|
|
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
|
-
|
|
319
|
-
|
|
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
|
-
|
|
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
|
|
50
|
-
bool
|
|
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 };
|
package/worker/meson.build
CHANGED
|
@@ -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
|
-
//
|
|
98
|
-
// the front.
|
|
99
|
-
if (
|
|
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
|
-
|
|
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
|
|
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 (
|
|
231
|
+
if (IsTooOldTimestamp(timestamp, newestItem->timestamp))
|
|
208
232
|
{
|
|
209
233
|
MS_WARN_DEV(
|
|
210
|
-
"packet too old, discarding it [seq:%" PRIu16 ", timestamp:%" PRIu32 "]",
|
|
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
|
|
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
|
|
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::
|
|
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 (
|
|
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::
|
|
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
|