@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/esm/index.js
CHANGED
|
@@ -9701,10 +9701,6 @@ const defaultMultistreamConnectionOptions = {
|
|
|
9701
9701
|
enableMainAudio: true,
|
|
9702
9702
|
enableMainVideo: true,
|
|
9703
9703
|
};
|
|
9704
|
-
const defaultVideoCodecParameters = {
|
|
9705
|
-
'max-mbps': `${defaultMaxVideoEncodeMbps}`,
|
|
9706
|
-
'max-fs': `${defaultMaxVideoEncodeFrameSize}`,
|
|
9707
|
-
};
|
|
9708
9704
|
class MultistreamConnection extends EventEmitter {
|
|
9709
9705
|
constructor(userOptions = {}) {
|
|
9710
9706
|
var _a, _b;
|
|
@@ -9728,7 +9724,6 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9728
9724
|
const mainSceneId = generateSceneId();
|
|
9729
9725
|
const videoMainEncodingOptions = this.getVideoEncodingOptions(MediaContent.Main);
|
|
9730
9726
|
this.createSendTransceiver(MediaType.VideoMain, mainSceneId, videoMainEncodingOptions);
|
|
9731
|
-
this.setCodecParameters(MediaType.VideoMain, defaultVideoCodecParameters);
|
|
9732
9727
|
this.createSendTransceiver(MediaType.AudioMain, mainSceneId);
|
|
9733
9728
|
(_a = this.sendTransceivers.get(MediaType.VideoMain)) === null || _a === void 0 ? void 0 : _a.setActive(this.options.enableMainVideo);
|
|
9734
9729
|
(_b = this.sendTransceivers.get(MediaType.AudioMain)) === null || _b === void 0 ? void 0 : _b.setActive(this.options.enableMainAudio);
|
|
@@ -9736,7 +9731,6 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9736
9731
|
const videoPresentationEncodingOptions = this.getVideoEncodingOptions(MediaContent.Slides);
|
|
9737
9732
|
const contentSceneId = generateSceneId();
|
|
9738
9733
|
this.createSendTransceiver(MediaType.VideoSlides, contentSceneId, videoPresentationEncodingOptions);
|
|
9739
|
-
this.setCodecParameters(MediaType.VideoSlides, defaultVideoCodecParameters);
|
|
9740
9734
|
this.createSendTransceiver(MediaType.AudioSlides, contentSceneId);
|
|
9741
9735
|
}
|
|
9742
9736
|
}
|
|
@@ -9855,9 +9849,11 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9855
9849
|
this.jmpSessions.set(mediaType, jmpSession);
|
|
9856
9850
|
}
|
|
9857
9851
|
sendSourceWarnings(mediaType, requests) {
|
|
9852
|
+
var _a;
|
|
9858
9853
|
if (getMediaFamily(mediaType) === MediaFamily.Video) {
|
|
9859
9854
|
const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
|
|
9860
9855
|
const signaler = this.streamSignalerManager.getEgressStreamSignalerOrThrow(sendTransceiver.mid);
|
|
9856
|
+
const activeSimulcastLayerNumber = ((_a = sendTransceiver.publishedTrack) === null || _a === void 0 ? void 0 : _a.getNumActiveSimulcastLayers()) || 0;
|
|
9861
9857
|
const sourceWarnings = [];
|
|
9862
9858
|
requests.forEach(({ ids, policySpecificInfo }) => {
|
|
9863
9859
|
ids.forEach((id) => {
|
|
@@ -9868,6 +9864,9 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9868
9864
|
else if (!signaler.getSenderIds().some((validId) => compareStreamIds(id, validId))) {
|
|
9869
9865
|
sourceWarnings.push({ id, state: 'invalid source', csi: sendTransceiver.csi });
|
|
9870
9866
|
}
|
|
9867
|
+
else if (signaler.getEncodingIndexForStreamId(id) > activeSimulcastLayerNumber) {
|
|
9868
|
+
sourceWarnings.push({ id, state: 'no source', csi: sendTransceiver.csi });
|
|
9869
|
+
}
|
|
9871
9870
|
});
|
|
9872
9871
|
});
|
|
9873
9872
|
if (sourceWarnings.length > 0) {
|
|
@@ -10042,21 +10041,20 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10042
10041
|
});
|
|
10043
10042
|
}
|
|
10044
10043
|
addTrackListeners(mediaType, track) {
|
|
10044
|
+
const onTrackResolutionChange = () => {
|
|
10045
|
+
const sources = this.getVideoSources(mediaType);
|
|
10046
|
+
if (sources != null) {
|
|
10047
|
+
this.sendSourceIndication(mediaType, 1, sources);
|
|
10048
|
+
}
|
|
10049
|
+
};
|
|
10050
|
+
track.on(LocalTrack.Events.TrackConstraintsChange, onTrackResolutionChange);
|
|
10045
10051
|
const onTrackMute = (event) => {
|
|
10046
|
-
|
|
10047
|
-
|
|
10048
|
-
if (!signaler) {
|
|
10049
|
-
return;
|
|
10052
|
+
if (getMediaFamily(mediaType) === MediaFamily.Audio) {
|
|
10053
|
+
this.sendSourceIndication(mediaType, +!event.trackState.muted);
|
|
10050
10054
|
}
|
|
10051
|
-
|
|
10052
|
-
|
|
10053
|
-
|
|
10054
|
-
}
|
|
10055
|
-
else {
|
|
10056
|
-
const state = event.trackState.muted ? 'avatar' : 'live';
|
|
10057
|
-
const sources = signaler
|
|
10058
|
-
.getSenderIds()
|
|
10059
|
-
.map((id) => ({ id, state, csi: sendTransceiver.csi }));
|
|
10055
|
+
else {
|
|
10056
|
+
const sources = this.getVideoSources(mediaType);
|
|
10057
|
+
if (sources != null) {
|
|
10060
10058
|
this.sendSourceIndication(mediaType, +!event.trackState.muted, sources);
|
|
10061
10059
|
}
|
|
10062
10060
|
}
|
|
@@ -10066,27 +10064,47 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10066
10064
|
if (!event.isPublished) {
|
|
10067
10065
|
track.off(LocalTrack.Events.Muted, onTrackMute);
|
|
10068
10066
|
track.off(LocalTrack.Events.PublishedStateUpdate, onTrackPublish);
|
|
10067
|
+
track.off(LocalTrack.Events.TrackConstraintsChange, onTrackResolutionChange);
|
|
10069
10068
|
}
|
|
10070
|
-
|
|
10071
|
-
|
|
10072
|
-
if (!signaler) {
|
|
10073
|
-
return;
|
|
10069
|
+
if (getMediaFamily(mediaType) === MediaFamily.Audio) {
|
|
10070
|
+
this.sendSourceIndication(mediaType, +event.isPublished);
|
|
10074
10071
|
}
|
|
10075
|
-
|
|
10076
|
-
|
|
10077
|
-
|
|
10078
|
-
}
|
|
10079
|
-
else {
|
|
10080
|
-
const state = event.isPublished ? 'live' : 'no source';
|
|
10081
|
-
const sources = signaler
|
|
10082
|
-
.getSenderIds()
|
|
10083
|
-
.map((id) => ({ id, state, csi: sendTransceiver.csi }));
|
|
10072
|
+
else {
|
|
10073
|
+
const sources = this.getVideoSources(mediaType);
|
|
10074
|
+
if (sources != null) {
|
|
10084
10075
|
this.sendSourceIndication(mediaType, +event.isPublished, sources);
|
|
10085
10076
|
}
|
|
10086
10077
|
}
|
|
10087
10078
|
};
|
|
10088
10079
|
track.on(LocalTrack.Events.PublishedStateUpdate, onTrackPublish);
|
|
10089
10080
|
}
|
|
10081
|
+
getVideoSources(mediaType) {
|
|
10082
|
+
var _a, _b, _c;
|
|
10083
|
+
const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
|
|
10084
|
+
const signaler = this.streamSignalerManager.getEgressStreamSignaler(sendTransceiver.mid);
|
|
10085
|
+
if (!signaler) {
|
|
10086
|
+
return null;
|
|
10087
|
+
}
|
|
10088
|
+
const activeSimulcastLayerNumber = ((_a = sendTransceiver.publishedTrack) === null || _a === void 0 ? void 0 : _a.getNumActiveSimulcastLayers()) || 0;
|
|
10089
|
+
const published = (_b = sendTransceiver.publishedTrack) === null || _b === void 0 ? void 0 : _b.published;
|
|
10090
|
+
const muted = ((_c = sendTransceiver.publishedTrack) === null || _c === void 0 ? void 0 : _c.muted) === true;
|
|
10091
|
+
return signaler.getSenderIds().map((id) => {
|
|
10092
|
+
let state;
|
|
10093
|
+
if (!published) {
|
|
10094
|
+
state = 'no source';
|
|
10095
|
+
}
|
|
10096
|
+
else if (muted) {
|
|
10097
|
+
state = 'avatar';
|
|
10098
|
+
}
|
|
10099
|
+
else if (activeSimulcastLayerNumber <= signaler.getEncodingIndexForStreamId(id)) {
|
|
10100
|
+
state = 'no source';
|
|
10101
|
+
}
|
|
10102
|
+
else {
|
|
10103
|
+
state = 'live';
|
|
10104
|
+
}
|
|
10105
|
+
return { id, state, csi: sendTransceiver.csi };
|
|
10106
|
+
});
|
|
10107
|
+
}
|
|
10090
10108
|
createReceiveSlot(mediaType) {
|
|
10091
10109
|
return __awaiter(this, void 0, void 0, function* () {
|
|
10092
10110
|
const rtcRtpTransceiver = this.pc.addTransceiver(toMediaStreamTrackKind(mediaType), {
|
|
@@ -10213,6 +10231,14 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10213
10231
|
const simulcastEnabled = hasSimulcast(av);
|
|
10214
10232
|
const rtxEnabled = av.type === 'video';
|
|
10215
10233
|
egressSignaler.signalStreams(simulcastEnabled, rtxEnabled, av);
|
|
10234
|
+
if (av.type === 'video') {
|
|
10235
|
+
[...av.codecs.values()]
|
|
10236
|
+
.filter((ci) => ci.name === 'H264')
|
|
10237
|
+
.forEach((ci) => {
|
|
10238
|
+
ci.fmtParams.set('max-mbps', `${defaultMaxVideoEncodeMbps}`);
|
|
10239
|
+
ci.fmtParams.set('max-fs', `${defaultMaxVideoEncodeFrameSize}`);
|
|
10240
|
+
});
|
|
10241
|
+
}
|
|
10216
10242
|
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; });
|
|
10217
10243
|
if (mediaType && this.customCodecParameters.has(mediaType)) {
|
|
10218
10244
|
[...av.codecs.values()]
|