matrice-streaming 0.1.14__py3-none-any.whl → 0.1.65__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- matrice_streaming/__init__.py +44 -32
- matrice_streaming/streaming_gateway/camera_streamer/__init__.py +68 -1
- matrice_streaming/streaming_gateway/camera_streamer/async_camera_worker.py +1388 -0
- matrice_streaming/streaming_gateway/camera_streamer/async_ffmpeg_worker.py +966 -0
- matrice_streaming/streaming_gateway/camera_streamer/camera_streamer.py +188 -24
- matrice_streaming/streaming_gateway/camera_streamer/device_detection.py +507 -0
- matrice_streaming/streaming_gateway/camera_streamer/encoding_pool_manager.py +136 -0
- matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_camera_streamer.py +1048 -0
- matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_config.py +192 -0
- matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_worker_manager.py +470 -0
- matrice_streaming/streaming_gateway/camera_streamer/gstreamer_camera_streamer.py +1368 -0
- matrice_streaming/streaming_gateway/camera_streamer/gstreamer_worker.py +1063 -0
- matrice_streaming/streaming_gateway/camera_streamer/gstreamer_worker_manager.py +546 -0
- matrice_streaming/streaming_gateway/camera_streamer/message_builder.py +60 -15
- matrice_streaming/streaming_gateway/camera_streamer/nvdec.py +1330 -0
- matrice_streaming/streaming_gateway/camera_streamer/nvdec_worker_manager.py +412 -0
- matrice_streaming/streaming_gateway/camera_streamer/platform_pipelines.py +680 -0
- matrice_streaming/streaming_gateway/camera_streamer/stream_statistics.py +111 -4
- matrice_streaming/streaming_gateway/camera_streamer/video_capture_manager.py +223 -27
- matrice_streaming/streaming_gateway/camera_streamer/worker_manager.py +694 -0
- matrice_streaming/streaming_gateway/debug/__init__.py +27 -2
- matrice_streaming/streaming_gateway/debug/benchmark.py +727 -0
- matrice_streaming/streaming_gateway/debug/debug_gstreamer_gateway.py +599 -0
- matrice_streaming/streaming_gateway/debug/debug_streaming_gateway.py +245 -95
- matrice_streaming/streaming_gateway/debug/debug_utils.py +29 -0
- matrice_streaming/streaming_gateway/debug/test_videoplayback.py +318 -0
- matrice_streaming/streaming_gateway/dynamic_camera_manager.py +656 -39
- matrice_streaming/streaming_gateway/metrics_reporter.py +676 -139
- matrice_streaming/streaming_gateway/streaming_action.py +71 -20
- matrice_streaming/streaming_gateway/streaming_gateway.py +1026 -78
- matrice_streaming/streaming_gateway/streaming_gateway_utils.py +175 -20
- matrice_streaming/streaming_gateway/streaming_status_listener.py +89 -0
- {matrice_streaming-0.1.14.dist-info → matrice_streaming-0.1.65.dist-info}/METADATA +1 -1
- matrice_streaming-0.1.65.dist-info/RECORD +56 -0
- matrice_streaming-0.1.14.dist-info/RECORD +0 -38
- {matrice_streaming-0.1.14.dist-info → matrice_streaming-0.1.65.dist-info}/WHEEL +0 -0
- {matrice_streaming-0.1.14.dist-info → matrice_streaming-0.1.65.dist-info}/licenses/LICENSE.txt +0 -0
- {matrice_streaming-0.1.14.dist-info → matrice_streaming-0.1.65.dist-info}/top_level.txt +0 -0
|
@@ -3,6 +3,7 @@ import re
|
|
|
3
3
|
from typing import Optional, Union, Dict, List
|
|
4
4
|
import logging
|
|
5
5
|
import time
|
|
6
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
6
7
|
from matrice_common.session import Session
|
|
7
8
|
|
|
8
9
|
|
|
@@ -27,11 +28,12 @@ class InputStream:
|
|
|
27
28
|
class StreamingGatewayUtil:
|
|
28
29
|
|
|
29
30
|
def __init__(
|
|
30
|
-
self, session: Session, streaming_gateway_id: str, server_id: str = None
|
|
31
|
+
self, session: Session, streaming_gateway_id: str, server_id: str = None, action_id: str = None
|
|
31
32
|
):
|
|
32
33
|
self.session = session
|
|
33
34
|
self.streaming_gateway_id = streaming_gateway_id
|
|
34
35
|
self.server_id = server_id
|
|
36
|
+
self.action_id = action_id
|
|
35
37
|
if not self.server_id and self.streaming_gateway_id:
|
|
36
38
|
self.server_id = self.get_streaming_gateway_by_id().get("serverId")
|
|
37
39
|
|
|
@@ -159,12 +161,24 @@ class StreamingGatewayUtil:
|
|
|
159
161
|
|
|
160
162
|
def get_input_streams(self) -> List[InputStream]:
|
|
161
163
|
"""Get cameras as list of InputStream objects with proper configuration."""
|
|
164
|
+
# Time the first 3 API calls
|
|
165
|
+
start = time.time()
|
|
162
166
|
cameras = self.get_cameras()
|
|
167
|
+
cameras_time = time.time() - start
|
|
168
|
+
logging.info(f"API call get_cameras() took {cameras_time:.3f}s")
|
|
169
|
+
|
|
170
|
+
start = time.time()
|
|
163
171
|
camera_groups = self.get_camera_groups()
|
|
172
|
+
groups_time = time.time() - start
|
|
173
|
+
logging.info(f"API call get_camera_groups() took {groups_time:.3f}s")
|
|
174
|
+
|
|
175
|
+
start = time.time()
|
|
164
176
|
input_topics = self.get_streaming_input_topics()
|
|
177
|
+
topics_time = time.time() - start
|
|
178
|
+
logging.info(f"API call get_streaming_input_topics() took {topics_time:.3f}s")
|
|
165
179
|
|
|
166
180
|
if not cameras:
|
|
167
|
-
logging.warning("No cameras found for streaming gateway"
|
|
181
|
+
logging.warning("No cameras found for streaming gateway")
|
|
168
182
|
return []
|
|
169
183
|
|
|
170
184
|
# Create lookup dictionaries
|
|
@@ -173,6 +187,75 @@ class StreamingGatewayUtil:
|
|
|
173
187
|
topic["cameraId"]: topic["topicName"] for topic in (input_topics or [])
|
|
174
188
|
}
|
|
175
189
|
|
|
190
|
+
# Identify FILE cameras that need simulated stream URLs
|
|
191
|
+
file_cameras = [c for c in cameras if c.get("protocolType") == "FILE"]
|
|
192
|
+
|
|
193
|
+
# Fetch simulated URLs concurrently, with caching for cameras sharing the same simulationVideoPath
|
|
194
|
+
stream_url_lookup = {}
|
|
195
|
+
if file_cameras:
|
|
196
|
+
# Group cameras by simulationVideoPath to avoid redundant API calls
|
|
197
|
+
# Only group non-empty paths; empty paths need individual API calls
|
|
198
|
+
path_to_cameras: Dict[str, List[dict]] = {}
|
|
199
|
+
cameras_needing_api_call = []
|
|
200
|
+
|
|
201
|
+
for camera in file_cameras:
|
|
202
|
+
sim_path = camera.get("simulationVideoPath", "")
|
|
203
|
+
if sim_path: # Non-empty path - can potentially share URL
|
|
204
|
+
if sim_path not in path_to_cameras:
|
|
205
|
+
path_to_cameras[sim_path] = []
|
|
206
|
+
# First camera with this path will make the API call
|
|
207
|
+
cameras_needing_api_call.append(camera)
|
|
208
|
+
path_to_cameras[sim_path].append(camera)
|
|
209
|
+
else:
|
|
210
|
+
# Empty path - needs its own API call
|
|
211
|
+
cameras_needing_api_call.append(camera)
|
|
212
|
+
|
|
213
|
+
logging.info(
|
|
214
|
+
f"FILE cameras: {len(file_cameras)} total, {len(cameras_needing_api_call)} unique API calls needed "
|
|
215
|
+
f"({len(file_cameras) - len(cameras_needing_api_call)} will use cached URLs)"
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
max_workers = min(len(cameras_needing_api_call), 100) # Max 100 concurrent requests
|
|
219
|
+
start = time.time()
|
|
220
|
+
|
|
221
|
+
# Cache to store presigned URL by simulationVideoPath
|
|
222
|
+
path_url_cache: Dict[str, str] = {}
|
|
223
|
+
|
|
224
|
+
with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
|
225
|
+
future_to_camera = {
|
|
226
|
+
executor.submit(self.get_simulated_stream_url, c["id"]): c
|
|
227
|
+
for c in cameras_needing_api_call
|
|
228
|
+
}
|
|
229
|
+
for future in as_completed(future_to_camera):
|
|
230
|
+
camera = future_to_camera[future]
|
|
231
|
+
camera_id = camera["id"]
|
|
232
|
+
sim_path = camera.get("simulationVideoPath", "")
|
|
233
|
+
try:
|
|
234
|
+
result = future.result()
|
|
235
|
+
if result and result.get("url"):
|
|
236
|
+
presigned_url = result["url"]
|
|
237
|
+
stream_url_lookup[camera_id] = presigned_url
|
|
238
|
+
# Cache the URL for this simulationVideoPath
|
|
239
|
+
if sim_path:
|
|
240
|
+
path_url_cache[sim_path] = presigned_url
|
|
241
|
+
except Exception as e:
|
|
242
|
+
logging.warning(f"Failed to get stream URL for camera {camera_id}: {e}")
|
|
243
|
+
|
|
244
|
+
# Apply cached URLs to cameras that share the same simulationVideoPath
|
|
245
|
+
for sim_path, cameras_with_path in path_to_cameras.items():
|
|
246
|
+
if sim_path in path_url_cache:
|
|
247
|
+
cached_url = path_url_cache[sim_path]
|
|
248
|
+
for camera in cameras_with_path:
|
|
249
|
+
# Only set if not already set (the first camera already has it)
|
|
250
|
+
if camera["id"] not in stream_url_lookup:
|
|
251
|
+
stream_url_lookup[camera["id"]] = cached_url
|
|
252
|
+
|
|
253
|
+
urls_time = time.time() - start
|
|
254
|
+
logging.info(
|
|
255
|
+
f"Concurrent fetch of {len(cameras_needing_api_call)} stream URLs took {urls_time:.3f}s "
|
|
256
|
+
f"(max_workers={max_workers}, cached {len(file_cameras) - len(cameras_needing_api_call)} URLs)"
|
|
257
|
+
)
|
|
258
|
+
|
|
176
259
|
input_streams = []
|
|
177
260
|
|
|
178
261
|
for camera in cameras:
|
|
@@ -192,10 +275,9 @@ class StreamingGatewayUtil:
|
|
|
192
275
|
simulate_video = False
|
|
193
276
|
|
|
194
277
|
if camera.get("protocolType") == "FILE":
|
|
195
|
-
#
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
source = stream_url_data["url"]
|
|
278
|
+
# Use pre-fetched URL from concurrent lookup
|
|
279
|
+
if camera_id in stream_url_lookup:
|
|
280
|
+
source = stream_url_lookup[camera_id]
|
|
199
281
|
simulate_video = True
|
|
200
282
|
else:
|
|
201
283
|
# Fallback to simulation video path
|
|
@@ -216,7 +298,7 @@ class StreamingGatewayUtil:
|
|
|
216
298
|
camera_key=camera.get("cameraName", "Unknown Camera"),
|
|
217
299
|
camera_group_key=camera_group.get(
|
|
218
300
|
"cameraGroupName", "Unknown Camera Group"
|
|
219
|
-
),
|
|
301
|
+
),
|
|
220
302
|
camera_location=camera_group.get(
|
|
221
303
|
"locationId", "Unknown Camera Location"
|
|
222
304
|
),
|
|
@@ -227,10 +309,7 @@ class StreamingGatewayUtil:
|
|
|
227
309
|
|
|
228
310
|
input_streams.append(input_stream)
|
|
229
311
|
|
|
230
|
-
logging.info(
|
|
231
|
-
f"Created {len(input_streams)} input streams for streaming gateway",
|
|
232
|
-
exc_info=True,
|
|
233
|
-
)
|
|
312
|
+
logging.info(f"Created {len(input_streams)} input streams for streaming gateway")
|
|
234
313
|
return input_streams
|
|
235
314
|
|
|
236
315
|
def start_streaming(self) -> Optional[Dict]:
|
|
@@ -345,19 +424,21 @@ class StreamingGatewayUtil:
|
|
|
345
424
|
|
|
346
425
|
def _get_redis_connection_info():
|
|
347
426
|
try:
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
427
|
+
# Build URL with actionId query parameter if available
|
|
428
|
+
url = f"/v1/actions/redis_servers/{server_id}"
|
|
429
|
+
if self.action_id:
|
|
430
|
+
url += f"?actionId={self.action_id}"
|
|
431
|
+
response = self.session.rpc.get(url)
|
|
351
432
|
if response.get("success", False):
|
|
352
433
|
data = response.get("data")
|
|
353
434
|
if (
|
|
354
435
|
data
|
|
355
|
-
|
|
436
|
+
# TODO: Check why BE is giving host as empty while in the DB it is localhost
|
|
356
437
|
and data.get("port")
|
|
357
438
|
and data.get("status") == "running"
|
|
358
439
|
):
|
|
359
440
|
return {
|
|
360
|
-
"host": data
|
|
441
|
+
"host": data.get("host") or "localhost",
|
|
361
442
|
"port": int(data["port"]),
|
|
362
443
|
"password": data.get("password", ""),
|
|
363
444
|
"username": data.get("username"),
|
|
@@ -413,9 +494,10 @@ class StreamingGatewayUtil:
|
|
|
413
494
|
f"/v1/actions/get_kafka_server/{server_id}"
|
|
414
495
|
)
|
|
415
496
|
else:
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
497
|
+
url = f"/v1/actions/redis_servers/{server_id}"
|
|
498
|
+
if self.action_id:
|
|
499
|
+
url += f"?actionId={self.action_id}"
|
|
500
|
+
response = self.session.rpc.get(url)
|
|
419
501
|
logging.error("Last response received: %s", response)
|
|
420
502
|
except Exception as exc:
|
|
421
503
|
logging.error(
|
|
@@ -465,4 +547,77 @@ class StreamingGatewayUtil:
|
|
|
465
547
|
return success
|
|
466
548
|
except Exception as e:
|
|
467
549
|
logging.error(f"Failed to send heartbeat: {e}", exc_info=True)
|
|
468
|
-
return False
|
|
550
|
+
return False
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
def input_stream_to_camera_config(input_stream: InputStream) -> Dict:
|
|
554
|
+
"""Convert InputStream dataclass to camera_config dict for WorkerManager.
|
|
555
|
+
|
|
556
|
+
This adapter function converts the InputStream configuration format used by
|
|
557
|
+
StreamingGateway to the dictionary format expected by WorkerManager and
|
|
558
|
+
AsyncCameraWorker.
|
|
559
|
+
|
|
560
|
+
Args:
|
|
561
|
+
input_stream: InputStream dataclass instance
|
|
562
|
+
|
|
563
|
+
Returns:
|
|
564
|
+
Dict compatible with WorkerManager/AsyncCameraWorker
|
|
565
|
+
"""
|
|
566
|
+
return {
|
|
567
|
+
'stream_key': input_stream.camera_key or f"camera_{input_stream.camera_id}",
|
|
568
|
+
'camera_id': input_stream.camera_id,
|
|
569
|
+
'source': input_stream.source,
|
|
570
|
+
'topic': input_stream.camera_input_topic or f"{input_stream.camera_id}_input_topic",
|
|
571
|
+
'fps': input_stream.fps,
|
|
572
|
+
'quality': input_stream.quality,
|
|
573
|
+
'width': input_stream.width,
|
|
574
|
+
'height': input_stream.height,
|
|
575
|
+
'camera_location': input_stream.camera_location or "Unknown",
|
|
576
|
+
'stream_group_key': input_stream.camera_group_key or "default",
|
|
577
|
+
'simulate_video_file_stream': input_stream.simulate_video_file_stream,
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
def build_stream_config(
|
|
582
|
+
gateway_util: StreamingGatewayUtil,
|
|
583
|
+
server_type: str,
|
|
584
|
+
service_id: str,
|
|
585
|
+
stream_maxlen: int = None
|
|
586
|
+
) -> Dict:
|
|
587
|
+
"""Build stream_config dict for WorkerManager from gateway connection info.
|
|
588
|
+
|
|
589
|
+
This function retrieves connection information from the API and builds
|
|
590
|
+
a configuration dictionary suitable for WorkerManager and AsyncCameraWorker.
|
|
591
|
+
|
|
592
|
+
Args:
|
|
593
|
+
gateway_util: StreamingGatewayUtil instance for API calls
|
|
594
|
+
server_type: 'kafka' or 'redis'
|
|
595
|
+
service_id: Streaming gateway ID (used as service_id)
|
|
596
|
+
stream_maxlen: Maximum entries per Redis stream (approximate mode, default: None = unlimited)
|
|
597
|
+
|
|
598
|
+
Returns:
|
|
599
|
+
Dict with connection configuration for WorkerManager
|
|
600
|
+
"""
|
|
601
|
+
# Get connection info (this already waits for server to be ready)
|
|
602
|
+
connection_info = gateway_util.get_and_wait_for_connection_info(
|
|
603
|
+
server_type=server_type
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
# Build stream config
|
|
607
|
+
stream_config = {
|
|
608
|
+
**connection_info,
|
|
609
|
+
'service_id': service_id,
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
# Add Redis-specific batching defaults if applicable
|
|
613
|
+
# These will be auto-optimized by WorkerManager based on camera count
|
|
614
|
+
if server_type.lower() == 'redis':
|
|
615
|
+
stream_config.update({
|
|
616
|
+
'pool_max_connections': 500, # High connection pool for 1000+ cameras
|
|
617
|
+
'enable_batching': True,
|
|
618
|
+
'batch_size': 10,
|
|
619
|
+
'batch_timeout': 0.01,
|
|
620
|
+
'stream_maxlen': stream_maxlen, # Redis XADD maxlen (approximate mode)
|
|
621
|
+
})
|
|
622
|
+
|
|
623
|
+
return stream_config
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""Kafka listener for streaming gateway status events (stop commands)."""
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Callable
|
|
4
|
+
from matrice_common.session import Session
|
|
5
|
+
from matrice_common.stream import EventListener as GenericEventListener
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class StreamingStatusListener:
|
|
9
|
+
"""Listener for streaming gateway status events from Kafka.
|
|
10
|
+
|
|
11
|
+
This class listens to the Streaming_Events_Status topic and triggers
|
|
12
|
+
a callback when a stop command is received for this gateway.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
session: Session,
|
|
18
|
+
streaming_gateway_id: str,
|
|
19
|
+
action_id: str,
|
|
20
|
+
on_stop_callback: Callable[[], None],
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Initialize status listener.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
session: Session object for authentication
|
|
26
|
+
streaming_gateway_id: ID of streaming gateway to filter events
|
|
27
|
+
action_id: ID of action record to filter events
|
|
28
|
+
on_stop_callback: Callback function to invoke when stop event is received
|
|
29
|
+
"""
|
|
30
|
+
self.streaming_gateway_id = streaming_gateway_id
|
|
31
|
+
self.action_id = action_id
|
|
32
|
+
self.on_stop_callback = on_stop_callback
|
|
33
|
+
self.logger = logging.getLogger(__name__)
|
|
34
|
+
|
|
35
|
+
# Create generic event listener for Streaming_Events_Status
|
|
36
|
+
self._listener = GenericEventListener(
|
|
37
|
+
session=session,
|
|
38
|
+
topics=['Streaming_Events_Status'],
|
|
39
|
+
event_handler=self.handle_event,
|
|
40
|
+
filter_field='streamingGatewayId',
|
|
41
|
+
filter_value=streaming_gateway_id,
|
|
42
|
+
consumer_group_id=f"stg_status_events_{streaming_gateway_id}_{str(action_id)}"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
self.logger.info(f"StreamingStatusListener initialized for gateway {streaming_gateway_id}")
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def is_listening(self) -> bool:
|
|
49
|
+
"""Check if listener is active."""
|
|
50
|
+
return self._listener.is_listening
|
|
51
|
+
|
|
52
|
+
def start(self) -> bool:
|
|
53
|
+
"""Start listening to status events.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
bool: True if started successfully
|
|
57
|
+
"""
|
|
58
|
+
return self._listener.start()
|
|
59
|
+
|
|
60
|
+
def stop(self):
|
|
61
|
+
"""Stop listening."""
|
|
62
|
+
self._listener.stop()
|
|
63
|
+
|
|
64
|
+
def handle_event(self, event: dict):
|
|
65
|
+
"""Handle status event.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
event: Status event dict with eventType, streamingGatewayId, timestamp
|
|
69
|
+
"""
|
|
70
|
+
if event.get('actionId') != self.action_id:
|
|
71
|
+
self.logger.info(f"Ignoring event for action {event.get('actionId')} - not matching {self.action_id}")
|
|
72
|
+
return
|
|
73
|
+
|
|
74
|
+
event_type = event.get('eventType')
|
|
75
|
+
|
|
76
|
+
self.logger.info(f"Received status event: {event_type} for gateway {self.streaming_gateway_id}")
|
|
77
|
+
|
|
78
|
+
if event_type == 'stopped':
|
|
79
|
+
self.logger.info(f"Stop command received for gateway {self.streaming_gateway_id}")
|
|
80
|
+
try:
|
|
81
|
+
self.on_stop_callback()
|
|
82
|
+
except Exception as e:
|
|
83
|
+
self.logger.error(f"Error executing stop callback: {e}", exc_info=True)
|
|
84
|
+
else:
|
|
85
|
+
self.logger.debug(f"Ignoring event type: {event_type}")
|
|
86
|
+
|
|
87
|
+
def get_statistics(self) -> dict:
|
|
88
|
+
"""Get statistics."""
|
|
89
|
+
return self._listener.get_statistics()
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
matrice_streaming/__init__.py,sha256=I8Op5-eLKbnCHV4gW25wwEd-PhrdiPQ61XAHzjQSwB8,1447
|
|
2
|
+
matrice_streaming/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
matrice_streaming/client/__init__.py,sha256=xkONxPt6ZX46098YE-qMPQXtqfDwGxc2k_n4i89vC1c,81
|
|
4
|
+
matrice_streaming/client/client.py,sha256=27rEXAZJ1jepe77uJN6COZyMWRX4pEDTyidZvNlJS40,18955
|
|
5
|
+
matrice_streaming/client/client_utils.py,sha256=k6GlMAYu2dmmzxejwvU4K7zIVb2Q0_RcCai9LhCXPBg,16613
|
|
6
|
+
matrice_streaming/deployment/__init__.py,sha256=T9hgJhjH55Qczlc80do4Cy5Nycko2qDj9Pa_dTD8wKE,798
|
|
7
|
+
matrice_streaming/deployment/camera_manager.py,sha256=QRIgZf4RkP17rYR-zhWWW8XqgCRQF5W_LCkWkeVm6k4,89933
|
|
8
|
+
matrice_streaming/deployment/deployment.py,sha256=TdlQcUuVEi5mOo0jsUk-Ql92ABQ0UJrXZmJeNYCt8WY,48101
|
|
9
|
+
matrice_streaming/deployment/inference_pipeline.py,sha256=pBrruqg0AlskvewrxnA76biCVZeSERSWA0QselpLD_Q,37938
|
|
10
|
+
matrice_streaming/deployment/streaming_gateway_manager.py,sha256=GtZosjeC4jj_hBOjAf5CNxUmCN0JBiuLVM-MKq5Sf4g,28787
|
|
11
|
+
matrice_streaming/deployment/todo.txt,sha256=J6NFH2NZDiFWqZ7wH9_m_lHGLcEHlCysVqYLxNtSBlg,65
|
|
12
|
+
matrice_streaming/streaming_gateway/__init__.py,sha256=qwTHom7ZKvzkFCAWNfl_w5eMyvNf8ysN044W5JAcqvg,912
|
|
13
|
+
matrice_streaming/streaming_gateway/dynamic_camera_manager.py,sha256=DCXyufxK_z4STFtmU82Jt_i3bCOYpLQHh4Rqn9YfaDA,47717
|
|
14
|
+
matrice_streaming/streaming_gateway/event_listener.py,sha256=7x-TKjsAsSFXlGq88bfGB1IR8A5rJTrAotJEBklyofk,3084
|
|
15
|
+
matrice_streaming/streaming_gateway/metrics_reporter.py,sha256=N9At7kEvY6mkMzibdcSzyo4JJYhBiy9Kxqtd0AfuGCY,46670
|
|
16
|
+
matrice_streaming/streaming_gateway/streaming_action.py,sha256=o6favSDGY0wTMBCsx1lai8x7aBSDyGswAvDFIvsPYgA,30189
|
|
17
|
+
matrice_streaming/streaming_gateway/streaming_gateway.py,sha256=fxKsR0QkQGyncEkpg-ZtEqTFenlFOD8BlC1baK98a7o,61124
|
|
18
|
+
matrice_streaming/streaming_gateway/streaming_gateway_utils.py,sha256=6kNYgl3f7HmeKFKYUW1IncNv8zT6rqpQxh_FDWEbKow,25271
|
|
19
|
+
matrice_streaming/streaming_gateway/streaming_status_listener.py,sha256=RgbW0xYbbpmO6ZjkVlh6fg8iqkpRaIShR2dQ3SMVFUw,3161
|
|
20
|
+
matrice_streaming/streaming_gateway/camera_streamer/ARCHITECTURE.md,sha256=kngsqiS1PdNYhihBoMtoiIf3THJ4OM33E_hxExqzKqY,9980
|
|
21
|
+
matrice_streaming/streaming_gateway/camera_streamer/__init__.py,sha256=8KyT8W_ckrukaP-vTnX78zD57OglYThSOl_HB7zW524,1907
|
|
22
|
+
matrice_streaming/streaming_gateway/camera_streamer/async_camera_worker.py,sha256=Bg7yfkCn2RofLqviq22eKRhdxMYtqaeTFJC2no94_lI,59278
|
|
23
|
+
matrice_streaming/streaming_gateway/camera_streamer/async_ffmpeg_worker.py,sha256=isBYJnnbdxefkRrV2BsizCSZe1ZDPn5wfoTSOTtObsU,37007
|
|
24
|
+
matrice_streaming/streaming_gateway/camera_streamer/camera_streamer.py,sha256=1BzWnwfPEWPVQ6gBW7uZFvykq2zEvygd5LWE6uqVRhY,39085
|
|
25
|
+
matrice_streaming/streaming_gateway/camera_streamer/device_detection.py,sha256=9F4rsbMpIexOIlX8aCj7Q6PFG01kOS1wtgAIQBG0FaM,18463
|
|
26
|
+
matrice_streaming/streaming_gateway/camera_streamer/encoder_manager.py,sha256=guWqNtgGZQBVBxeDlAVnLWTP-hsleWmKYuVcnd0Hvn0,6962
|
|
27
|
+
matrice_streaming/streaming_gateway/camera_streamer/encoding_pool_manager.py,sha256=kYfHu-B8bw9wTFxociAYLVvk-UOC-KqcaFdZ1TQuah4,4222
|
|
28
|
+
matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_camera_streamer.py,sha256=sCeSTVqaYy-XK2fW7ZSMmGYMCTHrSiFCMizHTzMMJyo,37646
|
|
29
|
+
matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_config.py,sha256=fbogEMtmqw4Fae4MS7vL1oQeFy3FkQbJlRGRF_BxIIo,6156
|
|
30
|
+
matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_worker_manager.py,sha256=pzeDcgST8dHZs18Q4PgnR0-4Up8PU1oAOo8Daos_Y2o,17396
|
|
31
|
+
matrice_streaming/streaming_gateway/camera_streamer/frame_processor.py,sha256=UPifhOr7wYpA1ACU4xGzC3A4lmbr2FvohcG371O6FHQ,2255
|
|
32
|
+
matrice_streaming/streaming_gateway/camera_streamer/gstreamer_camera_streamer.py,sha256=Y_X_luPlvcqMzOn0qodS5opJ6BWjwUYOWWunUEX_10o,54289
|
|
33
|
+
matrice_streaming/streaming_gateway/camera_streamer/gstreamer_worker.py,sha256=AqKNJ6q_BxFphOlJ2GaS4WpoLCHXLEu5JVvoKQNrGV0,42822
|
|
34
|
+
matrice_streaming/streaming_gateway/camera_streamer/gstreamer_worker_manager.py,sha256=jlKwIWWMXpztdyKiyremGmkVyw9mf2AxEmT7154xnrc,22002
|
|
35
|
+
matrice_streaming/streaming_gateway/camera_streamer/message_builder.py,sha256=W295q6cIm05ReF1ooQus3rsKgZOG3EldZplbQco-OyM,10231
|
|
36
|
+
matrice_streaming/streaming_gateway/camera_streamer/nvdec.py,sha256=-vm0wncirN0S8OJu6flwzNxfePFIG4JjAj7GdbQBqzc,52495
|
|
37
|
+
matrice_streaming/streaming_gateway/camera_streamer/nvdec_worker_manager.py,sha256=KlcwKFUPVZTQ3J1VIuhPev8Xv9BNw4dj2iLGHrREQCQ,16035
|
|
38
|
+
matrice_streaming/streaming_gateway/camera_streamer/platform_pipelines.py,sha256=UNjsYYWbUJteOq2tzxISFAbWMa2e9GUExSS6fWc2Aow,27303
|
|
39
|
+
matrice_streaming/streaming_gateway/camera_streamer/retry_manager.py,sha256=d8tlGoWoeSlgpCgXbUHTM61ekCQZki7TO1HzL2yPVzk,3607
|
|
40
|
+
matrice_streaming/streaming_gateway/camera_streamer/stream_statistics.py,sha256=VC1S6ogiHUTlzTqn2wGOC1ClOEjvDgWm9Ydi9sWj-Do,18951
|
|
41
|
+
matrice_streaming/streaming_gateway/camera_streamer/video_capture_manager.py,sha256=ySnbihdkpFPcBdFK_OFcHE-MgjG2YirUUYgEJHhvTxo,16899
|
|
42
|
+
matrice_streaming/streaming_gateway/camera_streamer/worker_manager.py,sha256=JDckHyqer0ka4TbVzICEoXePSwRcT2y1YnChnfuK78c,27901
|
|
43
|
+
matrice_streaming/streaming_gateway/debug/README.md,sha256=6GeHClMjJbmVuSKbJ8yOIDqpeAPnLNrHXMFtmubZz0E,11343
|
|
44
|
+
matrice_streaming/streaming_gateway/debug/__init__.py,sha256=_RtvH0Y12HFiDoKK8BEsMwy6k_iAFjmYYNzMawbOfeQ,2026
|
|
45
|
+
matrice_streaming/streaming_gateway/debug/benchmark.py,sha256=65la9K2mjiiuADCBSnYpPr9uYFnM89clgw-KHkjSkAU,25563
|
|
46
|
+
matrice_streaming/streaming_gateway/debug/debug_gstreamer_gateway.py,sha256=l835qko6ULAmNJpV5JhtKvvuy04x2IuQLsdk5TMTqjY,24015
|
|
47
|
+
matrice_streaming/streaming_gateway/debug/debug_stream_backend.py,sha256=LIp--57wk9yF7hGzVbc6ObcL2kdfdX-opAqdidHx7pU,6068
|
|
48
|
+
matrice_streaming/streaming_gateway/debug/debug_streaming_gateway.py,sha256=ZiDg7I49Fo0FzHqRjjPgQUjyILdqNw_8RThXR7zQyRw,19432
|
|
49
|
+
matrice_streaming/streaming_gateway/debug/debug_utils.py,sha256=jWcSBgrk_YVt1QzSyw6geX17YBnTvgVdA5ubqO531a0,10477
|
|
50
|
+
matrice_streaming/streaming_gateway/debug/example_debug_streaming.py,sha256=-gS8zNDswAoj6oss66QQWYZhY24usfLiMH0FFK06vV0,7994
|
|
51
|
+
matrice_streaming/streaming_gateway/debug/test_videoplayback.py,sha256=s_dgWkoESiuJHlUAf_iv4d7OGmAhwocwDZmIcFUZzvo,11093
|
|
52
|
+
matrice_streaming-0.1.65.dist-info/licenses/LICENSE.txt,sha256=_uQUZpgO0mRYL5-fPoEvLSbNnLPv6OmbeEDCHXhK6Qc,1066
|
|
53
|
+
matrice_streaming-0.1.65.dist-info/METADATA,sha256=zxJffH2ItbfhMIzLN6IbwSy7CO_MFxsG3TENiHkTprc,2477
|
|
54
|
+
matrice_streaming-0.1.65.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
55
|
+
matrice_streaming-0.1.65.dist-info/top_level.txt,sha256=PM_trIe8f4JLc90J871rNMYGVM3Po9Inx4As5LrCFUU,18
|
|
56
|
+
matrice_streaming-0.1.65.dist-info/RECORD,,
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
matrice_streaming/__init__.py,sha256=V2ica8I9XhoC-euUzRA2_2IhT2UbtQ0tD28TsZnuKUc,897
|
|
2
|
-
matrice_streaming/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
matrice_streaming/client/__init__.py,sha256=xkONxPt6ZX46098YE-qMPQXtqfDwGxc2k_n4i89vC1c,81
|
|
4
|
-
matrice_streaming/client/client.py,sha256=27rEXAZJ1jepe77uJN6COZyMWRX4pEDTyidZvNlJS40,18955
|
|
5
|
-
matrice_streaming/client/client_utils.py,sha256=k6GlMAYu2dmmzxejwvU4K7zIVb2Q0_RcCai9LhCXPBg,16613
|
|
6
|
-
matrice_streaming/deployment/__init__.py,sha256=T9hgJhjH55Qczlc80do4Cy5Nycko2qDj9Pa_dTD8wKE,798
|
|
7
|
-
matrice_streaming/deployment/camera_manager.py,sha256=QRIgZf4RkP17rYR-zhWWW8XqgCRQF5W_LCkWkeVm6k4,89933
|
|
8
|
-
matrice_streaming/deployment/deployment.py,sha256=TdlQcUuVEi5mOo0jsUk-Ql92ABQ0UJrXZmJeNYCt8WY,48101
|
|
9
|
-
matrice_streaming/deployment/inference_pipeline.py,sha256=pBrruqg0AlskvewrxnA76biCVZeSERSWA0QselpLD_Q,37938
|
|
10
|
-
matrice_streaming/deployment/streaming_gateway_manager.py,sha256=GtZosjeC4jj_hBOjAf5CNxUmCN0JBiuLVM-MKq5Sf4g,28787
|
|
11
|
-
matrice_streaming/deployment/todo.txt,sha256=J6NFH2NZDiFWqZ7wH9_m_lHGLcEHlCysVqYLxNtSBlg,65
|
|
12
|
-
matrice_streaming/streaming_gateway/__init__.py,sha256=qwTHom7ZKvzkFCAWNfl_w5eMyvNf8ysN044W5JAcqvg,912
|
|
13
|
-
matrice_streaming/streaming_gateway/dynamic_camera_manager.py,sha256=4gY10QzVzSvxZZOF450FwYX5Ub66tdKoSnUCbcZ0K0A,21764
|
|
14
|
-
matrice_streaming/streaming_gateway/event_listener.py,sha256=7x-TKjsAsSFXlGq88bfGB1IR8A5rJTrAotJEBklyofk,3084
|
|
15
|
-
matrice_streaming/streaming_gateway/metrics_reporter.py,sha256=iA3LVbBe4yUz8C921aMYuqMIgHa_lvLgR_NiTz6xZdI,23395
|
|
16
|
-
matrice_streaming/streaming_gateway/streaming_action.py,sha256=k0_h83s1mz_92MEIlEKQn0jPFtnLQDe_N4nGL_-d8g0,27246
|
|
17
|
-
matrice_streaming/streaming_gateway/streaming_gateway.py,sha256=hbZIr9KGkmOXjYj6OII2yYay4j3KaH1fQmbpd71ZAG4,15604
|
|
18
|
-
matrice_streaming/streaming_gateway/streaming_gateway_utils.py,sha256=NsUemNrG7pJnYZBtFTiHU_kb_j_vJ4kPmdh4iVxp-W0,18159
|
|
19
|
-
matrice_streaming/streaming_gateway/camera_streamer/ARCHITECTURE.md,sha256=kngsqiS1PdNYhihBoMtoiIf3THJ4OM33E_hxExqzKqY,9980
|
|
20
|
-
matrice_streaming/streaming_gateway/camera_streamer/__init__.py,sha256=GFbHW9Ch9cmwhsQuu0Gfg5aGOpxyiWxsLGIEJKxpS2s,73
|
|
21
|
-
matrice_streaming/streaming_gateway/camera_streamer/camera_streamer.py,sha256=udYDvRmXcNcyJfLeg9F6JJh3hBmMtIR5s1YGhVMCvDQ,31253
|
|
22
|
-
matrice_streaming/streaming_gateway/camera_streamer/encoder_manager.py,sha256=guWqNtgGZQBVBxeDlAVnLWTP-hsleWmKYuVcnd0Hvn0,6962
|
|
23
|
-
matrice_streaming/streaming_gateway/camera_streamer/frame_processor.py,sha256=UPifhOr7wYpA1ACU4xGzC3A4lmbr2FvohcG371O6FHQ,2255
|
|
24
|
-
matrice_streaming/streaming_gateway/camera_streamer/message_builder.py,sha256=CWJGiyrmc2yl0Yn9JchSkqIx8MzGEDfdSjnXakZ-DOc,8191
|
|
25
|
-
matrice_streaming/streaming_gateway/camera_streamer/retry_manager.py,sha256=d8tlGoWoeSlgpCgXbUHTM61ekCQZki7TO1HzL2yPVzk,3607
|
|
26
|
-
matrice_streaming/streaming_gateway/camera_streamer/stream_statistics.py,sha256=NgFTC24cL7k-g4ODSiuGpoBVXHcqxIVokXWFI1CoZlg,13663
|
|
27
|
-
matrice_streaming/streaming_gateway/camera_streamer/video_capture_manager.py,sha256=9zwOSLL10ZJX-Jm5EaX2U-Ub97oEkxGMdslwmufDTtM,8070
|
|
28
|
-
matrice_streaming/streaming_gateway/debug/README.md,sha256=6GeHClMjJbmVuSKbJ8yOIDqpeAPnLNrHXMFtmubZz0E,11343
|
|
29
|
-
matrice_streaming/streaming_gateway/debug/__init__.py,sha256=E__TO2CpZ38IimD_doWBAjFmCCZlPN--Z_Qa75BqnRA,1142
|
|
30
|
-
matrice_streaming/streaming_gateway/debug/debug_stream_backend.py,sha256=LIp--57wk9yF7hGzVbc6ObcL2kdfdX-opAqdidHx7pU,6068
|
|
31
|
-
matrice_streaming/streaming_gateway/debug/debug_streaming_gateway.py,sha256=IqPU2FRXP_iq5EjgRHyAHT7zVdSVa2K575eAod6WDQA,12317
|
|
32
|
-
matrice_streaming/streaming_gateway/debug/debug_utils.py,sha256=7YcGIGcYniadXgp1lCh0LAUxWJzU4-5qSbfT24cGU6Q,9553
|
|
33
|
-
matrice_streaming/streaming_gateway/debug/example_debug_streaming.py,sha256=-gS8zNDswAoj6oss66QQWYZhY24usfLiMH0FFK06vV0,7994
|
|
34
|
-
matrice_streaming-0.1.14.dist-info/licenses/LICENSE.txt,sha256=_uQUZpgO0mRYL5-fPoEvLSbNnLPv6OmbeEDCHXhK6Qc,1066
|
|
35
|
-
matrice_streaming-0.1.14.dist-info/METADATA,sha256=7hsf6cq6Kvv_I8tDrpN1AdU7ffGjPX4SUyfAEQDyan4,2477
|
|
36
|
-
matrice_streaming-0.1.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
37
|
-
matrice_streaming-0.1.14.dist-info/top_level.txt,sha256=PM_trIe8f4JLc90J871rNMYGVM3Po9Inx4As5LrCFUU,18
|
|
38
|
-
matrice_streaming-0.1.14.dist-info/RECORD,,
|
|
File without changes
|
{matrice_streaming-0.1.14.dist-info → matrice_streaming-0.1.65.dist-info}/licenses/LICENSE.txt
RENAMED
|
File without changes
|
|
File without changes
|