openvidu-browser: refactor replaceTrack to not override last constraints

pull/721/head
pabloFuente 2022-05-04 19:55:08 +02:00
parent 066810be17
commit 99cd4cdfd7
4 changed files with 44 additions and 33 deletions

View File

@ -329,27 +329,7 @@ export class Publisher extends StreamManager {
* @returns A Promise (to which you can optionally subscribe to) that is resolved if the track was successfully replaced and rejected with an Error object in other case * @returns A Promise (to which you can optionally subscribe to) that is resolved if the track was successfully replaced and rejected with an Error object in other case
*/ */
async replaceTrack(track: MediaStreamTrack): Promise<void> { async replaceTrack(track: MediaStreamTrack): Promise<void> {
// Set field "enabled" of the new track to the previous value return this.replaceTrackAux(track, true);
const trackOriginalEnabledValue: boolean = track.enabled;
if (track.kind === 'video') {
track.enabled = this.stream.videoActive;
} else if (track.kind === 'audio') {
track.enabled = this.stream.audioActive;
}
try {
if (this.stream.isLocalStreamPublished) {
// Only if the Publisher has been published is necessary to call native Web API RTCRtpSender.replaceTrack
// If it has not been published yet, replacing it on the MediaStream object is enough
await this.replaceTrackInMediaStream(track);
return await this.replaceTrackInRtcRtpSender(track);
} else {
// Publisher not published. Simply replace the track on the local MediaStream
return await this.replaceTrackInMediaStream(track);
}
} catch (error) {
track.enabled = trackOriginalEnabledValue;
throw error;
}
} }
/* Hidden methods */ /* Hidden methods */
@ -636,6 +616,33 @@ export class Publisher extends StreamManager {
}); });
} }
/**
* @hidden
*/
async replaceTrackAux(track: MediaStreamTrack, updateLastConstraints: boolean): Promise<void> {
// Set field "enabled" of the new track to the previous value
const trackOriginalEnabledValue: boolean = track.enabled;
if (track.kind === 'video') {
track.enabled = this.stream.videoActive;
} else if (track.kind === 'audio') {
track.enabled = this.stream.audioActive;
}
try {
if (this.stream.isLocalStreamPublished) {
// Only if the Publisher has been published is necessary to call native Web API RTCRtpSender.replaceTrack
// If it has not been published yet, replacing it on the MediaStream object is enough
await this.replaceTrackInMediaStream(track, updateLastConstraints);
return await this.replaceTrackInRtcRtpSender(track);
} else {
// Publisher not published. Simply replace the track on the local MediaStream
return await this.replaceTrackInMediaStream(track, updateLastConstraints);
}
} catch (error) {
track.enabled = trackOriginalEnabledValue;
throw error;
}
}
/** /**
* @hidden * @hidden
* *
@ -729,12 +736,14 @@ export class Publisher extends StreamManager {
/** /**
* @hidden * @hidden
*/ */
async replaceTrackInMediaStream(track: MediaStreamTrack): Promise<void> { async replaceTrackInMediaStream(track: MediaStreamTrack, updateLastConstraints: boolean): Promise<void> {
const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote! : this.stream.getMediaStream(); const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote! : this.stream.getMediaStream();
let removedTrack: MediaStreamTrack; let removedTrack: MediaStreamTrack;
if (track.kind === 'video') { if (track.kind === 'video') {
removedTrack = mediaStream.getVideoTracks()[0]; removedTrack = mediaStream.getVideoTracks()[0];
if (updateLastConstraints) {
this.stream.lastVideoTrackConstraints = track.getConstraints(); this.stream.lastVideoTrackConstraints = track.getConstraints();
}
} else { } else {
removedTrack = mediaStream.getAudioTracks()[0]; removedTrack = mediaStream.getAudioTracks()[0];
} }

View File

@ -421,9 +421,9 @@ export class Stream {
videoClone.style.display = 'none'; videoClone.style.display = 'none';
if (this.streamManager.remote) { if (this.streamManager.remote) {
this.streamManager.replaceTrackInMediaStream((this.virtualBackgroundSinkElements.video.srcObject as MediaStream).getVideoTracks()[0]); this.streamManager.replaceTrackInMediaStream((this.virtualBackgroundSinkElements.video.srcObject as MediaStream).getVideoTracks()[0], false);
} else { } else {
(this.streamManager as Publisher).replaceTrack((this.virtualBackgroundSinkElements.video.srcObject as MediaStream).getVideoTracks()[0]); (this.streamManager as Publisher).replaceTrackAux((this.virtualBackgroundSinkElements.video.srcObject as MediaStream).getVideoTracks()[0], false);
} }
resolveApplyFilter(undefined, false); resolveApplyFilter(undefined, false);
@ -553,9 +553,9 @@ export class Stream {
const mediaStreamClone = this.virtualBackgroundSourceElements!.mediaStreamClone; const mediaStreamClone = this.virtualBackgroundSourceElements!.mediaStreamClone;
if (!isDisposing) { if (!isDisposing) {
if (this.streamManager.remote) { if (this.streamManager.remote) {
await this.streamManager.replaceTrackInMediaStream(mediaStreamClone.getVideoTracks()[0]); await this.streamManager.replaceTrackInMediaStream(mediaStreamClone.getVideoTracks()[0], false);
} else { } else {
await (this.streamManager as Publisher).replaceTrack(mediaStreamClone.getVideoTracks()[0]); await (this.streamManager as Publisher).replaceTrackAux(mediaStreamClone.getVideoTracks()[0], false);
} }
} else { } else {
mediaStreamClone.getTracks().forEach((track) => track.stop()); mediaStreamClone.getTracks().forEach((track) => track.stop());

View File

@ -529,7 +529,7 @@ export abstract class StreamManager extends EventDispatcher {
/** /**
* @hidden * @hidden
*/ */
abstract replaceTrackInMediaStream(track: MediaStreamTrack): Promise<void>; abstract replaceTrackInMediaStream(track: MediaStreamTrack, updateLastConstraints: boolean): Promise<void>;
/* Private methods */ /* Private methods */

View File

@ -78,12 +78,14 @@ export class Subscriber extends StreamManager {
/** /**
* @hidden * @hidden
*/ */
async replaceTrackInMediaStream(track: MediaStreamTrack): Promise<void> { async replaceTrackInMediaStream(track: MediaStreamTrack, updateLastConstraints: boolean): Promise<void> {
const mediaStream: MediaStream = this.stream.getMediaStream(); const mediaStream: MediaStream = this.stream.getMediaStream();
let removedTrack: MediaStreamTrack; let removedTrack: MediaStreamTrack;
if (track.kind === 'video') { if (track.kind === 'video') {
removedTrack = mediaStream.getVideoTracks()[0]; removedTrack = mediaStream.getVideoTracks()[0];
if (updateLastConstraints) {
this.stream.lastVideoTrackConstraints = track.getConstraints(); this.stream.lastVideoTrackConstraints = track.getConstraints();
}
} else { } else {
removedTrack = mediaStream.getAudioTracks()[0]; removedTrack = mediaStream.getAudioTracks()[0];
} }