3333from ..stt .stt import STT
3434from ..tts .tts import TTS
3535from ..turn_detection import TurnDetector , TurnStartedEvent , TurnEndedEvent
36+ from ..utils .video_forwarder import VideoForwarder
37+ from ..utils .video_utils import ensure_even_dimensions
3638from ..vad import VAD
3739from ..vad .events import VADAudioEvent
3840from . import events
@@ -698,8 +700,8 @@ async def _reply_to_audio(
698700
699701 async def _process_track (self , track_id : str , track_type : int , participant ):
700702 # TODO: handle CancelledError
701- # we only process video tracks
702- if track_type != TrackType .TRACK_TYPE_VIDEO :
703+ # we only process video tracks (camera video or screenshare)
704+ if track_type not in ( TrackType .TRACK_TYPE_VIDEO , TrackType . TRACK_TYPE_SCREEN_SHARE ) :
703705 return
704706
705707 # subscribe to the video track
@@ -708,8 +710,16 @@ async def _process_track(self, track_id: str, track_type: int, participant):
708710 self .logger .error (f"Failed to subscribe to { track_id } " )
709711 return
710712
711- # Import VideoForwarder
712- from ..utils .video_forwarder import VideoForwarder
713+ # Wrap screenshare tracks to ensure even dimensions for H.264 encoding
714+ if track_type == TrackType .TRACK_TYPE_SCREEN_SHARE :
715+ class _EvenDimensionsTrack (VideoStreamTrack ):
716+ def __init__ (self , src ):
717+ super ().__init__ ()
718+ self .src = src
719+ async def recv (self ):
720+ return ensure_even_dimensions (await self .src .recv ())
721+
722+ track = _EvenDimensionsTrack (track ) # type: ignore[arg-type]
713723
714724 # Create a SHARED VideoForwarder for the RAW incoming track
715725 # This prevents multiple recv() calls competing on the same track
0 commit comments