@webex/web-client-media-engine 1.40.0 → 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 +62 -33
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +62 -33
- 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
|
@@ -8975,6 +8975,9 @@ function injectJmpAttributes(parsedSdp, csiMap, streamSignalingMode) {
|
|
|
8975
8975
|
mLine.addLine(new JmpStreamIdModeLine(streamSignalingMode));
|
|
8976
8976
|
}
|
|
8977
8977
|
});
|
|
8978
|
+
}
|
|
8979
|
+
function hasSimulcast(av) {
|
|
8980
|
+
return !!av.simulcast || av.ssrcGroups.map((sg) => sg.semantics).some((sem) => sem === 'SIM');
|
|
8978
8981
|
}
|
|
8979
8982
|
|
|
8980
8983
|
class SendOnlyTransceiver extends Transceiver {
|
|
@@ -9698,10 +9701,6 @@ const defaultMultistreamConnectionOptions = {
|
|
|
9698
9701
|
enableMainAudio: true,
|
|
9699
9702
|
enableMainVideo: true,
|
|
9700
9703
|
};
|
|
9701
|
-
const defaultVideoCodecParameters = {
|
|
9702
|
-
'max-mbps': `${defaultMaxVideoEncodeMbps}`,
|
|
9703
|
-
'max-fs': `${defaultMaxVideoEncodeFrameSize}`,
|
|
9704
|
-
};
|
|
9705
9704
|
class MultistreamConnection extends EventEmitter {
|
|
9706
9705
|
constructor(userOptions = {}) {
|
|
9707
9706
|
var _a, _b;
|
|
@@ -9725,7 +9724,6 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9725
9724
|
const mainSceneId = generateSceneId();
|
|
9726
9725
|
const videoMainEncodingOptions = this.getVideoEncodingOptions(MediaContent.Main);
|
|
9727
9726
|
this.createSendTransceiver(MediaType.VideoMain, mainSceneId, videoMainEncodingOptions);
|
|
9728
|
-
this.setCodecParameters(MediaType.VideoMain, defaultVideoCodecParameters);
|
|
9729
9727
|
this.createSendTransceiver(MediaType.AudioMain, mainSceneId);
|
|
9730
9728
|
(_a = this.sendTransceivers.get(MediaType.VideoMain)) === null || _a === void 0 ? void 0 : _a.setActive(this.options.enableMainVideo);
|
|
9731
9729
|
(_b = this.sendTransceivers.get(MediaType.AudioMain)) === null || _b === void 0 ? void 0 : _b.setActive(this.options.enableMainAudio);
|
|
@@ -9733,7 +9731,6 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9733
9731
|
const videoPresentationEncodingOptions = this.getVideoEncodingOptions(MediaContent.Slides);
|
|
9734
9732
|
const contentSceneId = generateSceneId();
|
|
9735
9733
|
this.createSendTransceiver(MediaType.VideoSlides, contentSceneId, videoPresentationEncodingOptions);
|
|
9736
|
-
this.setCodecParameters(MediaType.VideoSlides, defaultVideoCodecParameters);
|
|
9737
9734
|
this.createSendTransceiver(MediaType.AudioSlides, contentSceneId);
|
|
9738
9735
|
}
|
|
9739
9736
|
}
|
|
@@ -9852,9 +9849,11 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9852
9849
|
this.jmpSessions.set(mediaType, jmpSession);
|
|
9853
9850
|
}
|
|
9854
9851
|
sendSourceWarnings(mediaType, requests) {
|
|
9852
|
+
var _a;
|
|
9855
9853
|
if (getMediaFamily(mediaType) === MediaFamily.Video) {
|
|
9856
9854
|
const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
|
|
9857
9855
|
const signaler = this.streamSignalerManager.getEgressStreamSignalerOrThrow(sendTransceiver.mid);
|
|
9856
|
+
const activeSimulcastLayerNumber = ((_a = sendTransceiver.publishedTrack) === null || _a === void 0 ? void 0 : _a.getNumActiveSimulcastLayers()) || 0;
|
|
9858
9857
|
const sourceWarnings = [];
|
|
9859
9858
|
requests.forEach(({ ids, policySpecificInfo }) => {
|
|
9860
9859
|
ids.forEach((id) => {
|
|
@@ -9865,6 +9864,9 @@ class MultistreamConnection extends EventEmitter {
|
|
|
9865
9864
|
else if (!signaler.getSenderIds().some((validId) => compareStreamIds(id, validId))) {
|
|
9866
9865
|
sourceWarnings.push({ id, state: 'invalid source', csi: sendTransceiver.csi });
|
|
9867
9866
|
}
|
|
9867
|
+
else if (signaler.getEncodingIndexForStreamId(id) > activeSimulcastLayerNumber) {
|
|
9868
|
+
sourceWarnings.push({ id, state: 'no source', csi: sendTransceiver.csi });
|
|
9869
|
+
}
|
|
9868
9870
|
});
|
|
9869
9871
|
});
|
|
9870
9872
|
if (sourceWarnings.length > 0) {
|
|
@@ -10039,21 +10041,20 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10039
10041
|
});
|
|
10040
10042
|
}
|
|
10041
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);
|
|
10042
10051
|
const onTrackMute = (event) => {
|
|
10043
|
-
|
|
10044
|
-
|
|
10045
|
-
if (!signaler) {
|
|
10046
|
-
return;
|
|
10052
|
+
if (getMediaFamily(mediaType) === MediaFamily.Audio) {
|
|
10053
|
+
this.sendSourceIndication(mediaType, +!event.trackState.muted);
|
|
10047
10054
|
}
|
|
10048
|
-
|
|
10049
|
-
|
|
10050
|
-
|
|
10051
|
-
}
|
|
10052
|
-
else {
|
|
10053
|
-
const state = event.trackState.muted ? 'avatar' : 'live';
|
|
10054
|
-
const sources = signaler
|
|
10055
|
-
.getSenderIds()
|
|
10056
|
-
.map((id) => ({ id, state, csi: sendTransceiver.csi }));
|
|
10055
|
+
else {
|
|
10056
|
+
const sources = this.getVideoSources(mediaType);
|
|
10057
|
+
if (sources != null) {
|
|
10057
10058
|
this.sendSourceIndication(mediaType, +!event.trackState.muted, sources);
|
|
10058
10059
|
}
|
|
10059
10060
|
}
|
|
@@ -10063,27 +10064,47 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10063
10064
|
if (!event.isPublished) {
|
|
10064
10065
|
track.off(LocalTrack.Events.Muted, onTrackMute);
|
|
10065
10066
|
track.off(LocalTrack.Events.PublishedStateUpdate, onTrackPublish);
|
|
10067
|
+
track.off(LocalTrack.Events.TrackConstraintsChange, onTrackResolutionChange);
|
|
10066
10068
|
}
|
|
10067
|
-
|
|
10068
|
-
|
|
10069
|
-
if (!signaler) {
|
|
10070
|
-
return;
|
|
10069
|
+
if (getMediaFamily(mediaType) === MediaFamily.Audio) {
|
|
10070
|
+
this.sendSourceIndication(mediaType, +event.isPublished);
|
|
10071
10071
|
}
|
|
10072
|
-
|
|
10073
|
-
|
|
10074
|
-
|
|
10075
|
-
}
|
|
10076
|
-
else {
|
|
10077
|
-
const state = event.isPublished ? 'live' : 'no source';
|
|
10078
|
-
const sources = signaler
|
|
10079
|
-
.getSenderIds()
|
|
10080
|
-
.map((id) => ({ id, state, csi: sendTransceiver.csi }));
|
|
10072
|
+
else {
|
|
10073
|
+
const sources = this.getVideoSources(mediaType);
|
|
10074
|
+
if (sources != null) {
|
|
10081
10075
|
this.sendSourceIndication(mediaType, +event.isPublished, sources);
|
|
10082
10076
|
}
|
|
10083
10077
|
}
|
|
10084
10078
|
};
|
|
10085
10079
|
track.on(LocalTrack.Events.PublishedStateUpdate, onTrackPublish);
|
|
10086
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
|
+
}
|
|
10087
10108
|
createReceiveSlot(mediaType) {
|
|
10088
10109
|
return __awaiter(this, void 0, void 0, function* () {
|
|
10089
10110
|
const rtcRtpTransceiver = this.pc.addTransceiver(toMediaStreamTrackKind(mediaType), {
|
|
@@ -10207,9 +10228,17 @@ class MultistreamConnection extends EventEmitter {
|
|
|
10207
10228
|
.filter((av) => av.direction === 'sendrecv')
|
|
10208
10229
|
.forEach((av) => {
|
|
10209
10230
|
const egressSignaler = this.streamSignalerManager.getOrCreateEgressStreamSignaler(av.mid);
|
|
10210
|
-
const simulcastEnabled =
|
|
10231
|
+
const simulcastEnabled = hasSimulcast(av);
|
|
10211
10232
|
const rtxEnabled = av.type === 'video';
|
|
10212
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
|
+
}
|
|
10213
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; });
|
|
10214
10243
|
if (mediaType && this.customCodecParameters.has(mediaType)) {
|
|
10215
10244
|
[...av.codecs.values()]
|