OTVision 0.6.6__tar.gz → 0.6.7__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 (319) hide show
  1. {otvision-0.6.6 → otvision-0.6.7}/.github/workflows/release-testpypi.yml +24 -1
  2. {otvision-0.6.6 → otvision-0.6.7}/.pre-commit-config.yaml +1 -2
  3. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/rtsp_input_source.py +16 -0
  4. {otvision-0.6.6 → otvision-0.6.7}/OTVision/version.py +1 -1
  5. {otvision-0.6.6 → otvision-0.6.7}/PKG-INFO +1 -2
  6. {otvision-0.6.6 → otvision-0.6.7}/requirements.txt +0 -1
  7. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/test_rtsp_input_source.py +65 -11
  8. {otvision-0.6.6 → otvision-0.6.7}/.editorconfig +0 -0
  9. {otvision-0.6.6 → otvision-0.6.7}/.flake8 +0 -0
  10. {otvision-0.6.6 → otvision-0.6.7}/.github/dependabot.yml +0 -0
  11. {otvision-0.6.6 → otvision-0.6.7}/.github/workflows/build-nightly.yml +0 -0
  12. {otvision-0.6.6 → otvision-0.6.7}/.github/workflows/build-release.yml +0 -0
  13. {otvision-0.6.6 → otvision-0.6.7}/.github/workflows/linter.yml +0 -0
  14. {otvision-0.6.6 → otvision-0.6.7}/.github/workflows/release-pypi.yml +0 -0
  15. {otvision-0.6.6 → otvision-0.6.7}/.github/workflows/test.yml +0 -0
  16. {otvision-0.6.6 → otvision-0.6.7}/.gitignore +0 -0
  17. {otvision-0.6.6 → otvision-0.6.7}/.vscode/launch.json +0 -0
  18. {otvision-0.6.6 → otvision-0.6.7}/.vscode/scripts/build_debug_env.cmd +0 -0
  19. {otvision-0.6.6 → otvision-0.6.7}/.vscode/scripts/build_debug_env.sh +0 -0
  20. {otvision-0.6.6 → otvision-0.6.7}/.vscode/scripts/teardown_debug_env.cmd +0 -0
  21. {otvision-0.6.6 → otvision-0.6.7}/.vscode/scripts/teardown_debug_env.sh +0 -0
  22. {otvision-0.6.6 → otvision-0.6.7}/.vscode/settings.json +0 -0
  23. {otvision-0.6.6 → otvision-0.6.7}/.vscode/tasks.json +0 -0
  24. {otvision-0.6.6 → otvision-0.6.7}/.yamllint.yaml +0 -0
  25. {otvision-0.6.6 → otvision-0.6.7}/LICENSE +0 -0
  26. {otvision-0.6.6 → otvision-0.6.7}/OTVision/__init__.py +0 -0
  27. {otvision-0.6.6 → otvision-0.6.7}/OTVision/abstraction/__init__.py +0 -0
  28. {otvision-0.6.6 → otvision-0.6.7}/OTVision/abstraction/defaults.py +0 -0
  29. {otvision-0.6.6 → otvision-0.6.7}/OTVision/abstraction/observer.py +0 -0
  30. {otvision-0.6.6 → otvision-0.6.7}/OTVision/abstraction/pipes_and_filter.py +0 -0
  31. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/__init__.py +0 -0
  32. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/buffer.py +0 -0
  33. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/config.py +0 -0
  34. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/config_parser.py +0 -0
  35. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/configure_logger.py +0 -0
  36. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/__init__.py +0 -0
  37. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/current_object_detector.py +0 -0
  38. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/current_object_detector_metadata.py +0 -0
  39. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/detected_frame_factory.py +0 -0
  40. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/detected_frame_producer.py +0 -0
  41. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/detection_file_save_path_provider.py +0 -0
  42. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/factory.py +0 -0
  43. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/get_detect_cli_args.py +0 -0
  44. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/timestamper.py +0 -0
  45. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/detect/update_detect_config_with_cli_args.py +0 -0
  46. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/frame_count_provider.py +0 -0
  47. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/get_config.py +0 -0
  48. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/get_current_config.py +0 -0
  49. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/track/__init__.py +0 -0
  50. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/track/get_track_cli_args.py +0 -0
  51. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/track/update_current_track_config.py +0 -0
  52. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/track/update_track_config_with_cli_args.py +0 -0
  53. {otvision-0.6.6 → otvision-0.6.7}/OTVision/application/update_current_config.py +0 -0
  54. {otvision-0.6.6 → otvision-0.6.7}/OTVision/config.py +0 -0
  55. {otvision-0.6.6 → otvision-0.6.7}/OTVision/convert/__init__.py +0 -0
  56. {otvision-0.6.6 → otvision-0.6.7}/OTVision/convert/convert.py +0 -0
  57. {otvision-0.6.6 → otvision-0.6.7}/OTVision/dataformat.py +0 -0
  58. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/__init__.py +0 -0
  59. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/builder.py +0 -0
  60. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/cli.py +0 -0
  61. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/detect.py +0 -0
  62. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/detected_frame_buffer.py +0 -0
  63. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/file_based_detect_builder.py +0 -0
  64. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/otdet.py +0 -0
  65. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/otdet_file_writer.py +0 -0
  66. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/plugin_av/__init__.py +0 -0
  67. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/plugin_av/rotate_frame.py +0 -0
  68. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/pyav_frame_count_provider.py +0 -0
  69. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/rtsp_based_detect_builder.py +0 -0
  70. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/timestamper.py +0 -0
  71. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/video_input_source.py +0 -0
  72. {otvision-0.6.6 → otvision-0.6.7}/OTVision/detect/yolo.py +0 -0
  73. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/__init__.py +0 -0
  74. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/cli.py +0 -0
  75. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/current_config.py +0 -0
  76. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/detect_producer_consumer.py +0 -0
  77. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/detection.py +0 -0
  78. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/frame.py +0 -0
  79. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/input_source_detect.py +0 -0
  80. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/object_detection.py +0 -0
  81. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/serialization.py +0 -0
  82. {otvision-0.6.6 → otvision-0.6.7}/OTVision/domain/time.py +0 -0
  83. {otvision-0.6.6 → otvision-0.6.7}/OTVision/helpers/__init__.py +0 -0
  84. {otvision-0.6.6 → otvision-0.6.7}/OTVision/helpers/date.py +0 -0
  85. {otvision-0.6.6 → otvision-0.6.7}/OTVision/helpers/files.py +0 -0
  86. {otvision-0.6.6 → otvision-0.6.7}/OTVision/helpers/formats.py +0 -0
  87. {otvision-0.6.6 → otvision-0.6.7}/OTVision/helpers/input_types.py +0 -0
  88. {otvision-0.6.6 → otvision-0.6.7}/OTVision/helpers/log.py +0 -0
  89. {otvision-0.6.6 → otvision-0.6.7}/OTVision/helpers/machine.py +0 -0
  90. {otvision-0.6.6 → otvision-0.6.7}/OTVision/helpers/video.py +0 -0
  91. {otvision-0.6.6 → otvision-0.6.7}/OTVision/plugin/__init__.py +0 -0
  92. {otvision-0.6.6 → otvision-0.6.7}/OTVision/plugin/yaml_serialization.py +0 -0
  93. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/__init__.py +0 -0
  94. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/builder.py +0 -0
  95. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/cli.py +0 -0
  96. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/exporter/__init__.py +0 -0
  97. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/exporter/filebased_exporter.py +0 -0
  98. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/id_generator.py +0 -0
  99. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/model/__init__.py +0 -0
  100. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/model/filebased/__init__.py +0 -0
  101. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/model/filebased/frame_chunk.py +0 -0
  102. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/model/filebased/frame_group.py +0 -0
  103. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/model/track_exporter.py +0 -0
  104. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/model/tracking_interfaces.py +0 -0
  105. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/parser/__init__.py +0 -0
  106. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/parser/chunk_parser_plugins.py +0 -0
  107. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/parser/frame_group_parser_plugins.py +0 -0
  108. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/track.py +0 -0
  109. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/tracker/__init__.py +0 -0
  110. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/tracker/filebased_tracking.py +0 -0
  111. {otvision-0.6.6 → otvision-0.6.7}/OTVision/track/tracker/tracker_plugin_iou.py +0 -0
  112. {otvision-0.6.6 → otvision-0.6.7}/OTVision/transform/__init__.py +0 -0
  113. {otvision-0.6.6 → otvision-0.6.7}/OTVision/transform/get_homography.py +0 -0
  114. {otvision-0.6.6 → otvision-0.6.7}/OTVision/transform/reference_points_picker.py +0 -0
  115. {otvision-0.6.6 → otvision-0.6.7}/OTVision/transform/transform.py +0 -0
  116. {otvision-0.6.6 → otvision-0.6.7}/OTVision/view/__init__.py +0 -0
  117. {otvision-0.6.6 → otvision-0.6.7}/OTVision/view/helpers/OTC.ico +0 -0
  118. {otvision-0.6.6 → otvision-0.6.7}/OTVision/view/view.py +0 -0
  119. {otvision-0.6.6 → otvision-0.6.7}/OTVision/view/view_convert.py +0 -0
  120. {otvision-0.6.6 → otvision-0.6.7}/OTVision/view/view_detect.py +0 -0
  121. {otvision-0.6.6 → otvision-0.6.7}/OTVision/view/view_helpers.py +0 -0
  122. {otvision-0.6.6 → otvision-0.6.7}/OTVision/view/view_track.py +0 -0
  123. {otvision-0.6.6 → otvision-0.6.7}/OTVision/view/view_transform.py +0 -0
  124. {otvision-0.6.6 → otvision-0.6.7}/OTVision.bat +0 -0
  125. {otvision-0.6.6 → otvision-0.6.7}/README.md +0 -0
  126. {otvision-0.6.6 → otvision-0.6.7}/clean-up-repository.sh +0 -0
  127. {otvision-0.6.6 → otvision-0.6.7}/config.yml +0 -0
  128. {otvision-0.6.6 → otvision-0.6.7}/convert.py +0 -0
  129. {otvision-0.6.6 → otvision-0.6.7}/detect.py +0 -0
  130. {otvision-0.6.6 → otvision-0.6.7}/export_models.py +0 -0
  131. {otvision-0.6.6 → otvision-0.6.7}/install.cmd +0 -0
  132. {otvision-0.6.6 → otvision-0.6.7}/install.sh +0 -0
  133. {otvision-0.6.6 → otvision-0.6.7}/install_dev.cmd +0 -0
  134. {otvision-0.6.6 → otvision-0.6.7}/install_dev.sh +0 -0
  135. {otvision-0.6.6 → otvision-0.6.7}/pyproject.toml +0 -0
  136. {otvision-0.6.6 → otvision-0.6.7}/reference_points_picker.py +0 -0
  137. {otvision-0.6.6 → otvision-0.6.7}/requirements-dev.txt +0 -0
  138. {otvision-0.6.6 → otvision-0.6.7}/tests/__init__.py +0 -0
  139. {otvision-0.6.6 → otvision-0.6.7}/tests/abstraction/__init__.py +0 -0
  140. {otvision-0.6.6 → otvision-0.6.7}/tests/abstraction/test_defaults.py +0 -0
  141. {otvision-0.6.6 → otvision-0.6.7}/tests/abstraction/test_observer.py +0 -0
  142. {otvision-0.6.6 → otvision-0.6.7}/tests/application/__init__.py +0 -0
  143. {otvision-0.6.6 → otvision-0.6.7}/tests/application/detect/__init__.py +0 -0
  144. {otvision-0.6.6 → otvision-0.6.7}/tests/application/detect/test_current_object_detector.py +0 -0
  145. {otvision-0.6.6 → otvision-0.6.7}/tests/application/detect/test_detected_frame_factory.py +0 -0
  146. {otvision-0.6.6 → otvision-0.6.7}/tests/application/detect/test_detected_frame_producer.py +0 -0
  147. {otvision-0.6.6 → otvision-0.6.7}/tests/application/detect/test_detection_file_save_path_provider.py +0 -0
  148. {otvision-0.6.6 → otvision-0.6.7}/tests/application/detect/test_get_detect_cli_args.py +0 -0
  149. {otvision-0.6.6 → otvision-0.6.7}/tests/application/detect/test_timestamper.py +0 -0
  150. {otvision-0.6.6 → otvision-0.6.7}/tests/application/detect/test_update_detect_config_with_cli_args.py +0 -0
  151. {otvision-0.6.6 → otvision-0.6.7}/tests/application/test_buffer.py +0 -0
  152. {otvision-0.6.6 → otvision-0.6.7}/tests/application/test_get_config.py +0 -0
  153. {otvision-0.6.6 → otvision-0.6.7}/tests/application/track/__init__.py +0 -0
  154. {otvision-0.6.6 → otvision-0.6.7}/tests/application/track/test_get_track_cli_args.py +0 -0
  155. {otvision-0.6.6 → otvision-0.6.7}/tests/application/track/test_update_current_track_config.py +0 -0
  156. {otvision-0.6.6 → otvision-0.6.7}/tests/application/track/test_update_track_config_with_cli_args.py +0 -0
  157. {otvision-0.6.6 → otvision-0.6.7}/tests/cli/custom_cli_test_config.yaml +0 -0
  158. {otvision-0.6.6 → otvision-0.6.7}/tests/cli/test_convert_cli.py +0 -0
  159. {otvision-0.6.6 → otvision-0.6.7}/tests/cli/test_detect_cli.py +0 -0
  160. {otvision-0.6.6 → otvision-0.6.7}/tests/cli/test_track_cli.py +0 -0
  161. {otvision-0.6.6 → otvision-0.6.7}/tests/conftest.py +0 -0
  162. {otvision-0.6.6 → otvision-0.6.7}/tests/convert/__init__.py +0 -0
  163. {otvision-0.6.6 → otvision-0.6.7}/tests/convert/test_convert.py +0 -0
  164. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_CamView.png +0 -0
  165. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_CamView_Cars-Cyclist.png +0 -0
  166. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_CamView_Cars-Truck.png +0 -0
  167. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_CamView_refpts.png +0 -0
  168. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  169. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  170. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  171. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  172. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  173. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  174. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  175. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  176. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  177. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  178. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  179. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  180. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_FR20.otrfpts +0 -0
  181. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Satellite.jpg +0 -0
  182. {otvision-0.6.6 → otvision-0.6.7}/tests/data/Testvideo_Satellite_far.jpg +0 -0
  183. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  184. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  185. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  186. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  187. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Cyclist_F20_2020-01-01_00-00-00.h264 +0 -0
  188. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Truck_2020-01-01_00-00-00.h264 +0 -0
  189. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  190. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  191. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  192. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  193. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  194. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  195. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  196. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  197. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  198. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  199. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  200. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  201. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.avi +0 -0
  202. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  203. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.avi +0 -0
  204. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  205. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  206. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mkv +0 -0
  207. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  208. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mkv +0 -0
  209. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  210. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mov +0 -0
  211. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  212. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mov +0 -0
  213. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  214. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  215. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  216. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  217. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  218. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  219. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  220. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  221. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  222. {otvision-0.6.6 → otvision-0.6.7}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  223. {otvision-0.6.6 → otvision-0.6.7}/tests/data/detect/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  224. {otvision-0.6.6 → otvision-0.6.7}/tests/data/detect/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  225. {otvision-0.6.6 → otvision-0.6.7}/tests/data/detect/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  226. {otvision-0.6.6 → otvision-0.6.7}/tests/data/detect/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  227. {otvision-0.6.6 → otvision-0.6.7}/tests/data/detect/rotated-Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  228. {otvision-0.6.6 → otvision-0.6.7}/tests/data/log/_otvision_logs/test.log +0 -0
  229. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  230. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  231. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  232. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  233. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  234. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  235. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  236. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  237. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  238. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  239. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  240. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  241. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  242. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  243. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  244. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  245. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  246. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  247. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  248. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  249. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  250. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  251. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  252. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  253. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  254. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  255. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  256. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  257. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  258. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  259. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  260. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  261. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  262. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  263. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  264. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  265. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  266. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  267. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  268. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  269. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  270. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  271. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  272. {otvision-0.6.6 → otvision-0.6.7}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  273. {otvision-0.6.6 → otvision-0.6.7}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  274. {otvision-0.6.6 → otvision-0.6.7}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  275. {otvision-0.6.6 → otvision-0.6.7}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  276. {otvision-0.6.6 → otvision-0.6.7}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  277. {otvision-0.6.6 → otvision-0.6.7}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  278. {otvision-0.6.6 → otvision-0.6.7}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  279. {otvision-0.6.6 → otvision-0.6.7}/tests/data/transform/Testvideo_FR20.otrfpts +0 -0
  280. {otvision-0.6.6 → otvision-0.6.7}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/model.mlmodel +0 -0
  281. {otvision-0.6.6 → otvision-0.6.7}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/weights/weight.bin +0 -0
  282. {otvision-0.6.6 → otvision-0.6.7}/tests/data/yolov8m.mlpackage/Manifest.json +0 -0
  283. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/__init__.py +0 -0
  284. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/detect_test.py +0 -0
  285. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/plugin_av/__init__.py +0 -0
  286. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/plugin_av/test_rotate_frame.py +0 -0
  287. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/test_detected_frame_buffer.py +0 -0
  288. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/test_otdet.py +0 -0
  289. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/test_otdet_file_writer.py +0 -0
  290. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/test_pyav_frame_count_provider.py +0 -0
  291. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/test_video_input_source.py +0 -0
  292. {otvision-0.6.6 → otvision-0.6.7}/tests/detect/yolo_test.py +0 -0
  293. {otvision-0.6.6 → otvision-0.6.7}/tests/helpers/__init__.py +0 -0
  294. {otvision-0.6.6 → otvision-0.6.7}/tests/helpers/files_test.py +0 -0
  295. {otvision-0.6.6 → otvision-0.6.7}/tests/helpers/formats_test.py +0 -0
  296. {otvision-0.6.6 → otvision-0.6.7}/tests/helpers/test_log.py +0 -0
  297. {otvision-0.6.6 → otvision-0.6.7}/tests/log/__init__.py +0 -0
  298. {otvision-0.6.6 → otvision-0.6.7}/tests/log/log_maker.py +0 -0
  299. {otvision-0.6.6 → otvision-0.6.7}/tests/log/test_log.py +0 -0
  300. {otvision-0.6.6 → otvision-0.6.7}/tests/test_config.py +0 -0
  301. {otvision-0.6.6 → otvision-0.6.7}/tests/track/__init__.py +0 -0
  302. {otvision-0.6.6 → otvision-0.6.7}/tests/track/helper/__init__.py +0 -0
  303. {otvision-0.6.6 → otvision-0.6.7}/tests/track/helper/data_builder.py +0 -0
  304. {otvision-0.6.6 → otvision-0.6.7}/tests/track/parser/__init__.py +0 -0
  305. {otvision-0.6.6 → otvision-0.6.7}/tests/track/parser/test_chunk_parser_plugins.py +0 -0
  306. {otvision-0.6.6 → otvision-0.6.7}/tests/track/test_frame_chunk.py +0 -0
  307. {otvision-0.6.6 → otvision-0.6.7}/tests/track/test_frame_group.py +0 -0
  308. {otvision-0.6.6 → otvision-0.6.7}/tests/track/test_frame_group_parser_plugins.py +0 -0
  309. {otvision-0.6.6 → otvision-0.6.7}/tests/track/test_track.py +0 -0
  310. {otvision-0.6.6 → otvision-0.6.7}/tests/track/test_tracking_data_structures.py +0 -0
  311. {otvision-0.6.6 → otvision-0.6.7}/tests/transform/__init__.py +0 -0
  312. {otvision-0.6.6 → otvision-0.6.7}/tests/transform/test_transform.py +0 -0
  313. {otvision-0.6.6 → otvision-0.6.7}/tests/utils/__init__.py +0 -0
  314. {otvision-0.6.6 → otvision-0.6.7}/tests/utils/generator.py +0 -0
  315. {otvision-0.6.6 → otvision-0.6.7}/tests/utils/mocking.py +0 -0
  316. {otvision-0.6.6 → otvision-0.6.7}/track.py +0 -0
  317. {otvision-0.6.6 → otvision-0.6.7}/transform.py +0 -0
  318. {otvision-0.6.6 → otvision-0.6.7}/update_precommit.py +0 -0
  319. {otvision-0.6.6 → otvision-0.6.7}/view.py +0 -0
