viso-sdk-python 1.1.23__tar.gz → 1.1.24__tar.gz

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 (147) hide show
  1. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/CHANGELOG.md +4 -0
  2. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/PKG-INFO +1 -1
  3. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/_version.c +11 -11
  4. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/_version.py +1 -1
  5. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/__init__.c +65 -38
  6. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/__init__.py +1 -0
  7. viso_sdk_python-1.1.24/viso_sdk/redis/frame_reader.c +10655 -0
  8. viso_sdk_python-1.1.24/viso_sdk/redis/frame_reader.py +97 -0
  9. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk_python.egg-info/PKG-INFO +1 -1
  10. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk_python.egg-info/SOURCES.txt +2 -0
  11. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/AUTHORS +0 -0
  12. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/COPYING +0 -0
  13. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/MANIFEST.in +0 -0
  14. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/README.md +0 -0
  15. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/Makefile +0 -0
  16. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/__init__.py +0 -0
  17. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/conf.py +0 -0
  18. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/ext/__init__.py +0 -0
  19. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/ext/docstrings.py +0 -0
  20. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/ext/manager_tmpl.j2 +0 -0
  21. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/index.rst +0 -0
  22. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/make.bat +0 -0
  23. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/modules.rst +0 -0
  24. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk._version.rst +0 -0
  25. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.constants.constants.rst +0 -0
  26. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.constants.modules.rst +0 -0
  27. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.constants.rst +0 -0
  28. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.constants.variables.rst +0 -0
  29. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.edge.common.rst +0 -0
  30. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.edge.rst +0 -0
  31. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.logging.logger.rst +0 -0
  32. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.logging.rst +0 -0
  33. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.model.download.rst +0 -0
  34. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.model.rst +0 -0
  35. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.mqtt.mqtt_wrapper.rst +0 -0
  36. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.mqtt.rst +0 -0
  37. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.mqtt.utils.rst +0 -0
  38. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.nodered.flow.rst +0 -0
  39. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.nodered.rst +0 -0
  40. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.redis.redis_wrapper.rst +0 -0
  41. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.redis.rst +0 -0
  42. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.rst +0 -0
  43. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.status.rst +0 -0
  44. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/docs/source/viso_sdk.status.status_logger.rst +0 -0
  45. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/pyproject.toml +0 -0
  46. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/requirements-dev.txt +0 -0
  47. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/requirements-docker.txt +0 -0
  48. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/requirements-docs.txt +0 -0
  49. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/requirements-lint.txt +0 -0
  50. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/requirements-test.txt +0 -0
  51. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/requirements.txt +0 -0
  52. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/setup.cfg +0 -0
  53. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/setup.py +0 -0
  54. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/__init__.py +0 -0
  55. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/conftest.py +0 -0
  56. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/fixtures/flow.json +0 -0
  57. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/integration/__init__.py +0 -0
  58. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/integration/test_status.py +0 -0
  59. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/meta/__init__.py +0 -0
  60. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/meta/test_ensure_type_hints.py +0 -0
  61. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/smoke/__init__.py +0 -0
  62. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/smoke/test_dists.py +0 -0
  63. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/__init__.py +0 -0
  64. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_flow.py +0 -0
  65. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_log_id.py +0 -0
  66. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_logger.py +0 -0
  67. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_model_fetch.py +0 -0
  68. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_nms.py +0 -0
  69. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_object.py +0 -0
  70. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_polygon_roi_manager.py +0 -0
  71. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_redis_utils.py +0 -0
  72. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_redis_wrapper.py +0 -0
  73. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_rollingq.py +0 -0
  74. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_stream_cleanup.py +0 -0
  75. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_trace_malloc.py +0 -0
  76. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tests/unit/test_viso_data.py +0 -0
  77. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/tox.ini +0 -0
  78. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/__init__.c +0 -0
  79. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/__init__.py +0 -0
  80. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/constants/__init__.c +0 -0
  81. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/constants/__init__.py +0 -0
  82. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/constants/constants.c +0 -0
  83. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/constants/constants.py +0 -0
  84. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/constants/modules.c +0 -0
  85. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/constants/modules.py +0 -0
  86. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/constants/variables.c +0 -0
  87. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/constants/variables.py +0 -0
  88. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/debug/__init__.c +0 -0
  89. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/debug/__init__.py +0 -0
  90. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/debug/trace_malloc.c +0 -0
  91. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/debug/trace_malloc.py +0 -0
  92. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/detection/__init__.c +0 -0
  93. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/detection/__init__.py +0 -0
  94. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/detection/model_utils.c +0 -0
  95. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/detection/model_utils.py +0 -0
  96. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/detection/nms.c +0 -0
  97. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/detection/nms.py +0 -0
  98. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/detection/object.c +0 -0
  99. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/detection/object.py +0 -0
  100. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/edge/__init__.c +0 -0
  101. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/edge/__init__.py +0 -0
  102. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/edge/common.c +0 -0
  103. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/edge/common.py +0 -0
  104. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/logging/__init__.c +0 -0
  105. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/logging/__init__.py +0 -0
  106. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/logging/log_id.c +0 -0
  107. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/logging/log_id.py +0 -0
  108. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/logging/logger.c +0 -0
  109. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/logging/logger.py +0 -0
  110. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/model/__init__.c +0 -0
  111. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/model/__init__.py +0 -0
  112. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/model/fetch.c +0 -0
  113. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/model/fetch.py +0 -0
  114. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/mqtt/__init__.c +0 -0
  115. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/mqtt/__init__.py +0 -0
  116. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/mqtt/mqtt_wrapper.c +0 -0
  117. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/mqtt/mqtt_wrapper.py +0 -0
  118. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/mqtt/utils.c +0 -0
  119. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/mqtt/utils.py +0 -0
  120. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/nodered/__init__.c +0 -0
  121. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/nodered/__init__.py +0 -0
  122. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/nodered/flow.c +0 -0
  123. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/nodered/flow.py +0 -0
  124. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/py.typed +0 -0
  125. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/redis_wrapper.c +0 -0
  126. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/redis_wrapper.py +0 -0
  127. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/stream_cleanup.c +0 -0
  128. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/stream_cleanup.py +0 -0
  129. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/utils.c +0 -0
  130. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/utils.py +0 -0
  131. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/viso_data.c +0 -0
  132. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/redis/viso_data.py +0 -0
  133. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/roi/__init__.c +0 -0
  134. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/roi/__init__.py +0 -0
  135. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/roi/polygon_roi_manager.c +0 -0
  136. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/roi/polygon_roi_manager.py +0 -0
  137. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/status/__init__.c +0 -0
  138. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/status/__init__.py +0 -0
  139. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/status/status_logger.c +0 -0
  140. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/status/status_logger.py +0 -0
  141. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/structures/__init__.c +0 -0
  142. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/structures/__init__.py +0 -0
  143. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/structures/rollingq.c +0 -0
  144. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk/structures/rollingq.py +0 -0
  145. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk_python.egg-info/dependency_links.txt +0 -0
  146. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk_python.egg-info/requires.txt +0 -0
  147. {viso_sdk_python-1.1.23 → viso_sdk_python-1.1.24}/viso_sdk_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,10 @@
1
1
  # Changelog
2
2
 
3
3
  <!--next-version-placeholder-->
4
+ ## v1.1.24
5
+ ### Features
6
+ - add `FrameReader` to centralise Redis frame consumption — moves the read→dedup→decode pipeline into a single SDK class; dedup is now checked on the raw dict before base64 decode and JPEG decompress, so duplicate polls at high poll rates are effectively free
7
+
4
8
  ## v1.1.23
5
9
  ### Fix
6
10
  - to debug, set log level via environment variable
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: viso-sdk-python
3
- Version: 1.1.23
3
+ Version: 1.1.24
4
4
  Summary: VisoSDK: A Python SDK for use in Viso containers
5
5
  Home-page: https://gitlab.com/TopKamera/03_edge/Base/viso-sdk-python-public.git
6
6
  Author: support@viso.ai
@@ -1994,7 +1994,7 @@ static __pyx_mstatetype * const __pyx_mstate_global = &__pyx_mstate_global_stati
1994
1994
  #endif
1995
1995
  /* #### Code section: constant_name_defines ### */
1996
1996
  #define __pyx_kp_u_ __pyx_string_tab[0]
1997
- #define __pyx_kp_u_1_1_23 __pyx_string_tab[1]
1997
+ #define __pyx_kp_u_1_1_24 __pyx_string_tab[1]
1998
1998
  #define __pyx_kp_u_Copyright_2020 __pyx_string_tab[2]
1999
1999
  #define __pyx_kp_u_Viso_ai_team __pyx_string_tab[3]
2000
2000
  #define __pyx_kp_u__2 __pyx_string_tab[4]
@@ -2605,16 +2605,16 @@ __Pyx_RefNannySetupContext("PyInit__version", 0);
2605
2605
  * __license__ = "LGPL3"
2606
2606
  * __title__ = "viso-sdk-python" # <<<<<<<<<<<<<<
2607
2607
  *
2608
- * __version__ = "1.1.23"
2608
+ * __version__ = "1.1.24"
2609
2609
  */
2610
2610
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_title, __pyx_mstate_global->__pyx_kp_u_viso_sdk_python) < (0)) __PYX_ERR(0, 15, __pyx_L1_error)
2611
2611
 
2612
2612
  /* "viso_sdk/_version.py":17
2613
2613
  * __title__ = "viso-sdk-python"
2614
2614
  *
2615
- * __version__ = "1.1.23" # <<<<<<<<<<<<<<
2615
+ * __version__ = "1.1.24" # <<<<<<<<<<<<<<
2616
2616
  */
2617
- if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_version, __pyx_mstate_global->__pyx_kp_u_1_1_23) < (0)) __PYX_ERR(0, 17, __pyx_L1_error)
2617
+ if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_version, __pyx_mstate_global->__pyx_kp_u_1_1_24) < (0)) __PYX_ERR(0, 17, __pyx_L1_error)
2618
2618
 
2619
2619
  /* "viso_sdk/_version.py":1
2620
2620
  * """ # <<<<<<<<<<<<<<
@@ -2688,24 +2688,24 @@ static int __Pyx_InitConstants(__pyx_mstatetype *__pyx_mstate) {
2688
2688
  CYTHON_UNUSED_VAR(__pyx_mstate);
2689
2689
  {
2690
2690
  const struct { const unsigned int length: 5; } index[] = {{1},{6},{15},{12},{1},{18},{26},{15},{5},{7},{10},{18},{13},{8},{8},{7},{9},{8},{11},{8},{10},{8},{3},{2},{4},{12},{10},{8},{9},{11},{4}};
2691
- #if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (243 bytes) */
2692
- const char* const cstring = "BZh91AY&SY\\\304\223o\000\000\007\337\200@\000@\003x\005\350\204A\000\277\357\377\2400\000\315[\r&\223\024\362\217\032\232j\000\321\264\232h\320\210\232m\t\211\246@\006\200\0005=M\252i\250a\242d\365\003A\246\215\n\021|O\005\273\033i\300\030\036d$\035\023_%\302\331\276\352swV\245p C<\203\025\304\234\361\341M\001\032 \200\201D\0065\256\370\001x\371\030\272o\317A\245K\320\344XnTfm\327\265MA\nn\333[\222\013\374\327\253}\241\245\344\300*(\004\357#\301\207&{\214\205\243R\"\327V&\256U#z{\240\367\342\304\311X\302\332lp\226\034\341\255\214\177M!8f\312\014\3702\027\204\207z\2272\004\201\222\020\346\226\223p\247\021\256=l\037\255ME\037W\260G\344_\305\334\221N\024$\0271$\333\300";
2693
- PyObject *data = __Pyx_DecompressString(cstring, 243, 2);
2691
+ #if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (242 bytes) */
2692
+ const char* const cstring = "BZh91AY&SY\315\371f>\000\000\007\337\200@\000@\003|\005\350\204A\000\277\357\377\2400\000\315[\r&\246#(\360S\312\000\320z\023\001\0214\332\023\023L\200\000\000\003S\324\332\246\232\206\231\244=L\2324\r4hL\213\374\257+\275\327. \300\370\360\361k\217\252lmpbg\332\357\013\215&@\206\037\202\221\314\234\247\306\232\0024A\001\002\210\014o]\346\006\361\3621u\357\3131\235K\320\300\260\330\207@\327\237\232\032\004J\026\355\232b\3335[\021\302\255\312D\240(9\001\t\021\315F\365b\351\013\006\204E\255\332.V\252\221\334\236\350=\363bd\253ae5\270K\206\020\322\266?\256HJ\0312c>\014\205\241\021\336\245\310\201 `\2049\245\234\334)\304k\217K\007\352\323AG\325\354\"\317\245\270\273\222)\302\204\206o\3131\360";
2693
+ PyObject *data = __Pyx_DecompressString(cstring, 242, 2);
2694
2694
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
2695
2695
  const char* const bytes = __Pyx_PyBytes_AsString(data);
2696
2696
  #if !CYTHON_ASSUME_SAFE_MACROS
2697
2697
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
2698
2698
  #endif
