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.
Files changed (38) hide show
  1. matrice_streaming/__init__.py +44 -32
  2. matrice_streaming/streaming_gateway/camera_streamer/__init__.py +68 -1
  3. matrice_streaming/streaming_gateway/camera_streamer/async_camera_worker.py +1388 -0
  4. matrice_streaming/streaming_gateway/camera_streamer/async_ffmpeg_worker.py +966 -0
  5. matrice_streaming/streaming_gateway/camera_streamer/camera_streamer.py +188 -24
  6. matrice_streaming/streaming_gateway/camera_streamer/device_detection.py +507 -0
  7. matrice_streaming/streaming_gateway/camera_streamer/encoding_pool_manager.py +136 -0
  8. matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_camera_streamer.py +1048 -0
  9. matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_config.py +192 -0
  10. matrice_streaming/streaming_gateway/camera_streamer/ffmpeg_worker_manager.py +470 -0
  11. matrice_streaming/streaming_gateway/camera_streamer/gstreamer_camera_streamer.py +1368 -0
  12. matrice_streaming/streaming_gateway/camera_streamer/gstreamer_worker.py +1063 -0
  13. matrice_streaming/streaming_gateway/camera_streamer/gstreamer_worker_manager.py +546 -0
  14. matrice_streaming/streaming_gateway/camera_streamer/message_builder.py +60 -15
  15. matrice_streaming/streaming_gateway/camera_streamer/nvdec.py +1330 -0
  16. matrice_streaming/streaming_gateway/camera_streamer/nvdec_worker_manager.py +412 -0
  17. matrice_streaming/streaming_gateway/camera_streamer/platform_pipelines.py +680 -0
  18. matrice_streaming/streaming_gateway/camera_streamer/stream_statistics.py +111 -4
  19. matrice_streaming/streaming_gateway/camera_streamer/video_capture_manager.py +223 -27
  20. matrice_streaming/streaming_gateway/camera_streamer/worker_manager.py +694 -0
  21. matrice_streaming/streaming_gateway/debug/__init__.py +27 -2
  22. matrice_streaming/streaming_gateway/debug/benchmark.py +727 -0
  23. matrice_streaming/streaming_gateway/debug/debug_gstreamer_gateway.py +599 -0
  24. matrice_streaming/streaming_gateway/debug/debug_streaming_gateway.py +245 -95
  25. matrice_streaming/streaming_gateway/debug/debug_utils.py +29 -0
  26. matrice_streaming/streaming_gateway/debug/test_videoplayback.py +318 -0
  27. matrice_streaming/streaming_gateway/dynamic_camera_manager.py +656 -39
  28. matrice_streaming/streaming_gateway/metrics_reporter.py +676 -139
  29. matrice_streaming/streaming_gateway/streaming_action.py +71 -20
  30. matrice_streaming/streaming_gateway/streaming_gateway.py +1026 -78
  31. matrice_streaming/streaming_gateway/streaming_gateway_utils.py +175 -20
  32. matrice_streaming/streaming_gateway/streaming_status_listener.py +89 -0
  33. {matrice_streaming-0.1.14.dist-info → matrice_streaming-0.1.65.dist-info}/METADATA +1 -1
  34. matrice_streaming-0.1.65.dist-info/RECORD +56 -0
  35. matrice_streaming-0.1.14.dist-info/RECORD +0 -38
  36. {matrice_streaming-0.1.14.dist-info → matrice_streaming-0.1.65.dist-info}/WHEEL +0 -0
  37. {matrice_streaming-0.1.14.dist-info → matrice_streaming-0.1.65.dist-info}/licenses/LICENSE.txt +0 -0
  38. {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", exc_info=True)
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
- # Get simulated stream URL for file type cameras
196
- stream_url_data = self.get_simulated_stream_url(camera_id)
197
- if stream_url_data and stream_url_data.get("url"):
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
- ), # TODO: change to location not id
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
- response = self.session.rpc.get(
349
- f"/v1/actions/redis_servers/{server_id}"
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
- and data.get("host")
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["host"],
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
- response = self.session.rpc.get(
417
- f"/v1/actions/redis_servers/{server_id}"
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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matrice_streaming
3
- Version: 0.1.14
3
+ Version: 0.1.65
4
4
  Summary: Common server utilities for Matrice.ai services
5
5
  Author-email: "Matrice.ai" <dipendra@matrice.ai>
6
6
  License-Expression: MIT
@@ -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,,