@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/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
- const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
10044
- const signaler = this.streamSignalerManager.getEgressStreamSignaler(sendTransceiver.mid);
10045
- if (!signaler) {
10046
- return;
10052
+ if (getMediaFamily(mediaType) === MediaFamily.Audio) {
10053
+ this.sendSourceIndication(mediaType, +!event.trackState.muted);
10047
10054
  }
10048
- if (this.getPublishedTracks().includes(track)) {
10049
- if (getMediaFamily(mediaType) === MediaFamily.Audio) {
10050
- this.sendSourceIndication(mediaType, +!event.trackState.muted);
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
- const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
10068
- const signaler = this.streamSignalerManager.getEgressStreamSignaler(sendTransceiver.mid);
10069
- if (!signaler) {
10070
- return;
10069
+ if (getMediaFamily(mediaType) === MediaFamily.Audio) {
10070
+ this.sendSourceIndication(mediaType, +event.isPublished);
10071
10071
  }
10072
- if (!event.trackState.muted) {
10073
- if (getMediaFamily(mediaType) === MediaFamily.Audio) {
10074
- this.sendSourceIndication(mediaType, +event.isPublished);
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 = !!av.simulcast;
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()]