@@ -26,14 +26,37 @@ jobs:
26
26
  steps:
27
27
  - name: Checkout code
28
28
  uses: actions/checkout@v4
29
+
30
+ - name: Fetch all tags
31
+ run: git fetch --tags --unshallow
32
+
29
33
  - name: Set up Python
30
34
  uses: actions/setup-python@v5
31
35
  with:
32
36
  python-version: "3.12"
37
+
38
+ - name: Get latest tag and create new version
39
+ id: get_version
40
+ run: |
41
+ # Get the latest tag in format v*.*.* (ignoring tags like "nightly")
42
+ LATEST_TAG="$(git tag -l "v*.*.*" | sort -V | tail -n 1 || echo 'v0.0.0')"
43
+ # Extract version without 'v' prefix
44
+ VERSION="${LATEST_TAG#v}"
45
+ # Split version into parts
46
+ IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
47
+ # Increment patch version
48
+ PATCH="$((PATCH + 1))"
49
+ # Create new version with incremented patch
50
+ INCREMENTED_VERSION="$MAJOR.$MINOR.$PATCH"
51
+ DATE_TIME="$(date +'%Y%m%d%H%M%S')"
52
+ NEW_VERSION="${INCREMENTED_VERSION}a${DATE_TIME}"
53
+ echo "Final version: $NEW_VERSION"
54
+ echo "new_version=$NEW_VERSION" >> "$GITHUB_OUTPUT"
55
+
33
56
  - name: Update Python Package Version
