Skip to content

Commit 07bd1dd

Browse files
committed
Remove dummy stream track. Add TiciTrackWrapper
1 parent ad85bdd commit 07bd1dd

File tree

2 files changed

+26
-19
lines changed

2 files changed

+26
-19
lines changed

src/bodyrtc/builder.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import aiortc
55

66
from bodyrtc.stream import WebRTCBaseStream, WebRTCOfferStream, WebRTCAnswerStream, ConnectionProvider
7+
from bodyrtc.tracks import TiciVideoStreamTrack, TiciTrackWrapper
78

89

910
class WebRTCStreamBuilder(abc.ABC):
@@ -58,6 +59,8 @@ def offer_to_receive_audio_stream(self):
5859
def add_video_stream(self, camera_type: str, track: aiortc.MediaStreamTrack):
5960
assert camera_type not in self.video_tracks
6061
assert camera_type in ["driver", "wideRoad", "road"]
62+
if not isinstance(track, TiciVideoStreamTrack):
63+
track = TiciTrackWrapper(camera_type, track)
6164
self.video_tracks[camera_type] = track
6265

6366
def add_audio_stream(self, track: aiortc.MediaStreamTrack):

src/bodyrtc/tracks.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,23 @@
66

77
import aiortc
88
from aiortc.mediastreams import VIDEO_CLOCK_RATE, VIDEO_TIME_BASE
9-
from aiortc.contrib.media import MediaPlayer
10-
import av
11-
import numpy as np
9+
10+
11+
def video_track_id(camera_type: str, track_id: str) -> str:
12+
return f"{camera_type}:{track_id}"
1213

1314

1415
class TiciVideoStreamTrack(aiortc.MediaStreamTrack):
16+
"""
17+
Abstract video track which associates video track with camera_type
18+
"""
1519
kind = "video"
1620

1721
def __init__(self, camera_type: str, dt: float, time_base: fractions.Fraction = VIDEO_TIME_BASE, clock_rate: int = VIDEO_CLOCK_RATE):
1822
assert camera_type in ["driver", "wideRoad", "road"]
1923
super().__init__()
2024
# override track id to include camera type - client needs that for identification
21-
self._id: str = f"{camera_type}:{self._id}"
25+
self._id: str = video_track_id(camera_type, self._id)
2226
self._dt: float = dt
2327
self._time_base: fractions.Fraction = time_base
2428
self._clock_rate: int = clock_rate
@@ -44,20 +48,20 @@ def codec_preference(self) -> Optional[str]:
4448
return None
4549

4650

47-
class DummyVideoStreamTrack(TiciVideoStreamTrack):
48-
def __init__(self, camera_type: str, dt: float = 1/20, color: int = 0):
49-
super().__init__(camera_type, dt)
50-
self._color = color
51-
self._pts = 0
52-
53-
async def recv(self):
54-
self.log_debug("track sending frame %s", self._pts)
55-
img = np.full((1920, 1080, 3), self._color, dtype=np.uint8)
56-
57-
new_frame = av.VideoFrame.from_ndarray(img, format="rgb24")
58-
new_frame.pts = self._pts
59-
new_frame.time_base = self._time_base
51+
class TiciTrackWrapper(aiortc.MediaStreamTrack):
52+
"""
53+
Associates video track with camera_type
54+
"""
55+
def __init__(self, camera_type: str, track: aiortc.MediaStreamTrack):
56+
assert track.kind == "video"
57+
assert not isinstance(track, TiciVideoStreamTrack)
58+
super().__init__()
59+
self._id = video_track_id(camera_type, track.id)
60+
self._track = track
6061

61-
self._pts = await self.next_pts(self._pts)
62+
@property
63+
def kind(self) -> str:
64+
return self._track.kind
6265

63-
return new_frame
66+
async def recv(self):
67+
return await self._track.recv()

0 commit comments

Comments
 (0)