mirror of https://github.com/OpenVidu/openvidu.git
openvidu-browser: refactor replaceTrack to not override last constraints
parent
066810be17
commit
99cd4cdfd7
|
@ -168,7 +168,7 @@ export class Publisher extends StreamManager {
|
||||||
* useful if the Publisher was unpublished freeing the hardware resource, and openvidu-browser is not able to successfully re-create the video track as it was before unpublishing. In this way previous track settings will be ignored and this MediaStreamTrack
|
* useful if the Publisher was unpublished freeing the hardware resource, and openvidu-browser is not able to successfully re-create the video track as it was before unpublishing. In this way previous track settings will be ignored and this MediaStreamTrack
|
||||||
* will be used instead.
|
* will be used instead.
|
||||||
*/
|
*/
|
||||||
publishVideo<T extends boolean>(enabled: T, resource?: T extends false ? boolean : MediaStreamTrack): void {
|
publishVideo<T extends boolean>(enabled: T, resource?: T extends false ? boolean : MediaStreamTrack): void {
|
||||||
|
|
||||||
if (this.stream.videoActive !== enabled) {
|
if (this.stream.videoActive !== enabled) {
|
||||||
|
|
||||||
|
@ -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];
|
||||||
this.stream.lastVideoTrackConstraints = track.getConstraints();
|
if (updateLastConstraints) {
|
||||||
|
this.stream.lastVideoTrackConstraints = track.getConstraints();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
removedTrack = mediaStream.getAudioTracks()[0];
|
removedTrack = mediaStream.getAudioTracks()[0];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
this.stream.lastVideoTrackConstraints = track.getConstraints();
|
if (updateLastConstraints) {
|
||||||
|
this.stream.lastVideoTrackConstraints = track.getConstraints();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
removedTrack = mediaStream.getAudioTracks()[0];
|
removedTrack = mediaStream.getAudioTracks()[0];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue