Skip to content

Commit 3116a21

Browse files
cloudwebrtcCopilotdevin-ai-integration[bot]
authored
E2E Test: select video quality when publish simulcast video track. (#646)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: cloudwebrtc <17733746+cloudwebrtc@users.noreply.github.com> Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 111b344 commit 3116a21

3 files changed

Lines changed: 386 additions & 0 deletions

File tree

livekit-rtc/livekit/rtc/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
ParticipantTrackPermission,
4646
)
4747
from ._proto.video_frame_pb2 import FrameMetadata, VideoBufferType, VideoCodec, VideoRotation
48+
from ._proto.track_publication_pb2 import VideoQuality
4849
from .audio_frame import AudioFrame
4950
from .audio_source import AudioSource
5051
from .audio_stream import AudioFrameEvent, AudioStream, NoiseCancellationOptions
@@ -188,6 +189,7 @@
188189
"TranscriptionSegment",
189190
"VideoCodec",
190191
"VideoEncoding",
192+
"VideoQuality",
191193
"VideoFrame",
192194
"VideoFrameEvent",
193195
"VideoSource",

livekit-rtc/livekit/rtc/track_publication.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919
from ._proto import e2ee_pb2 as proto_e2ee
2020
from ._proto import ffi_pb2 as proto_ffi
2121
from ._proto import track_pb2 as proto_track
22+
from ._proto import track_publication_pb2 as proto_track_pub
2223
from .track import Track, LocalTrack, RemoteTrack
2324

25+
VideoQuality = proto_track_pub.VideoQuality
26+
2427

2528
class TrackPublication:
2629
def __init__(self, owned_info: proto_track.OwnedTrackPublication):
@@ -116,5 +119,27 @@ def set_subscribed(self, subscribed: bool) -> None:
116119
req.set_subscribed.publication_handle = self._ffi_handle.handle
117120
FfiClient.instance.request(req)
118121

122+
def set_video_quality(self, quality: "VideoQuality.ValueType") -> None:
123+
"""For simulcasted video tracks, request a specific simulcast layer
124+
from the server. Use one of `rtc.VideoQuality.VIDEO_QUALITY_LOW` (q),
125+
`VIDEO_QUALITY_MEDIUM` (h), or `VIDEO_QUALITY_HIGH` (f).
126+
127+
Raises:
128+
ValueError: if the publication is not a video track, or is not
129+
simulcasted (selecting a layer requires multiple layers).
130+
"""
131+
if self.kind != proto_track.TrackKind.KIND_VIDEO:
132+
raise ValueError(
133+
f"set_video_quality is only supported on video publications (sid={self.sid})"
134+
)
135+
if not self.simulcasted:
136+
raise ValueError(
137+
f"set_video_quality requires a simulcasted publication (sid={self.sid})"
138+
)
139+
req = proto_ffi.FfiRequest()
140+
req.set_remote_track_publication_quality.track_publication_handle = self._ffi_handle.handle
141+
req.set_remote_track_publication_quality.quality = quality
142+
FfiClient.instance.request(req)
143+
119144
def __repr__(self) -> str:
120145
return f"rtc.RemoteTrackPublication(sid={self.sid}, name={self.name}, kind={self.kind}, source={self.source})"

0 commit comments

Comments
 (0)