34
57
  uses: platomo/update-version-py-action@v1.0.1
35
58
  with:
36
- version: nightly
59
+ version: ${{ steps.get_version.outputs.new_version }}
37
60
  file-path: "OTVision"
38
61
  - name: Install pypa/build
39
62
  shell: bash
@@ -63,14 +63,13 @@ repos:
63
63
  - pre-commit==3.8.0
64
64
  - pytest-cov==5.0.0
65
65
  - pytest==8.3.3
66
- - torch==2.3.1
67
66
  - torchvision==0.18.1
68
67
  - twine==6.1.0
69
68
  - types-PyYAML
70
69
  - types-flake8
71
70
  - types-geopandas
72
71
  - types-jsonschema
73
- - types-setuptools
72
+ - types-torch
74
73
  - types-tqdm
75
74
  - types-ujson
76
75
  - ultralytics==8.3.94
@@ -27,6 +27,7 @@ from OTVision.domain.time import DatetimeProvider
27
27
 
28
28
  RTSP_URL = "rtsp://127.0.0.1:8554/test"
29
29
  RETRY_SECONDS = 1
30
+ DEFAULT_READ_FAIL_THRESHOLD = 5
30
31
 
31
32
 
32
33
  class Counter:
@@ -82,6 +83,7 @@ class RtspInputSource(InputSourceDetect):
82
83
  datetime_provider: DatetimeProvider,
