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