OTVision 0.6.12__tar.gz → 0.6.14__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 (339) hide show
  1. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/config_parser.py +23 -3
  2. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/track/ottrk.py +3 -2
  3. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/builder.py +12 -1
  4. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/stream_ottrk_file_writer.py +17 -4
  5. {otvision-0.6.12 → otvision-0.6.14}/OTVision/version.py +1 -1
  6. {otvision-0.6.12 → otvision-0.6.14}/PKG-INFO +1 -1
  7. {otvision-0.6.12 → otvision-0.6.14}/tests/application/test_config_parser.py +82 -0
  8. {otvision-0.6.12 → otvision-0.6.14}/tests/application/track/test_ottrk.py +2 -3
  9. {otvision-0.6.12 → otvision-0.6.14}/.editorconfig +0 -0
  10. {otvision-0.6.12 → otvision-0.6.14}/.flake8 +0 -0
  11. {otvision-0.6.12 → otvision-0.6.14}/.github/dependabot.yml +0 -0
  12. {otvision-0.6.12 → otvision-0.6.14}/.github/workflows/build-nightly.yml +0 -0
  13. {otvision-0.6.12 → otvision-0.6.14}/.github/workflows/build-release.yml +0 -0
  14. {otvision-0.6.12 → otvision-0.6.14}/.github/workflows/linter.yml +0 -0
  15. {otvision-0.6.12 → otvision-0.6.14}/.github/workflows/release-pypi.yml +0 -0
  16. {otvision-0.6.12 → otvision-0.6.14}/.github/workflows/release-testpypi.yml +0 -0
  17. {otvision-0.6.12 → otvision-0.6.14}/.github/workflows/test.yml +0 -0
  18. {otvision-0.6.12 → otvision-0.6.14}/.gitignore +0 -0
  19. {otvision-0.6.12 → otvision-0.6.14}/.pre-commit-config.yaml +0 -0
  20. {otvision-0.6.12 → otvision-0.6.14}/.vscode/launch.json +0 -0
  21. {otvision-0.6.12 → otvision-0.6.14}/.vscode/scripts/build_debug_env.cmd +0 -0
  22. {otvision-0.6.12 → otvision-0.6.14}/.vscode/scripts/build_debug_env.sh +0 -0
  23. {otvision-0.6.12 → otvision-0.6.14}/.vscode/scripts/teardown_debug_env.cmd +0 -0
  24. {otvision-0.6.12 → otvision-0.6.14}/.vscode/scripts/teardown_debug_env.sh +0 -0
  25. {otvision-0.6.12 → otvision-0.6.14}/.vscode/settings.json +0 -0
  26. {otvision-0.6.12 → otvision-0.6.14}/.vscode/tasks.json +0 -0
  27. {otvision-0.6.12 → otvision-0.6.14}/.yamllint.yaml +0 -0
  28. {otvision-0.6.12 → otvision-0.6.14}/LICENSE +0 -0
  29. {otvision-0.6.12 → otvision-0.6.14}/OTVision/__init__.py +0 -0
  30. {otvision-0.6.12 → otvision-0.6.14}/OTVision/abstraction/__init__.py +0 -0
  31. {otvision-0.6.12 → otvision-0.6.14}/OTVision/abstraction/defaults.py +0 -0
  32. {otvision-0.6.12 → otvision-0.6.14}/OTVision/abstraction/observer.py +0 -0
  33. {otvision-0.6.12 → otvision-0.6.14}/OTVision/abstraction/pipes_and_filter.py +0 -0
  34. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/__init__.py +0 -0
  35. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/buffer.py +0 -0
  36. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/config.py +0 -0
  37. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/configure_logger.py +0 -0
  38. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/detect/__init__.py +0 -0
  39. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/detect/current_object_detector.py +0 -0
  40. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/detect/current_object_detector_metadata.py +0 -0
  41. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/detect/detected_frame_factory.py +0 -0
  42. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/detect/factory.py +0 -0
  43. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/detect/get_detect_cli_args.py +0 -0
  44. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/detect/timestamper.py +0 -0
  45. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/detect/update_detect_config_with_cli_args.py +0 -0
  46. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/event/__init__.py +0 -0
  47. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/event/new_otvision_config.py +0 -0
  48. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/event/new_video_start.py +0 -0
  49. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/frame_count_provider.py +0 -0
  50. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/get_config.py +0 -0
  51. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/get_current_config.py +0 -0
  52. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/otvision_save_path_provider.py +0 -0
  53. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/track/__init__.py +0 -0
  54. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/track/get_track_cli_args.py +0 -0
  55. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/track/tracking_run_id.py +0 -0
  56. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/track/update_current_track_config.py +0 -0
  57. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/track/update_track_config_with_cli_args.py +0 -0
  58. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/update_current_config.py +0 -0
  59. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/video/__init__.py +0 -0
  60. {otvision-0.6.12 → otvision-0.6.14}/OTVision/application/video/generate_video.py +0 -0
  61. {otvision-0.6.12 → otvision-0.6.14}/OTVision/config.py +0 -0
  62. {otvision-0.6.12 → otvision-0.6.14}/OTVision/convert/__init__.py +0 -0
  63. {otvision-0.6.12 → otvision-0.6.14}/OTVision/convert/convert.py +0 -0
  64. {otvision-0.6.12 → otvision-0.6.14}/OTVision/dataformat.py +0 -0
  65. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/__init__.py +0 -0
  66. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/cli.py +0 -0
  67. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/detect.py +0 -0
  68. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/detected_frame_buffer.py +0 -0
  69. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/detected_frame_producer.py +0 -0
  70. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/detected_frame_producer_factory.py +0 -0
  71. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/file_based_detect_builder.py +0 -0
  72. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/otdet.py +0 -0
  73. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/otdet_file_writer.py +0 -0
  74. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/plugin_av/__init__.py +0 -0
  75. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/plugin_av/rotate_frame.py +0 -0
  76. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/pyav_frame_count_provider.py +0 -0
  77. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/rtsp_based_detect_builder.py +0 -0
  78. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/rtsp_input_source.py +0 -0
  79. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/timestamper.py +0 -0
  80. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/video_input_source.py +0 -0
  81. {otvision-0.6.12 → otvision-0.6.14}/OTVision/detect/yolo.py +0 -0
  82. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/__init__.py +0 -0
  83. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/cli.py +0 -0
  84. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/current_config.py +0 -0
  85. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/detect_producer_consumer.py +0 -0
  86. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/detection.py +0 -0
  87. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/frame.py +0 -0
  88. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/input_source_detect.py +0 -0
  89. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/object_detection.py +0 -0
  90. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/serialization.py +0 -0
  91. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/time.py +0 -0
  92. {otvision-0.6.12 → otvision-0.6.14}/OTVision/domain/video_writer.py +0 -0
  93. {otvision-0.6.12 → otvision-0.6.14}/OTVision/helpers/__init__.py +0 -0
  94. {otvision-0.6.12 → otvision-0.6.14}/OTVision/helpers/date.py +0 -0
  95. {otvision-0.6.12 → otvision-0.6.14}/OTVision/helpers/files.py +0 -0
  96. {otvision-0.6.12 → otvision-0.6.14}/OTVision/helpers/formats.py +0 -0
  97. {otvision-0.6.12 → otvision-0.6.14}/OTVision/helpers/input_types.py +0 -0
  98. {otvision-0.6.12 → otvision-0.6.14}/OTVision/helpers/log.py +0 -0
  99. {otvision-0.6.12 → otvision-0.6.14}/OTVision/helpers/machine.py +0 -0
  100. {otvision-0.6.12 → otvision-0.6.14}/OTVision/helpers/video.py +0 -0
  101. {otvision-0.6.12 → otvision-0.6.14}/OTVision/plugin/__init__.py +0 -0
  102. {otvision-0.6.12 → otvision-0.6.14}/OTVision/plugin/ffmpeg_video_writer.py +0 -0
  103. {otvision-0.6.12 → otvision-0.6.14}/OTVision/plugin/generate_video.py +0 -0
  104. {otvision-0.6.12 → otvision-0.6.14}/OTVision/plugin/yaml_serialization.py +0 -0
  105. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/__init__.py +0 -0
  106. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/builder.py +0 -0
  107. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/cli.py +0 -0
  108. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/exporter/__init__.py +0 -0
  109. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/exporter/filebased_exporter.py +0 -0
  110. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/id_generator.py +0 -0
  111. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/model/__init__.py +0 -0
  112. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/model/filebased/__init__.py +0 -0
  113. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/model/filebased/frame_chunk.py +0 -0
  114. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/model/filebased/frame_group.py +0 -0
  115. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/model/track_exporter.py +0 -0
  116. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/model/tracking_interfaces.py +0 -0
  117. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/parser/__init__.py +0 -0
  118. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/parser/chunk_parser_plugins.py +0 -0
  119. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/parser/frame_group_parser_plugins.py +0 -0
  120. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/track.py +0 -0
  121. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/tracker/__init__.py +0 -0
  122. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/tracker/filebased_tracking.py +0 -0
  123. {otvision-0.6.12 → otvision-0.6.14}/OTVision/track/tracker/tracker_plugin_iou.py +0 -0
  124. {otvision-0.6.12 → otvision-0.6.14}/OTVision/transform/__init__.py +0 -0
  125. {otvision-0.6.12 → otvision-0.6.14}/OTVision/transform/get_homography.py +0 -0
  126. {otvision-0.6.12 → otvision-0.6.14}/OTVision/transform/reference_points_picker.py +0 -0
  127. {otvision-0.6.12 → otvision-0.6.14}/OTVision/transform/transform.py +0 -0
  128. {otvision-0.6.12 → otvision-0.6.14}/OTVision/view/__init__.py +0 -0
  129. {otvision-0.6.12 → otvision-0.6.14}/OTVision/view/helpers/OTC.ico +0 -0
  130. {otvision-0.6.12 → otvision-0.6.14}/OTVision/view/view.py +0 -0
  131. {otvision-0.6.12 → otvision-0.6.14}/OTVision/view/view_convert.py +0 -0
  132. {otvision-0.6.12 → otvision-0.6.14}/OTVision/view/view_detect.py +0 -0
  133. {otvision-0.6.12 → otvision-0.6.14}/OTVision/view/view_helpers.py +0 -0
  134. {otvision-0.6.12 → otvision-0.6.14}/OTVision/view/view_track.py +0 -0
  135. {otvision-0.6.12 → otvision-0.6.14}/OTVision/view/view_transform.py +0 -0
  136. {otvision-0.6.12 → otvision-0.6.14}/OTVision.bat +0 -0
  137. {otvision-0.6.12 → otvision-0.6.14}/README.md +0 -0
  138. {otvision-0.6.12 → otvision-0.6.14}/clean-up-repository.sh +0 -0
  139. {otvision-0.6.12 → otvision-0.6.14}/config.yml +0 -0
  140. {otvision-0.6.12 → otvision-0.6.14}/convert.py +0 -0
  141. {otvision-0.6.12 → otvision-0.6.14}/detect.py +0 -0
  142. {otvision-0.6.12 → otvision-0.6.14}/export_models.py +0 -0
  143. {otvision-0.6.12 → otvision-0.6.14}/generate_video.py +0 -0
  144. {otvision-0.6.12 → otvision-0.6.14}/install.cmd +0 -0
  145. {otvision-0.6.12 → otvision-0.6.14}/install.sh +0 -0
  146. {otvision-0.6.12 → otvision-0.6.14}/install_cuda.cmd +0 -0
  147. {otvision-0.6.12 → otvision-0.6.14}/install_cuda.sh +0 -0
  148. {otvision-0.6.12 → otvision-0.6.14}/install_dev.cmd +0 -0
  149. {otvision-0.6.12 → otvision-0.6.14}/install_dev.sh +0 -0
  150. {otvision-0.6.12 → otvision-0.6.14}/pyproject.toml +0 -0
  151. {otvision-0.6.12 → otvision-0.6.14}/reference_points_picker.py +0 -0
  152. {otvision-0.6.12 → otvision-0.6.14}/tests/__init__.py +0 -0
  153. {otvision-0.6.12 → otvision-0.6.14}/tests/abstraction/__init__.py +0 -0
  154. {otvision-0.6.12 → otvision-0.6.14}/tests/abstraction/test_defaults.py +0 -0
  155. {otvision-0.6.12 → otvision-0.6.14}/tests/abstraction/test_observer.py +0 -0
  156. {otvision-0.6.12 → otvision-0.6.14}/tests/application/__init__.py +0 -0
  157. {otvision-0.6.12 → otvision-0.6.14}/tests/application/detect/__init__.py +0 -0
  158. {otvision-0.6.12 → otvision-0.6.14}/tests/application/detect/test_current_object_detector.py +0 -0
  159. {otvision-0.6.12 → otvision-0.6.14}/tests/application/detect/test_detected_frame_factory.py +0 -0
  160. {otvision-0.6.12 → otvision-0.6.14}/tests/application/detect/test_get_detect_cli_args.py +0 -0
  161. {otvision-0.6.12 → otvision-0.6.14}/tests/application/detect/test_timestamper.py +0 -0
  162. {otvision-0.6.12 → otvision-0.6.14}/tests/application/detect/test_update_detect_config_with_cli_args.py +0 -0
  163. {otvision-0.6.12 → otvision-0.6.14}/tests/application/test_buffer.py +0 -0
  164. {otvision-0.6.12 → otvision-0.6.14}/tests/application/test_get_config.py +0 -0
  165. {otvision-0.6.12 → otvision-0.6.14}/tests/application/test_otvision_save_path_provider.py +0 -0
  166. {otvision-0.6.12 → otvision-0.6.14}/tests/application/track/__init__.py +0 -0
  167. {otvision-0.6.12 → otvision-0.6.14}/tests/application/track/test_get_track_cli_args.py +0 -0
  168. {otvision-0.6.12 → otvision-0.6.14}/tests/application/track/test_update_current_track_config.py +0 -0
  169. {otvision-0.6.12 → otvision-0.6.14}/tests/application/track/test_update_track_config_with_cli_args.py +0 -0
  170. {otvision-0.6.12 → otvision-0.6.14}/tests/cli/custom_cli_test_config.yaml +0 -0
  171. {otvision-0.6.12 → otvision-0.6.14}/tests/cli/test_convert_cli.py +0 -0
  172. {otvision-0.6.12 → otvision-0.6.14}/tests/cli/test_detect_cli.py +0 -0
  173. {otvision-0.6.12 → otvision-0.6.14}/tests/cli/test_track_cli.py +0 -0
  174. {otvision-0.6.12 → otvision-0.6.14}/tests/conftest.py +0 -0
  175. {otvision-0.6.12 → otvision-0.6.14}/tests/convert/__init__.py +0 -0
  176. {otvision-0.6.12 → otvision-0.6.14}/tests/convert/test_convert.py +0 -0
  177. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_CamView.png +0 -0
  178. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_CamView_Cars-Cyclist.png +0 -0
  179. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_CamView_Cars-Truck.png +0 -0
  180. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_CamView_refpts.png +0 -0
  181. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  182. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  183. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  184. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  185. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  186. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  187. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  188. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  189. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  190. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  191. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  192. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  193. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_FR20.otrfpts +0 -0
  194. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Satellite.jpg +0 -0
  195. {otvision-0.6.12 → otvision-0.6.14}/tests/data/Testvideo_Satellite_far.jpg +0 -0
  196. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  197. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  198. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  199. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  200. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Cyclist_F20_2020-01-01_00-00-00.h264 +0 -0
  201. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/fail_fps_from_filename/Testvideo_Cars-Truck_2020-01-01_00-00-00.h264 +0 -0
  202. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  203. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/fps_from_filename/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  204. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  205. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/fps_from_filename/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  206. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  207. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/input_fps_20/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  208. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  209. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/input_fps_20/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  210. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  211. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/input_fps_40/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  212. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  213. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/input_fps_40/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  214. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.avi +0 -0
  215. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  216. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.avi +0 -0
  217. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_avi/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  218. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  219. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mkv +0 -0
  220. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  221. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mkv/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mkv +0 -0
  222. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  223. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mov +0 -0
  224. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  225. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mov/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mov +0 -0
  226. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.h264 +0 -0
  227. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  228. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.h264 +0 -0
  229. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/output_filetype_mp4/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  230. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  231. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  232. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/rotation/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  233. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.h264 +0 -0
  234. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mov +0 -0
  235. {otvision-0.6.12 → otvision-0.6.14}/tests/data/convert/rotation/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00_rotate.mp4 +0 -0
  236. {otvision-0.6.12 → otvision-0.6.14}/tests/data/detect/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  237. {otvision-0.6.12 → otvision-0.6.14}/tests/data/detect/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.mp4 +0 -0
  238. {otvision-0.6.12 → otvision-0.6.14}/tests/data/detect/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  239. {otvision-0.6.12 → otvision-0.6.14}/tests/data/detect/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  240. {otvision-0.6.12 → otvision-0.6.14}/tests/data/detect/rotated-Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.mp4 +0 -0
  241. {otvision-0.6.12 → otvision-0.6.14}/tests/data/log/_otvision_logs/test.log +0 -0
  242. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  243. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/default/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  244. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  245. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/default/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  246. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  247. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  248. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  249. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_h_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  250. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  251. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  252. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  253. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_h_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  254. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  255. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  256. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  257. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_iou_0_2/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  258. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  259. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  260. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  261. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_iou_0_6/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  262. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  263. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  264. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  265. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_l_0_1/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  266. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  267. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  268. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  269. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/sigma_l_0_5/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  270. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  271. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_min_10/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  272. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  273. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_min_10/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  274. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  275. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_min_3/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  276. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  277. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_min_3/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  278. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  279. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_miss_max_25/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  280. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  281. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_miss_max_25/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  282. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otdet +0 -0
  283. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_miss_max_75/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  284. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otdet +0 -0
  285. {otvision-0.6.12 → otvision-0.6.14}/tests/data/track/t_miss_max_75/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  286. {otvision-0.6.12 → otvision-0.6.14}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.gpkg +0 -0
  287. {otvision-0.6.12 → otvision-0.6.14}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  288. {otvision-0.6.12 → otvision-0.6.14}/tests/data/transform/Testvideo_Cars-Cyclist_FR20_2020-01-01_00-00-00.ottrk +0 -0
  289. {otvision-0.6.12 → otvision-0.6.14}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.gpkg +0 -0
  290. {otvision-0.6.12 → otvision-0.6.14}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.otrfpts +0 -0
  291. {otvision-0.6.12 → otvision-0.6.14}/tests/data/transform/Testvideo_Cars-Truck_FR20_2020-01-01_00-00-00.ottrk +0 -0
  292. {otvision-0.6.12 → otvision-0.6.14}/tests/data/transform/Testvideo_FR20.otrfpts +0 -0
  293. {otvision-0.6.12 → otvision-0.6.14}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/model.mlmodel +0 -0
  294. {otvision-0.6.12 → otvision-0.6.14}/tests/data/yolov8m.mlpackage/Data/com.apple.CoreML/weights/weight.bin +0 -0
  295. {otvision-0.6.12 → otvision-0.6.14}/tests/data/yolov8m.mlpackage/Manifest.json +0 -0
  296. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/__init__.py +0 -0
  297. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/detect_test.py +0 -0
  298. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/plugin_av/__init__.py +0 -0
  299. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/plugin_av/test_rotate_frame.py +0 -0
  300. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/test_detected_frame_buffer.py +0 -0
  301. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/test_detected_frame_producer.py +0 -0
  302. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/test_detected_frame_producer_factory.py +0 -0
  303. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/test_otdet.py +0 -0
  304. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/test_otdet_file_writer.py +0 -0
  305. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/test_pyav_frame_count_provider.py +0 -0
  306. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/test_rtsp_input_source.py +0 -0
  307. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/test_video_input_source.py +0 -0
  308. {otvision-0.6.12 → otvision-0.6.14}/tests/detect/yolo_test.py +0 -0
  309. {otvision-0.6.12 → otvision-0.6.14}/tests/helpers/__init__.py +0 -0
  310. {otvision-0.6.12 → otvision-0.6.14}/tests/helpers/files_test.py +0 -0
  311. {otvision-0.6.12 → otvision-0.6.14}/tests/helpers/formats_test.py +0 -0
  312. {otvision-0.6.12 → otvision-0.6.14}/tests/helpers/test_log.py +0 -0
  313. {otvision-0.6.12 → otvision-0.6.14}/tests/log/__init__.py +0 -0
  314. {otvision-0.6.12 → otvision-0.6.14}/tests/log/log_maker.py +0 -0
  315. {otvision-0.6.12 → otvision-0.6.14}/tests/log/test_log.py +0 -0
  316. {otvision-0.6.12 → otvision-0.6.14}/tests/plugin/__init__.py +0 -0
  317. {otvision-0.6.12 → otvision-0.6.14}/tests/plugin/test_ffmpeg_video_file_writer.py +0 -0
  318. {otvision-0.6.12 → otvision-0.6.14}/tests/test_config.py +0 -0
  319. {otvision-0.6.12 → otvision-0.6.14}/tests/track/__init__.py +0 -0
  320. {otvision-0.6.12 → otvision-0.6.14}/tests/track/helper/__init__.py +0 -0
  321. {otvision-0.6.12 → otvision-0.6.14}/tests/track/helper/data_builder.py +0 -0
  322. {otvision-0.6.12 → otvision-0.6.14}/tests/track/parser/__init__.py +0 -0
  323. {otvision-0.6.12 → otvision-0.6.14}/tests/track/parser/test_chunk_parser_plugins.py +0 -0
  324. {otvision-0.6.12 → otvision-0.6.14}/tests/track/test_frame_chunk.py +0 -0
  325. {otvision-0.6.12 → otvision-0.6.14}/tests/track/test_frame_group.py +0 -0
  326. {otvision-0.6.12 → otvision-0.6.14}/tests/track/test_frame_group_parser_plugins.py +0 -0
  327. {otvision-0.6.12 → otvision-0.6.14}/tests/track/test_stream_ottrk_file_writer.py +0 -0
  328. {otvision-0.6.12 → otvision-0.6.14}/tests/track/test_track.py +0 -0
  329. {otvision-0.6.12 → otvision-0.6.14}/tests/track/test_tracking_data_structures.py +0 -0
  330. {otvision-0.6.12 → otvision-0.6.14}/tests/transform/__init__.py +0 -0
  331. {otvision-0.6.12 → otvision-0.6.14}/tests/transform/test_transform.py +0 -0
  332. {otvision-0.6.12 → otvision-0.6.14}/tests/utils/__init__.py +0 -0
  333. {otvision-0.6.12 → otvision-0.6.14}/tests/utils/generator.py +0 -0
  334. {otvision-0.6.12 → otvision-0.6.14}/tests/utils/mocking.py +0 -0
  335. {otvision-0.6.12 → otvision-0.6.14}/track.py +0 -0
  336. {otvision-0.6.12 → otvision-0.6.14}/transform.py +0 -0
  337. {otvision-0.6.12 → otvision-0.6.14}/update_precommit.py +0 -0
  338. {otvision-0.6.12 → otvision-0.6.14}/uv.lock +0 -0
  339. {otvision-0.6.12 → otvision-0.6.14}/view.py +0 -0
@@ -73,6 +73,11 @@ from OTVision.application.config import (
73
73
  _UndistortConfig,
74
74
  )
75
75
  from OTVision.domain.serialization import Deserializer
76
+ from OTVision.plugin.ffmpeg_video_writer import (
77
+ ConstantRateFactor,
78
+ EncodingSpeed,
79
+ VideoCodec,
80
+ )
76
81
 
77
82
 
78
83
  class InvalidOtvisionConfigError(Exception):
@@ -190,6 +195,21 @@ class ConfigParser:
190
195
  if expected_duration is not None:
191
196
  expected_duration = timedelta(seconds=int(expected_duration))
192
197
 
198
+ if video_codec := data.get(VIDEO_CODEC, None):
199
+ video_codec = VideoCodec(video_codec)
200
+ else:
201
+ video_codec = DetectConfig.video_codec
202
+
203
+ if encoding_speed := data.get(ENCODING_SPEED, None):
204
+ encoding_speed = EncodingSpeed(encoding_speed)
205
+ else:
206
+ encoding_speed = DetectConfig.encoding_speed
207
+
208
+ if data.get(CRF, None) is not None:
209
+ crf = ConstantRateFactor[data[CRF]]
210
+ else:
211
+ crf = DetectConfig.crf
212
+
193
213
  start_time = self._parse_start_time(data)