2699
- #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (194 bytes) */
2700
- const char* const cstring = "x\3325\216\315\216\3020\014\204_\245/\320\010\312u\265?\332\003\027\016\234\366j\231\304\245\026\251\335M\034P\337\236\224\322\323\214\346\323x\354\366n\357\272\303\257Ns\342\353`M\267\353v\355\037gu\310\215\021\216_W\3475U\210\362}\177\347\233\376\034\233\017\226^7\360\271h\233\303\255\235f\033TN\307\363\351\200\227<\241\r\000Xj\226\000|d!`\001K\350\351\202\376V\263\355\001\250\276$\010\234\002\032\031\217T\255\340H\0004\"\307\312\241\347H\213F\366$\371e+\222\227j(+\\;\242\017}\317\377\027\214k\230\311\002\365Xb]3\312\313&\030\333\332\273S\312\254\365\330L\230\2365\366m\352";
2701
- PyObject *data = __Pyx_DecompressString(cstring, 194, 1);
2699
+ #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (195 bytes) */
2700
+ const char* const cstring = "x\3325\216\275n\3030\014\204_\305/`!q;\006\375A\207,\031:e%\030\211\216\211\310\242#Q)\374\366\245\343x\272\303}8\036\335\336\355]\367\376#\323\234\371:h\323\355\272]{\346\"\016\271Q\302\361\363\352\274d\203\230\276\036\257|\323\357cs\340\324\313\006>\026mK\270\265\323\254\203\244\323\361\367\364\206\2272\241\016\000X-\313\000>r\"\340\004\232\321\323\005\375\315\262\355\0010_3\004\316\001\225\224G2\233p$\000\032\221\243q\3509\322\242\221=\245\362\264\206\322S%\324\025\256\235$\177\362\232\277W\214kXH\003\365X\243\255)\225e\023\224u\355=(\027\026;6\023\346\1777\017m\353";
2701
+ PyObject *data = __Pyx_DecompressString(cstring, 195, 1);
2702
2702
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
2703
2703
  const char* const bytes = __Pyx_PyBytes_AsString(data);
2704
2704
  #if !CYTHON_ASSUME_SAFE_MACROS
2705
2705
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
2706
2706
  #endif
2707
2707
  #else /* compression: none (287 bytes) */
2708
- const char* const bytes = ".1.1.23Copyright 2020-Viso.ai team?g.corrigan@viso.ai viso.ai AG <info@viso.ai>viso-sdk-pythonLGPL3abspath__author__cline_in_traceback__copyright___cur_dirdatetimedirname__email____file____license____main____module____name__nowospath__qualname__setdefault__test____title____version__year";
2708
+ const char* const bytes = ".1.1.24Copyright 2020-Viso.ai team?g.corrigan@viso.ai viso.ai AG <info@viso.ai>viso-sdk-pythonLGPL3abspath__author__cline_in_traceback__copyright___cur_dirdatetimedirname__email____file____license____main____module____name__nowospath__qualname__setdefault__test____title____version__year";
2709
2709
  PyObject *data = NULL;
2710
2710
  CYTHON_UNUSED_VAR(__Pyx_DecompressString);
2711
2711
  #endif
@@ -14,4 +14,4 @@ __email__ = "g.corrigan@viso.ai"
14
14
  __license__ = "LGPL3"
15
15
  __title__ = "viso-sdk-python"
16
16
 
