Skip to content

Commit 08e6133

Browse files
committed
ensure video track dimensions are an even number
1 parent 6a725b0 commit 08e6133

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

agents-core/vision_agents/core/agents/agents.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
from ..stt.stt import STT
3434
from ..tts.tts import TTS
3535
from ..turn_detection import TurnDetector, TurnStartedEvent, TurnEndedEvent
36+
from ..utils.video_forwarder import VideoForwarder
37+
from ..utils.video_utils import ensure_even_dimensions
3638
from ..vad import VAD
3739
from ..vad.events import VADAudioEvent
3840
from . 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
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""Video frame utilities."""
2+
3+
import av
4+
5+
6+
def ensure_even_dimensions(frame: av.VideoFrame) -> av.VideoFrame:
7+
"""
8+
Ensure frame has even dimensions for H.264 yuv420p encoding.
9+
10+
Crops by 1 pixel if width or height is odd.
11+
"""
12+
needs_width_adjust = frame.width % 2 != 0
13+
needs_height_adjust = frame.height % 2 != 0
14+
15+
if not needs_width_adjust and not needs_height_adjust:
16+
return frame
17+
18+
new_width = frame.width - (1 if needs_width_adjust else 0)
19+
new_height = frame.height - (1 if needs_height_adjust else 0)
20+
21+
cropped = frame.reformat(width=new_width, height=new_height)
22+
cropped.pts = frame.pts
23+
cropped.time_base = frame.time_base
24+
25+
return cropped
26+

0 commit comments

Comments
 (0)