@webex/plugin-meetings 3.0.0-beta.76 → 3.0.0-beta.78

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.
@@ -4,23 +4,26 @@ import sinon from 'sinon';
4
4
  import {assert} from '@webex/test-helper-chai';
5
5
  import {getMaxFs} from '@webex/plugin-meetings/src/multistream/remoteMedia';
6
6
  import FakeTimers from '@sinonjs/fake-timers';
7
+ import * as mediaCore from '@webex/internal-media-core';
7
8
 
8
9
  type ExpectedActiveSpeaker = {
9
10
  policy: 'active-speaker';
11
+ maxPayloadBitsPerSecond?: number;
10
12
  priority: number;
11
13
  receiveSlots: Array<ReceiveSlot>;
12
- maxFs: number;
14
+ maxFs?: number;
15
+ maxMbps?: number;
13
16
  };
14
17
  type ExpectedReceiverSelected = {
15
18
  policy: 'receiver-selected';
19
+ maxPayloadBitsPerSecond?: number;
16
20
  csi: number;
17
21
  receiveSlot: ReceiveSlot;
18
- maxFs: number;
22
+ maxFs?: number;
23
+ maxMbps?: number;
19
24
  };
20
25
  type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
21
26
 
22
- const maxPayloadBitsPerSecond = 10 * 1000 * 1000; // for now we always send this fixed constant
23
-
24
27
  const degradationPreferences = {
25
28
  maxMacroblocksLimit: Infinity, // no limit
26
29
  };