83
84
  frame_counter: Counter,
84
85
  get_current_config: GetCurrentConfig,
86
+ read_fail_threshold: int = DEFAULT_READ_FAIL_THRESHOLD,
85
87
  ) -> None:
86
88
  super().__init__(subject)
87
89
  self._datetime_provider = datetime_provider
@@ -93,6 +95,8 @@ class RtspInputSource(InputSourceDetect):
93
95
  self._stream_start_time: datetime = self._datetime_provider.provide()
94
96
  self._current_video_start_time = self._stream_start_time
95
97
  self._outdated = True
98
+ self._read_fail_threshold = read_fail_threshold
99
+ self._consecutive_read_fails = 0
96
100
 
97
101
  @property
98
102
  def _video_capture(self) -> VideoCapture:
@@ -157,10 +161,22 @@ class RtspInputSource(InputSourceDetect):
157
161
  def _read_next_frame(self) -> ndarray | None:
158
162
  successful, frame = self._video_capture.read()
159
163
  if successful:
164
+ self._consecutive_read_fails = 0
160
165
  return frame
166
+ self._consecutive_read_fails += 1
167
+
168
+ if self._consecutive_read_fails >= self._read_fail_threshold:
169
+ self._try_reconnecting_stream()
170
+
161
171
  logger().debug("Failed to grab frame")
