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