@@ -29,8 +32,16 @@ describe('MediaRequestManager', () => {
29
32
  const CROSS_PRIORITY_DUPLICATION = true;
30
33
  const CROSS_POLICY_DUPLICATION = true;
31
34
  const PREFER_LIVE_VIDEO = true;
32
- const ACTIVE_SPEAKER_MAX_FS = 3600;
33
- const RECEIVER_SELECTED_MAX_FS = 8190;
35
+ const MAX_FPS = 3000;
36
+ const MAX_FS_360p = 920;
37
+ const MAX_FS_720p = 3600;
38
+ const MAX_FS_1080p = 8192;
39
+ const MAX_MBPS_360p = 27600;
40
+ const MAX_MBPS_720p = 108000;
41
+ const MAX_MBPS_1080p = 245760;
42
+ const MAX_PAYLOADBITSPS_360p = 640000;
43
+ const MAX_PAYLOADBITSPS_720p = 2500000;
44
+ const MAX_PAYLOADBITSPS_1080p = 4000000;
34
45
 
35
46
  const NUM_SLOTS = 10;
36
47
 
@@ -41,10 +52,10 @@ describe('MediaRequestManager', () => {
41
52
 
42
53
  beforeEach(() => {
43
54
  sendMediaRequestsCallback = sinon.stub();
44
- mediaRequestManager = new MediaRequestManager(
55
+ mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
45
56
  degradationPreferences,
46
- sendMediaRequestsCallback
47
- );
57
+ kind: 'video',
58
+ });
48
59
 
49
60
  // create some fake receive slots used by the tests
50
61
  fakeWcmeSlots = Array(NUM_SLOTS)
@@ -109,7 +120,10 @@ describe('MediaRequestManager', () => {
109
120
  // It should be used only for verifying requests created with
110
121
  // addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
111
122
  // hardcoded values used in them
112
- const checkMediaRequestsSent = (expectedRequests: ExpectedRequest[]) => {
123
+ const checkMediaRequestsSent = (
124
+ expectedRequests: ExpectedRequest[],
125
+ isCodecInfoDefined: boolean = true
126
+ ) => {
113
127
  assert.calledOnce(sendMediaRequestsCallback);
114
128
  assert.calledWith(
115
129
  sendMediaRequestsCallback,
@@ -124,15 +138,18 @@ describe('MediaRequestManager', () => {
124
138
  preferLiveVideo: PREFER_LIVE_VIDEO,
125
139
  }),
126
140
  receiveSlots: expectedRequest.receiveSlots,
127
- maxPayloadBitsPerSecond,
128
- codecInfos: [
129
- sinon.match({
130
- payloadType: 0x80,
131
- h264: sinon.match({
132
- maxFs: expectedRequest.maxFs,
133
- }),
134
- }),
135
- ],
141
+ maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
142
+ codecInfos: isCodecInfoDefined
143
+ ? [
144
+ sinon.match({
145
+ payloadType: 0x80,
146
+ h264: sinon.match({
147
+ maxMbps: expectedRequest.maxMbps,
148
+ maxFs: expectedRequest.maxFs,
149
+ }),
150
+ }),
151
+ ]
152
+ : [],
136
153
  });
137
154
  }
138
155
  if (expectedRequest.policy === 'receiver-selected') {
@@ -142,15 +159,18 @@ describe('MediaRequestManager', () => {
142
159
  csi: expectedRequest.csi,
143
160
  }),
144
161
  receiveSlots: [expectedRequest.receiveSlot],
145
- maxPayloadBitsPerSecond,
146
- codecInfos: [
147
- sinon.match({
148
- payloadType: 0x80,
149
- h264: sinon.match({
150
- maxFs: expectedRequest.maxFs,
151
- }),
152
- }),
153
- ],
162
+ maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
163
+ codecInfos: isCodecInfoDefined
164
+ ? [
165
+ sinon.match({
166
+ payloadType: 0x80,
167
+ h264: sinon.match({
168
+ maxMbps: expectedRequest.maxMbps,
169
+ maxFs: expectedRequest.maxFs,
170
+ }),
171
+ }),
172
+ ]
173
+ : [],
154
174
  });
155
175
  }
156
176
 
@@ -184,8 +204,8 @@ describe('MediaRequestManager', () => {
184
204
  receiveSlots: [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
185
205
  codecInfo: {
186
206
  codec: 'h264',
187
- maxFs: 1620,
188
- maxFps: 1500,
207
+ maxFs: MAX_FS_360p,
208
+ maxFps: MAX_FPS,
189
209
  },
190
210
  },
191
211
  false
@@ -199,9 +219,9 @@ describe('MediaRequestManager', () => {
199
219
  receiveSlots: [fakeReceiveSlots[3]],
200
220
  codecInfo: {
201
221
  codec: 'h264',
202
- maxFs: 3600,
203
- maxFps: 2500,
204
- maxMbps: 90000,
222
+ maxFs: MAX_FS_720p,
223
+ maxFps: MAX_FPS,
224
+ maxMbps: MAX_MBPS_720p,
205
225
  },
206
226
  },
207
227
  false
@@ -217,9 +237,9 @@ describe('MediaRequestManager', () => {
217
237
  receiveSlots: [fakeReceiveSlots[4]],
218
238
  codecInfo: {
219
239
  codec: 'h264',
220
- maxFs: 8192,
221
- maxFps: 2500,
222
- maxMbps: 204800,
240
+ maxFs: MAX_FS_1080p,
241
+ maxFps: MAX_FPS,
242
+ maxMbps: MAX_MBPS_1080p,
223
243
  },
224
244
  },
225
245
  true
@@ -237,13 +257,14 @@ describe('MediaRequestManager', () => {
237
257
  preferLiveVideo: false,
238
258
  }),
239
259
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
260
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
240
261
  codecInfos: [
241
262
  sinon.match({
242
263
  payloadType: 0x80,
243
264
  h264: sinon.match({
244
- maxFs: 1620,
245
- maxFps: 1500,
246
- maxMbps: 245760,
265
+ maxFs: MAX_FS_360p,
266
+ maxFps: MAX_FPS,
267
+ maxMbps: MAX_MBPS_360p,
247
268
  }),
248
269
  }),
249
270
  ],
@@ -254,13 +275,14 @@ describe('MediaRequestManager', () => {
254
275
  csi: 123,
255
276
  }),
256
277
  receiveSlots: [fakeWcmeSlots[3]],
278
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
257
279
  codecInfos: [
258
280
  sinon.match({
259
281
  payloadType: 0x80,
260
282
  h264: sinon.match({
261
- maxFs: 3600,
262
- maxFps: 2500,
263
- maxMbps: 90000,
283
+ maxFs: MAX_FS_720p,
284
+ maxFps: MAX_FPS,
285
+ maxMbps: MAX_MBPS_720p,
264
286
  }),
265
287
  }),
266
288
  ],
@@ -271,13 +293,14 @@ describe('MediaRequestManager', () => {
271
293
  csi: 123,
272
294
  }),
273
295
  receiveSlots: [fakeWcmeSlots[4]],
296
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
274
297
  codecInfos: [
275
298
  sinon.match({
276
299
  payloadType: 0x80,
277
300
  h264: sinon.match({
278
- maxFs: 8192,
279
- maxFps: 2500,
280
- maxMbps: 204800,
301
+ maxFs: MAX_FS_1080p,
302
+ maxFps: MAX_FPS,
303
+ maxMbps: MAX_MBPS_1080p,
281
304
  }),
282
305
  }),
283
306
  ],
@@ -287,32 +310,38 @@ describe('MediaRequestManager', () => {
287
310
 
288
311
  it('keeps adding requests with every call to addRequest()', () => {
289
312
  // start with 1 request
290
- addReceiverSelectedRequest(100, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, true);
313
+ addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_1080p, true);
291
314
 
292
315
  checkMediaRequestsSent([
293
316
  {
294
317
  policy: 'receiver-selected',
295
318
  csi: 100,
296
319
  receiveSlot: fakeWcmeSlots[0],
297
- maxFs: RECEIVER_SELECTED_MAX_FS,
320
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
321
+ maxFs: MAX_FS_1080p,
322
+ maxMbps: MAX_MBPS_1080p,
298
323
  },
299
324
  ]);
300
325
 
301
326
  // now add another one
302
- addReceiverSelectedRequest(101, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, true);
327
+ addReceiverSelectedRequest(101, fakeReceiveSlots[1], MAX_FS_1080p, true);
303
328
 
304
329
  checkMediaRequestsSent([
305
330
  {
306
331
  policy: 'receiver-selected',
307
332
  csi: 100,
308
333
  receiveSlot: fakeWcmeSlots[0],
309
- maxFs: RECEIVER_SELECTED_MAX_FS,
334
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
335
+ maxFs: MAX_FS_1080p,
336
+ maxMbps: MAX_MBPS_1080p,
310
337
  },
311
338
  {
312
339
  policy: 'receiver-selected',
313
340
  csi: 101,
314
341
  receiveSlot: fakeWcmeSlots[1],
315
- maxFs: RECEIVER_SELECTED_MAX_FS,
342
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
343
+ maxFs: MAX_FS_1080p,
344
+ maxMbps: MAX_MBPS_1080p,
316
345
  },
317
346
  ]);
318
347
 
@@ -320,7 +349,7 @@ describe('MediaRequestManager', () => {
320
349
  addActiveSpeakerRequest(
321
350
  1,
322
351
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
323
- ACTIVE_SPEAKER_MAX_FS,
352
+ MAX_FS_720p,
324
353
  true
325
354
  );
326
355
 
@@ -329,37 +358,35 @@ describe('MediaRequestManager', () => {
329
358
  policy: 'receiver-selected',
330
359
  csi: 100,
331
360
  receiveSlot: fakeWcmeSlots[0],
332
- maxFs: RECEIVER_SELECTED_MAX_FS,
361
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
362
+ maxFs: MAX_FS_1080p,
363
+ maxMbps: MAX_MBPS_1080p,
333
364
  },
334
365
  {
335
366
  policy: 'receiver-selected',
336
367
  csi: 101,
337
368
  receiveSlot: fakeWcmeSlots[1],
338
- maxFs: RECEIVER_SELECTED_MAX_FS,
369
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
370
+ maxFs: MAX_FS_1080p,
371
+ maxMbps: MAX_MBPS_1080p,
339
372
  },
340
373
  {
341
374
  policy: 'active-speaker',
342
375
  priority: 1,
343
376
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
344
- maxFs: ACTIVE_SPEAKER_MAX_FS,
377
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
378
+ maxFs: MAX_FS_720p,
379
+ maxMbps: MAX_MBPS_720p,
345
380
  },
346
381
  ]);
347
382
  });
348
383
 
349
384
  it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
350
385
  const requestIds = [
351
- addActiveSpeakerRequest(
352
- 255,
353
- [fakeReceiveSlots[0], fakeReceiveSlots[1]],
354
- ACTIVE_SPEAKER_MAX_FS
355
- ),
356
- addActiveSpeakerRequest(
357
- 255,
358
- [fakeReceiveSlots[2], fakeReceiveSlots[3]],
359
- ACTIVE_SPEAKER_MAX_FS
360
- ),
361
- addReceiverSelectedRequest(100, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS),
362
- addReceiverSelectedRequest(200, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS),
386
+ addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]], MAX_FS_720p),
387
+ addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p),
388
+ addReceiverSelectedRequest(100, fakeReceiveSlots[4], MAX_FS_1080p),
389
+ addReceiverSelectedRequest(200, fakeReceiveSlots[5], MAX_FS_1080p),
363
390
  ];
364
391
 
365
392
  // cancel one of the active speaker requests
@@ -371,19 +398,25 @@ describe('MediaRequestManager', () => {
371
398
  policy: 'active-speaker',
372
399
  priority: 255,
373
400
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
374
- maxFs: ACTIVE_SPEAKER_MAX_FS,
401
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
402
+ maxFs: MAX_FS_720p,
403
+ maxMbps: MAX_MBPS_720p,
375
404
  },
376
405
  {
377
406
  policy: 'receiver-selected',
378
407
  csi: 100,
379
408
  receiveSlot: fakeWcmeSlots[4],
380
- maxFs: RECEIVER_SELECTED_MAX_FS,
409
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
410
+ maxFs: MAX_FS_1080p,
411
+ maxMbps: MAX_MBPS_1080p,
381
412
  },
382
413
  {
383
414
  policy: 'receiver-selected',
384
415
  csi: 200,
385
416
  receiveSlot: fakeWcmeSlots[5],
386
- maxFs: RECEIVER_SELECTED_MAX_FS,
417
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
418
+ maxFs: MAX_FS_1080p,
419
+ maxMbps: MAX_MBPS_1080p,
387
420
  },
388
421
  ]);
389
422
 
@@ -396,13 +429,17 @@ describe('MediaRequestManager', () => {
396
429
  policy: 'active-speaker',
397
430
  priority: 255,
398
431
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
399
- maxFs: ACTIVE_SPEAKER_MAX_FS,
432
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
433
+ maxFs: MAX_FS_720p,
434
+ maxMbps: MAX_MBPS_720p,
400
435
  },
401
436
  {
402
437
  policy: 'receiver-selected',
403
438
  csi: 100,
404
439
  receiveSlot: fakeWcmeSlots[4],
405
- maxFs: RECEIVER_SELECTED_MAX_FS,
440
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
441
+ maxFs: MAX_FS_1080p,
442
+ maxMbps: MAX_MBPS_1080p,
406
443
  },
407
444
  ]);
408
445
  });
@@ -411,10 +448,10 @@ describe('MediaRequestManager', () => {
411
448
  addActiveSpeakerRequest(
412
449
  10,
413
450
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
414
- ACTIVE_SPEAKER_MAX_FS,
451
+ MAX_FS_720p,
415
452
  false
416
453
  );
417
- addReceiverSelectedRequest(123, fakeReceiveSlots[3], RECEIVER_SELECTED_MAX_FS, false);
454
+ addReceiverSelectedRequest(123, fakeReceiveSlots[3], MAX_FS_1080p, false);
418
455
 
419
456
  // nothing should be sent out as we didn't commit the requests
420
457
  assert.notCalled(sendMediaRequestsCallback);
@@ -428,13 +465,17 @@ describe('MediaRequestManager', () => {
428
465
  policy: 'active-speaker',
429
466
  priority: 10,
430
467
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
431
- maxFs: ACTIVE_SPEAKER_MAX_FS,
468
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
469
+ maxFs: MAX_FS_720p,
470
+ maxMbps: MAX_MBPS_720p,
432
471
  },
433
472
  {
434
473
  policy: 'receiver-selected',
435
474
  csi: 123,
436
475
  receiveSlot: fakeWcmeSlots[3],
437
- maxFs: RECEIVER_SELECTED_MAX_FS,
476
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
477
+ maxFs: MAX_FS_1080p,
478
+ maxMbps: MAX_MBPS_1080p,
438
479
  },
439
480
  ]);
440
481
  });
@@ -445,12 +486,12 @@ describe('MediaRequestManager', () => {
445
486
  addActiveSpeakerRequest(
446
487
  250,
447
488
  [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
448
- ACTIVE_SPEAKER_MAX_FS,
489
+ MAX_FS_720p,
449
490
  false
450
491
  ),
451
- addReceiverSelectedRequest(98765, fakeReceiveSlots[3], RECEIVER_SELECTED_MAX_FS, false),
452
- addReceiverSelectedRequest(99999, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS, false),
453
- addReceiverSelectedRequest(88888, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS, true),
492
+ addReceiverSelectedRequest(98765, fakeReceiveSlots[3], MAX_FS_1080p, false),
493
+ addReceiverSelectedRequest(99999, fakeReceiveSlots[4], MAX_FS_1080p, false),
494
+ addReceiverSelectedRequest(88888, fakeReceiveSlots[5], MAX_FS_1080p, true),
454
495
  ];
455
496
 
456
497
  checkMediaRequestsSent([
@@ -458,25 +499,33 @@ describe('MediaRequestManager', () => {
458
499
  policy: 'active-speaker',
459
500
  priority: 250,
460
501
  receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
461
- maxFs: ACTIVE_SPEAKER_MAX_FS,
502
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
503
+ maxFs: MAX_FS_720p,
504
+ maxMbps: MAX_MBPS_720p,
462
505
  },
463
506
  {
464
507
  policy: 'receiver-selected',
465
508
  csi: 98765,
466
509
  receiveSlot: fakeWcmeSlots[3],
467
- maxFs: RECEIVER_SELECTED_MAX_FS,
510
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
511
+ maxFs: MAX_FS_1080p,
512
+ maxMbps: MAX_MBPS_1080p,
468
513
  },
469
514
  {
470
515
  policy: 'receiver-selected',
471
516
  csi: 99999,
472
517
  receiveSlot: fakeWcmeSlots[4],
473
- maxFs: RECEIVER_SELECTED_MAX_FS,
518
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
519
+ maxFs: MAX_FS_1080p,
520
+ maxMbps: MAX_MBPS_1080p,
474
521
  },
475
522
  {
476
523
  policy: 'receiver-selected',
477
524
  csi: 88888,
478
525
  receiveSlot: fakeWcmeSlots[5],
479
- maxFs: RECEIVER_SELECTED_MAX_FS,
526
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
527
+ maxFs: MAX_FS_1080p,
528
+ maxMbps: MAX_MBPS_1080p,
480
529
  },
481
530
  ]);
482
531
 
@@ -495,25 +544,27 @@ describe('MediaRequestManager', () => {
495
544
  policy: 'receiver-selected',
496
545
  csi: 98765,
497
546
  receiveSlot: fakeWcmeSlots[3],
498
- maxFs: RECEIVER_SELECTED_MAX_FS,
547
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
548
+ maxFs: MAX_FS_1080p,
549
+ maxMbps: MAX_MBPS_1080p,
499
550
  },
500
551
  ]);
501
552
  });
502
553
 
503
554
  it('sends the wcme media requests when commit() is called', () => {
504
555
  // send some requests, all of them with commit=false
505
- addReceiverSelectedRequest(123000, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, false);
506
- addReceiverSelectedRequest(456000, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, false);
556
+ addReceiverSelectedRequest(123000, fakeReceiveSlots[0], MAX_FS_1080p, false);
557
+ addReceiverSelectedRequest(456000, fakeReceiveSlots[1], MAX_FS_1080p, false);
507
558
  addActiveSpeakerRequest(
508
559
  255,
509
560
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
510
- ACTIVE_SPEAKER_MAX_FS,
561
+ MAX_FS_720p,
511
562
  false
512
563
  );
513
564
  addActiveSpeakerRequest(
514
565
  254,
515
566
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
516
- ACTIVE_SPEAKER_MAX_FS,
567
+ MAX_FS_720p,
517
568
  false
518
569
  );
519
570
 
@@ -529,43 +580,51 @@ describe('MediaRequestManager', () => {
529
580
  policy: 'receiver-selected',
530
581
  csi: 123000,
531
582
  receiveSlot: fakeWcmeSlots[0],
532
- maxFs: RECEIVER_SELECTED_MAX_FS,
583
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
584
+ maxFs: MAX_FS_1080p,
585
+ maxMbps: MAX_MBPS_1080p,
533
586
  },
534
587
  {
535
588
  policy: 'receiver-selected',
536
589
  csi: 456000,
537
590
  receiveSlot: fakeWcmeSlots[1],
538
- maxFs: RECEIVER_SELECTED_MAX_FS,
591
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
592
+ maxFs: MAX_FS_1080p,
593
+ maxMbps: MAX_MBPS_1080p,
539
594
  },
540
595
  {
541
596
  policy: 'active-speaker',
542
597
  priority: 255,
543
598
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
544
- maxFs: ACTIVE_SPEAKER_MAX_FS,
599
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
600
+ maxFs: MAX_FS_720p,
601
+ maxMbps: MAX_MBPS_720p,
545
602
  },
546
603
  {
547
604
  policy: 'active-speaker',
548
605
  priority: 254,
549
606
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
550
- maxFs: ACTIVE_SPEAKER_MAX_FS,
607
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
608
+ maxFs: MAX_FS_720p,
609
+ maxMbps: MAX_MBPS_720p,
551
610
  },
552
611
  ]);
553
612
  });
