private sendRemoteVideoUpdate()

in src/audiovideocontroller/DefaultAudioVideoController.ts [1088:1155]


  private sendRemoteVideoUpdate(): boolean {
    const context = this.meetingSessionContext;
    /* istanbul ignore next: Extremely unlikely that `videosToReceive` is null */
    if (context.videosToReceive === null) {
      return false;
    }

    const groupIdsToReceive = context.videosToReceive.array().map((streamId: number) => {
      return context.videoStreamIndex.groupIdForStreamId(streamId);
    });
    this.receiveRemotePauseResumeTask.updateSubscribedGroupdIds(new Set(groupIdsToReceive));

    const currentConfigs = convertVideoPreferencesToSignalingClientVideoSubscriptionConfiguration(
      context,
      groupIdsToReceive,
      context.videoDownlinkBandwidthPolicy.getVideoPreferences()
    );

    const newVideoSubscriptionConfigurationsMap: Map<
      number,
      SignalingClientVideoSubscriptionConfiguration
    > = new Map();
    const addedOrUpdated: SignalingClientVideoSubscriptionConfiguration[] = [];
    for (const config of currentConfigs) {
      let shouldIncludeInUpdate = false;
      if (!context.lastVideoSubscriptionConfiguration.has(config.groupId)) {
        shouldIncludeInUpdate = true;
      } else {
        const lastConfig = context.lastVideoSubscriptionConfiguration.get(config.groupId);
        if (!config.equals(lastConfig)) {
          this.logger.debug(
            `${JSON.stringify(config)} does not equal ${JSON.stringify(lastConfig)}, sending update`
          );
          shouldIncludeInUpdate = true;
        }
      }

      newVideoSubscriptionConfigurationsMap.set(config.groupId, config);
      if (shouldIncludeInUpdate) {
        addedOrUpdated.push(config);
      }
    }
    context.lastVideoSubscriptionConfiguration = newVideoSubscriptionConfigurationsMap;

    const removedMids: string[] = [];
    if (context.lastVideosToReceive !== null) {
      const groupIdsToReceiveSet = new Set(groupIdsToReceive);
      for (const streamId of context.lastVideosToReceive.array()) {
        const groupId = context.videoStreamIndex.groupIdForStreamId(streamId);
        if (!groupIdsToReceiveSet.has(groupId)) {
          const mid = context.transceiverController.getMidForGroupId(groupId);
          if (mid === undefined) {
            context.logger.warn(`Could not find MID for group ID to remove: ${groupId}`);
            continue;
          }
          removedMids.push(mid);
        }
      }
    }

    // pass updated preference configurations to server for server-side bandwdith padding/probing
    // additionally, trigger server-side video quality adaption if enabed
    if (addedOrUpdated.length !== 0 || removedMids.length !== 0) {
      context.signalingClient.remoteVideoUpdate(addedOrUpdated, removedMids);
    }

    return true;
  }