in src/transceivercontroller/DefaultTransceiverController.ts [328:386]
private updateTransceiverWithoutStop(
transceivers: RTCRtpTransceiver[],
videoStreamIndex: VideoStreamIndex,
videosRemaining: number[]
): void {
let n = 1;
for (const transceiver of transceivers) {
if (transceiver === this._localCameraTransceiver || !this.transceiverIsVideo(transceiver)) {
continue;
}
this.videoSubscriptions[n] = 0;
if (transceiver.direction !== 'inactive') {
const streamId = videoStreamIndex.streamIdForTrack('v_' + transceiver.mid);
if (streamId !== undefined) {
for (const [index, recvStreamId] of videosRemaining.entries()) {
if (videoStreamIndex.StreamIdsInSameGroup(streamId, recvStreamId)) {
transceiver.direction = 'recvonly';
this.videoSubscriptions[n] = recvStreamId;
this.streamIdToTransceiver.delete(streamId);
this.streamIdToTransceiver.set(recvStreamId, transceiver);
videosRemaining.splice(index, 1);
break;
}
}
}
}
n += 1;
}
// Next fill in open slots and remove unused
n = 1;
for (const transceiver of transceivers) {
if (transceiver === this._localCameraTransceiver || !this.transceiverIsVideo(transceiver)) {
continue;
}
if (transceiver.direction === 'inactive' && videosRemaining.length > 0) {
// Fill available slot
transceiver.direction = 'recvonly';
const streamId = videosRemaining.shift();
this.videoSubscriptions[n] = streamId;
this.streamIdToTransceiver.set(streamId, transceiver);
this.groupIdToTransceiver.set(videoStreamIndex.groupIdForStreamId(streamId), transceiver);
} else {
// Remove if no longer subscribed
if (this.videoSubscriptions[n] === 0) {
transceiver.direction = 'inactive';
for (const [streamId, previousTransceiver] of this.streamIdToTransceiver.entries()) {
if (transceiver === previousTransceiver) {
this.streamIdToTransceiver.delete(streamId);
this.groupIdToTransceiver.delete(videoStreamIndex.groupIdForStreamId(streamId));
}
}
}
}
n += 1;
}
}