@webex/plugin-meetings 3.0.0-beta.34 → 3.0.0-beta.340
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/README.md +46 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +94 -15
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +709 -35
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +45 -1
- package/dist/breakouts/utils.js.map +1 -1
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/webex-errors.js +48 -7
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +5 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +233 -29
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +383 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +57 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +249 -72
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +62 -116
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +73 -124
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +1 -204
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +86 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3927 -2960
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +224 -131
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +260 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +73 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +192 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +39 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +424 -116
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +72 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +58 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +132 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +102 -6
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +326 -232
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +16 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -446
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +228 -58
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +29 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +39 -36
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +209 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +233 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/clusterReachability.js +356 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.js +273 -391
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +17 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reconnection-manager/index.js +214 -170
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +62 -35
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -97
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +95 -38
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +142 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +181 -214
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +22 -18
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/utils.d.ts +14 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/webex-errors.d.ts +25 -1
- package/dist/types/common/logs/request.d.ts +2 -0
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +2 -7
- package/dist/types/constants.d.ts +201 -30
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -4
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +66 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/mediaQualityMetrics/config.d.ts +0 -128
- package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
- package/dist/types/meeting/index.d.ts +506 -512
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +93 -25
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +17 -0
- package/dist/types/meetings/index.d.ts +91 -21
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +14 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +25 -0
- package/dist/types/members/util.d.ts +214 -1
- package/dist/types/metrics/constants.d.ts +15 -4
- package/dist/types/metrics/index.d.ts +4 -111
- package/dist/types/multistream/mediaRequestManager.d.ts +72 -5
- package/dist/types/multistream/receiveSlot.d.ts +13 -11
- package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
- package/dist/types/multistream/remoteMedia.d.ts +8 -29
- package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
- package/dist/types/multistream/sendSlotManager.d.ts +61 -0
- package/dist/types/reachability/clusterReachability.d.ts +109 -0
- package/dist/types/reachability/index.d.ts +60 -95
- package/dist/types/reachability/request.d.ts +7 -3
- package/dist/types/reachability/util.d.ts +8 -0
- package/dist/types/reconnection-manager/index.d.ts +19 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/index.d.ts +2 -1
- package/dist/types/roap/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +21 -3
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +54 -0
- package/dist/types/statsAnalyzer/index.d.ts +29 -11
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +22 -19
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +42 -12
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +592 -20
- package/src/breakouts/utils.ts +42 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/webex-errors.ts +44 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -9
- package/src/constants.ts +224 -20
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +413 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +102 -122
- package/src/media/properties.ts +87 -110
- package/src/mediaQualityMetrics/config.ts +0 -135
- package/src/meeting/in-meeting-actions.ts +171 -3
- package/src/meeting/index.ts +3276 -2555
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +223 -136
- package/src/meeting/request.ts +177 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +170 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +454 -125
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +80 -11
- package/src/member/index.ts +58 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +141 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +134 -8
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +333 -240
- package/src/metrics/constants.ts +15 -4
- package/src/metrics/index.ts +1 -469
- package/src/multistream/mediaRequestManager.ts +277 -82
- package/src/multistream/receiveSlot.ts +31 -17
- package/src/multistream/receiveSlotManager.ts +34 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +236 -342
- package/src/reachability/request.ts +17 -8
- package/src/reachability/util.ts +24 -0
- package/src/reconnection-manager/index.ts +128 -106
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +63 -32
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +48 -26
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +124 -0
- package/src/statsAnalyzer/index.ts +218 -289
- package/src/statsAnalyzer/mqaUtil.ts +28 -30
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +60 -3
- package/test/integration/spec/journey.js +320 -261
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +118 -28
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1395 -69
- package/test/unit/spec/breakouts/utils.js +52 -1
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1304 -33
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +120 -37
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
- package/test/unit/spec/meeting/index.js +5849 -2014
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +402 -213
- package/test/unit/spec/meeting/request.js +483 -49
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +26 -0
- package/test/unit/spec/meetings/index.js +1231 -212
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +61 -6
- package/test/unit/spec/member/util.js +510 -34
- package/test/unit/spec/members/index.js +432 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +210 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +776 -162
- package/test/unit/spec/multistream/receiveSlot.ts +28 -20
- package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +486 -13
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +117 -11
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +174 -63
- package/test/unit/spec/roap/request.ts +226 -85
- package/test/unit/spec/roap/turnDiscovery.ts +76 -34
- package/test/unit/spec/rtcMetrics/index.ts +93 -0
- package/test/unit/spec/stats-analyzer/index.js +231 -7
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -52
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/meeting/effectsState.d.ts +0 -42
- package/dist/types/metrics/config.d.ts +0 -169
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -485
- package/test/unit/spec/meeting/effectsState.js +0 -285
|
@@ -3,23 +3,28 @@ 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
5
|
import {getMaxFs} from '@webex/plugin-meetings/src/multistream/remoteMedia';
|
|
6
|
+
import FakeTimers from '@sinonjs/fake-timers';
|
|
7
|
+
import * as mediaCore from '@webex/internal-media-core';
|
|
8
|
+
import { expect } from 'chai';
|
|
6
9
|
|
|
7
10
|
type ExpectedActiveSpeaker = {
|
|
8
11
|
policy: 'active-speaker';
|
|
12
|
+
maxPayloadBitsPerSecond?: number;
|
|
9
13
|
priority: number;
|
|
10
14
|
receiveSlots: Array<ReceiveSlot>;
|
|
11
|
-
maxFs
|
|
15
|
+
maxFs?: number;
|
|
16
|
+
maxMbps?: number;
|
|
12
17
|
};
|
|
13
18
|
type ExpectedReceiverSelected = {
|
|
14
19
|
policy: 'receiver-selected';
|
|
20
|
+
maxPayloadBitsPerSecond?: number;
|
|
15
21
|
csi: number;
|
|
16
22
|
receiveSlot: ReceiveSlot;
|
|
17
|
-
maxFs
|
|
23
|
+
maxFs?: number;
|
|
24
|
+
maxMbps?: number;
|
|
18
25
|
};
|
|
19
26
|
type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
|
|
20
27
|
|
|
21
|
-
const maxPayloadBitsPerSecond = 10 * 1000 * 1000; // for now we always send this fixed constant
|
|
22
|
-
|
|
23
28
|
const degradationPreferences = {
|
|
24
29
|
maxMacroblocksLimit: Infinity, // no limit
|
|
25
30
|
};
|
|
@@ -27,11 +32,18 @@ const degradationPreferences = {
|
|
|
27
32
|
describe('MediaRequestManager', () => {
|
|
28
33
|
const CROSS_PRIORITY_DUPLICATION = true;
|
|
29
34
|
const CROSS_POLICY_DUPLICATION = true;
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
const
|
|
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;
|
|
45
|
+
|
|
46
|
+
const NUM_SLOTS = 15;
|
|
35
47
|
|
|
36
48
|
let mediaRequestManager: MediaRequestManager;
|
|
37
49
|
let sendMediaRequestsCallback;
|
|
@@ -40,10 +52,11 @@ describe('MediaRequestManager', () => {
|
|
|
40
52
|
|
|
41
53
|
beforeEach(() => {
|
|
42
54
|
sendMediaRequestsCallback = sinon.stub();
|
|
43
|
-
mediaRequestManager = new MediaRequestManager(
|
|
55
|
+
mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
|
|
44
56
|
degradationPreferences,
|
|
45
|
-
|
|
46
|
-
|
|
57
|
+
kind: 'video',
|
|
58
|
+
trimRequestsToNumOfSources: false,
|
|
59
|
+
});
|
|
47
60
|
|
|
48
61
|
// create some fake receive slots used by the tests
|
|
49
62
|
fakeWcmeSlots = Array(NUM_SLOTS)
|
|
@@ -62,13 +75,12 @@ describe('MediaRequestManager', () => {
|
|
|
62
75
|
off: sinon.stub(),
|
|
63
76
|
sourceState: 'live',
|
|
64
77
|
wcmeReceiveSlot: fakeWcmeSlots[index],
|
|
65
|
-
resetSourceState: sinon.stub(),
|
|
66
78
|
} as unknown as ReceiveSlot)
|
|
67
79
|
);
|
|
68
80
|
});
|
|
69
81
|
|
|
70
82
|
// helper function for adding an active speaker request
|
|
71
|
-
const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false) =>
|
|
83
|
+
const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false, preferLiveVideo = true) =>
|
|
72
84
|
mediaRequestManager.addRequest(
|
|
73
85
|
{
|
|
74
86
|
policyInfo: {
|
|
@@ -76,7 +88,7 @@ describe('MediaRequestManager', () => {
|
|
|
76
88
|
priority,
|
|
77
89
|
crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
|
|
78
90
|
crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
|
|
79
|
-
preferLiveVideo
|
|
91
|
+
preferLiveVideo,
|
|
80
92
|
},
|
|
81
93
|
receiveSlots,
|
|
82
94
|
codecInfo: {
|
|
@@ -109,7 +121,12 @@ describe('MediaRequestManager', () => {
|
|
|
109
121
|
// It should be used only for verifying requests created with
|
|
110
122
|
// addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
|
|
111
123
|
// hardcoded values used in them
|
|
112
|
-
const checkMediaRequestsSent = (
|
|
124
|
+
const checkMediaRequestsSent = (
|
|
125
|
+
expectedRequests: ExpectedRequest[], {
|
|
126
|
+
isCodecInfoDefined = true,
|
|
127
|
+
preferLiveVideo = true,
|
|
128
|
+
} = {}
|
|
129
|
+
) => {
|
|
113
130
|
assert.calledOnce(sendMediaRequestsCallback);
|
|
114
131
|
assert.calledWith(
|
|
115
132
|
sendMediaRequestsCallback,
|
|
@@ -121,18 +138,21 @@ describe('MediaRequestManager', () => {
|
|
|
121
138
|
priority: expectedRequest.priority,
|
|
122
139
|
crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
|
|
123
140
|
crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
|
|
124
|
-
preferLiveVideo
|
|
141
|
+
preferLiveVideo,
|
|
125
142
|
}),
|
|
126
143
|
receiveSlots: expectedRequest.receiveSlots,
|
|
127
|
-
maxPayloadBitsPerSecond,
|
|
128
|
-
codecInfos:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
144
|
+
maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
|
|
145
|
+
codecInfos: isCodecInfoDefined
|
|
146
|
+
? [
|
|
147
|
+
sinon.match({
|
|
148
|
+
payloadType: 0x80,
|
|
149
|
+
h264: sinon.match({
|
|
150
|
+
maxMbps: expectedRequest.maxMbps,
|
|
151
|
+
maxFs: expectedRequest.maxFs,
|
|
152
|
+
}),
|
|
153
|
+
}),
|
|
154
|
+
]
|
|
155
|
+
: [],
|
|
136
156
|
});
|
|
137
157
|
}
|
|
138
158
|
if (expectedRequest.policy === 'receiver-selected') {
|
|
@@ -142,15 +162,18 @@ describe('MediaRequestManager', () => {
|
|
|
142
162
|
csi: expectedRequest.csi,
|
|
143
163
|
}),
|
|
144
164
|
receiveSlots: [expectedRequest.receiveSlot],
|
|
145
|
-
maxPayloadBitsPerSecond,
|
|
146
|
-
codecInfos:
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
165
|
+
maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
|
|
166
|
+
codecInfos: isCodecInfoDefined
|
|
167
|
+
? [
|
|
168
|
+
sinon.match({
|
|
169
|
+
payloadType: 0x80,
|
|
170
|
+
h264: sinon.match({
|
|
171
|
+
maxMbps: expectedRequest.maxMbps,
|
|
172
|
+
maxFs: expectedRequest.maxFs,
|
|
173
|
+
}),
|
|
174
|
+
}),
|
|
175
|
+
]
|
|
176
|
+
: [],
|
|
154
177
|
});
|
|
155
178
|
}
|
|
156
179
|
|
|
@@ -184,8 +207,8 @@ describe('MediaRequestManager', () => {
|
|
|
184
207
|
receiveSlots: [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
185
208
|
codecInfo: {
|
|
186
209
|
codec: 'h264',
|
|
187
|
-
maxFs:
|
|
188
|
-
maxFps:
|
|
210
|
+
maxFs: MAX_FS_360p,
|
|
211
|
+
maxFps: MAX_FPS,
|
|
189
212
|
},
|
|
190
213
|
},
|
|
191
214
|
false
|
|
@@ -199,9 +222,9 @@ describe('MediaRequestManager', () => {
|
|
|
199
222
|
receiveSlots: [fakeReceiveSlots[3]],
|
|
200
223
|
codecInfo: {
|
|
201
224
|
codec: 'h264',
|
|
202
|
-
maxFs:
|
|
203
|
-
maxFps:
|
|
204
|
-
maxMbps:
|
|
225
|
+
maxFs: MAX_FS_720p,
|
|
226
|
+
maxFps: MAX_FPS,
|
|
227
|
+
maxMbps: MAX_MBPS_720p,
|
|
205
228
|
},
|
|
206
229
|
},
|
|
207
230
|
false
|
|
@@ -217,9 +240,9 @@ describe('MediaRequestManager', () => {
|
|
|
217
240
|
receiveSlots: [fakeReceiveSlots[4]],
|
|
218
241
|
codecInfo: {
|
|
219
242
|
codec: 'h264',
|
|
220
|
-
maxFs:
|
|
221
|
-
maxFps:
|
|
222
|
-
maxMbps:
|
|
243
|
+
maxFs: MAX_FS_1080p,
|
|
244
|
+
maxFps: MAX_FPS,
|
|
245
|
+
maxMbps: MAX_MBPS_1080p,
|
|
223
246
|
},
|
|
224
247
|
},
|
|
225
248
|
true
|
|
@@ -237,13 +260,14 @@ describe('MediaRequestManager', () => {
|
|
|
237
260
|
preferLiveVideo: false,
|
|
238
261
|
}),
|
|
239
262
|
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
263
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
240
264
|
codecInfos: [
|
|
241
265
|
sinon.match({
|
|
242
266
|
payloadType: 0x80,
|
|
243
267
|
h264: sinon.match({
|
|
244
|
-
maxFs:
|
|
245
|
-
maxFps:
|
|
246
|
-
maxMbps:
|
|
268
|
+
maxFs: MAX_FS_360p,
|
|
269
|
+
maxFps: MAX_FPS,
|
|
270
|
+
maxMbps: MAX_MBPS_360p,
|
|
247
271
|
}),
|
|
248
272
|
}),
|
|
249
273
|
],
|
|
@@ -254,13 +278,14 @@ describe('MediaRequestManager', () => {
|
|
|
254
278
|
csi: 123,
|
|
255
279
|
}),
|
|
256
280
|
receiveSlots: [fakeWcmeSlots[3]],
|
|
281
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
257
282
|
codecInfos: [
|
|
258
283
|
sinon.match({
|
|
259
284
|
payloadType: 0x80,
|
|
260
285
|
h264: sinon.match({
|
|
261
|
-
maxFs:
|
|
262
|
-
maxFps:
|
|
263
|
-
maxMbps:
|
|
286
|
+
maxFs: MAX_FS_720p,
|
|
287
|
+
maxFps: MAX_FPS,
|
|
288
|
+
maxMbps: MAX_MBPS_720p,
|
|
264
289
|
}),
|
|
265
290
|
}),
|
|
266
291
|
],
|
|
@@ -271,13 +296,14 @@ describe('MediaRequestManager', () => {
|
|
|
271
296
|
csi: 123,
|
|
272
297
|
}),
|
|
273
298
|
receiveSlots: [fakeWcmeSlots[4]],
|
|
299
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
274
300
|
codecInfos: [
|
|
275
301
|
sinon.match({
|
|
276
302
|
payloadType: 0x80,
|
|
277
303
|
h264: sinon.match({
|
|
278
|
-
maxFs:
|
|
279
|
-
maxFps:
|
|
280
|
-
maxMbps:
|
|
304
|
+
maxFs: MAX_FS_1080p,
|
|
305
|
+
maxFps: MAX_FPS,
|
|
306
|
+
maxMbps: MAX_MBPS_1080p,
|
|
281
307
|
}),
|
|
282
308
|
}),
|
|
283
309
|
],
|
|
@@ -287,32 +313,38 @@ describe('MediaRequestManager', () => {
|
|
|
287
313
|
|
|
288
314
|
it('keeps adding requests with every call to addRequest()', () => {
|
|
289
315
|
// start with 1 request
|
|
290
|
-
addReceiverSelectedRequest(100, fakeReceiveSlots[0],
|
|
316
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_1080p, true);
|
|
291
317
|
|
|
292
318
|
checkMediaRequestsSent([
|
|
293
319
|
{
|
|
294
320
|
policy: 'receiver-selected',
|
|
295
321
|
csi: 100,
|
|
296
322
|
receiveSlot: fakeWcmeSlots[0],
|
|
297
|
-
|
|
323
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
324
|
+
maxFs: MAX_FS_1080p,
|
|
325
|
+
maxMbps: MAX_MBPS_1080p,
|
|
298
326
|
},
|
|
299
327
|
]);
|
|
300
328
|
|
|
301
329
|
// now add another one
|
|
302
|
-
addReceiverSelectedRequest(101, fakeReceiveSlots[1],
|
|
330
|
+
addReceiverSelectedRequest(101, fakeReceiveSlots[1], MAX_FS_1080p, true);
|
|
303
331
|
|
|
304
332
|
checkMediaRequestsSent([
|
|
305
333
|
{
|
|
306
334
|
policy: 'receiver-selected',
|
|
307
335
|
csi: 100,
|
|
308
336
|
receiveSlot: fakeWcmeSlots[0],
|
|
309
|
-
|
|
337
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
338
|
+
maxFs: MAX_FS_1080p,
|
|
339
|
+
maxMbps: MAX_MBPS_1080p,
|
|
310
340
|
},
|
|
311
341
|
{
|
|
312
342
|
policy: 'receiver-selected',
|
|
313
343
|
csi: 101,
|
|
314
344
|
receiveSlot: fakeWcmeSlots[1],
|
|
315
|
-
|
|
345
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
346
|
+
maxFs: MAX_FS_1080p,
|
|
347
|
+
maxMbps: MAX_MBPS_1080p,
|
|
316
348
|
},
|
|
317
349
|
]);
|
|
318
350
|
|
|
@@ -320,7 +352,7 @@ describe('MediaRequestManager', () => {
|
|
|
320
352
|
addActiveSpeakerRequest(
|
|
321
353
|
1,
|
|
322
354
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
323
|
-
|
|
355
|
+
MAX_FS_720p,
|
|
324
356
|
true
|
|
325
357
|
);
|
|
326
358
|
|
|
@@ -329,37 +361,55 @@ describe('MediaRequestManager', () => {
|
|
|
329
361
|
policy: 'receiver-selected',
|
|
330
362
|
csi: 100,
|
|
331
363
|
receiveSlot: fakeWcmeSlots[0],
|
|
332
|
-
|
|
364
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
365
|
+
maxFs: MAX_FS_1080p,
|
|
366
|
+
maxMbps: MAX_MBPS_1080p,
|
|
333
367
|
},
|
|
334
368
|
{
|
|
335
369
|
policy: 'receiver-selected',
|
|
336
370
|
csi: 101,
|
|
337
371
|
receiveSlot: fakeWcmeSlots[1],
|
|
338
|
-
|
|
372
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
373
|
+
maxFs: MAX_FS_1080p,
|
|
374
|
+
maxMbps: MAX_MBPS_1080p,
|
|
339
375
|
},
|
|
340
376
|
{
|
|
341
377
|
policy: 'active-speaker',
|
|
342
378
|
priority: 1,
|
|
343
379
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
344
|
-
|
|
380
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
381
|
+
maxFs: MAX_FS_720p,
|
|
382
|
+
maxMbps: MAX_MBPS_720p,
|
|
345
383
|
},
|
|
346
384
|
]);
|
|
347
385
|
});
|
|
348
386
|
|
|
387
|
+
it('removes the events maxFsUpdate and sourceUpdate when cancelRequest() is called', async () => {
|
|
388
|
+
|
|
389
|
+
const requestId = addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p);
|
|
390
|
+
|
|
391
|
+
mediaRequestManager.cancelRequest(requestId, true);
|
|
392
|
+
|
|
393
|
+
const sourceUpdateHandler = fakeReceiveSlots[2].off.getCall(0);
|
|
394
|
+
|
|
395
|
+
const maxFsHandlerCall = fakeReceiveSlots[2].off.getCall(1);
|
|
396
|
+
|
|
397
|
+
const maxFsEventName = maxFsHandlerCall.args[0];
|
|
398
|
+
const sourceUpdateEventName = sourceUpdateHandler.args[0];
|
|
399
|
+
|
|
400
|
+
expect(sourceUpdateHandler.args[1]).to.be.a('function');
|
|
401
|
+
expect(maxFsHandlerCall.args[1]).to.be.a('function');
|
|
402
|
+
|
|
403
|
+
assert.equal(maxFsEventName, 'maxFsUpdate')
|
|
404
|
+
assert.equal(sourceUpdateEventName, 'sourceUpdate')
|
|
405
|
+
});
|
|
406
|
+
|
|
349
407
|
it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
|
|
350
408
|
const requestIds = [
|
|
351
|
-
addActiveSpeakerRequest(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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),
|
|
409
|
+
addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]], MAX_FS_720p),
|
|
410
|
+
addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p),
|
|
411
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[4], MAX_FS_1080p),
|
|
412
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[5], MAX_FS_1080p),
|
|
363
413
|
];
|
|
364
414
|
|
|
365
415
|
// cancel one of the active speaker requests
|
|
@@ -371,19 +421,25 @@ describe('MediaRequestManager', () => {
|
|
|
371
421
|
policy: 'active-speaker',
|
|
372
422
|
priority: 255,
|
|
373
423
|
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
374
|
-
|
|
424
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
425
|
+
maxFs: MAX_FS_720p,
|
|
426
|
+
maxMbps: MAX_MBPS_720p,
|
|
375
427
|
},
|
|
376
428
|
{
|
|
377
429
|
policy: 'receiver-selected',
|
|
378
430
|
csi: 100,
|
|
379
431
|
receiveSlot: fakeWcmeSlots[4],
|
|
380
|
-
|
|
432
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
433
|
+
maxFs: MAX_FS_1080p,
|
|
434
|
+
maxMbps: MAX_MBPS_1080p,
|
|
381
435
|
},
|
|
382
436
|
{
|
|
383
437
|
policy: 'receiver-selected',
|
|
384
438
|
csi: 200,
|
|
385
439
|
receiveSlot: fakeWcmeSlots[5],
|
|
386
|
-
|
|
440
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
441
|
+
maxFs: MAX_FS_1080p,
|
|
442
|
+
maxMbps: MAX_MBPS_1080p,
|
|
387
443
|
},
|
|
388
444
|
]);
|
|
389
445
|
|
|
@@ -396,13 +452,17 @@ describe('MediaRequestManager', () => {
|
|
|
396
452
|
policy: 'active-speaker',
|
|
397
453
|
priority: 255,
|
|
398
454
|
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
399
|
-
|
|
455
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
456
|
+
maxFs: MAX_FS_720p,
|
|
457
|
+
maxMbps: MAX_MBPS_720p,
|
|
400
458
|
},
|
|
401
459
|
{
|
|
402
460
|
policy: 'receiver-selected',
|
|
403
461
|
csi: 100,
|
|
404
462
|
receiveSlot: fakeWcmeSlots[4],
|
|
405
|
-
|
|
463
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
464
|
+
maxFs: MAX_FS_1080p,
|
|
465
|
+
maxMbps: MAX_MBPS_1080p,
|
|
406
466
|
},
|
|
407
467
|
]);
|
|
408
468
|
});
|
|
@@ -411,10 +471,10 @@ describe('MediaRequestManager', () => {
|
|
|
411
471
|
addActiveSpeakerRequest(
|
|
412
472
|
10,
|
|
413
473
|
[fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
414
|
-
|
|
474
|
+
MAX_FS_720p,
|
|
415
475
|
false
|
|
416
476
|
);
|
|
417
|
-
addReceiverSelectedRequest(123, fakeReceiveSlots[3],
|
|
477
|
+
addReceiverSelectedRequest(123, fakeReceiveSlots[3], MAX_FS_1080p, false);
|
|
418
478
|
|
|
419
479
|
// nothing should be sent out as we didn't commit the requests
|
|
420
480
|
assert.notCalled(sendMediaRequestsCallback);
|
|
@@ -428,13 +488,17 @@ describe('MediaRequestManager', () => {
|
|
|
428
488
|
policy: 'active-speaker',
|
|
429
489
|
priority: 10,
|
|
430
490
|
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
431
|
-
|
|
491
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
492
|
+
maxFs: MAX_FS_720p,
|
|
493
|
+
maxMbps: MAX_MBPS_720p,
|
|
432
494
|
},
|
|
433
495
|
{
|
|
434
496
|
policy: 'receiver-selected',
|
|
435
497
|
csi: 123,
|
|
436
498
|
receiveSlot: fakeWcmeSlots[3],
|
|
437
|
-
|
|
499
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
500
|
+
maxFs: MAX_FS_1080p,
|
|
501
|
+
maxMbps: MAX_MBPS_1080p,
|
|
438
502
|
},
|
|
439
503
|
]);
|
|
440
504
|
});
|
|
@@ -445,12 +509,12 @@ describe('MediaRequestManager', () => {
|
|
|
445
509
|
addActiveSpeakerRequest(
|
|
446
510
|
250,
|
|
447
511
|
[fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
448
|
-
|
|
512
|
+
MAX_FS_720p,
|
|
449
513
|
false
|
|
450
514
|
),
|
|
451
|
-
addReceiverSelectedRequest(98765, fakeReceiveSlots[3],
|
|
452
|
-
addReceiverSelectedRequest(99999, fakeReceiveSlots[4],
|
|
453
|
-
addReceiverSelectedRequest(88888, fakeReceiveSlots[5],
|
|
515
|
+
addReceiverSelectedRequest(98765, fakeReceiveSlots[3], MAX_FS_1080p, false),
|
|
516
|
+
addReceiverSelectedRequest(99999, fakeReceiveSlots[4], MAX_FS_1080p, false),
|
|
517
|
+
addReceiverSelectedRequest(88888, fakeReceiveSlots[5], MAX_FS_1080p, true),
|
|
454
518
|
];
|
|
455
519
|
|
|
456
520
|
checkMediaRequestsSent([
|
|
@@ -458,25 +522,33 @@ describe('MediaRequestManager', () => {
|
|
|
458
522
|
policy: 'active-speaker',
|
|
459
523
|
priority: 250,
|
|
460
524
|
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
461
|
-
|
|
525
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
526
|
+
maxFs: MAX_FS_720p,
|
|
527
|
+
maxMbps: MAX_MBPS_720p,
|
|
462
528
|
},
|
|
463
529
|
{
|
|
464
530
|
policy: 'receiver-selected',
|
|
465
531
|
csi: 98765,
|
|
466
532
|
receiveSlot: fakeWcmeSlots[3],
|
|
467
|
-
|
|
533
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
534
|
+
maxFs: MAX_FS_1080p,
|
|
535
|
+
maxMbps: MAX_MBPS_1080p,
|
|
468
536
|
},
|
|
469
537
|
{
|
|
470
538
|
policy: 'receiver-selected',
|
|
471
539
|
csi: 99999,
|
|
472
540
|
receiveSlot: fakeWcmeSlots[4],
|
|
473
|
-
|
|
541
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
542
|
+
maxFs: MAX_FS_1080p,
|
|
543
|
+
maxMbps: MAX_MBPS_1080p,
|
|
474
544
|
},
|
|
475
545
|
{
|
|
476
546
|
policy: 'receiver-selected',
|
|
477
547
|
csi: 88888,
|
|
478
548
|
receiveSlot: fakeWcmeSlots[5],
|
|
479
|
-
|
|
549
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
550
|
+
maxFs: MAX_FS_1080p,
|
|
551
|
+
maxMbps: MAX_MBPS_1080p,
|
|
480
552
|
},
|
|
481
553
|
]);
|
|
482
554
|
|
|
@@ -495,25 +567,27 @@ describe('MediaRequestManager', () => {
|
|
|
495
567
|
policy: 'receiver-selected',
|
|
496
568
|
csi: 98765,
|
|
497
569
|
receiveSlot: fakeWcmeSlots[3],
|
|
498
|
-
|
|
570
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
571
|
+
maxFs: MAX_FS_1080p,
|
|
572
|
+
maxMbps: MAX_MBPS_1080p,
|
|
499
573
|
},
|
|
500
574
|
]);
|
|
501
575
|
});
|
|
502
576
|
|
|
503
577
|
it('sends the wcme media requests when commit() is called', () => {
|
|
504
578
|
// send some requests, all of them with commit=false
|
|
505
|
-
addReceiverSelectedRequest(123000, fakeReceiveSlots[0],
|
|
506
|
-
addReceiverSelectedRequest(456000, fakeReceiveSlots[1],
|
|
579
|
+
addReceiverSelectedRequest(123000, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
580
|
+
addReceiverSelectedRequest(456000, fakeReceiveSlots[1], MAX_FS_1080p, false);
|
|
507
581
|
addActiveSpeakerRequest(
|
|
508
582
|
255,
|
|
509
583
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
510
|
-
|
|
584
|
+
MAX_FS_720p,
|
|
511
585
|
false
|
|
512
586
|
);
|
|
513
587
|
addActiveSpeakerRequest(
|
|
514
588
|
254,
|
|
515
589
|
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
516
|
-
|
|
590
|
+
MAX_FS_720p,
|
|
517
591
|
false
|
|
518
592
|
);
|
|
519
593
|
|
|
@@ -529,78 +603,99 @@ describe('MediaRequestManager', () => {
|
|
|
529
603
|
policy: 'receiver-selected',
|
|
530
604
|
csi: 123000,
|
|
531
605
|
receiveSlot: fakeWcmeSlots[0],
|
|
532
|
-
|
|
606
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
607
|
+
maxFs: MAX_FS_1080p,
|
|
608
|
+
maxMbps: MAX_MBPS_1080p,
|
|
533
609
|
},
|
|
534
610
|
{
|
|
535
611
|
policy: 'receiver-selected',
|
|
536
612
|
csi: 456000,
|
|
537
613
|
receiveSlot: fakeWcmeSlots[1],
|
|
538
|
-
|
|
614
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
615
|
+
maxFs: MAX_FS_1080p,
|
|
616
|
+
maxMbps: MAX_MBPS_1080p,
|
|
539
617
|
},
|
|
540
618
|
{
|
|
541
619
|
policy: 'active-speaker',
|
|
542
620
|
priority: 255,
|
|
543
621
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
544
|
-
|
|
622
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
623
|
+
maxFs: MAX_FS_720p,
|
|
624
|
+
maxMbps: MAX_MBPS_720p,
|
|
545
625
|
},
|
|
546
626
|
{
|
|
547
627
|
policy: 'active-speaker',
|
|
548
628
|
priority: 254,
|
|
549
629
|
receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
|
|
550
|
-
|
|
630
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
631
|
+
maxFs: MAX_FS_720p,
|
|
632
|
+
maxMbps: MAX_MBPS_720p,
|
|
551
633
|
},
|
|
552
634
|
]);
|
|
553
635
|
});
|
|
554
636
|
|
|
555
|
-
it('clears all the requests on reset()', () => {
|
|
637
|
+
it('avoids sending duplicate requests and clears all the requests on reset()', () => {
|
|
556
638
|
// send some requests and commit them one by one
|
|
557
|
-
addReceiverSelectedRequest(1500, fakeReceiveSlots[0],
|
|
558
|
-
addReceiverSelectedRequest(1501, fakeReceiveSlots[1],
|
|
639
|
+
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
640
|
+
addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
|
|
559
641
|
addActiveSpeakerRequest(
|
|
560
642
|
255,
|
|
561
643
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
562
|
-
|
|
563
|
-
|
|
644
|
+
MAX_FS_720p,
|
|
645
|
+
false
|
|
564
646
|
);
|
|
565
647
|
addActiveSpeakerRequest(
|
|
566
648
|
254,
|
|
567
649
|
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
568
|
-
|
|
569
|
-
|
|
650
|
+
MAX_FS_720p,
|
|
651
|
+
false
|
|
570
652
|
);
|
|
571
653
|
|
|
572
|
-
|
|
654
|
+
// nothing should be sent out as we didn't commit the requests
|
|
655
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
573
656
|
|
|
574
|
-
// check that when calling commit() all requests are re-sent again
|
|
575
657
|
mediaRequestManager.commit();
|
|
576
|
-
|
|
577
658
|
checkMediaRequestsSent([
|
|
578
659
|
{
|
|
579
660
|
policy: 'receiver-selected',
|
|
580
661
|
csi: 1500,
|
|
581
662
|
receiveSlot: fakeWcmeSlots[0],
|
|
582
|
-
|
|
663
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
664
|
+
maxFs: MAX_FS_1080p,
|
|
665
|
+
maxMbps: MAX_MBPS_1080p,
|
|
583
666
|
},
|
|
584
667
|
{
|
|
585
668
|
policy: 'receiver-selected',
|
|
586
669
|
csi: 1501,
|
|
587
670
|
receiveSlot: fakeWcmeSlots[1],
|
|
588
|
-
|
|
671
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
672
|
+
maxFs: MAX_FS_1080p,
|
|
673
|
+
maxMbps: MAX_MBPS_1080p,
|
|
589
674
|
},
|
|
590
675
|
{
|
|
591
676
|
policy: 'active-speaker',
|
|
592
677
|
priority: 255,
|
|
593
678
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
594
|
-
|
|
679
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
680
|
+
maxFs: MAX_FS_720p,
|
|
681
|
+
maxMbps: MAX_MBPS_720p,
|
|
595
682
|
},
|
|
596
683
|
{
|
|
597
684
|
policy: 'active-speaker',
|
|
598
685
|
priority: 254,
|
|
599
686
|
receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
|
|
600
|
-
|
|
687
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
688
|
+
maxFs: MAX_FS_720p,
|
|
689
|
+
maxMbps: MAX_MBPS_720p,
|
|
601
690
|
},
|
|
602
691
|
]);
|
|
603
692
|
|
|
693
|
+
// check that when calling commit()
|
|
694
|
+
// all requests are not re-sent again (avoid duplicate requests)
|
|
695
|
+
mediaRequestManager.commit();
|
|
696
|
+
|
|
697
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
698
|
+
|
|
604
699
|
// now reset everything
|
|
605
700
|
mediaRequestManager.reset();
|
|
606
701
|
|
|
@@ -609,76 +704,81 @@ describe('MediaRequestManager', () => {
|
|
|
609
704
|
checkMediaRequestsSent([]);
|
|
610
705
|
});
|
|
611
706
|
|
|
612
|
-
it('
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
[fakeReceiveSlots[0], fakeReceiveSlots[1]],
|
|
617
|
-
ACTIVE_SPEAKER_MAX_FS
|
|
618
|
-
),
|
|
619
|
-
addActiveSpeakerRequest(
|
|
620
|
-
255,
|
|
621
|
-
[fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
622
|
-
ACTIVE_SPEAKER_MAX_FS
|
|
623
|
-
),
|
|
624
|
-
addReceiverSelectedRequest(100, fakeReceiveSlots[4], RECEIVER_SELECTED_MAX_FS),
|
|
625
|
-
addReceiverSelectedRequest(200, fakeReceiveSlots[5], RECEIVER_SELECTED_MAX_FS),
|
|
626
|
-
];
|
|
707
|
+
it('makes sure to call requests correctly after reset was called and another request was added', () => {
|
|
708
|
+
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
709
|
+
|
|
710
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
627
711
|
|
|
628
712
|
mediaRequestManager.commit();
|
|
629
713
|
checkMediaRequestsSent([
|
|
630
714
|
{
|
|
631
|
-
policy: '
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
policy: 'active-speaker',
|
|
638
|
-
priority: 255,
|
|
639
|
-
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3]],
|
|
640
|
-
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
715
|
+
policy: 'receiver-selected',
|
|
716
|
+
csi: 1500,
|
|
717
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
718
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
719
|
+
maxFs: MAX_FS_1080p,
|
|
720
|
+
maxMbps: MAX_MBPS_1080p,
|
|
641
721
|
},
|
|
722
|
+
]);
|
|
723
|
+
|
|
724
|
+
// now reset everything
|
|
725
|
+
mediaRequestManager.reset();
|
|
726
|
+
|
|
727
|
+
// calling commit now should not cause any requests to be sent out
|
|
728
|
+
mediaRequestManager.commit();
|
|
729
|
+
checkMediaRequestsSent([]);
|
|
730
|
+
|
|
731
|
+
//add new request
|
|
732
|
+
addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
|
|
733
|
+
|
|
734
|
+
// commit
|
|
735
|
+
mediaRequestManager.commit();
|
|
736
|
+
|
|
737
|
+
// check the new request was sent
|
|
738
|
+
checkMediaRequestsSent([
|
|
642
739
|
{
|
|
643
740
|
policy: 'receiver-selected',
|
|
644
|
-
csi:
|
|
645
|
-
receiveSlot: fakeWcmeSlots[
|
|
646
|
-
|
|
741
|
+
csi: 1501,
|
|
742
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
743
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
744
|
+
maxFs: MAX_FS_1080p,
|
|
745
|
+
maxMbps: MAX_MBPS_1080p,
|
|
647
746
|
},
|
|
747
|
+
]);
|
|
748
|
+
});
|
|
749
|
+
|
|
750
|
+
it('can send same media request after previous requests have been cleared', () => {
|
|
751
|
+
// add a request and commit
|
|
752
|
+
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
753
|
+
mediaRequestManager.commit();
|
|
754
|
+
checkMediaRequestsSent([
|
|
648
755
|
{
|
|
649
756
|
policy: 'receiver-selected',
|
|
650
|
-
csi:
|
|
651
|
-
|
|
652
|
-
|
|
757
|
+
csi: 1500,
|
|
758
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
759
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
760
|
+
maxFs: MAX_FS_1080p,
|
|
761
|
+
maxMbps: MAX_MBPS_1080p,
|
|
653
762
|
},
|
|
654
763
|
]);
|
|
655
764
|
|
|
656
|
-
//
|
|
657
|
-
mediaRequestManager.
|
|
658
|
-
mediaRequestManager.cancelRequest(requestIds[3], false);
|
|
765
|
+
// clear previous requests
|
|
766
|
+
mediaRequestManager.clearPreviousRequests();
|
|
659
767
|
|
|
768
|
+
// commit same request
|
|
660
769
|
mediaRequestManager.commit();
|
|
661
770
|
|
|
662
|
-
//
|
|
771
|
+
// check the request was sent
|
|
663
772
|
checkMediaRequestsSent([
|
|
664
|
-
{
|
|
665
|
-
policy: 'active-speaker',
|
|
666
|
-
priority: 255,
|
|
667
|
-
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
668
|
-
maxFs: ACTIVE_SPEAKER_MAX_FS,
|
|
669
|
-
},
|
|
670
773
|
{
|
|
671
774
|
policy: 'receiver-selected',
|
|
672
|
-
csi:
|
|
673
|
-
|
|
674
|
-
|
|
775
|
+
csi: 1500,
|
|
776
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
777
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
778
|
+
maxFs: MAX_FS_1080p,
|
|
779
|
+
maxMbps: MAX_MBPS_1080p,
|
|
675
780
|
},
|
|
676
781
|
]);
|
|
677
|
-
|
|
678
|
-
// and that the receive slots of the 2 cancelled ones had resetSourceState() called
|
|
679
|
-
assert.calledOnce(fakeReceiveSlots[2].resetSourceState);
|
|
680
|
-
assert.calledOnce(fakeReceiveSlots[3].resetSourceState);
|
|
681
|
-
assert.calledOnce(fakeReceiveSlots[5].resetSourceState);
|
|
682
782
|
});
|
|
683
783
|
|
|
684
784
|
it('re-sends media requests after degradation preferences are set', () => {
|
|
@@ -706,7 +806,9 @@ describe('MediaRequestManager', () => {
|
|
|
706
806
|
policy: 'active-speaker',
|
|
707
807
|
priority: 255,
|
|
708
808
|
receiveSlots: fakeWcmeSlots.slice(0, 4),
|
|
809
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
709
810
|
maxFs: getMaxFs('large'),
|
|
811
|
+
maxMbps: MAX_MBPS_1080p,
|
|
710
812
|
},
|
|
711
813
|
]);
|
|
712
814
|
});
|
|
@@ -733,13 +835,17 @@ describe('MediaRequestManager', () => {
|
|
|
733
835
|
policy: 'active-speaker',
|
|
734
836
|
priority: 255,
|
|
735
837
|
receiveSlots: fakeWcmeSlots.slice(0, 3),
|
|
838
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
736
839
|
maxFs: getMaxFs('medium'),
|
|
840
|
+
maxMbps: MAX_MBPS_720p,
|
|
737
841
|
},
|
|
738
842
|
{
|
|
739
843
|
policy: 'receiver-selected',
|
|
740
844
|
csi: 123,
|
|
741
845
|
receiveSlot: fakeWcmeSlots[3],
|
|
846
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
742
847
|
maxFs: getMaxFs('medium'),
|
|
848
|
+
maxMbps: MAX_MBPS_720p,
|
|
743
849
|
},
|
|
744
850
|
]);
|
|
745
851
|
|
|
@@ -752,7 +858,9 @@ describe('MediaRequestManager', () => {
|
|
|
752
858
|
policy: 'active-speaker',
|
|
753
859
|
priority: 255,
|
|
754
860
|
receiveSlots: fakeWcmeSlots.slice(0, 3),
|
|
861
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
755
862
|
maxFs: getMaxFs('large'),
|
|
863
|
+
maxMbps: MAX_MBPS_1080p,
|
|
756
864
|
},
|
|
757
865
|
]);
|
|
758
866
|
});
|
|
@@ -771,7 +879,9 @@ describe('MediaRequestManager', () => {
|
|
|
771
879
|
policy: 'active-speaker',
|
|
772
880
|
priority: 255,
|
|
773
881
|
receiveSlots: fakeWcmeSlots.slice(0, 10),
|
|
882
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
774
883
|
maxFs: getMaxFs('small'),
|
|
884
|
+
maxMbps: MAX_MBPS_360p,
|
|
775
885
|
},
|
|
776
886
|
]);
|
|
777
887
|
});
|
|
@@ -791,14 +901,518 @@ describe('MediaRequestManager', () => {
|
|
|
791
901
|
policy: 'active-speaker',
|
|
792
902
|
priority: 255,
|
|
793
903
|
receiveSlots: fakeWcmeSlots.slice(0, 5),
|
|
904
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
794
905
|
maxFs: getMaxFs('medium'),
|
|
906
|
+
maxMbps: MAX_MBPS_720p,
|
|
795
907
|
},
|
|
796
908
|
{
|
|
797
909
|
policy: 'active-speaker',
|
|
798
910
|
priority: 254,
|
|
799
911
|
receiveSlots: fakeWcmeSlots.slice(5, 10),
|
|
912
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
800
913
|
maxFs: getMaxFs('small'),
|
|
914
|
+
maxMbps: MAX_MBPS_360p,
|
|
801
915
|
},
|
|
802
916
|
]);
|
|
803
917
|
});
|
|
918
|
+
|
|
919
|
+
it('respects the preferredMaxFs if set', () => {
|
|
920
|
+
sendMediaRequestsCallback.resetHistory();
|
|
921
|
+
const clock = FakeTimers.install({now: Date.now()});
|
|
922
|
+
|
|
923
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
|
|
924
|
+
|
|
925
|
+
sendMediaRequestsCallback.resetHistory();
|
|
926
|
+
|
|
927
|
+
const maxFsHandlerCall = fakeReceiveSlots[0].on.getCall(1);
|
|
928
|
+
|
|
929
|
+
const maxFsHandler = maxFsHandlerCall.args[1];
|
|
930
|
+
const eventName = maxFsHandlerCall.args[0];
|
|
931
|
+
|
|
932
|
+
assert.equal(eventName, 'maxFsUpdate');
|
|
933
|
+
|
|
934
|
+
const preferredFrameSize = 100;
|
|
935
|
+
|
|
936
|
+
maxFsHandler({maxFs: preferredFrameSize});
|
|
937
|
+
|
|
938
|
+
clock.tick(999);
|
|
939
|
+
|
|
940
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
941
|
+
|
|
942
|
+
clock.tick(1);
|
|
943
|
+
|
|
944
|
+
checkMediaRequestsSent([
|
|
945
|
+
{
|
|
946
|
+
policy: 'active-speaker',
|
|
947
|
+
priority: 255,
|
|
948
|
+
receiveSlots: fakeWcmeSlots.slice(0, 10),
|
|
949
|
+
maxFs: preferredFrameSize,
|
|
950
|
+
maxPayloadBitsPerSecond: 99000,
|
|
951
|
+
maxMbps: 3000,
|
|
952
|
+
},
|
|
953
|
+
]);
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
describe('maxPayloadBitsPerSecond', () => {
|
|
957
|
+
let getRecommendedMaxBitrateForFrameSizeSpy;
|
|
958
|
+
|
|
959
|
+
beforeEach(() => {
|
|
960
|
+
sendMediaRequestsCallback.resetHistory();
|
|
961
|
+
getRecommendedMaxBitrateForFrameSizeSpy = sinon.spy(
|
|
962
|
+
mediaCore,
|
|
963
|
+
'getRecommendedMaxBitrateForFrameSize'
|
|
964
|
+
);
|
|
965
|
+
});
|
|
966
|
+
|
|
967
|
+
afterEach(() => {
|
|
968
|
+
getRecommendedMaxBitrateForFrameSizeSpy.restore();
|
|
969
|
+
});
|
|
970
|
+
|
|
971
|
+
it('returns the default maxPayloadBitsPerSecond if kind is "audio"', () => {
|
|
972
|
+
const mediaRequestManagerAudio = new MediaRequestManager(sendMediaRequestsCallback, {
|
|
973
|
+
degradationPreferences,
|
|
974
|
+
kind: 'audio',
|
|
975
|
+
trimRequestsToNumOfSources: false,
|
|
976
|
+
});
|
|
977
|
+
mediaRequestManagerAudio.setNumCurrentSources(100, 100);
|
|
978
|
+
sendMediaRequestsCallback.resetHistory();
|
|
979
|
+
|
|
980
|
+
mediaRequestManagerAudio.addRequest(
|
|
981
|
+
{
|
|
982
|
+
policyInfo: {
|
|
983
|
+
policy: 'receiver-selected',
|
|
984
|
+
csi: 123,
|
|
985
|
+
},
|
|
986
|
+
receiveSlots: [fakeReceiveSlots[0]],
|
|
987
|
+
codecInfo: undefined,
|
|
988
|
+
},
|
|
989
|
+
false
|
|
990
|
+
);
|
|
991
|
+
|
|
992
|
+
mediaRequestManagerAudio.commit();
|
|
993
|
+
|
|
994
|
+
checkMediaRequestsSent(
|
|
995
|
+
[
|
|
996
|
+
{
|
|
997
|
+
policy: 'receiver-selected',
|
|
998
|
+
csi: 123,
|
|
999
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1000
|
+
// returns RecommendedOpusBitrates.FB_MONO_MUSIC as expected:
|
|
1001
|
+
maxPayloadBitsPerSecond: 64000,
|
|
1002
|
+
},
|
|
1003
|
+
// set isCodecInfoDefined to false, since we don't pass in a codec info when audio:
|
|
1004
|
+
],
|
|
1005
|
+
{isCodecInfoDefined: false}
|
|
1006
|
+
);
|
|
1007
|
+
|
|
1008
|
+
assert.notCalled(getRecommendedMaxBitrateForFrameSizeSpy);
|
|
1009
|
+
});
|
|
1010
|
+
|
|
1011
|
+
it('returns the recommended maxPayloadBitsPerSecond if kind is "video"', () => {
|
|
1012
|
+
mediaRequestManager.addRequest(
|
|
1013
|
+
{
|
|
1014
|
+
policyInfo: {
|
|
1015
|
+
policy: 'receiver-selected',
|
|
1016
|
+
csi: 123,
|
|
1017
|
+
},
|
|
1018
|
+
receiveSlots: [fakeReceiveSlots[0]],
|
|
1019
|
+
codecInfo: {
|
|
1020
|
+
codec: 'h264',
|
|
1021
|
+
maxFs: MAX_FS_1080p,
|
|
1022
|
+
maxFps: MAX_FPS,
|
|
1023
|
+
maxMbps: MAX_MBPS_1080p,
|
|
1024
|
+
},
|
|
1025
|
+
},
|
|
1026
|
+
false
|
|
1027
|
+
);
|
|
1028
|
+
|
|
1029
|
+
mediaRequestManager.commit();
|
|
1030
|
+
|
|
1031
|
+
checkMediaRequestsSent([
|
|
1032
|
+
{
|
|
1033
|
+
policy: 'receiver-selected',
|
|
1034
|
+
csi: 123,
|
|
1035
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1036
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
1037
|
+
maxFs: MAX_FS_1080p,
|
|
1038
|
+
maxMbps: MAX_MBPS_1080p,
|
|
1039
|
+
},
|
|
1040
|
+
]);
|
|
1041
|
+
|
|
1042
|
+
// calls the utility function as expected with maxFs passed in (no need to do
|
|
1043
|
+
// further tests here, since the util function itself should be tested for different inputs)
|
|
1044
|
+
assert.calledWith(getRecommendedMaxBitrateForFrameSizeSpy, MAX_FS_1080p);
|
|
1045
|
+
});
|
|
1046
|
+
});
|
|
1047
|
+
|
|
1048
|
+
describe('maxMbps', () => {
|
|
1049
|
+
beforeEach(() => {
|
|
1050
|
+
sendMediaRequestsCallback.resetHistory();
|
|
1051
|
+
});
|
|
1052
|
+
|
|
1053
|
+
it('returns the correct maxMbps value', () => {
|
|
1054
|
+
mediaRequestManager.addRequest(
|
|
1055
|
+
{
|
|
1056
|
+
policyInfo: {
|
|
1057
|
+
policy: 'receiver-selected',
|
|
1058
|
+
csi: 123,
|
|
1059
|
+
},
|
|
1060
|
+
receiveSlots: [fakeReceiveSlots[0]],
|
|
1061
|
+
codecInfo: {
|
|
1062
|
+
codec: 'h264',
|
|
1063
|
+
maxFs: MAX_FS_1080p,
|
|
1064
|
+
maxFps: MAX_FPS,
|
|
1065
|
+
// random value to pass in, to show that the output (below) is calculated
|
|
1066
|
+
// from the maxFs and maxFps values only:
|
|
1067
|
+
maxMbps: 123,
|
|
1068
|
+
},
|
|
1069
|
+
},
|
|
1070
|
+
false
|
|
1071
|
+
);
|
|
1072
|
+
|
|
1073
|
+
mediaRequestManager.commit();
|
|
1074
|
+
|
|
1075
|
+
checkMediaRequestsSent([
|
|
1076
|
+
{
|
|
1077
|
+
policy: 'receiver-selected',
|
|
1078
|
+
csi: 123,
|
|
1079
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1080
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
1081
|
+
maxFs: MAX_FS_1080p,
|
|
1082
|
+
maxMbps: MAX_MBPS_1080p,
|
|
1083
|
+
},
|
|
1084
|
+
]);
|
|
1085
|
+
});
|
|
1086
|
+
});
|
|
1087
|
+
|
|
1088
|
+
describe('trimming of requested receive slots', () => {
|
|
1089
|
+
beforeEach(() => {
|
|
1090
|
+
mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
|
|
1091
|
+
degradationPreferences,
|
|
1092
|
+
kind: 'video',
|
|
1093
|
+
trimRequestsToNumOfSources: true,
|
|
1094
|
+
});
|
|
1095
|
+
});
|
|
1096
|
+
|
|
1097
|
+
const limitNumAvailableStreams = (preferLiveVideo, limit) => {
|
|
1098
|
+
if (preferLiveVideo) {
|
|
1099
|
+
mediaRequestManager.setNumCurrentSources(100, limit);
|
|
1100
|
+
} else {
|
|
1101
|
+
mediaRequestManager.setNumCurrentSources(limit, 1);
|
|
1102
|
+
}
|
|
1103
|
+
};
|
|
1104
|
+
|
|
1105
|
+
[true, false].forEach((preferLiveVideo) =>
|
|
1106
|
+
describe(`preferLiveVideo=${preferLiveVideo}`, () => {
|
|
1107
|
+
it(`trims the active speaker request with lowest priority first and maintains slot order`, () => {
|
|
1108
|
+
// add some receiver-selected and active-speaker requests, in a mixed up order
|
|
1109
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1110
|
+
addActiveSpeakerRequest( // AS request 1 - it will get 1 slot trimmed
|
|
1111
|
+
254,
|
|
1112
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1113
|
+
MAX_FS_360p,
|
|
1114
|
+
false,
|
|
1115
|
+
preferLiveVideo
|
|
1116
|
+
);
|
|
1117
|
+
addActiveSpeakerRequest( // AS request 2 - lowest priority, it will have all slots trimmed
|
|
1118
|
+
253,
|
|
1119
|
+
[fakeReceiveSlots[7], fakeReceiveSlots[8], fakeReceiveSlots[9]],
|
|
1120
|
+
MAX_FS_360p,
|
|
1121
|
+
false,
|
|
1122
|
+
preferLiveVideo
|
|
1123
|
+
);
|
|
1124
|
+
addActiveSpeakerRequest( // AS request 3 - highest priority, nothing will be trimmed
|
|
1125
|
+
255,
|
|
1126
|
+
[fakeReceiveSlots[4], fakeReceiveSlots[5], fakeReceiveSlots[6]],
|
|
1127
|
+
MAX_FS_360p,
|
|
1128
|
+
false,
|
|
1129
|
+
preferLiveVideo
|
|
1130
|
+
);
|
|
1131
|
+
addReceiverSelectedRequest(101, fakeReceiveSlots[10], MAX_FS_360p, false);
|
|
1132
|
+
|
|
1133
|
+
/* Set number of available streams to 7 so that there will be enough sources only for
|
|
1134
|
+
the 2 RS requests and 2 of the 3 AS requests. The lowest priority AS request will
|
|
1135
|
+
have all the slots trimmed, the second lowest priority AS request will have 1 slot trimmed */
|
|
1136
|
+
limitNumAvailableStreams(preferLiveVideo, 7);
|
|
1137
|
+
|
|
1138
|
+
// check what got trimmed
|
|
1139
|
+
checkMediaRequestsSent([
|
|
1140
|
+
{
|
|
1141
|
+
policy: 'receiver-selected',
|
|
1142
|
+
csi: 100,
|
|
1143
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1144
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1145
|
+
maxFs: MAX_FS_360p,
|
|
1146
|
+
maxMbps: MAX_MBPS_360p,
|
|
1147
|
+
},
|
|
1148
|
+
{
|
|
1149
|
+
policy: 'active-speaker',
|
|
1150
|
+
priority: 254,
|
|
1151
|
+
receiveSlots: [fakeWcmeSlots[1], fakeWcmeSlots[2]], // fakeWcmeSlots[3] got trimmed
|
|
1152
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1153
|
+
maxFs: MAX_FS_360p,
|
|
1154
|
+
maxMbps: MAX_MBPS_360p,
|
|
1155
|
+
},
|
|
1156
|
+
// AS request with priority 253 is missing, because all of its slots got trimmed
|
|
1157
|
+
{
|
|
1158
|
+
policy: 'active-speaker',
|
|
1159
|
+
priority: 255,
|
|
1160
|
+
receiveSlots: [fakeWcmeSlots[4], fakeWcmeSlots[5], fakeWcmeSlots[6]],
|
|
1161
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1162
|
+
maxFs: MAX_FS_360p,
|
|
1163
|
+
maxMbps: MAX_MBPS_360p,
|
|
1164
|
+
},
|
|
1165
|
+
{
|
|
1166
|
+
policy: 'receiver-selected',
|
|
1167
|
+
csi: 101,
|
|
1168
|
+
receiveSlot: fakeWcmeSlots[10],
|
|
1169
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1170
|
+
maxFs: MAX_FS_360p,
|
|
1171
|
+
maxMbps: MAX_MBPS_360p,
|
|
1172
|
+
},
|
|
1173
|
+
], {preferLiveVideo});
|
|
1174
|
+
|
|
1175
|
+
// now increase the number of available streams so only the last AS request is trimmed by 1
|
|
1176
|
+
limitNumAvailableStreams(preferLiveVideo, 10);
|
|
1177
|
+
|
|
1178
|
+
checkMediaRequestsSent([
|
|
1179
|
+
{
|
|
1180
|
+
policy: 'receiver-selected',
|
|
1181
|
+
csi: 100,
|
|
1182
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1183
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1184
|
+
maxFs: MAX_FS_360p,
|
|
1185
|
+
maxMbps: MAX_MBPS_360p,
|
|
1186
|
+
},
|
|
1187
|
+
{
|
|
1188
|
+
policy: 'active-speaker',
|
|
1189
|
+
priority: 254,
|
|
1190
|
+
receiveSlots: [fakeWcmeSlots[1], fakeWcmeSlots[2], fakeWcmeSlots[3]], // all slots are used, nothing trimmed
|
|
1191
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1192
|
+
maxFs: MAX_FS_360p,
|
|
1193
|
+
maxMbps: MAX_MBPS_360p,
|
|
1194
|
+
},
|
|
1195
|
+
{
|
|
1196
|
+
policy: 'active-speaker',
|
|
1197
|
+
priority: 253,
|
|
1198
|
+
receiveSlots: [fakeWcmeSlots[7], fakeWcmeSlots[8]], // only 1 slot is trimmed
|
|
1199
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1200
|
+
maxFs: MAX_FS_360p,
|
|
1201
|
+
maxMbps: MAX_MBPS_360p,
|
|
1202
|
+
},
|
|
1203
|
+
{
|
|
1204
|
+
policy: 'active-speaker',
|
|
1205
|
+
priority: 255,
|
|
1206
|
+
receiveSlots: [fakeWcmeSlots[4], fakeWcmeSlots[5], fakeWcmeSlots[6]], // all slots are used, nothing trimmed
|
|
1207
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1208
|
+
maxFs: MAX_FS_360p,
|
|
1209
|
+
maxMbps: MAX_MBPS_360p,
|
|
1210
|
+
},
|
|
1211
|
+
{
|
|
1212
|
+
policy: 'receiver-selected',
|
|
1213
|
+
csi: 101,
|
|
1214
|
+
receiveSlot: fakeWcmeSlots[10],
|
|
1215
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1216
|
+
maxFs: MAX_FS_360p,
|
|
1217
|
+
maxMbps: MAX_MBPS_360p,
|
|
1218
|
+
},
|
|
1219
|
+
], {preferLiveVideo});
|
|
1220
|
+
})
|
|
1221
|
+
|
|
1222
|
+
it('does not trim the receiver selected requests', async () => {
|
|
1223
|
+
// add some receiver-selected and active-speaker requests, in a mixed up order
|
|
1224
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1225
|
+
addActiveSpeakerRequest(
|
|
1226
|
+
255,
|
|
1227
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1228
|
+
MAX_FS_360p,
|
|
1229
|
+
false,
|
|
1230
|
+
preferLiveVideo
|
|
1231
|
+
);
|
|
1232
|
+
addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
|
|
1233
|
+
addActiveSpeakerRequest(
|
|
1234
|
+
254,
|
|
1235
|
+
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
1236
|
+
MAX_FS_720p,
|
|
1237
|
+
false,
|
|
1238
|
+
preferLiveVideo
|
|
1239
|
+
);
|
|
1240
|
+
|
|
1241
|
+
/* Set number of available streams to 1, which is lower than the number of RS requests,
|
|
1242
|
+
so all AS requests will be trimmed to 0 but RS requests should be unaltered */
|
|
1243
|
+
limitNumAvailableStreams(preferLiveVideo, 1);
|
|
1244
|
+
|
|
1245
|
+
// check what got trimmed - only RS requests should remain
|
|
1246
|
+
checkMediaRequestsSent([
|
|
1247
|
+
{
|
|
1248
|
+
policy: 'receiver-selected',
|
|
1249
|
+
csi: 200,
|
|
1250
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1251
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1252
|
+
maxFs: MAX_FS_360p,
|
|
1253
|
+
maxMbps: MAX_MBPS_360p,
|
|
1254
|
+
},
|
|
1255
|
+
{
|
|
1256
|
+
policy: 'receiver-selected',
|
|
1257
|
+
csi: 201,
|
|
1258
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
1259
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
1260
|
+
maxFs: MAX_FS_720p,
|
|
1261
|
+
maxMbps: MAX_MBPS_720p,
|
|
1262
|
+
},
|
|
1263
|
+
], {preferLiveVideo});
|
|
1264
|
+
});
|
|
1265
|
+
|
|
1266
|
+
it('does trimming first and applies degradationPreferences after that', async () => {
|
|
1267
|
+
// add some receiver-selected and active-speaker requests
|
|
1268
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1269
|
+
addActiveSpeakerRequest(
|
|
1270
|
+
255,
|
|
1271
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1272
|
+
MAX_FS_360p,
|
|
1273
|
+
false,
|
|
1274
|
+
preferLiveVideo
|
|
1275
|
+
);
|
|
1276
|
+
addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
|
|
1277
|
+
addActiveSpeakerRequest(
|
|
1278
|
+
254,
|
|
1279
|
+
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
1280
|
+
MAX_FS_720p,
|
|
1281
|
+
false,
|
|
1282
|
+
preferLiveVideo
|
|
1283
|
+
);
|
|
1284
|
+
|
|
1285
|
+
// Set maxMacroblocksLimit to a value that's big enough just for the 2 RS requests and 1 AS with 1 slot of 360p.
|
|
1286
|
+
// but not big enough for all of the RS and AS requests. If maxMacroblocksLimit
|
|
1287
|
+
// was applied first, the resolution of all requests (including RS ones) would be degraded
|
|
1288
|
+
// This test verifies that it's not happening and the resolutions are not affected.
|
|
1289
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: MAX_FS_360p + MAX_FS_720p + MAX_FS_360p});
|
|
1290
|
+
sendMediaRequestsCallback.resetHistory();
|
|
1291
|
+
|
|
1292
|
+
/* Limit the num of streams so that only 2 RS requests and 1 AS with 1 slot can be sent out */
|
|
1293
|
+
limitNumAvailableStreams(preferLiveVideo, 3);
|
|
1294
|
+
|
|
1295
|
+
// check what got trimmed - the remaining requests should have unchanged resolutions
|
|
1296
|
+
checkMediaRequestsSent([
|
|
1297
|
+
{
|
|
1298
|
+
policy: 'receiver-selected',
|
|
1299
|
+
csi: 200,
|
|
1300
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1301
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1302
|
+
maxFs: MAX_FS_360p,
|
|
1303
|
+
maxMbps: MAX_MBPS_360p,
|
|
1304
|
+
},
|
|
1305
|
+
{
|
|
1306
|
+
policy: 'active-speaker',
|
|
1307
|
+
priority: 255,
|
|
1308
|
+
receiveSlots: [fakeWcmeSlots[1]],
|
|
1309
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1310
|
+
maxFs: MAX_FS_360p,
|
|
1311
|
+
maxMbps: MAX_MBPS_360p,
|
|
1312
|
+
},
|
|
1313
|
+
{
|
|
1314
|
+
policy: 'receiver-selected',
|
|
1315
|
+
csi: 201,
|
|
1316
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
1317
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
1318
|
+
maxFs: MAX_FS_720p,
|
|
1319
|
+
maxMbps: MAX_MBPS_720p,
|
|
1320
|
+
},
|
|
1321
|
+
], {preferLiveVideo});
|
|
1322
|
+
});
|
|
1323
|
+
|
|
1324
|
+
it('trims all AS requests completely until setNumCurrentSources() is called with non-zero values', async () => {
|
|
1325
|
+
// add some receiver-selected and active-speaker requests
|
|
1326
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1327
|
+
addActiveSpeakerRequest(
|
|
1328
|
+
255,
|
|
1329
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1330
|
+
MAX_FS_360p,
|
|
1331
|
+
false,
|
|
1332
|
+
preferLiveVideo
|
|
1333
|
+
);
|
|
1334
|
+
addActiveSpeakerRequest(
|
|
1335
|
+
254,
|
|
1336
|
+
[fakeReceiveSlots[5]],
|
|
1337
|
+
MAX_FS_360p,
|
|
1338
|
+
false,
|
|
1339
|
+
preferLiveVideo
|
|
1340
|
+
);
|
|
1341
|
+
|
|
1342
|
+
mediaRequestManager.commit();
|
|
1343
|
+
|
|
1344
|
+
// we're not calling setNumCurrentSources(), so it should use the initial values of 0 for sources count
|
|
1345
|
+
// and completely trim all AS requests to 0
|
|
1346
|
+
checkMediaRequestsSent([
|
|
1347
|
+
{
|
|
1348
|
+
policy: 'receiver-selected',
|
|
1349
|
+
csi: 200,
|
|
1350
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1351
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1352
|
+
maxFs: MAX_FS_360p,
|
|
1353
|
+
maxMbps: MAX_MBPS_360p,
|
|
1354
|
+
},
|
|
1355
|
+
], {preferLiveVideo});
|
|
1356
|
+
});
|
|
1357
|
+
|
|
1358
|
+
it('resets num of sources to 0 when reset() is called', async () => {
|
|
1359
|
+
// set available streams to non-zero value
|
|
1360
|
+
limitNumAvailableStreams(preferLiveVideo, 4);
|
|
1361
|
+
sendMediaRequestsCallback.resetHistory();
|
|
1362
|
+
|
|
1363
|
+
// do the reset
|
|
1364
|
+
mediaRequestManager.reset();
|
|
1365
|
+
|
|
1366
|
+
// add some receiver-selected and active-speaker requests
|
|
1367
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1368
|
+
addActiveSpeakerRequest(
|
|
1369
|
+
255,
|
|
1370
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1371
|
+
MAX_FS_360p,
|
|
1372
|
+
false,
|
|
1373
|
+
preferLiveVideo
|
|
1374
|
+
);
|
|
1375
|
+
|
|
1376
|
+
mediaRequestManager.commit();
|
|
1377
|
+
|
|
1378
|
+
// verify that AS request was trimmed to 0, because we've reset mediaRequestManager so available streams count is 0 now
|
|
1379
|
+
checkMediaRequestsSent([
|
|
1380
|
+
{
|
|
1381
|
+
policy: 'receiver-selected',
|
|
1382
|
+
csi: 200,
|
|
1383
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1384
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1385
|
+
maxFs: MAX_FS_360p,
|
|
1386
|
+
maxMbps: MAX_MBPS_360p,
|
|
1387
|
+
},
|
|
1388
|
+
], {preferLiveVideo});
|
|
1389
|
+
});
|
|
1390
|
+
})
|
|
1391
|
+
);
|
|
1392
|
+
|
|
1393
|
+
|
|
1394
|
+
it('throws if there are 2 active-speaker requests with different preferLiveVideo values', () => {
|
|
1395
|
+
addActiveSpeakerRequest(
|
|
1396
|
+
255,
|
|
1397
|
+
[fakeReceiveSlots[0]],
|
|
1398
|
+
MAX_FS_360p,
|
|
1399
|
+
false,
|
|
1400
|
+
true
|
|
1401
|
+
);
|
|
1402
|
+
addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
|
|
1403
|
+
addActiveSpeakerRequest(
|
|
1404
|
+
254,
|
|
1405
|
+
[fakeReceiveSlots[2]],
|
|
1406
|
+
MAX_FS_360p,
|
|
1407
|
+
false,
|
|
1408
|
+
false
|
|
1409
|
+
);
|
|
1410
|
+
|
|
1411
|
+
assert.throws(() => mediaRequestManager.commit(), 'a mix of active-speaker groups with different values for preferLiveVideo is not supported');
|
|
1412
|
+
})
|
|
1413
|
+
})
|
|
804
1414
|
});
|
|
1415
|
+
function assertEqual(arg0: any, arg1: string) {
|
|
1416
|
+
throw new Error('Function not implemented.');
|
|
1417
|
+
}
|
|
1418
|
+
|