194
214
  return DetectConfig(
195
215
  paths=sources,
@@ -202,9 +222,9 @@ class ConfigParser:
202
222
  detect_start=data.get(DETECT_START, DetectConfig.detect_start),
203
223
  detect_end=data.get(DETECT_END, DetectConfig.detect_end),
204
224
  write_video=data.get(WRITE_VIDEO, DetectConfig.write_video),
205
- video_codec=data.get(VIDEO_CODEC, DetectConfig.video_codec),
206
- encoding_speed=data.get(ENCODING_SPEED, DetectConfig.encoding_speed),
207
- crf=data.get(CRF, DetectConfig.crf),
225
+ video_codec=video_codec,
226
+ encoding_speed=encoding_speed,
227
+ crf=crf,
208
228
  )
209
229
 
210
230
  def parse_yolo_config(self, data: dict) -> YoloConfig:
@@ -76,8 +76,9 @@ class OttrkBuilder:
76
76
  t_min=self.config.t_min,
77
77
  t_miss_max=self.config.t_miss_max,
78
78
  )
79
- result[dataformat.TRACKING_RUN_ID] = self.config.tracking_run_id
80
- result[dataformat.FRAME_GROUP] = self.config.frame_group
79
+ tracking_metadata = result[dataformat.TRACKING]
80
+ tracking_metadata[dataformat.TRACKING_RUN_ID] = self.config.tracking_run_id
81
+ tracking_metadata[dataformat.FRAME_GROUP] = self.config.frame_group
81
82
  return result