554
613
 
555
614
  it('avoids sending duplicate requests and clears all the requests on reset()', () => {
556
615
  // send some requests and commit them one by one
557
- addReceiverSelectedRequest(1500, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, false);
558
- addReceiverSelectedRequest(1501, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, false);
616
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
617
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
559
618
  addActiveSpeakerRequest(
560
619
  255,
561
620
  [fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
562
- ACTIVE_SPEAKER_MAX_FS,
621
+ MAX_FS_720p,
563
622
  false
564
623
  );
565
624
  addActiveSpeakerRequest(
566
625
  254,
567
626
  [fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
568
- ACTIVE_SPEAKER_MAX_FS,
627
+ MAX_FS_720p,
569
628
  false
570
629
  );
571
630
 
@@ -578,25 +637,33 @@ describe('MediaRequestManager', () => {
578
637
  policy: 'receiver-selected',
579
638
  csi: 1500,
580
639
  receiveSlot: fakeWcmeSlots[0],
581
- maxFs: RECEIVER_SELECTED_MAX_FS,
640
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
641
+ maxFs: MAX_FS_1080p,
642
+ maxMbps: MAX_MBPS_1080p,
582
643
  },
583
644
  {
584
645
  policy: 'receiver-selected',
585
646
  csi: 1501,
586
647
  receiveSlot: fakeWcmeSlots[1],
587
- maxFs: RECEIVER_SELECTED_MAX_FS,
648
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
649
+ maxFs: MAX_FS_1080p,
650
+ maxMbps: MAX_MBPS_1080p,
588
651
  },
589
652
  {
590
653
  policy: 'active-speaker',
591
654
  priority: 255,
592
655
  receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
593
- maxFs: ACTIVE_SPEAKER_MAX_FS,
656
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
657
+ maxFs: MAX_FS_720p,
658
+ maxMbps: MAX_MBPS_720p,
594
659
  },
595
660
  {
596
661
  policy: 'active-speaker',
597
662
  priority: 254,
598
663
  receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
599
- maxFs: ACTIVE_SPEAKER_MAX_FS,
664
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
665
+ maxFs: MAX_FS_720p,
666
+ maxMbps: MAX_MBPS_720p,
600
667
  },
601
668
  ]);
602
669
 
@@ -615,7 +682,7 @@ describe('MediaRequestManager', () => {
615
682
  });
616
683
 
617
684
  it('makes sure to call requests correctly after reset was called and another request was added', () => {
618
- addReceiverSelectedRequest(1500, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, false);
685
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
619
686
 
620
687
  assert.notCalled(sendMediaRequestsCallback);
621
688
 
@@ -625,7 +692,9 @@ describe('MediaRequestManager', () => {
625
692
  policy: 'receiver-selected',
626
693
  csi: 1500,
627
694
  receiveSlot: fakeWcmeSlots[0],
628
- maxFs: RECEIVER_SELECTED_MAX_FS,
695
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
696
+ maxFs: MAX_FS_1080p,
697
+ maxMbps: MAX_MBPS_1080p,
629
698
  },
630
699
  ]);
631
700
 
@@ -637,7 +706,7 @@ describe('MediaRequestManager', () => {
637
706
  checkMediaRequestsSent([]);
638
707
 
639
708
  //add new request
640
- addReceiverSelectedRequest(1501, fakeReceiveSlots[1], RECEIVER_SELECTED_MAX_FS, false);
709
+ addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
641
710
 
642
711
  // commit
643
712
  mediaRequestManager.commit();
@@ -648,21 +717,25 @@ describe('MediaRequestManager', () => {
648
717
  policy: 'receiver-selected',
649
718
  csi: 1501,
650
719
  receiveSlot: fakeWcmeSlots[1],
651
- maxFs: RECEIVER_SELECTED_MAX_FS,
720
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
721
+ maxFs: MAX_FS_1080p,
722
+ maxMbps: MAX_MBPS_1080p,
652
723
  },
653
724
  ]);
654
725
  });
655
726
 
656
727
  it('can send same media request after previous requests have been cleared', () => {
657
728
  // add a request and commit
658
- addReceiverSelectedRequest(1500, fakeReceiveSlots[0], RECEIVER_SELECTED_MAX_FS, false);
729
+ addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
659
730
  mediaRequestManager.commit();
660
731
  checkMediaRequestsSent([
661
732
  {
662
733
  policy: 'receiver-selected',
663
734
  csi: 1500,
735
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
664
736
  receiveSlot: fakeWcmeSlots[0],
665
- maxFs: RECEIVER_SELECTED_MAX_FS,
737
+ maxFs: MAX_FS_1080p,
738
+ maxMbps: MAX_MBPS_1080p,
666
739
  },
667
740
  ]);
668
741
 
@@ -677,8 +750,10 @@ describe('MediaRequestManager', () => {
677
750
  {
678
751
  policy: 'receiver-selected',
679
752
  csi: 1500,
753
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
680
754
  receiveSlot: fakeWcmeSlots[0],
681
- maxFs: RECEIVER_SELECTED_MAX_FS,
755
+ maxFs: MAX_FS_1080p,
756
+ maxMbps: MAX_MBPS_1080p,
682
757
  },
683
758
  ]);
684
759
  });
@@ -708,7 +783,9 @@ describe('MediaRequestManager', () => {
708
783
  policy: 'active-speaker',
709
784
  priority: 255,
710
785
  receiveSlots: fakeWcmeSlots.slice(0, 4),
786
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
711
787
  maxFs: getMaxFs('large'),
788
+ maxMbps: MAX_MBPS_1080p,
712
789
  },
713
790
  ]);
714
791
  });