162
172
  return None
163
173
 
174
+ def _try_reconnecting_stream(self) -> None:
175
+ self._video_capture.release()
176
+ self._current_video_capture = None
177
+ if not self.should_stop() and self._current_stream is not None:
178
+ self._current_video_capture = self._init_video_capture(self._current_stream)
179
+
164
180
  def should_stop(self) -> bool:
165
181
  return self._stop_capture
166
182
 
@@ -1,4 +1,4 @@
1
- __version__ = "v0.6.6"
1
+ __version__ = "v0.6.7"
2
2
 
3
3
 
4
4
  def otdet_version() -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OTVision
3
- Version: 0.6.6
3
+ Version: 0.6.7
4
4
  Summary: OTVision is a core module of the OpenTrafficCam framework to perform object detection and tracking.
5
5
  Project-URL: Homepage, https://opentrafficcam.org/
6
6
  Project-URL: Documentation, https://opentrafficcam.org/overview/
@@ -27,7 +27,6 @@ Requires-Dist: numpy==2.1.1; sys_platform != 'win32'
27
27
  Requires-Dist: opencv-python==4.10.0.84
28
28
  Requires-Dist: pandas==2.2.3
29
29
  Requires-Dist: pyyaml==6.0.2
30
- Requires-Dist: setuptools==74.0.0
31
30
  Requires-Dist: torch==2.3.1