82
83
 
83
84
  def _build_data(self) -> list[dict]:
@@ -68,6 +68,8 @@ class DetectBuilder(ABC):
68
68
 
69
69
  @cached_property
70
70
  def configure_logger(self) -> ConfigureLogger:
71
+ if self._configure_logger is not None:
72
+ return self._configure_logger
71
73
  return ConfigureLogger()
72
74
 
73
75
  @cached_property
@@ -94,6 +96,8 @@ class DetectBuilder(ABC):
94
96
 
95
97
  @cached_property
96
98
  def current_config(self) -> CurrentConfig:
99
+ if self.__current_config is not None:
100
+ return self.__current_config
97
101
  return CurrentConfig(Config())
98
102
 
99
103
  @cached_property
@@ -173,8 +177,15 @@ class DetectBuilder(ABC):
173
177
  def detect_config(self) -> DetectConfig:
174
178
  return self.current_config.get().detect
175
179
 
176
- def __init__(self, argv: list[str] | None = None) -> None:
180
+ def __init__(
181
+ self,
182
+ argv: list[str] | None = None,
183
+ current_config: CurrentConfig | None = None,
184
+ configure_logger: ConfigureLogger | None = None,
185
+ ) -> None:
177
186
  self.argv = argv
187
+ self.__current_config = current_config
188
+ self._configure_logger = configure_logger
178
189
 
