@webex/web-client-media-engine 1.40.1 → 1.40.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +58 -32
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +58 -32
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -9705,10 +9705,6 @@ const defaultMultistreamConnectionOptions = {
|
|
|
9705
9705
|
enableMainAudio: true,
|
|
9706
9706
|
enableMainVideo: true,
|
|
9707
9707
|
};
|
|
9708
|
-
const defaultVideoCodecParameters = {
|
|
9709
|
-
'max-mbps': `${defaultMaxVideoEncodeMbps}`,
|
|
9710
|
-
'max-fs': `${defaultMaxVideoEncodeFrameSize}`,
|
|
9711
|
-
};
|
|
9712
9708
|
class MultistreamConnection extends EventEmitter {
|
|
9713
9709
|
constructor(userOptions = {}) {
|
|
9714
9710
|
var _a, _b;
|
|
@@ -9732,7 +9728,6 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9732
9728
|
const mainSceneId = generateSceneId();
|
|
9733
9729
|
const videoMainEncodingOptions = this.getVideoEncodingOptions(MediaContent.Main);
|
|
9734
9730
|
this.createSendTransceiver(MediaType.VideoMain, mainSceneId, videoMainEncodingOptions);
|
|
9735
|
-
this.setCodecParameters(MediaType.VideoMain, defaultVideoCodecParameters);
|
|
9736
9731
|
this.createSendTransceiver(MediaType.AudioMain, mainSceneId);
|
|
9737
9732
|
(_a = this.sendTransceivers.get(MediaType.VideoMain)) === null || _a === void 0 ? void 0 : _a.setActive(this.options.enableMainVideo);
|
|
9738
9733
|
(_b = this.sendTransceivers.get(MediaType.AudioMain)) === null || _b === void 0 ? void 0 : _b.setActive(this.options.enableMainAudio);
|
|
@@ -9740,7 +9735,6 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9740
9735
|
const videoPresentationEncodingOptions = this.getVideoEncodingOptions(MediaContent.Slides);
|
|
9741
9736
|
const contentSceneId = generateSceneId();
|
|
9742
9737
|
this.createSendTransceiver(MediaType.VideoSlides, contentSceneId, videoPresentationEncodingOptions);
|
|
9743
|
-
this.setCodecParameters(MediaType.VideoSlides, defaultVideoCodecParameters);
|
|
9744
9738
|
this.createSendTransceiver(MediaType.AudioSlides, contentSceneId);
|
|
9745
9739
|
}
|
|
9746
9740
|
}
|
|
@@ -9859,9 +9853,11 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9859
9853
|
this.jmpSessions.set(mediaType, jmpSession);
|
|
9860
9854
|
}
|
|
9861
9855
|
sendSourceWarnings(mediaType, requests) {
|
|
9856
|
+
var _a;
|
|
9862
9857
|
if (getMediaFamily(mediaType) === MediaFamily.Video) {
|
|
9863
9858
|
const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
|
|
9864
9859
|
const signaler = this.streamSignalerManager.getEgressStreamSignalerOrThrow(sendTransceiver.mid);
|
|
9860
|
+
const activeSimulcastLayerNumber = ((_a = sendTransceiver.publishedTrack) === null || _a === void 0 ? void 0 : _a.getNumActiveSimulcastLayers()) || 0;
|
|
9865
9861
|
const sourceWarnings = [];
|
|
9866
9862
|
requests.forEach(({ ids, policySpecificInfo }) => {
|
|
9867
9863
|
ids.forEach((id) => {
|
|
@@ -9872,6 +9868,9 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9872
9868
|
else if (!signaler.getSenderIds().some((validId) => compareStreamIds(id, validId))) {
|
|
9873
9869
|
sourceWarnings.push({ id, state: 'invalid source', csi: sendTransceiver.csi });
|
|
9874
9870
|
}
|
|
9871
|
+
else if (signaler.getEncodingIndexForStreamId(id) > activeSimulcastLayerNumber) {
|
|
9872
|
+
sourceWarnings.push({ id, state: 'no source', csi: sendTransceiver.csi });
|
|
9873
|
+
}
|
|
9875
9874
|
});
|
|
9876
9875
|
});
|
|
9877
9876
|
if (sourceWarnings.length > 0) {
|
|
@@ -10046,21 +10045,20 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10046
10045
|
});
|
|
10047
10046
|
}
|
|
10048
10047
|
addTrackListeners(mediaType, track) {
|
|
10048
|
+
const onTrackResolutionChange = () => {
|
|
10049
|
+
const sources = this.getVideoSources(mediaType);
|
|
10050
|
+
if (sources != null) {
|
|
10051
|
+
this.sendSourceIndication(mediaType, 1, sources);
|
|
10052
|
+
}
|
|
10053
|
+
};
|
|
10054
|
+
track.on(LocalTrack.Events.TrackConstraintsChange, onTrackResolutionChange);
|
|
10049
10055
|
const onTrackMute = (event) => {
|
|
10050
|
-
|
|
10051
|
-
|
|
10052
|
-
if (!signaler) {
|
|
10053
|
-
return;
|
|
10056
|
+
if (getMediaFamily(mediaType) === MediaFamily.Audio) {
|
|
10057
|
+
this.sendSourceIndication(mediaType, +!event.trackState.muted);
|
|
10054
10058
|
}
|
|
10055
|
-
|
|
10056
|
-
|
|
10057
|
-
|
|
10058
|
-
}
|
|
10059
|
-
else {
|
|
10060
|
-
const state = event.trackState.muted ? 'avatar' : 'live';
|
|
10061
|
-
const sources = signaler
|
|
10062
|
-
.getSenderIds()
|
|
10063
|
-
.map((id) => ({ id, state, csi: sendTransceiver.csi }));
|
|
10059
|
+
else {
|
|
10060
|
+
const sources = this.getVideoSources(mediaType);
|
|
10061
|
+
if (sources != null) {
|
|
10064
10062
|
this.sendSourceIndication(mediaType, +!event.trackState.muted, sources);
|
|
10065
10063
|
}
|
|
10066
10064
|
}
|
|
@@ -10070,27 +10068,47 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10070
10068
|
if (!event.isPublished) {
|
|
10071
10069
|
track.off(LocalTrack.Events.Muted, onTrackMute);
|
|
10072
10070
|
track.off(LocalTrack.Events.PublishedStateUpdate, onTrackPublish);
|
|
10071
|
+
track.off(LocalTrack.Events.TrackConstraintsChange, onTrackResolutionChange);
|
|
10073
10072
|
}
|
|
10074
|
-
|
|
10075
|
-
|
|
10076
|
-
if (!signaler) {
|
|
10077
|
-
return;
|
|
10073
|
+
if (getMediaFamily(mediaType) === MediaFamily.Audio) {
|
|
10074
|
+
this.sendSourceIndication(mediaType, +event.isPublished);
|
|
10078
10075
|
}
|
|
10079
|
-
|
|
10080
|
-
|
|
10081
|
-
|
|
10082
|
-
}
|
|
10083
|
-
else {
|
|
10084
|
-
const state = event.isPublished ? 'live' : 'no source';
|
|
10085
|
-
const sources = signaler
|
|
10086
|
-
.getSenderIds()
|
|
10087
|
-
.map((id) => ({ id, state, csi: sendTransceiver.csi }));
|
|
10076
|
+
else {
|
|
10077
|
+
const sources = this.getVideoSources(mediaType);
|
|
10078
|
+
if (sources != null) {
|
|
10088
10079
|
this.sendSourceIndication(mediaType, +event.isPublished, sources);
|
|
10089
10080
|
}
|
|
10090
10081
|
}
|
|
10091
10082
|
};
|
|
10092
10083
|
track.on(LocalTrack.Events.PublishedStateUpdate, onTrackPublish);
|
|
10093
10084
|
}
|
|
10085
|
+
getVideoSources(mediaType) {
|
|
10086
|
+
var _a, _b, _c;
|
|
10087
|
+
const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
|
|
10088
|
+
const signaler = this.streamSignalerManager.getEgressStreamSignaler(sendTransceiver.mid);
|
|
10089
|
+
if (!signaler) {
|
|
10090
|
+
return null;
|
|
10091
|
+
}
|
|
10092
|
+
const activeSimulcastLayerNumber = ((_a = sendTransceiver.publishedTrack) === null || _a === void 0 ? void 0 : _a.getNumActiveSimulcastLayers()) || 0;
|
|
10093
|
+
const published = (_b = sendTransceiver.publishedTrack) === null || _b === void 0 ? void 0 : _b.published;
|
|
10094
|
+
const muted = ((_c = sendTransceiver.publishedTrack) === null || _c === void 0 ? void 0 : _c.muted) === true;
|
|
10095
|
+
return signaler.getSenderIds().map((id) => {
|
|
10096
|
+
let state;
|
|
10097
|
+
if (!published) {
|
|
10098
|
+
state = 'no source';
|
|
10099
|
+
}
|
|
10100
|
+
else if (muted) {
|
|
10101
|
+
state = 'avatar';
|
|
10102
|
+
}
|
|
10103
|
+
else if (activeSimulcastLayerNumber <= signaler.getEncodingIndexForStreamId(id)) {
|
|
10104
|
+
state = 'no source';
|
|
10105
|
+
}
|
|
10106
|
+
else {
|
|
10107
|
+
state = 'live';
|
|
10108
|
+
}
|
|
10109
|
+
return { id, state, csi: sendTransceiver.csi };
|
|
10110
|
+
});
|
|
10111
|
+
}
|
|
10094
10112
|
createReceiveSlot(mediaType) {
|
|
10095
10113
|
return __awaiter(this, void 0, void 0, function* () {
|
|
10096
10114
|
const rtcRtpTransceiver = this.pc.addTransceiver(toMediaStreamTrackKind(mediaType), {
|
|
@@ -10217,6 +10235,14 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10217
10235
|
const simulcastEnabled = hasSimulcast(av);
|
|
10218
10236
|
const rtxEnabled = av.type === 'video';
|
|
10219
10237
|
egressSignaler.signalStreams(simulcastEnabled, rtxEnabled, av);
|
|
10238
|
+
if (av.type === 'video') {
|
|
10239
|
+
[...av.codecs.values()]
|
|
10240
|
+
.filter((ci) => ci.name === 'H264')
|
|
10241
|
+
.forEach((ci) => {
|
|
10242
|
+
ci.fmtParams.set('max-mbps', `${defaultMaxVideoEncodeMbps}`);
|
|
10243
|
+
ci.fmtParams.set('max-fs', `${defaultMaxVideoEncodeFrameSize}`);
|
|
10244
|
+
});
|
|
10245
|
+
}
|
|
10220
10246
|
const mediaType = [...this.sendTransceivers.keys()].find((key) => { var _a; return ((_a = this.sendTransceivers.get(key)) === null || _a === void 0 ? void 0 : _a.mid) === av.mid; });
|
|
10221
10247
|
if (mediaType && this.customCodecParameters.has(mediaType)) {
|
|
10222
10248
|
[...av.codecs.values()]
|