32
31
  Requires-Dist: torchvision==0.18.1
33
32
  Requires-Dist: tqdm==4.67.1
@@ -9,7 +9,6 @@ numpy==1.26.4; sys_platform == 'win32' # ultralytics requires numpy <= 2.1.1; to
9
9
  opencv-python==4.10.0.84 # only upgrade when https://github.com/opencv/opencv/issues/27091 is resolved
10
10
  pandas==2.2.3
11
11
  PyYAML==6.0.2
12
- setuptools==74.0.0
13
12
  # Follow instructions at https://pytorch.org to install torch with CUDA
14
13
  torch==2.3.1 # NOTE: Omit if using torch with CUDA and install manually
15
14
  torchvision==0.18.1 # NOTE: Omit if using torch with CUDA and install manually
@@ -80,8 +80,8 @@ class TestRtspInputSource:
80
80
  def test_produce(
81
81
  self, mock_video_capture: Mock, mock_convert_frame_to_rgb: Mock
82
82
  ) -> None:
83
- given = create_given(mock_video_capture, mock_convert_frame_to_rgb)
84
- target = create_target_with(given)
83
+ given = setup_with(create_given(mock_video_capture, mock_convert_frame_to_rgb))
84
+ target = create_target(given)
85
85
  generator = target.produce()