@@ -735,13 +812,17 @@ describe('MediaRequestManager', () => {
735
812
  policy: 'active-speaker',
736
813
  priority: 255,
737
814
  receiveSlots: fakeWcmeSlots.slice(0, 3),
815
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
738
816
  maxFs: getMaxFs('medium'),
817
+ maxMbps: MAX_MBPS_720p,
739
818
  },
740
819
  {
741
820
  policy: 'receiver-selected',
742
821
  csi: 123,
743
822
  receiveSlot: fakeWcmeSlots[3],
823
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
744
824
  maxFs: getMaxFs('medium'),
825
+ maxMbps: MAX_MBPS_720p,
745
826
  },
746
827
  ]);
747
828
 
@@ -754,7 +835,9 @@ describe('MediaRequestManager', () => {
754
835
  policy: 'active-speaker',
755
836
  priority: 255,
756
837
  receiveSlots: fakeWcmeSlots.slice(0, 3),
838
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
757
839
  maxFs: getMaxFs('large'),
840
+ maxMbps: MAX_MBPS_1080p,
758
841
  },
759
842
  ]);
760
843
  });
@@ -773,7 +856,9 @@ describe('MediaRequestManager', () => {
773
856
  policy: 'active-speaker',
774
857
  priority: 255,
775
858
  receiveSlots: fakeWcmeSlots.slice(0, 10),
859
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
776
860
  maxFs: getMaxFs('small'),
861
+ maxMbps: MAX_MBPS_360p,
777
862
  },
778
863
  ]);