17
- __version__ = "1.1.23"
17
+ __version__ = "1.1.24"
@@ -1917,7 +1917,7 @@ typedef struct {
1917
1917
  PyObject *__pyx_empty_tuple;
1918
1918
  PyObject *__pyx_empty_bytes;
1919
1919
  PyObject *__pyx_empty_unicode;
1920
- PyObject *__pyx_string_tab[25];
1920
+ PyObject *__pyx_string_tab[28];
1921
1921
  /* #### Code section: module_state_contents ### */
1922
1922
  /* CodeObjectCache.module_state_decls */
1923
1923
  struct __Pyx_CodeObjectCache __pyx_code_cache;
@@ -1949,29 +1949,32 @@ static __pyx_mstatetype * const __pyx_mstate_global = &__pyx_mstate_global_stati
1949
1949
  /* #### Code section: constant_name_defines ### */
1950
1950
  #define __pyx_kp_u_ __pyx_string_tab[0]
1951
1951
  #define __pyx_kp_u__2 __pyx_string_tab[1]
1952
- #define __pyx_kp_u_viso_sdk_redis___init __pyx_string_tab[2]
1953
- #define __pyx_kp_u_viso_sdk_redis_wrapper __pyx_string_tab[3]
1954
- #define __pyx_kp_u_viso_sdk_stream_cleanup __pyx_string_tab[4]
1955
- #define __pyx_kp_u_viso_sdk_utils __pyx_string_tab[5]
1956
- #define __pyx_kp_u_viso_sdk_viso_data __pyx_string_tab[6]
1957
- #define __pyx_n_u_RedisWrapper __pyx_string_tab[7]
1958
- #define __pyx_n_u_StreamCleanupManager __pyx_string_tab[8]
1959
- #define __pyx_n_u_VisoData __pyx_string_tab[9]
1960
- #define __pyx_n_u_VisoRedis __pyx_string_tab[10]
1961
- #define __pyx_n_u_clear_stream_redis_keys __pyx_string_tab[11]
1962
- #define __pyx_n_u_cline_in_traceback __pyx_string_tab[12]
1963
- #define __pyx_n_u_gen_redis_key_local __pyx_string_tab[13]
1964
- #define __pyx_n_u_gen_redis_key_status __pyx_string_tab[14]
1965
- #define __pyx_n_u_main __pyx_string_tab[15]
1966
- #define __pyx_n_u_module __pyx_string_tab[16]
1967
- #define __pyx_n_u_name __pyx_string_tab[17]
1968
- #define __pyx_n_u_qualname __pyx_string_tab[18]
1969
- #define __pyx_n_u_redis_wrapper __pyx_string_tab[19]
1970
- #define __pyx_n_u_setdefault __pyx_string_tab[20]
1971
- #define __pyx_n_u_stream_cleanup __pyx_string_tab[21]
1972
- #define __pyx_n_u_test __pyx_string_tab[22]
1973
- #define __pyx_n_u_utils __pyx_string_tab[23]
1974
- #define __pyx_n_u_viso_data __pyx_string_tab[24]
1952
+ #define __pyx_kp_u_viso_sdk_frame_reader __pyx_string_tab[2]
1953
+ #define __pyx_kp_u_viso_sdk_redis___init __pyx_string_tab[3]
1954
+ #define __pyx_kp_u_viso_sdk_redis_wrapper __pyx_string_tab[4]
1955
+ #define __pyx_kp_u_viso_sdk_stream_cleanup __pyx_string_tab[5]
1956
+ #define __pyx_kp_u_viso_sdk_utils __pyx_string_tab[6]
1957
+ #define __pyx_kp_u_viso_sdk_viso_data __pyx_string_tab[7]
1958
+ #define __pyx_n_u_FrameReader __pyx_string_tab[8]
1959
+ #define __pyx_n_u_RedisWrapper __pyx_string_tab[9]
1960
+ #define __pyx_n_u_StreamCleanupManager __pyx_string_tab[10]
1961
+ #define __pyx_n_u_VisoData __pyx_string_tab[11]
1962
+ #define __pyx_n_u_VisoRedis __pyx_string_tab[12]
1963
+ #define __pyx_n_u_clear_stream_redis_keys __pyx_string_tab[13]
1964
+ #define __pyx_n_u_cline_in_traceback __pyx_string_tab[14]
1965
+ #define __pyx_n_u_frame_reader __pyx_string_tab[15]
1966
+ #define __pyx_n_u_gen_redis_key_local __pyx_string_tab[16]
1967
+ #define __pyx_n_u_gen_redis_key_status __pyx_string_tab[17]
1968
+ #define __pyx_n_u_main __pyx_string_tab[18]
1969
+ #define __pyx_n_u_module __pyx_string_tab[19]
1970
+ #define __pyx_n_u_name __pyx_string_tab[20]
1971
+ #define __pyx_n_u_qualname __pyx_string_tab[21]
1972
+ #define __pyx_n_u_redis_wrapper __pyx_string_tab[22]
1973
+ #define __pyx_n_u_setdefault __pyx_string_tab[23]
1974
+ #define __pyx_n_u_stream_cleanup __pyx_string_tab[24]
1975
+ #define __pyx_n_u_test __pyx_string_tab[25]
1976
+ #define __pyx_n_u_utils __pyx_string_tab[26]
1977
+ #define __pyx_n_u_viso_data __pyx_string_tab[27]
1975
1978
  /* #### Code section: module_state_clear ### */
1976
1979
  #if CYTHON_USE_MODULE_STATE
1977
1980
  static CYTHON_SMALL_CODE int __pyx_m_clear(PyObject *m) {
@@ -1986,7 +1989,7 @@ static CYTHON_SMALL_CODE int __pyx_m_clear(PyObject *m) {
1986
1989
  #if CYTHON_PEP489_MULTI_PHASE_INIT
1987
1990
  __Pyx_State_RemoveModule(NULL);
1988
1991
  #endif
1989
- for (int i=0; i<25; ++i) { Py_CLEAR(clear_module_state->__pyx_string_tab[i]); }
1992
+ for (int i=0; i<28; ++i) { Py_CLEAR(clear_module_state->__pyx_string_tab[i]); }
1990
1993
  /* #### Code section: module_state_clear_contents ### */
1991
1994
  /* #### Code section: module_state_clear_end ### */
1992
1995
  return 0;
@@ -2003,7 +2006,7 @@ static CYTHON_SMALL_CODE int __pyx_m_traverse(PyObject *m, visitproc visit, void
2003
2006
  __Pyx_VISIT_CONST(traverse_module_state->__pyx_empty_tuple);
2004
2007
  __Pyx_VISIT_CONST(traverse_module_state->__pyx_empty_bytes);
2005
2008
  __Pyx_VISIT_CONST(traverse_module_state->__pyx_empty_unicode);
2006
- for (int i=0; i<25; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_string_tab[i]); }
2009
+ for (int i=0; i<28; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_string_tab[i]); }
2007
2010
  /* #### Code section: module_state_traverse_contents ### */
2008
2011
  /* #### Code section: module_state_traverse_end ### */
2009
2012
  return 0;
@@ -2422,6 +2425,7 @@ __Pyx_RefNannySetupContext("PyInit_redis", 0);
2422
2425
  * from .utils import gen_redis_key_local, gen_redis_key_status
2423
2426
  * from .viso_data import VisoData # <<<<<<<<<<<<<<
2424
2427
  * from .stream_cleanup import StreamCleanupManager, clear_stream_redis_keys
2428
+ * from .frame_reader import FrameReader
2425
2429
  */
2426
2430
  {
2427
2431
  PyObject* const __pyx_imported_names[] = {__pyx_mstate_global->__pyx_n_u_VisoData};
@@ -2444,6 +2448,7 @@ __Pyx_RefNannySetupContext("PyInit_redis", 0);
2444
2448
  * from .utils import gen_redis_key_local, gen_redis_key_status
2445
2449
  * from .viso_data import VisoData
2446
2450
  * from .stream_cleanup import StreamCleanupManager, clear_stream_redis_keys # <<<<<<<<<<<<<<
2451
+ * from .frame_reader import FrameReader
2447
2452
  */
2448
2453
  {
2449
2454
  PyObject* const __pyx_imported_names[] = {__pyx_mstate_global->__pyx_n_u_StreamCleanupManager,__pyx_mstate_global->__pyx_n_u_clear_stream_redis_keys};
@@ -2462,6 +2467,28 @@ __Pyx_RefNannySetupContext("PyInit_redis", 0);
2462
2467
  }
2463
2468
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2464
2469
 
2470
+ /* "viso_sdk/redis/__init__.py":5
2471
+ * from .viso_data import VisoData
2472
+ * from .stream_cleanup import StreamCleanupManager, clear_stream_redis_keys
2473
+ * from .frame_reader import FrameReader # <<<<<<<<<<<<<<
2474
+ */
2475
+ {
2476
+ PyObject* const __pyx_imported_names[] = {__pyx_mstate_global->__pyx_n_u_FrameReader};
2477
+ __pyx_t_1 = __Pyx_Import(__pyx_mstate_global->__pyx_n_u_frame_reader, __pyx_imported_names, 1, __pyx_mstate_global->__pyx_kp_u_viso_sdk_frame_reader, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 5, __pyx_L1_error)
2478
+ }
2479
+ __pyx_t_2 = __pyx_t_1;
2480
+ __Pyx_GOTREF(__pyx_t_2);
2481
+ {
2482
+ PyObject* const __pyx_imported_names[] = {__pyx_mstate_global->__pyx_n_u_FrameReader};
2483
+ __pyx_t_3 = 0; {
2484
+ __pyx_t_4 = __Pyx_ImportFrom(__pyx_t_2, __pyx_imported_names[__pyx_t_3]); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 5, __pyx_L1_error)
2485
+ __Pyx_GOTREF(__pyx_t_4);
2486
+ if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_imported_names[__pyx_t_3], __pyx_t_4) < (0)) __PYX_ERR(0, 5, __pyx_L1_error)
2487
+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
2488
+ }
2489
+ }
2490
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
2491
+
2465
2492
  /* "viso_sdk/redis/__init__.py":1
2466
2493
  * from .redis_wrapper import RedisWrapper as VisoRedis # <<<<<<<<<<<<<<
2467
2494
  * from .utils import gen_redis_key_local, gen_redis_key_status
@@ -2525,34 +2552,34 @@ static int __Pyx_InitCachedConstants(__pyx_mstatetype *__pyx_mstate) {
2525
2552
  static int __Pyx_InitConstants(__pyx_mstatetype *__pyx_mstate) {
2526
2553
  CYTHON_UNUSED_VAR(__pyx_mstate);
2527
2554
  {
2528
- const struct { const unsigned int length: 5; } index[] = {{1},{1},{23},{22},{23},{14},{18},{12},{20},{8},{9},{23},{18},{19},{20},{8},{10},{8},{12},{13},{10},{14},{8},{5},{9}};
2529
- #if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (222 bytes) */
2530
- const char* const cstring = "BZh91AY&SY\276\370t\375\000\000\001\337\200@\000\000\001\000\000\214\002\031\200\277\257\377\2400\000\314\3144\247\240\236\202h\032h4\032\t$\320\324F5\001\220\323&\202EL\324\232a?T2h\031\003\312\025\231\006S\216Zu\007z\020\035P9f\235\207\207\205\243J\306\340\323i\005\301P\313K\225u\213\273\374\300*ib\340\237\223\265\376\253=I$e\260\005\021\033\311\226!@\233<4>[\0326c\206\253'|\300\346\217\210\036\317\251M\021Uo:\311^\315=\3128;\032\317!\235\360q\325\220?\213\216\252\212Qp\3757\340\220m\2105LK\330[Q\036\235\005\036\"Y\026\256\nQNC~\232\212\3613\330\242\221K\254\251j\305\t\027\342\356H\247\n\022\027\337\016\237\240";
2531
- PyObject *data = __Pyx_DecompressString(cstring, 222, 2);
2555
+ const struct { const unsigned int length: 5; } index[] = {{1},{1},{21},{23},{22},{23},{14},{18},{11},{12},{20},{8},{9},{23},{18},{12},{19},{20},{8},{10},{8},{12},{13},{10},{14},{8},{5},{9}};
2556
+ #if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (235 bytes) */
2557
+ const char* const cstring = "BZh91AY&SY\371\253\337'\000\000\001\337\200@\000\000\001\000\000\215\002\031\200\277\257\377\2400\000\3140\322\231\246\247\222\0004\006\200 &\232CM\000h\001\240\221M\020MO2\2232\r\rF\250\253\234\201C]\341\304\246t\003V 9@\306\345\350DD\032\241|\347\206\010\364\n\231E\031y\202\237lU\330\367\342au\006k\nI\3715\345\274\353\372T\250\313\241P\t\212\232|fl\361\230\246\026\2244==\217\254\245&\363\313e\233\333\034\253x\355\017\220\036\217\3409\300\246\255\266\362X\267>\n@CF\363\260\342? \205\314Dk\201\321QJ\374\024[\337s\217\363B\201\264\201\340\0252b\371AM\000AQ\230\357\014\037!6Z\300\276p\263\351\251\314c\010\300\251'\026\212\201!\374]\311\024\341BC\346\257|\234";
2558
+ PyObject *data = __Pyx_DecompressString(cstring, 235, 2);
2532
2559
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
2533
2560
  const char* const bytes = __Pyx_PyBytes_AsString(data);