86
86
  actual = list()
87
87
  actual.append(next(generator))
@@ -140,6 +140,58 @@ class TestRtspInputSource:
140
140
  ]
141
141
  assert given.subject.notify.call_args_list == create_expected_flush_events()
142
142
 
143
+ @patch("OTVision.detect.rtsp_input_source.convert_frame_to_rgb")
144
+ @patch("OTVision.detect.rtsp_input_source.VideoCapture")
145
+ def test_reconnecting_on_consecutive_read_fails(
146
+ self, mock_video_capture: Mock, mock_convert_frame_to_rgb: Mock
147
+ ) -> None:
148
+ first_vc_instance = Mock()
149
+ second_vc_instance = Mock()
150
+ third_vc_instance = Mock()
151
+
152
+ given = create_given(mock_video_capture, mock_convert_frame_to_rgb)
153
+
154
+ # This triggers the reconnecting
155
+ first_vc_instance.read.side_effect = [
156
+ (True, FIRST_FRAME_DATA),
157
+ (False, None),
158
+ (False, None),
159
+ ]
160
+
161
+ # This simulates the first re-connect try that fails
162
+ second_vc_instance.isOpened.return_value = False
163
+
164
+ # This simulates the second re-connect try that succeeds
165
+ third_vc_instance.read.side_effect = [(True, SECOND_FRAME_DATA)]
166
+ third_vc_instance.isOpened.return_value = True
167
+
168
+ given.video_capture.side_effect = [
169
+ first_vc_instance,
170
+ second_vc_instance,
171
+ third_vc_instance,
172
+ ]
173
+
174
+ target = create_target(given)
175
+ target._read_fail_threshold = 2
176
+
177
+ actual = list()
178
+ actual.append(target._read_next_frame()) # First read successful
179
+ actual.append(target._read_next_frame()) # Second read fails
180
+ actual.append(target._read_next_frame()) # Third read fails
181
+ actual.append(target._read_next_frame()) # Fourth read successful
182
+
183
+ assert actual == [FIRST_FRAME_DATA, None, None, SECOND_FRAME_DATA]
184
+ first_vc_instance.release.assert_called_once()
185
+ assert first_vc_instance.read.call_count == 3
186
+ second_vc_instance.isOpened.assert_called_once()
187
+ second_vc_instance.read.assert_not_called()
188
+ assert second_vc_instance.read.call_count == 0
189
+
190
+ third_vc_instance.release.assert_not_called()
191
+ assert third_vc_instance.read.call_count == 1
192
+
193
+ assert target._consecutive_read_fails == 0
194
+
143
195
 