779
864
  });
@@ -793,13 +878,17 @@ describe('MediaRequestManager', () => {
793
878
  policy: 'active-speaker',
794
879
  priority: 255,
795
880
  receiveSlots: fakeWcmeSlots.slice(0, 5),
881
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
796
882
  maxFs: getMaxFs('medium'),
883
+ maxMbps: MAX_MBPS_720p,
797
884
  },
798
885
  {
799
886
  policy: 'active-speaker',
800
887
  priority: 254,
801
888
  receiveSlots: fakeWcmeSlots.slice(5, 10),
889
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
802
890
  maxFs: getMaxFs('small'),
891
+ maxMbps: MAX_MBPS_360p,
803
892
  },
804
893
  ]);
805
894
  });
@@ -835,7 +924,137 @@ describe('MediaRequestManager', () => {
835
924
  priority: 255,
836
925
  receiveSlots: fakeWcmeSlots.slice(0, 10),
837
926
  maxFs: preferredFrameSize,
927
+ maxPayloadBitsPerSecond: 99000,
928
+ maxMbps: 3000,
838
929
  },
839
930
  ]);
840
931
  });
932
+
933
+ describe('maxPayloadBitsPerSecond', () => {
934
+ let getRecommendedMaxBitrateForFrameSizeSpy;
935
+
936
+ beforeEach(() => {
937
+ sendMediaRequestsCallback.resetHistory();
938
+ getRecommendedMaxBitrateForFrameSizeSpy = sinon.spy(
939
+ mediaCore,
940
+ 'getRecommendedMaxBitrateForFrameSize'
941
+ );
942
+ });
943
+
944
+ afterEach(() => {
945
+ getRecommendedMaxBitrateForFrameSizeSpy.restore();
946
+ });
947
+
948
+ it('returns the default maxPayloadBitsPerSecond if kind is "audio"', () => {
949
+ const mediaRequestManagerAudio = new MediaRequestManager(sendMediaRequestsCallback, {
950
+ degradationPreferences,
951
+ kind: 'audio',
952
+ });
953
+ mediaRequestManagerAudio.addRequest(
954
+ {
955
+ policyInfo: {
956
+ policy: 'receiver-selected',
957
+ csi: 123,
958
+ },
959
+ receiveSlots: [fakeReceiveSlots[0]],
960
+ codecInfo: undefined,
961
+ },
962
+ false
963
+ );
964
+
965
+ mediaRequestManagerAudio.commit();
966
+
967
+ checkMediaRequestsSent(
968
+ [
969
+ {
970
+ policy: 'receiver-selected',
971
+ csi: 123,
972
+ receiveSlot: fakeWcmeSlots[0],
973
+ // returns RecommendedOpusBitrates.FB_MONO_MUSIC as expected:
974
+ maxPayloadBitsPerSecond: 64000,
975
+ },
976
+ // set isCodecInfoDefined to false, since we don't pass in a codec info when audio:
977
+ ],
978
+ false
979
+ );
980
+
981
+ assert.notCalled(getRecommendedMaxBitrateForFrameSizeSpy);
982
+ });
983
+
984
+ it('returns the recommended maxPayloadBitsPerSecond if kind is "video"', () => {
985
+ mediaRequestManager.addRequest(
986
+ {
987
+ policyInfo: {
988
+ policy: 'receiver-selected',
989
+ csi: 123,
990
+ },
991
+ receiveSlots: [fakeReceiveSlots[0]],
992
+ codecInfo: {
993
+ codec: 'h264',
994
+ maxFs: MAX_FS_1080p,
995
+ maxFps: MAX_FPS,
996
+ maxMbps: MAX_MBPS_1080p,
997
+ },
998
+ },
999
+ false
1000
+ );
1001
+
1002
+ mediaRequestManager.commit();
1003
+
1004
+ checkMediaRequestsSent([
1005
+ {
1006
+ policy: 'receiver-selected',
1007
+ csi: 123,
1008
+ receiveSlot: fakeWcmeSlots[0],
1009
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
1010
+ maxFs: MAX_FS_1080p,
1011
+ maxMbps: MAX_MBPS_1080p,
1012
+ },
1013
+ ]);
1014
+
1015
+ // calls the utility function as expected with maxFs passed in (no need to do
1016
+ // further tests here, since the util function itself should be tested for different inputs)
1017
+ assert.calledWith(getRecommendedMaxBitrateForFrameSizeSpy, MAX_FS_1080p);
1018
+ });
1019
+ });
1020
+
1021
+ describe('maxMbps', () => {
1022
+ beforeEach(() => {
1023
+ sendMediaRequestsCallback.resetHistory();
1024
+ });
1025
+
1026
+ it('returns the correct maxMbps value', () => {
1027
+ mediaRequestManager.addRequest(
1028
+ {
1029
+ policyInfo: {
1030
+ policy: 'receiver-selected',
1031
+ csi: 123,
1032
+ },
1033
+ receiveSlots: [fakeReceiveSlots[0]],
1034
+ codecInfo: {
1035
+ codec: 'h264',
1036
+ maxFs: MAX_FS_1080p,
1037
+ maxFps: MAX_FPS,
1038
+ // random value to pass in, to show that the output (below) is calculated
1039
+ // from the maxFs and maxFps values only:
1040
+ maxMbps: 123,
1041
+ },
1042
+ },
1043
+ false
1044
+ );
1045
+
1046
+ mediaRequestManager.commit();
1047
+
1048
+ checkMediaRequestsSent([
1049
+ {
1050
+ policy: 'receiver-selected',
1051
+ csi: 123,
1052
+ receiveSlot: fakeWcmeSlots[0],
1053
+ maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
1054
+ maxFs: MAX_FS_1080p,
1055
+ maxMbps: MAX_MBPS_1080p,
1056
+ },
1057
+ ]);
1058
+ });
1059
+ });
841
1060
  });