Skip to content

Commit 52d4de4

Browse files
authored
Ensure RemoteVideoTracks without any attached elements are stopped by… (#1625)
1 parent 694101d commit 52d4de4

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

.changeset/orange-bottles-warn.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"livekit-client": patch
3+
---
4+
5+
Ensure RemoteVideoTracks without any attached elements are stopped by adaptiveStream

src/room/Room.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1661,8 +1661,8 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
16611661
return;
16621662
}
16631663
const newStreamState = Track.streamStateFromProto(streamState.state);
1664+
pub.track.setStreamState(newStreamState);
16641665
if (newStreamState !== pub.track.streamState) {
1665-
pub.track.streamState = newStreamState;
16661666
participant.emit(ParticipantEvent.TrackStreamStateChanged, pub, pub.track.streamState);
16671667
this.emitWhenConnected(
16681668
RoomEvent.TrackStreamStateChanged,

src/room/track/RemoteVideoTrack.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ export default class RemoteVideoTrack extends RemoteTrack<Track.Kind.Video> {
3838
return this.adaptiveStreamSettings !== undefined;
3939
}
4040

41+
override setStreamState(value: Track.StreamState) {
42+
super.setStreamState(value);
43+
console.log('setStreamState', value);
44+
if (value === Track.StreamState.Active) {
45+
// update visibility for adaptive stream tracks when stream state received from server is active
46+
// this is needed to ensure the track is stopped when there's no element attached to it at all
47+
this.updateVisibility();
48+
}
49+
}
50+
4151
/**
4252
* Note: When using adaptiveStream, you need to use remoteVideoTrack.attach() to add the track to a HTMLVideoElement, otherwise your video tracks might never start
4353
*/
@@ -220,7 +230,7 @@ export default class RemoteVideoTrack extends RemoteTrack<Track.Kind.Video> {
220230
this.updateDimensions();
221231
}, REACTION_DELAY);
222232

223-
private updateVisibility() {
233+
private updateVisibility(forceEmit?: boolean) {
224234
const lastVisibilityChange = this.elementInfos.reduce(
225235
(prev, info) => Math.max(prev, info.visibilityChangedAt || 0),
226236
0,
@@ -234,7 +244,7 @@ export default class RemoteVideoTrack extends RemoteTrack<Track.Kind.Video> {
234244
const isVisible =
235245
(this.elementInfos.some((info) => info.visible) && !backgroundPause) || isPiPMode;
236246

237-
if (this.lastVisible === isVisible) {
247+
if (this.lastVisible === isVisible && !forceEmit) {
238248
return;
239249
}
240250

src/room/track/Track.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ export abstract class Track<
3737

3838
source: Track.Source;
3939

40+
private _streamState: Track.StreamState = Track.StreamState.Active;
41+
4042
/**
4143
* sid is set after track is published to server, or if it's a remote track
4244
*/
@@ -51,7 +53,14 @@ export abstract class Track<
5153
* indicates current state of stream, it'll indicate `paused` if the track
5254
* has been paused by congestion controller
5355
*/
54-
streamState: Track.StreamState = Track.StreamState.Active;
56+
get streamState(): Track.StreamState {
57+
return this._streamState;
58+
}
59+
60+
/** @internal */
61+
setStreamState(value: Track.StreamState) {
62+
this._streamState = value;
63+
}
5564

5665
/** @internal */
5766
rtpTimestamp: number | undefined;

0 commit comments

Comments
 (0)