144
196
  def create_given(video_capture: Mock, convert_frame_to_rgb: Mock) -> Given:
145
197
  return Given(
@@ -155,9 +207,16 @@ def create_given(video_capture: Mock, convert_frame_to_rgb: Mock) -> Given:
155
207
  )
156
208
 
157
209
 
158
- def create_target_with(
159
- given: Given, video_capture_is_opened: bool = True
160
- ) -> RtspInputSource:
210
+ def create_target(given: Given) -> RtspInputSource:
211
+ return RtspInputSource(
212
+ subject=given.subject,
213
+ datetime_provider=given.datetime_provider,
214
+ frame_counter=given.frame_counter,
215
+ get_current_config=given.get_current_config,
216
+ )
217
+
218
+
219
+ def setup_with(given: Given, video_capture_is_opened: bool = True) -> Given:
161
220
  frames = [
162
221
  (True, FIRST_FRAME_DATA),
163
222
  (False, SECOND_FRAME_DATA),
@@ -197,12 +256,7 @@ def create_target_with(
197
256
  given.config.convert.output_fps = OUTPUT_FPS
198
257
  given.get_current_config.get.return_value = given.config
199
258
 
200
- return RtspInputSource(
201
- subject=given.subject,
202
- datetime_provider=given.datetime_provider,
203
- frame_counter=given.frame_counter,
204
- get_current_config=given.get_current_config,
205
- )
259
+ return given
206
260
 
207
261
 
208
262
  def create_expected_flush_events() -> list[Any]:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes