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;
}