@webex/web-client-media-engine 1.40.1 → 1.40.3

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 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
- const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
10051
- const signaler = this.streamSignalerManager.getEgressStreamSignaler(sendTransceiver.mid);
10052
- if (!signaler) {
10053
- return;
10056
+ if (getMediaFamily(mediaType) === MediaFamily.Audio) {
10057
+ this.sendSourceIndication(mediaType, +!event.trackState.muted);
10054
10058
  }
10055
- if (this.getPublishedTracks().includes(track)) {
10056
- if (getMediaFamily(mediaType) === MediaFamily.Audio) {
10057
- this.sendSourceIndication(mediaType, +!event.trackState.muted);
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
- const sendTransceiver = this.getSendTransceiverOrThrow(mediaType);
10075
- const signaler = this.streamSignalerManager.getEgressStreamSignaler(sendTransceiver.mid);
10076
- if (!signaler) {
10077
- return;
10073
+ if (getMediaFamily(mediaType) === MediaFamily.Audio) {
10074
+ this.sendSourceIndication(mediaType, +event.isPublished);
10078
10075
  }
10079
- if (!event.trackState.muted) {
10080
- if (getMediaFamily(mediaType) === MediaFamily.Audio) {
10081
- this.sendSourceIndication(mediaType, +event.isPublished);
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()]