179
190
  @property
180
191
  @abstractmethod
@@ -1,4 +1,5 @@
1
1
  from pathlib import Path
2
+ from typing import Any
2
3
 
3
4
  from OTVision.application.buffer import Buffer
4
5
  from OTVision.application.config import Config, TrackConfig
@@ -66,7 +67,7 @@ class StreamOttrkFileWriter(Buffer[TrackedFrame, OtdetFileWrittenEvent]):
66
67
  )
67
68
  self._builder.set_config(builder_config)
68
69
  last_frame = tracked_frames[-1]
69
- self._builder.add_tracked_frames(self._get_buffered_elements())
70
+ self._builder.add_tracked_frames(tracked_frames)
70
71
  self._ottrk_unfinished_tracks = last_frame.unfinished_tracks
71
72
  self.reset()
72
73
 
@@ -103,9 +104,18 @@ class StreamOttrkFileWriter(Buffer[TrackedFrame, OtdetFileWrittenEvent]):
103
104
  )
104
105
  logger().warning(f"Unfinished tracks: {self._ottrk_unfinished_tracks}")
105
106
  if self.build_condition_fulfilled:
106
- ottrk_data = self._builder.build()
107
- self.write(ottrk_data)
108
- self._in_writing_state = False
107
+ self._create_ottrk()
108
+
109
+ def _create_ottrk(self) -> None:
110
+ ottrk_data = self._builder.build()
111
+ self.write(ottrk_data)
112
+ self.full_reset()
113
+
114
+ def full_reset(self) -> None:
115
+ self._in_writing_state = False
116
+ self._builder.reset()
117
+ self._ottrk_unfinished_tracks = set()
118
+ self._current_output_file = None
109
119
 
