Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion livekit-rtc/livekit/rtc/video_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,41 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import annotations

from ._ffi_client import FfiHandle, FfiClient
from ._proto import ffi_pb2 as proto_ffi
from ._proto import video_frame_pb2 as proto_video
from .video_frame import VideoFrame


class VideoSource:
def __init__(self, width: int, height: int) -> None:
def __init__(self, width: int, height: int, *, is_screencast: bool = False) -> None:
"""
Create a new video source.

Args:
width (int): Initial width of the video source.
height (int): Initial height of the video source.
is_screencast (bool, optional): Optimize the WebRTC pipeline for screen content.
Defaults to False.

When True, WebRTC will:

- Maintain resolution under congestion by dropping frames instead of
downscaling (keeps text crisp)
- Disable quality scaling and denoising to preserve text/UI readability
- Guarantee a minimum 1200 kbps bitrate floor
- Enable zero-hertz mode, stopping frame transmission when the screen
is static to save bandwidth
- Set content type to screen, adjusting encoder configuration throughout
the pipeline (VP9 inter-layer prediction, simulcast layer allocation, etc.)
"""
req = proto_ffi.FfiRequest()
req.new_video_source.type = proto_video.VideoSourceType.VIDEO_SOURCE_NATIVE
req.new_video_source.resolution.width = width
req.new_video_source.resolution.height = height
req.new_video_source.is_screencast = is_screencast

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Setting is_screencast on protobuf message that lacks this field causes AttributeError at runtime

The code sets req.new_video_source.is_screencast = is_screencast on line 29, but the NewVideoSourceRequest protobuf message does not have an is_screencast field. This causes an AttributeError every time VideoSource.__init__ is called, making the class completely unusable.

Root Cause

The protobuf definition for NewVideoSourceRequest only has two fields: type and resolution (confirmed in livekit-rtc/livekit/rtc/_proto/video_frame_pb2.pyi:242-265 and verified at runtime). The PR adds req.new_video_source.is_screencast = is_screencast but the corresponding .proto file was never updated to include the is_screencast field.

Runtime verification:

>>> msg = video_frame_pb2.NewVideoSourceRequest()
>>> msg.is_screencast = True
AttributeError: Protocol message NewVideoSourceRequest has no "is_screencast" field.

Impact: Every call to VideoSource(width, height) — even without passing is_screencast — will crash with AttributeError because False (the default) is still assigned to the non-existent field. This is a complete regression that breaks all video source creation.

Prompt for agents
The protobuf definition for NewVideoSourceRequest in video_frame_pb2.py needs to be regenerated from an updated .proto file that includes the is_screencast field. The .proto file (likely video_frame.proto) should add a field like `optional bool is_screencast = 3;` to the NewVideoSourceRequest message. Then regenerate the Python protobuf bindings (video_frame_pb2.py and video_frame_pb2.pyi). Without this proto update, the line `req.new_video_source.is_screencast = is_screencast` in video_source.py:29 will always raise an AttributeError at runtime.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.


resp = FfiClient.instance.request(req)
self._info = resp.new_video_source.source
Expand Down
Loading