safer
This commit is contained in:
@@ -93,6 +93,7 @@ class WebRTCServer:
|
||||
self.pcs = set()
|
||||
self.fps = fps
|
||||
self.frameContainer = [None]
|
||||
self.frame_lock = threading.Lock()
|
||||
self.hub = MonitoringHub()
|
||||
self.sio = None
|
||||
|
||||
@@ -161,7 +162,7 @@ class WebRTCServer:
|
||||
await pc.setRemoteDescription(
|
||||
RTCSessionDescription(offer["sdp"], offer.get("type", "offer"))
|
||||
)
|
||||
pc.addTrack(VideoFrameTrack(self.fps, self.frameContainer))
|
||||
pc.addTrack(VideoFrameTrack(self.fps, self.frameContainer, self.frame_lock))
|
||||
|
||||
dc = pc.createDataChannel("monitoring")
|
||||
|
||||
@@ -179,10 +180,12 @@ class WebRTCServer:
|
||||
asyncio.run_coroutine_threadsafe(self._websocket_start(), self.background_loop)
|
||||
|
||||
def provide_frame(self, frame):
|
||||
self.frameContainer[0] = frame
|
||||
with self.frame_lock:
|
||||
self.frameContainer[0] = frame.copy()
|
||||
|
||||
def send_data(self, data):
|
||||
self.hub.send_data(data)
|
||||
if self.background_loop.is_running():
|
||||
self.background_loop.call_soon_threadsafe(self.hub.send_data, data)
|
||||
|
||||
def alert(self, timestamp, summary, level):
|
||||
payload = {
|
||||
@@ -207,10 +210,11 @@ class WebRTCServer:
|
||||
|
||||
|
||||
class VideoFrameTrack(VideoStreamTrack):
|
||||
def __init__(self, fps, fc):
|
||||
def __init__(self, fps, fc, lock):
|
||||
super().__init__()
|
||||
self.fps = fps
|
||||
self.frameContainer = fc
|
||||
self.frame_lock = lock
|
||||
|
||||
async def next_timestamp(self):
|
||||
"""
|
||||
@@ -230,11 +234,13 @@ class VideoFrameTrack(VideoStreamTrack):
|
||||
|
||||
async def recv(self):
|
||||
pts, time_base = await self.next_timestamp()
|
||||
frame = self.frameContainer[0]
|
||||
with self.frame_lock:
|
||||
frame = self.frameContainer[0]
|
||||
if frame is not None:
|
||||
frame = frame.copy()
|
||||
if frame is None:
|
||||
frame = np.zeros((480, 640, 3), dtype=np.uint8)
|
||||
else:
|
||||
frame = self.frameContainer[0]
|
||||
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
|
||||
video_frame = av.VideoFrame.from_ndarray(frame, format="rgb24")
|
||||
video_frame.pts = pts
|
||||
@@ -255,4 +261,4 @@ def route_channel(channel):
|
||||
print(f"Latency: {now - pre}ms")
|
||||
|
||||
case _:
|
||||
print(f"Unknown Channel {channel.label}")
|
||||
print(f"Unknown Channel {channel.label}")
|
||||
|
||||
Reference in New Issue
Block a user