2534
2561
  #if !CYTHON_ASSUME_SAFE_MACROS
2535
2562
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
2536
2563
  #endif
2537
- #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (172 bytes) */
2538
- const char* const cstring = "x\332UP\313\016\3020\014\373\243\375\002\007\270r\001\t\216\221Y\303T\255\355F\223\202\370{\372@\233\332K\0347v\343\016\207\267\225\205\304\314Cdce \262\301*QO\323'b]9n\254hdx\032\035#\244u\243\223Z'[W\201\201\342R<\356\315\342Z\225\307&<#`\342x\313\203\247<Wj\235-\276\221\376\217\264\rf\376f\332\006\316\013\222F\214\374\3008O\034\366{r\313\010\327S\242\320$D\036Y\226\217_Lr\\P\200\257\365\225\340\032\356\242\n\253\341'\222\323>+\221\262\344\017\332\243\226\204?\303[\204\364";
2539
- PyObject *data = __Pyx_DecompressString(cstring, 172, 1);
2564
+ #elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (189 bytes) */
2565
+ const char* const cstring = "x\332UPA\016\3020\014\373\321\276\300\001\304\215\013Hp\214\302\232M\325\332n4)\210\337\223\266h[sij9v\342\356\360\266<\003\233\251\033\"z\202Hh(\256`$c\271\003\260\301\n@\013\303'\342\262\354\310,:\355\241w\204!-+\234\304:^\177\2451(x\316~\327bw\315r\217\252v+\"\307\252q\301\200#\305\273\316\234t$\277\205\233-\"\374\375\3522\023}\025\266\201tW\220\210==\261\237\366G\215\0246.\270\271G\327B,(\211\001<\252\204\226\237Mr\224\273\220U\264^\t]\355\233\004\230\304\320\200\311I\033\001\200\020kn[\002\371\360\037\306\377\226|";
2566
+ PyObject *data = __Pyx_DecompressString(cstring, 189, 1);
2540
2567
  if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
