@@ -27,14 +27,6 @@ def __init__(
27
27
self ._deque_background_task : Optional [asyncio .Task ] = None
28
28
self ._active_viewers : Set [str ,] = set ()
29
29
30
- async def _add_viewer (self , viewer_token : Optional [str ] = None ) -> str :
31
- viewer_token = viewer_token or str (uuid .uuid4 ())
32
- self ._active_viewers .add (viewer_token )
33
- return viewer_token
34
-
35
- async def _remove_viewer (self , viewer_token : str ) -> None :
36
- self ._active_viewers .discard (viewer_token )
37
-
38
30
async def __clear_deque (self ) -> None :
39
31
while True :
40
32
await asyncio .sleep (1 / self .fps )
@@ -44,6 +36,14 @@ async def __clear_deque(self) -> None:
44
36
):
45
37
self ._frame_buffer .clear ()
46
38
39
+ async def _add_viewer (self , viewer_token : Optional [str ] = None ) -> str :
40
+ viewer_token = viewer_token or str (uuid .uuid4 ())
41
+ self ._active_viewers .add (viewer_token )
42
+ return viewer_token
43
+
44
+ async def _remove_viewer (self , viewer_token : str ) -> None :
45
+ self ._active_viewers .discard (viewer_token )
46
+
47
47
async def _ensure_background_tasks (self ) -> None :
48
48
if self ._deque_background_task is None or self ._deque_background_task .done ():
49
49
self ._deque_background_task = asyncio .create_task (self .__clear_deque ())
@@ -85,7 +85,8 @@ def set_fps(self, fps: int) -> None:
85
85
async def _get_frame (self ) -> np .ndarray :
86
86
# A little hacky, if you have a better way, please let me know
87
87
await self ._ensure_background_tasks ()
88
- # Checking here to avoid continous polling
88
+ # Checking the encoding here instead of set_frame
89
+ # to avoid continous polling
89
90
if self ._check_encoding (self ._frame ) != "jpeg" :
90
91
raise ValueError (
91
92
"Input is not an encoded JPEG frame. Use OpenCV's imencode method to encode the frame to JPEG."
@@ -113,6 +114,7 @@ def __init__(
113
114
) -> None :
114
115
self .size = size
115
116
self .quality = max (1 , min (quality , 100 ))
117
+ self ._last_processed_frame : np .ndarray = np .zeros ((320 , 240 , 1 ), dtype = np .uint8 )
116
118
super ().__init__ (name , fps )
117
119
118
120
async def __process_current_frame (self ) -> np .ndarray :
@@ -131,9 +133,12 @@ async def __process_current_frame(self) -> np.ndarray:
131
133
)
132
134
self ._frame_buffer .append (len (frame .tobytes ()))
133
135
self ._bandwidth_last_modified_time = time .time ()
136
+ self ._last_processed_frame = frame
134
137
return frame
135
138
136
139
async def _get_frame (self ) -> np .ndarray :
140
+ if time .time () - self ._bandwidth_last_modified_time <= 1 / self .fps :
141
+ return self ._last_processed_frame
137
142
await self ._ensure_background_tasks ()
138
143
async with self ._lock :
139
144
return await self .__process_current_frame ()
@@ -242,12 +247,15 @@ async def __process_current_frame(self) -> np.ndarray:
242
247
raise ValueError ("Error encoding frame" )
243
248
self ._frame_buffer .append (len (frame .tobytes ()))
244
249
self ._bandwidth_last_modified_time = time .time ()
250
+ self ._last_processed_frame = frame
245
251
return frame
246
252
247
253
async def _get_frame (self ) -> np .ndarray :
248
254
if not self ._is_running :
249
255
print ("Stream is not running, please call the start method first." )
250
256
return self ._frame
257
+ if time .time () - self ._bandwidth_last_modified_time <= 1 / self .fps :
258
+ return self ._last_processed_frame
251
259
await self ._ensure_background_tasks ()
252
260
async with self ._lock :
253
261
return await self .__process_current_frame ()
0 commit comments