110
120
  def write(self, ottrk: dict) -> None:
111
121
  write_json(
@@ -114,3 +124,6 @@ class StreamOttrkFileWriter(Buffer[TrackedFrame, OtdetFileWrittenEvent]):
114
124
  filetype=self.config.filetypes.track,
115
125
  overwrite=True,
116
126
  )
127
+
128
+ def force_flush(self, _: Any) -> None:
129
+ self._create_ottrk()
@@ -1,4 +1,4 @@
1
- __version__ = "v0.6.12"
1
+ __version__ = "v0.6.14"
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.12
3
+ Version: 0.6.14
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/
@@ -1,3 +1,4 @@
1
+ from datetime import datetime, timedelta
1
2
  from pathlib import Path
2
3
  from unittest.mock import Mock
3
4
 
@@ -5,11 +6,92 @@ import pytest
5
6
 
6
7
  from OTVision.application.config import (
7
8
  Config,
9
+ DetectConfig,
8
10
  StreamConfig,
9
11
  TrackConfig,
12
+ YoloConfig,
10
13
  _TrackIouConfig,
11
14
  )
12
15
  from OTVision.application.config_parser import ConfigParser, InvalidOtvisionConfigError
16
+ from OTVision.plugin.ffmpeg_video_writer import (
17
+ ConstantRateFactor,
18
+ EncodingSpeed,
19
+ VideoCodec,
20
+ )
21
+
22
+ # Ensure paths are translated to the respective platform (unix, windows)
23
+ VIDEO_1 = str(Path("tests/data/video1.mp4"))
24
+ VIDEO_2 = str(Path("tests/data/video2.mp4"))
25
+
26
+
27
+ class TestConfigParser:
28
+ @pytest.fixture
29
+ def given_deserializer(self) -> Mock:
30
+ return Mock()
31
+
32
+ @pytest.fixture
33
+ def given_config_parser(self, given_deserializer: Mock) -> ConfigParser:
34
+ return ConfigParser(given_deserializer)
35
+
36
+ def test_parse_detect_config_with_fully_specified_config(
37
+ self, given_config_parser: ConfigParser
38
+ ) -> None:
39
+ detect_dict = {
40
+ "PATHS": [VIDEO_1, VIDEO_2],
41
+ "RUN_CHAINED": False,
42
+ "YOLO": {
43
+ "WEIGHTS": "yolov8m.pt",
44
+ "CONF": 0.35,
45
+ "IOU": 0.5,
46
+ "IMGSIZE": 1280,
47
+ "NORMALIZED": False,
48
+ },
49
+ "EXPECTED_DURATION": 3600,
50
+ "OVERWRITE": False,
51
+ "HALF_PRECISION": True,
52
+ "START_TIME": "2025-10-15_14-30-00",
53
+ "DETECT_START": 10,
54
+ "DETECT_END": 100,
55
+ "WRITE_VIDEO": True,
56
+ "VIDEO_CODEC": "h264_nvenc",
57
+ "ENCODING_SPEED": "medium",
58
+ "CRF": "HIGH_QUALITY",
59
+ }
60
+
61
+ result = given_config_parser.parse_detect_config(detect_dict)
62
+
63
+ expected = DetectConfig(
64
+ paths=[VIDEO_1, VIDEO_2],
65
+ run_chained=False,
66
+ yolo_config=YoloConfig(
67
+ weights="yolov8m.pt",
68
+ conf=0.35,
69
+ iou=0.5,
70
+ img_size=1280,
71
+ normalized=False,
72
+ ),
73
+ expected_duration=timedelta(seconds=3600),
74
+ overwrite=False,
75
+ half_precision=True,
76
+ start_time=datetime(2025, 10, 15, 14, 30, 0),
77
+ detect_start=10,
78
+ detect_end=100,
79
+ write_video=True,
80
+ video_codec=VideoCodec.H264_NVENC,
81
+ encoding_speed=EncodingSpeed.MEDIUM,
82
+ crf=ConstantRateFactor.HIGH_QUALITY,
83
+ )
84
+ assert result == expected
85
+
86
+ def test_parse_detect_config_with_empty_config(
87
+ self, given_config_parser: ConfigParser
88
+ ) -> None:
89
+ detect_dict: dict = {}
90
+
91
+ result = given_config_parser.parse_detect_config(detect_dict)
92
+
93
+ expected = DetectConfig()
94
+ assert result == expected
13
95
 
14
96
 
15
97
  class TestConfigParserValidateFlushBufferSupportTrackLifecycle:
@@ -348,6 +348,8 @@ def create_expected_track_metadata(
348
348
  config.t_min,
349
349
  config.t_miss_max,
350
350
  ),
351
+ dataformat.TRACKING_RUN_ID: config.tracking_run_id,
352
+ dataformat.FRAME_GROUP: config.frame_group,
351
353
  },
352
354
  }
353
355
 
@@ -431,14 +433,11 @@ def create_expected_ottrk(
431
433
  ) -> dict:
432
434
  otdet_metadata = create_otdet_metadata(actual_duration, expected_duration)
433
435
  track_metadata = create_expected_track_metadata(actual_duration, expected_duration)
434
- config = create_ottrk_builder_config(actual_duration, expected_duration)
435
436
 
436
437
  # Add the missing fields that OttrkBuilder adds
437
438
  combined_metadata = {
438
439
  **otdet_metadata,
439
440
  **track_metadata,
440
- dataformat.TRACKING_RUN_ID: config.tracking_run_id,
441
- dataformat.FRAME_GROUP: config.frame_group,
442
441
  }
443
442
 
444
443
  return {
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