2541
2568
  const char* const bytes = __Pyx_PyBytes_AsString(data);
2542
2569
  #if !CYTHON_ASSUME_SAFE_MACROS
2543
2570
  if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
2544
2571
  #endif
2545
- #else /* compression: none (328 bytes) */
2546
- const char* const bytes = ".?viso_sdk.redis.__init__viso_sdk.redis_wrapperviso_sdk.stream_cleanupviso_sdk.utilsviso_sdk.viso_dataRedisWrapperStreamCleanupManagerVisoDataVisoRedisclear_stream_redis_keyscline_in_tracebackgen_redis_key_localgen_redis_key_status__main____module____name____qualname__redis_wrappersetdefaultstream_cleanup__test__utilsviso_data";
2572
+ #else /* compression: none (372 bytes) */
2573
+ const char* const bytes = ".?viso_sdk.frame_readerviso_sdk.redis.__init__viso_sdk.redis_wrapperviso_sdk.stream_cleanupviso_sdk.utilsviso_sdk.viso_dataFrameReaderRedisWrapperStreamCleanupManagerVisoDataVisoRedisclear_stream_redis_keyscline_in_tracebackframe_readergen_redis_key_localgen_redis_key_status__main____module____name____qualname__redis_wrappersetdefaultstream_cleanup__test__utilsviso_data";
2547
2574
  PyObject *data = NULL;
