@webex/plugin-meetings 3.0.0-beta.16 → 3.0.0-beta.18
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/dist/breakouts/breakout.js +116 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/index.js +226 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +43 -6
- package/dist/constants.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +2 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +48 -0
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +1 -0
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +19 -11
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +3 -3
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +4 -4
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +5 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +652 -459
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +25 -44
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +22 -57
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +2 -0
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +28 -18
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +14 -12
- package/dist/meetings/request.js.map +1 -1
- package/dist/member/index.js +9 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +14 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/index.js +8 -6
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +3 -1
- package/dist/members/request.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +46 -6
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +4 -0
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js +3 -3
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +8 -6
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +168 -63
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/reachability/index.js +63 -51
- package/dist/reachability/index.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +25 -12
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/request.js +88 -68
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +72 -47
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/index.js +3 -3
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +18 -6
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/package.json +24 -19
- package/src/breakouts/README.md +190 -0
- package/src/breakouts/breakout.ts +110 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/index.ts +225 -0
- package/src/config.ts +4 -1
- package/src/constants.ts +39 -1
- package/src/locus-info/controlsUtils.ts +2 -0
- package/src/locus-info/index.ts +59 -1
- package/src/locus-info/parser.ts +1 -0
- package/src/locus-info/selfUtils.ts +8 -0
- package/src/media/index.ts +1 -2
- package/src/media/properties.ts +6 -9
- package/src/meeting/in-meeting-actions.ts +8 -0
- package/src/meeting/index.ts +360 -111
- package/src/meeting/request.ts +9 -31
- package/src/meeting/request.type.ts +2 -0
- package/src/meeting/util.ts +25 -60
- package/src/meeting-info/meeting-info-v2.ts +2 -0
- package/src/meetings/index.ts +10 -5
- package/src/meetings/request.ts +1 -1
- package/src/member/index.ts +9 -0
- package/src/member/util.ts +14 -1
- package/src/members/index.ts +1 -0
- package/src/members/request.ts +1 -0
- package/src/multistream/mediaRequestManager.ts +79 -15
- package/src/multistream/multistreamMedia.ts +4 -0
- package/src/multistream/receiveSlot.ts +17 -12
- package/src/multistream/receiveSlotManager.ts +22 -21
- package/src/multistream/remoteMedia.ts +1 -1
- package/src/multistream/remoteMediaGroup.ts +2 -2
- package/src/multistream/remoteMediaManager.ts +150 -37
- package/src/reachability/index.ts +16 -13
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.type.ts +25 -0
- package/src/reconnection-manager/index.ts +18 -9
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/request.ts +78 -73
- package/src/roap/turnDiscovery.ts +8 -6
- package/src/statsAnalyzer/index.ts +4 -4
- package/src/statsAnalyzer/mqaUtil.ts +6 -0
- package/test/unit/spec/breakouts/breakout.ts +119 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/index.ts +293 -0
- package/test/unit/spec/locus-info/controlsUtils.js +20 -0
- package/test/unit/spec/locus-info/index.js +103 -0
- package/test/unit/spec/locus-info/selfConstant.js +25 -0
- package/test/unit/spec/locus-info/selfUtils.js +84 -0
- package/test/unit/spec/media/index.ts +1 -1
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/effectsState.js +5 -1
- package/test/unit/spec/meeting/in-meeting-actions.ts +5 -1
- package/test/unit/spec/meeting/index.js +241 -50
- package/test/unit/spec/meeting/request.js +17 -0
- package/test/unit/spec/meeting/utils.js +28 -122
- package/test/unit/spec/meetings/index.js +1 -0
- package/test/unit/spec/member/util.js +26 -1
- package/test/unit/spec/multistream/mediaRequestManager.ts +312 -50
- package/test/unit/spec/multistream/receiveSlot.ts +6 -6
- package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
- package/test/unit/spec/multistream/remoteMedia.ts +2 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +354 -65
- package/test/unit/spec/reachability/index.ts +58 -24
- package/test/unit/spec/reconnection-manager/index.js +42 -13
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +2 -1
- package/test/unit/spec/roap/request.ts +114 -0
- package/test/unit/spec/roap/turnDiscovery.ts +45 -29
- package/test/unit/spec/stats-analyzer/index.js +2 -2
- package/test/utils/webex-test-users.js +1 -0
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -18
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/src/media/internal-media-core-wrapper.ts +0 -9
|
@@ -2,21 +2,28 @@ import {MediaRequestManager} from '@webex/plugin-meetings/src/multistream/mediaR
|
|
|
2
2
|
import {ReceiveSlot} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
3
3
|
import sinon from 'sinon';
|
|
4
4
|
import {assert} from '@webex/test-helper-chai';
|
|
5
|
+
import {getMaxFs} from '@webex/plugin-meetings/src/multistream/remoteMedia';
|
|
5
6
|
|
|
6
7
|
type ExpectedActiveSpeaker = {
|
|
7
8
|
policy: 'active-speaker';
|
|
8
9
|
priority: number;
|
|
9
10
|
receiveSlots: Array<ReceiveSlot>;
|
|
11
|
+
maxFs: number;
|
|
10
12
|
};
|
|
11
13
|
type ExpectedReceiverSelected = {
|
|
12
14
|
policy: 'receiver-selected';
|
|
13
15
|
csi: number;
|
|
14
16
|
receiveSlot: ReceiveSlot;
|
|
17
|
+
maxFs: number;
|
|
15
18
|
};
|
|
16
19
|
type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
|
|
17
20
|
|
|
18
21
|
const maxPayloadBitsPerSecond = 10 * 1000 * 1000; // for now we always send this fixed constant
|
|
19
22
|
|
|
23
|
+
const degradationPreferences = {
|
|
24
|
+
maxMacroblocksLimit: Infinity, // no limit
|
|
25
|
+
};
|
|
26
|
+
|
|
20
27
|
describe('MediaRequestManager', () => {
|
|
21
28
|
const CROSS_PRIORITY_DUPLICATION = true;
|
|
22
29
|
const CROSS_POLICY_DUPLICATION = true;
|
|
@@ -33,7 +40,10 @@ describe('MediaRequestManager', () => {
|
|
|
33
40
|
|
|
34
41
|
beforeEach(() => {
|
|
35
42
|
sendMediaRequestsCallback = sinon.stub();
|
|
36
|
-
mediaRequestManager = new MediaRequestManager(
|
|
43
|
+
mediaRequestManager = new MediaRequestManager(
|
|
44
|
+
degradationPreferences,
|
|
45
|
+
sendMediaRequestsCallback
|
|
46
|
+
);
|
|
37
47
|
|
|
38
48
|
// create some fake receive slots used by the tests
|
|
39
49
|
fakeWcmeSlots = Array(NUM_SLOTS)
|
|
@@ -55,7 +65,7 @@ describe('MediaRequestManager', () => {
|
|
|
55
65
|
});
|
|
56
66
|
|
|
57
67
|
// helper function for adding an active speaker request
|
|
58
|
-
const addActiveSpeakerRequest = (priority, receiveSlots, commit = false) =>
|
|
68
|
+
const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false) =>
|
|
59
69
|
mediaRequestManager.addRequest(
|
|
60
70
|
{
|
|
61
71
|
policyInfo: {
|
|
@@ -68,14 +78,14 @@ describe('MediaRequestManager', () => {
|
|
|
68
78
|
receiveSlots,
|
|
69
79
|
codecInfo: {
|
|
70
80
|
codec: 'h264',
|
|
71
|
-
maxFs:
|
|
81
|
+
maxFs: maxFs,
|
|
72
82
|
},
|
|
73
83
|
},
|
|
74
84
|
commit
|
|
75
85
|
);
|
|
76
86
|
|
|
77
87
|
// helper function for adding a receiver selected request
|
|
78
|
-
const addReceiverSelectedRequest = (csi, receiveSlot, commit = false) =>
|
|
88
|
+
const addReceiverSelectedRequest = (csi, receiveSlot, maxFs, commit = false) =>
|
|
79
89
|
mediaRequestManager.addRequest(
|
|
80
90
|
{
|
|
81
91
|
policyInfo: {
|
|
@@ -85,7 +95,7 @@ describe('MediaRequestManager', () => {
|
|
|
85
95
|
receiveSlots: [receiveSlot],
|
|
86
96
|
codecInfo: {
|
|
87
97
|
codec: 'h264',
|
|
88
|
-
maxFs:
|
|
98
|
+
maxFs: maxFs,
|
|
89
99
|
},
|
|
90
100
|
},
|
|
91
101
|
commit
|
|
@@ -116,7 +126,7 @@ describe('MediaRequestManager', () => {
|
|
|
116
126
|
sinon.match({
|
|
117
127
|
payloadType: 0x80,
|
|
118
128
|
h264: sinon.match({
|
|
119
|
-
maxFs:
|
|
129
|
+
maxFs: expectedRequest.maxFs,
|
|
120
130
|
}),
|
|
121
131
|
}),
|
|
122
132
|
],
|
|
@@ -134,7 +144,7 @@ describe('MediaRequestManager', () => {
|
|
|
134
144
|
sinon.match({
|
|
135
145
|
payloadType: 0x80,
|
|
136
146
|
h264: sinon.match({
|
|
137
|
-
maxFs:
|
|
147
|
+
maxFs: expectedRequest.maxFs,
|
|
138
148
|
}),
|
|
139
149
|
}),
|
|
140
150
|
],
|
|
@@ -274,44 +284,79 @@ describe('MediaRequestManager', () => {
|
|
|
274
284
|
|
|
275
285
|
it('keeps adding requests with every call to addRequest()', () => {
|
|
276
286
|
// start with 1 request
|
|
277
|
-
addReceiverSelectedRequest(100, fakeReceiveSlots[0], true);
|
|
287
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, true);
|
|
278
288
|
|
|
279
289
|
checkMediaRequestsSent([
|
|
280
|
-
{
|
|
290
|
+
{
|
|
291
|
+
policy: 'receiver-selected',
|
|
292
|
+
csi: 100,
|
|
293
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
294
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
295
|
+
},
|
|
281
296
|
]);
|
|
282
297
|
|
|
283
298
|
// now add another one
|
|
284
|
-
addReceiverSelectedRequest(101, fakeReceiveSlots[1], true);
|
|
299
|
+
addReceiverSelectedRequest(101, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, true);
|
|
285
300
|
|
|
286
301
|
checkMediaRequestsSent([
|
|
287
|
-
{
|
|
288
|
-
|
|
302
|
+
{
|
|
303
|
+
policy: 'receiver-selected',
|
|
304
|
+
csi: 100,
|
|
305
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
306
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
policy: 'receiver-selected',
|
|
310
|
+
csi: 101,
|
|
311
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
312
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
313
|
+
},
|
|
289
314
|
]);
|
|
290
315
|
|
|
291
316
|
// and one more
|
|
292
317
|
addActiveSpeakerRequest(
|
|
293
318
|
1,
|
|
294
319
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
320
|
+
ACTIVE_SPEAKER_MAX_FS,
|
|
295
321
|
true
|
|
296
322
|
);
|
|
297
323
|
|
|
298
324
|
checkMediaRequestsSent([
|
|
299
|
-
{
|
|
300
|
-
|
|
325
|
+
{
|
|
326
|
+
policy: 'receiver-selected',
|
|
327
|
+
csi: 100,
|
|
328
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
329
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
policy: 'receiver-selected',
|
|
333
|
+
csi: 101,
|
|
334
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
335
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
336
|
+
},
|
|
301
337
|
{
|
|
302
338
|
policy: 'active-speaker',
|
|
303
339
|
priority: 1,
|
|
304
340
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
341
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
305
342
|
},
|
|
306
343
|
]);
|
|
307
344
|
});
|
|
308
345
|
|
|
309
346
|
it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
|
|
310
347
|
const requestIds = [
|
|
311
|
-
addActiveSpeakerRequest(
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
348
|
+
addActiveSpeakerRequest(
|
|
349
|
+
255,
|
|
350
|
+
[fakeReceiveSlots[0], fakeReceiveSlots[1]],
|
|
351
|
+
ACTIVE_SPEAKER_MAX_FS
|
|
352
|
+
),
|
|
353
|
+
addActiveSpeakerRequest(
|
|
354
|
+
255,
|
|
355
|
+
[fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
356
|
+
ACTIVE_SPEAKER_MAX_FS
|
|
357
|
+
),
|
|
358
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS),
|
|
359
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS),
|
|
315
360
|
];
|
|
316
361
|
|
|
317
362
|
// cancel one of the active speaker requests
|
|
@@ -319,9 +364,24 @@ describe('MediaRequestManager', () => {
|
|
|
319
364
|
|
|
320
365
|
// expect only the 3 remaining requests to be sent out
|
|
321
366
|
checkMediaRequestsSent([
|
|
322
|
-
{
|
|
323
|
-
|
|
324
|
-
|
|
367
|
+
{
|
|
368
|
+
policy: 'active-speaker',
|
|
369
|
+
priority: 255,
|
|
370
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
371
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
policy: 'receiver-selected',
|
|
375
|
+
csi: 100,
|
|
376
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
377
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
policy: 'receiver-selected',
|
|
381
|
+
csi: 200,
|
|
382
|
+
receiveSlot: fakeWcmeSlots[5],
|
|
383
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
384
|
+
},
|
|
325
385
|
]);
|
|
326
386
|
|
|
327
387
|
// cancel one of the receiver selected requests
|
|
@@ -329,8 +389,18 @@ describe('MediaRequestManager', () => {
|
|
|
329
389
|
|
|
330
390
|
// expect only the 2 remaining requests to be sent out
|
|
331
391
|
checkMediaRequestsSent([
|
|
332
|
-
{
|
|
333
|
-
|
|
392
|
+
{
|
|
393
|
+
policy: 'active-speaker',
|
|
394
|
+
priority: 255,
|
|
395
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
396
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
policy: 'receiver-selected',
|
|
400
|
+
csi: 100,
|
|
401
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
402
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
403
|
+
},
|
|
334
404
|
]);
|
|
335
405
|
});
|
|
336
406
|
|
|
@@ -338,9 +408,10 @@ describe('MediaRequestManager', () => {
|
|
|
338
408
|
addActiveSpeakerRequest(
|
|
339
409
|
10,
|
|
340
410
|
[fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
411
|
+
ACTIVE_SPEAKER_MAX_FS,
|
|
341
412
|
false
|
|
342
413
|
);
|
|
343
|
-
addReceiverSelectedRequest(123, fakeReceiveSlots[3], false);
|
|
414
|
+
addReceiverSelectedRequest(123, fakeReceiveSlots[3], RECEIVER_SELECTED_MAX_FS, false);
|
|
344
415
|
|
|
345
416
|
// nothing should be sent out as we didn't commit the requests
|
|
346
417
|
assert.notCalled(sendMediaRequestsCallback);
|
|
@@ -354,8 +425,14 @@ describe('MediaRequestManager', () => {
|
|
|
354
425
|
policy: 'active-speaker',
|
|
355
426
|
priority: 10,
|
|
356
427
|
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
428
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
policy: 'receiver-selected',
|
|
432
|
+
csi: 123,
|
|
433
|
+
receiveSlot: fakeWcmeSlots[3],
|
|
434
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
357
435
|
},
|
|
358
|
-
{policy: 'receiver-selected', csi: 123, receiveSlot: fakeWcmeSlots[3]},
|
|
359
436
|
]);
|
|
360
437
|
});
|
|
361
438
|
|
|
@@ -365,11 +442,12 @@ describe('MediaRequestManager', () => {
|
|
|
365
442
|
addActiveSpeakerRequest(
|
|
366
443
|
250,
|
|
367
444
|
[fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
445
|
+
ACTIVE_SPEAKER_MAX_FS,
|
|
368
446
|
false
|
|
369
447
|
),
|
|
370
|
-
addReceiverSelectedRequest(98765, fakeReceiveSlots[3], false),
|
|
371
|
-
addReceiverSelectedRequest(99999, fakeReceiveSlots[4], false),
|
|
372
|
-
addReceiverSelectedRequest(88888, fakeReceiveSlots[5], true),
|
|
448
|
+
addReceiverSelectedRequest(98765, fakeReceiveSlots[3], RECEIVER_SELECTED_MAX_FS, false),
|
|
449
|
+
addReceiverSelectedRequest(99999, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS, false),
|
|
450
|
+
addReceiverSelectedRequest(88888, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS, true),
|
|
373
451
|
];
|
|
374
452
|
|
|
375
453
|
checkMediaRequestsSent([
|
|
@@ -377,10 +455,26 @@ describe('MediaRequestManager', () => {
|
|
|
377
455
|
policy: 'active-speaker',
|
|
378
456
|
priority: 250,
|
|
379
457
|
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
458
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
policy: 'receiver-selected',
|
|
462
|
+
csi: 98765,
|
|
463
|
+
receiveSlot: fakeWcmeSlots[3],
|
|
464
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
policy: 'receiver-selected',
|
|
468
|
+
csi: 99999,
|
|
469
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
470
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
policy: 'receiver-selected',
|
|
474
|
+
csi: 88888,
|
|
475
|
+
receiveSlot: fakeWcmeSlots[5],
|
|
476
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
380
477
|
},
|
|
381
|
-
{policy: 'receiver-selected', csi: 98765, receiveSlot: fakeWcmeSlots[3]},
|
|
382
|
-
{policy: 'receiver-selected', csi: 99999, receiveSlot: fakeWcmeSlots[4]},
|
|
383
|
-
{policy: 'receiver-selected', csi: 88888, receiveSlot: fakeWcmeSlots[5]},
|
|
384
478
|
]);
|
|
385
479
|
|
|
386
480
|
// now cancel 3 of them, but with commit=false => nothing should happen
|
|
@@ -394,22 +488,29 @@ describe('MediaRequestManager', () => {
|
|
|
394
488
|
mediaRequestManager.commit();
|
|
395
489
|
|
|
396
490
|
checkMediaRequestsSent([
|
|
397
|
-
{
|
|
491
|
+
{
|
|
492
|
+
policy: 'receiver-selected',
|
|
493
|
+
csi: 98765,
|
|
494
|
+
receiveSlot: fakeWcmeSlots[3],
|
|
495
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
496
|
+
},
|
|
398
497
|
]);
|
|
399
498
|
});
|
|
400
499
|
|
|
401
500
|
it('sends the wcme media requests when commit() is called', () => {
|
|
402
501
|
// send some requests, all of them with commit=false
|
|
403
|
-
addReceiverSelectedRequest(123000, fakeReceiveSlots[0], false);
|
|
404
|
-
addReceiverSelectedRequest(456000, fakeReceiveSlots[1], false);
|
|
502
|
+
addReceiverSelectedRequest(123000, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, false);
|
|
503
|
+
addReceiverSelectedRequest(456000, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, false);
|
|
405
504
|
addActiveSpeakerRequest(
|
|
406
505
|
255,
|
|
407
506
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
507
|
+
ACTIVE_SPEAKER_MAX_FS,
|
|
408
508
|
false
|
|
409
509
|
);
|
|
410
510
|
addActiveSpeakerRequest(
|
|
411
511
|
254,
|
|
412
512
|
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
513
|
+
ACTIVE_SPEAKER_MAX_FS,
|
|
413
514
|
false
|
|
414
515
|
);
|
|
415
516
|
|
|
@@ -421,33 +522,47 @@ describe('MediaRequestManager', () => {
|
|
|
421
522
|
|
|
422
523
|
// check that all requests have been sent out
|
|
423
524
|
checkMediaRequestsSent([
|
|
424
|
-
{
|
|
425
|
-
|
|
525
|
+
{
|
|
526
|
+
policy: 'receiver-selected',
|
|
527
|
+
csi: 123000,
|
|
528
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
529
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
policy: 'receiver-selected',
|
|
533
|
+
csi: 456000,
|
|
534
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
535
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
536
|
+
},
|
|
426
537
|
{
|
|
427
538
|
policy: 'active-speaker',
|
|
428
539
|
priority: 255,
|
|
429
540
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
541
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
430
542
|
},
|
|
431
543
|
{
|
|
432
544
|
policy: 'active-speaker',
|
|
433
545
|
priority: 254,
|
|
434
546
|
receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
|
|
547
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
435
548
|
},
|
|
436
549
|
]);
|
|
437
550
|
});
|
|
438
551
|
|
|
439
552
|
it('clears all the requests on reset()', () => {
|
|
440
553
|
// send some requests and commit them one by one
|
|
441
|
-
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], true);
|
|
442
|
-
addReceiverSelectedRequest(1501, fakeReceiveSlots[1], true);
|
|
554
|
+
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, true);
|
|
555
|
+
addReceiverSelectedRequest(1501, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, true);
|
|
443
556
|
addActiveSpeakerRequest(
|
|
444
557
|
255,
|
|
445
558
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
559
|
+
ACTIVE_SPEAKER_MAX_FS,
|
|
446
560
|
true
|
|
447
561
|
);
|
|
448
562
|
addActiveSpeakerRequest(
|
|
449
563
|
254,
|
|
450
564
|
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
565
|
+
ACTIVE_SPEAKER_MAX_FS,
|
|
451
566
|
true
|
|
452
567
|
);
|
|
453
568
|
|
|
@@ -457,17 +572,29 @@ describe('MediaRequestManager', () => {
|
|
|
457
572
|
mediaRequestManager.commit();
|
|
458
573
|
|
|
459
574
|
checkMediaRequestsSent([
|
|
460
|
-
{
|
|
461
|
-
|
|
575
|
+
{
|
|
576
|
+
policy: 'receiver-selected',
|
|
577
|
+
csi: 1500,
|
|
578
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
579
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
policy: 'receiver-selected',
|
|
583
|
+
csi: 1501,
|
|
584
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
585
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
586
|
+
},
|
|
462
587
|
{
|
|
463
588
|
policy: 'active-speaker',
|
|
464
589
|
priority: 255,
|
|
465
590
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
591
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
466
592
|
},
|
|
467
593
|
{
|
|
468
594
|
policy: 'active-speaker',
|
|
469
595
|
priority: 254,
|
|
470
596
|
receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
|
|
597
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
471
598
|
},
|
|
472
599
|
]);
|
|
473
600
|
|
|
@@ -481,18 +608,46 @@ describe('MediaRequestManager', () => {
|
|
|
481
608
|
|
|
482
609
|
it('calls resetSourceState() on slots that are stopped being used', () => {
|
|
483
610
|
const requestIds = [
|
|
484
|
-
addActiveSpeakerRequest(
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
611
|
+
addActiveSpeakerRequest(
|
|
612
|
+
255,
|
|
613
|
+
[fakeReceiveSlots[0], fakeReceiveSlots[1]],
|
|
614
|
+
ACTIVE_SPEAKER_MAX_FS
|
|
615
|
+
),
|
|
616
|
+
addActiveSpeakerRequest(
|
|
617
|
+
255,
|
|
618
|
+
[fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
619
|
+
ACTIVE_SPEAKER_MAX_FS
|
|
620
|
+
),
|
|
621
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS),
|
|
622
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS),
|
|
488
623
|
];
|
|
489
624
|
|
|
490
625
|
mediaRequestManager.commit();
|
|
491
626
|
checkMediaRequestsSent([
|
|
492
|
-
{
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
627
|
+
{
|
|
628
|
+
policy: 'active-speaker',
|
|
629
|
+
priority: 255,
|
|
630
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
631
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
policy: 'active-speaker',
|
|
635
|
+
priority: 255,
|
|
636
|
+
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3]],
|
|
637
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
policy: 'receiver-selected',
|
|
641
|
+
csi: 100,
|
|
642
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
643
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
policy: 'receiver-selected',
|
|
647
|
+
csi: 200,
|
|
648
|
+
receiveSlot: fakeWcmeSlots[5],
|
|
649
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
650
|
+
},
|
|
496
651
|
]);
|
|
497
652
|
|
|
498
653
|
// cancel 2 of the requests
|
|
@@ -503,8 +658,18 @@ describe('MediaRequestManager', () => {
|
|
|
503
658
|
|
|
504
659
|
// expect only the 2 remaining requests to be sent out
|
|
505
660
|
checkMediaRequestsSent([
|
|
506
|
-
{
|
|
507
|
-
|
|
661
|
+
{
|
|
662
|
+
policy: 'active-speaker',
|
|
663
|
+
priority: 255,
|
|
664
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
665
|
+
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
policy: 'receiver-selected',
|
|
669
|
+
csi: 100,
|
|
670
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
671
|
+
maxFs: RECEIVER_SELECTED_MAX_FS,
|
|
672
|
+
},
|
|
508
673
|
]);
|
|
509
674
|
|
|
510
675
|
// and that the receive slots of the 2 cancelled ones had resetSourceState() called
|
|
@@ -512,4 +677,101 @@ describe('MediaRequestManager', () => {
|
|
|
512
677
|
assert.calledOnce(fakeReceiveSlots[3].resetSourceState);
|
|
513
678
|
assert.calledOnce(fakeReceiveSlots[5].resetSourceState);
|
|
514
679
|
});
|
|
680
|
+
|
|
681
|
+
it('re-sends media requests after degradation preferences are set', () => {
|
|
682
|
+
// set max macroblocks limit
|
|
683
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
684
|
+
assert.calledOnce(sendMediaRequestsCallback);
|
|
685
|
+
});
|
|
686
|
+
|
|
687
|
+
it('can degrade max-fs once when request exceeds max macroblocks limit', () => {
|
|
688
|
+
// set max macroblocks limit
|
|
689
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
690
|
+
sendMediaRequestsCallback.resetHistory();
|
|
691
|
+
|
|
692
|
+
// request 3 "large" 1080p streams
|
|
693
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 3), getMaxFs('large'), false);
|
|
694
|
+
|
|
695
|
+
// request additional "large" 1080p stream to exceed max macroblocks limit
|
|
696
|
+
const additionalRequestId = addReceiverSelectedRequest(
|
|
697
|
+
123,
|
|
698
|
+
fakeReceiveSlots[3],
|
|
699
|
+
getMaxFs('large'),
|
|
700
|
+
true
|
|
701
|
+
);
|
|
702
|
+
|
|
703
|
+
// check that resulting requests are 4 "medium" 720p streams
|
|
704
|
+
checkMediaRequestsSent([
|
|
705
|
+
{
|
|
706
|
+
policy: 'active-speaker',
|
|
707
|
+
priority: 255,
|
|
708
|
+
receiveSlots: fakeWcmeSlots.slice(0, 3),
|
|
709
|
+
maxFs: getMaxFs('medium'),
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
policy: 'receiver-selected',
|
|
713
|
+
csi: 123,
|
|
714
|
+
receiveSlot: fakeWcmeSlots[3],
|
|
715
|
+
maxFs: getMaxFs('medium'),
|
|
716
|
+
},
|
|
717
|
+
]);
|
|
718
|
+
|
|
719
|
+
// cancel additional request
|
|
720
|
+
mediaRequestManager.cancelRequest(additionalRequestId);
|
|
721
|
+
|
|
722
|
+
// check that resulting requests are 3 "large" 1080p streams
|
|
723
|
+
checkMediaRequestsSent([
|
|
724
|
+
{
|
|
725
|
+
policy: 'active-speaker',
|
|
726
|
+
priority: 255,
|
|
727
|
+
receiveSlots: fakeWcmeSlots.slice(0, 3),
|
|
728
|
+
maxFs: getMaxFs('large'),
|
|
729
|
+
},
|
|
730
|
+
]);
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
it('can degrade max-fs multiple times when request exceeds max macroblocks limit', () => {
|
|
734
|
+
// set max macroblocks limit
|
|
735
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
736
|
+
sendMediaRequestsCallback.resetHistory();
|
|
737
|
+
|
|
738
|
+
// request 10 "large" 1080p streams
|
|
739
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
|
|
740
|
+
|
|
741
|
+
// check that resulting requests are 10 "small" 360p streams
|
|
742
|
+
checkMediaRequestsSent([
|
|
743
|
+
{
|
|
744
|
+
policy: 'active-speaker',
|
|
745
|
+
priority: 255,
|
|
746
|
+
receiveSlots: fakeWcmeSlots.slice(0, 10),
|
|
747
|
+
maxFs: getMaxFs('small'),
|
|
748
|
+
},
|
|
749
|
+
]);
|
|
750
|
+
});
|
|
751
|
+
|
|
752
|
+
it('can degrade only the largest max-fs when request exceeds max macroblocks limit', () => {
|
|
753
|
+
// set max macroblocks limit
|
|
754
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
755
|
+
sendMediaRequestsCallback.resetHistory();
|
|
756
|
+
|
|
757
|
+
// request 5 "large" 1080p streams and 5 "small" 360p streams
|
|
758
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 5), getMaxFs('large'), false);
|
|
759
|
+
addActiveSpeakerRequest(254, fakeReceiveSlots.slice(5, 10), getMaxFs('small'), true);
|
|
760
|
+
|
|
761
|
+
// check that resulting requests are 5 "medium" 720p streams and 5 "small" 360p streams
|
|
762
|
+
checkMediaRequestsSent([
|
|
763
|
+
{
|
|
764
|
+
policy: 'active-speaker',
|
|
765
|
+
priority: 255,
|
|
766
|
+
receiveSlots: fakeWcmeSlots.slice(0, 5),
|
|
767
|
+
maxFs: getMaxFs('medium'),
|
|
768
|
+
},
|
|
769
|
+
{
|
|
770
|
+
policy: 'active-speaker',
|
|
771
|
+
priority: 254,
|
|
772
|
+
receiveSlots: fakeWcmeSlots.slice(5, 10),
|
|
773
|
+
maxFs: getMaxFs('small'),
|
|
774
|
+
},
|
|
775
|
+
]);
|
|
776
|
+
});
|
|
515
777
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable require-jsdoc */
|
|
2
2
|
import EventEmitter from 'events';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import {MediaType, ReceiveSlotEvents as WcmeReceiveSlotEvents} from '@webex/internal-media-core';
|
|
5
5
|
import {ReceiveSlot, ReceiveSlotEvents} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
6
6
|
import sinon from 'sinon';
|
|
7
7
|
import {assert} from '@webex/test-helper-chai';
|
|
@@ -25,7 +25,7 @@ describe('ReceiveSlot', () => {
|
|
|
25
25
|
fakeStream = {id: 'fake stream'};
|
|
26
26
|
fakeWcmeSlot = new FakeWcmeSlot(fakeStream);
|
|
27
27
|
findMemberIdCallbackStub = sinon.stub();
|
|
28
|
-
receiveSlot = new ReceiveSlot(
|
|
28
|
+
receiveSlot = new ReceiveSlot(MediaType.VideoMain, fakeWcmeSlot, findMemberIdCallbackStub);
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
describe('forwards events from underlying wcme receive slot', () => {
|
|
@@ -43,7 +43,7 @@ describe('ReceiveSlot', () => {
|
|
|
43
43
|
eventData = data;
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
fakeWcmeSlot.emit(
|
|
46
|
+
fakeWcmeSlot.emit(WcmeReceiveSlotEvents.SourceUpdate, 'live', csi);
|
|
47
47
|
|
|
48
48
|
assert.strictEqual(eventEmitted, true);
|
|
49
49
|
assert.deepEqual(eventData, {
|
|
@@ -58,7 +58,7 @@ describe('ReceiveSlot', () => {
|
|
|
58
58
|
|
|
59
59
|
it('has public properties', () => {
|
|
60
60
|
assert.strictEqual(receiveSlot.id, 'r1');
|
|
61
|
-
assert.strictEqual(receiveSlot.mediaType,
|
|
61
|
+
assert.strictEqual(receiveSlot.mediaType, MediaType.VideoMain);
|
|
62
62
|
});
|
|
63
63
|
|
|
64
64
|
it("exposes underlying wcme receive slot's properties", () => {
|
|
@@ -76,7 +76,7 @@ describe('ReceiveSlot', () => {
|
|
|
76
76
|
|
|
77
77
|
findMemberIdCallbackStub.returns(fakeMemberId);
|
|
78
78
|
|
|
79
|
-
fakeWcmeSlot.emit(
|
|
79
|
+
fakeWcmeSlot.emit(WcmeReceiveSlotEvents.SourceUpdate, 'live', csi);
|
|
80
80
|
|
|
81
81
|
assert.strictEqual(receiveSlot.memberId, fakeMemberId);
|
|
82
82
|
assert.strictEqual(receiveSlot.csi, csi);
|
|
@@ -89,7 +89,7 @@ describe('ReceiveSlot', () => {
|
|
|
89
89
|
|
|
90
90
|
findMemberIdCallbackStub.returns(fakeMemberId);
|
|
91
91
|
|
|
92
|
-
fakeWcmeSlot.emit(
|
|
92
|
+
fakeWcmeSlot.emit(WcmeReceiveSlotEvents.SourceUpdate, 'live', csi);
|
|
93
93
|
|
|
94
94
|
assert.strictEqual(receiveSlot.memberId, fakeMemberId);
|
|
95
95
|
assert.strictEqual(receiveSlot.csi, csi);
|