2548
2575
  CYTHON_UNUSED_VAR(__Pyx_DecompressString);
2549
2576
  #endif
2550
2577
  PyObject **stringtab = __pyx_mstate->__pyx_string_tab;
2551
2578
  Py_ssize_t pos = 0;
2552
- for (int i = 0; i < 25; i++) {
2579
+ for (int i = 0; i < 28; i++) {
2553
2580
  Py_ssize_t bytes_length = index[i].length;
2554
2581
  PyObject *string = PyUnicode_DecodeUTF8(bytes + pos, bytes_length, NULL);
2555
- if (likely(string) && i >= 7) PyUnicode_InternInPlace(&string);
2582
+ if (likely(string) && i >= 8) PyUnicode_InternInPlace(&string);
2556
2583
  if (unlikely(!string)) {
2557
2584
  Py_XDECREF(data);
2558
2585
  __PYX_ERR(0, 1, __pyx_L1_error)
@@ -2561,7 +2588,7 @@ const char* const bytes = ".?viso_sdk.redis.__init__viso_sdk.redis_wrapperviso_s
2561
2588
  pos += bytes_length;
2562
2589
  }
2563
2590
  Py_XDECREF(data);
2564
- for (Py_ssize_t i = 0; i < 25; i++) {
2591
+ for (Py_ssize_t i = 0; i < 28; i++) {
2565
2592
  if (unlikely(PyObject_Hash(stringtab[i]) == -1)) {
2566
2593
  __PYX_ERR(0, 1, __pyx_L1_error)
2567
2594
  }
@@ -2,3 +2,4 @@ from .redis_wrapper import RedisWrapper as VisoRedis
2
2
  from .utils import gen_redis_key_local, gen_redis_key_status
3
3
  from .viso_data import VisoData
4
4
  from .stream_cleanup import StreamCleanupManager, clear_stream_redis_keys
5
+ from .frame_reader import FrameReader