Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
194 commits
Select commit Hold shift + click to select a range
b113f9d
Move RecorderStats to utils.stats
C-Achard Jun 24, 2026
ea693fa
Preserve mono frames & add recorder timing
C-Achard Jun 24, 2026
9f7916a
Add preserve_mono camera option and UI support
C-Achard Jun 24, 2026
02394ec
Add actual_pixel_format and preserve_mono support
C-Achard Jun 24, 2026
07ec931
Basler: track camera pixel format and mono output
C-Achard Jun 24, 2026
fd1b90e
Show detected output format & mono option
C-Achard Jun 24, 2026
c2a10e2
Track actual pixel/output formats in camera backends
C-Achard Jun 24, 2026
388b4c6
Use make_two_field_row for Output row
C-Achard Jun 24, 2026
4d7f999
Use display labels for multi-camera GUI
C-Achard Jun 24, 2026
25cc158
Update tests: display_id naming and fallback
C-Achard Jun 24, 2026
33604f0
Remove tiled frame generation and accessors
C-Achard Jun 24, 2026
9136655
Use runtime FPS for recording; add fallbacks
C-Achard Jun 24, 2026
63fe321
Track encoding errors with writer_timing
C-Achard Jun 24, 2026
03e0fa4
Use _camera_pixel_format in camera backends
C-Achard Jun 24, 2026
97fa492
Add TYPE_CHECKING in stats
C-Achard Jun 24, 2026
b9c331d
test: remove duplicate stable camera ID test
C-Achard Jul 14, 2026
a46e8c8
Fix camera ID fallback and stop state reset
C-Achard Aug 11, 2026
ebb2ca3
Clear camera runtime info during shutdown
C-Achard Aug 11, 2026
7739629
Harden frame rate handling in video recorder
C-Achard Aug 11, 2026
b976cd6
Suggest mono preserve instead of auto-enable
C-Achard Aug 11, 2026
7352d28
Stabilize preview rendering GUI test
C-Achard Aug 11, 2026
43fc534
Refactor WriteGear option handling
C-Achard Aug 12, 2026
24422f9
Clarify docs: Route camera open/probe requests to UI thread
C-Achard Aug 13, 2026
fdc1d6e
Only check output format once in read
C-Achard Aug 18, 2026
73caf10
Type hint fix
C-Achard Aug 18, 2026
aad029d
Harden recording FPS resolution logic
C-Achard Aug 18, 2026
231330c
Filter None WriteGear option values
C-Achard Aug 18, 2026
08e8adc
Centralize WriteGear option validation
C-Achard Aug 18, 2026
5376a65
Use one-by-one Basler grab strategy
C-Achard Jun 26, 2026
77dfac4
Ignore profiling output artifacts
C-Achard Jun 26, 2026
c596fde
Add profiling extra with Scalene
C-Achard Jun 26, 2026
02ee671
Optimize recording pipeline and encoder options
C-Achard Jun 26, 2026
43b82b3
Enable timing logs and enrich recorder stats
C-Achard Jun 26, 2026
e0de588
Expand recording behavior test coverage
C-Achard Jun 26, 2026
1250404
Persist fast encoding setting in GUI
C-Achard Jun 29, 2026
dc0fa7d
Always wire recording setting signal handlers
C-Achard Jun 29, 2026
b8bc931
Disable default timing logs and fix stats import
C-Achard Jun 29, 2026
a1758f2
Fix writer defaults and buffer time fallback
C-Achard Jun 29, 2026
a74cfed
Defer recording until preview frames are ready
C-Achard Jun 30, 2026
bdbb45b
Disable delayed auto-start of recording
C-Achard Jun 30, 2026
fb77aa9
Update main_window.py
C-Achard Jun 30, 2026
b6e4b89
Centralize trigger debug logging flag
C-Achard Aug 11, 2026
71d5404
Normalize WriteGear options and rename overrides
C-Achard Aug 11, 2026
7e3573d
Align tests with writer options override rename
C-Achard Aug 12, 2026
98ba0e6
Fix merge conflict
C-Achard Aug 12, 2026
0cafaf4
Guard recording start when no cameras configured
C-Achard Aug 18, 2026
0b817a6
Update tests for writegear option builder
C-Achard Aug 18, 2026
80c13b6
Add Basler acquisition stats debug logging
C-Achard Aug 19, 2026
4e6801e
Add frame timestamp metadata helper class
C-Achard Jun 29, 2026
a127892
Propagate hardware timestamp metadata
C-Achard Jun 29, 2026
0106b72
Update aravis_backend.py
C-Achard Jun 29, 2026
2fe4be8
Update basler_backend.py
C-Achard Jun 29, 2026
8d5d28c
Update gentl_backend.py
C-Achard Jun 29, 2026
de96d90
Update opencv_backend.py
C-Achard Jun 29, 2026
4e4c0f5
Update tests for CapturedFrame read API
C-Achard Jun 29, 2026
69704b9
Rename metadata key to frame_timestamps
C-Achard Jun 29, 2026
c86ecff
Add timestamp metadata coverage across tests
C-Achard Jun 29, 2026
2fb6245
Harden Basler timestamp metadata handling
C-Achard Jun 29, 2026
447067b
Drop legacy timestamps assertions in tests
C-Achard Jun 29, 2026
5e7d1c5
Guard default timestamp field
C-Achard Jun 29, 2026
2bf4b03
Run pre-commit
C-Achard Aug 12, 2026
30648ce
Refactor Basler test fixture injection
C-Achard Aug 12, 2026
082ef1f
Add Basler timestamp metadata edge-case tests
C-Achard Aug 12, 2026
6979ba2
Remove unused last_frame_timestamp_metadata
C-Achard Aug 12, 2026
19af93d
Lock processor settings during DLC inference
C-Achard Jun 30, 2026
c884d0c
Improve processor discovery and logging
C-Achard Jul 1, 2026
05a179f
Add processors package exports
C-Achard Jul 1, 2026
5dc49f0
Move example socket processors to examples module
C-Achard Jul 1, 2026
b84af35
Update plugin docs for processor examples
C-Achard Jul 1, 2026
c941b36
Skip socket base module in processor scan
C-Achard Jul 1, 2026
db5ef79
Update processor_utils.py
C-Achard Jul 1, 2026
d44a08a
Warn on duplicate processor registration
C-Achard Jul 1, 2026
bf92b29
Update examples.py
C-Achard Jul 1, 2026
0f95f94
Refine processor package scan typing
C-Achard Jul 1, 2026
030847c
Update examples.py
C-Achard Jul 1, 2026
b222abb
Fix dlclive Processor import paths
C-Achard Jul 1, 2026
2678565
Extract processor registry into new module
C-Achard Jul 1, 2026
d6dafac
Fix dlclive mock structure in processor tests
C-Achard Jul 1, 2026
8b49771
Make Engine a str enum and normalize model_type
C-Achard Jul 1, 2026
02b6a2f
Persist custom processor folder in settings
C-Achard Jul 1, 2026
99496f8
Improve recorder error logging and handling
C-Achard Jul 1, 2026
3294773
Hide base socket processor from discovery
C-Achard Aug 12, 2026
703c2eb
Unify processor discovery and scan metadata
C-Achard Aug 12, 2026
50891a0
Deprecate legacy processor registry API
C-Achard Aug 12, 2026
3b6aaee
Update processor discovery tests
C-Achard Aug 12, 2026
14933e8
Require dlclive in socket processor tests
C-Achard Aug 12, 2026
0acccb2
Add discovery tests for built-in processors
C-Achard Aug 12, 2026
0b02770
Update processor plugin system docs
C-Achard Aug 12, 2026
54a6701
Refine custom processor UI controls
C-Achard Aug 12, 2026
b9f95ae
Improve processor session override GUI test
C-Achard Aug 12, 2026
0ccc434
Add test for processor control re-enable
C-Achard Aug 12, 2026
d2ba6d5
Improve processor discovery and logging
C-Achard Jul 1, 2026
090ffc9
Add processors package exports
C-Achard Jul 1, 2026
3ff8d47
Move example socket processors to examples module
C-Achard Jul 1, 2026
64ff4b1
Skip socket base module in processor scan
C-Achard Jul 1, 2026
b9bfe87
Update processor_utils.py
C-Achard Jul 1, 2026
dfc2346
Warn on duplicate processor registration
C-Achard Jul 1, 2026
a1decc1
Extract processor registry into new module
C-Achard Jul 1, 2026
4bb586f
Normalize recording container handling
C-Achard Jul 2, 2026
a16fca7
Add DLC timing instrumentation in GUI path
C-Achard Jul 2, 2026
379a40b
Prioritize latest frame when queue is full
C-Achard Jul 2, 2026
785609c
Lower camera backend logs to debug
C-Achard Jul 2, 2026
ff68a2a
Harden DLC worker startup and timing logs
C-Achard Jul 2, 2026
75e4299
Disable pose latency debug logging
C-Achard Jul 2, 2026
e3074e3
Fix shutdown order in camera preview stop
C-Achard Jul 2, 2026
ea90735
Add mono-preserving output mode to GenTL
C-Achard Jul 2, 2026
fceae65
Async recording stop and queued frame dispatch
C-Achard Jul 2, 2026
f59bde7
Update recording_manager.py
C-Achard Jul 3, 2026
cb784a6
Use runner pose directly in DLC processor
C-Achard Aug 13, 2026
f0865a1
Split timing loggers across worker thread
C-Achard Aug 13, 2026
754ecfd
pre-commit
C-Achard Aug 13, 2026
df72a5f
Remove duplicate node value reader
C-Achard Aug 14, 2026
ed47d52
Pass timestamp metadata to frame writer
C-Achard Aug 18, 2026
ee51ae0
Stabilize rec manager async write tests
C-Achard Aug 18, 2026
5accf71
Lock processor settings during DLC inference
C-Achard Jun 30, 2026
f31a49f
Improve processor discovery and logging
C-Achard Jul 1, 2026
86e4722
Add processors package exports
C-Achard Jul 1, 2026
d74a37c
Move example socket processors to examples module
C-Achard Jul 1, 2026
bea3226
Skip socket base module in processor scan
C-Achard Jul 1, 2026
3501f2a
Update processor_utils.py
C-Achard Jul 1, 2026
eea2666
Warn on duplicate processor registration
C-Achard Jul 1, 2026
9a3a120
Fix dlclive Processor import paths
C-Achard Jul 1, 2026
11c848f
Extract processor registry into new module
C-Achard Jul 1, 2026
c3d351b
Refactor camera worker and recording pipeline
C-Achard Jul 2, 2026
1f4890e
Route recording frames through recording sink
C-Achard Jul 2, 2026
a04c803
Update recording manager test imports
C-Achard Jul 2, 2026
2b12ad5
Propagate capture metadata in single-camera flow
C-Achard Jul 2, 2026
10dfe2b
Add timestamp metadata to frame signal
C-Achard Jul 3, 2026
1f18371
Comment previous signals
C-Achard Jul 3, 2026
3e0fab8
Fix dispatcher lifecycle and add flush API
C-Achard Jul 3, 2026
eb18bfa
Update tests for CapturedFrame integration
C-Achard Jul 3, 2026
83a3617
Stabilize recording and camera tests
C-Achard Jul 3, 2026
ff4f590
Harden recording dispatcher shutdown flow
C-Achard Aug 14, 2026
26e4893
Retry recorder stop until success
C-Achard Aug 14, 2026
eb9d424
Disable debug timing log
C-Achard Aug 14, 2026
2e81a14
Add timeout for recorder stop retries
C-Achard Aug 18, 2026
6b461a2
Rename recording frame toggle API
C-Achard Aug 18, 2026
671d634
Respect configured OpenCV device name
C-Achard Jul 8, 2026
fb22710
Use display IDs in camera UI labels
C-Achard Jul 8, 2026
bfe6757
Make controls panel scrollable with fixed footer
C-Achard Jul 8, 2026
26d8514
Fix test assertion
C-Achard Jul 8, 2026
91b5275
Refactor settings store and add preference APIs
C-Achard Jul 10, 2026
45cdff9
Persist processor and DLC camera selections
C-Achard Jul 10, 2026
3700f1d
Expand settings store unit test coverage
C-Achard Jul 10, 2026
d84ed2a
Improve config path handling in main window
C-Achard Jul 10, 2026
410ca85
pre-commit
C-Achard Aug 14, 2026
2f089e9
Persist recording filename in user settings
C-Achard Aug 14, 2026
b2eaf39
Restore local prefs only on initial config load
C-Achard Aug 17, 2026
32aeb5c
Include camera ID in unknown camera label
C-Achard Aug 17, 2026
0d77725
Fix loading of last config file setting
C-Achard Aug 18, 2026
69768b3
Add Help menu link to documentation
C-Achard Aug 19, 2026
4c9fa25
Add camera settings fixture
C-Achard Jul 8, 2026
78c3eea
Refactor full-queue frame drop test
C-Achard Jul 8, 2026
01d8c55
Add SingleCameraWorker service unit tests
C-Achard Jul 8, 2026
1e2e69e
Add GUI tests for preview and recording lifecycle
C-Achard Jul 8, 2026
28e0ad8
Drop strobe settings when fields are hidden
C-Achard Jul 8, 2026
5230ca8
Add trigger config dialog GUI test coverage
C-Achard Jul 8, 2026
991ba58
Sync settings after saving config
C-Achard Jul 10, 2026
0edc6d2
Add unit tests for GenTL discovery utils
C-Achard Jul 10, 2026
8b6410f
Add GUI tests for config and camera fallback
C-Achard Jul 10, 2026
be17f88
Refactor recording option tests
C-Achard Aug 12, 2026
1871750
Add mono output format tests for GenTL backend
C-Achard Aug 14, 2026
d994ab8
Use isHidden in trigger config test
C-Achard Aug 17, 2026
a6fe0f9
Update test_config.py
C-Achard Aug 18, 2026
d3b4084
Build processors inside DLC worker when needed
C-Achard Jul 9, 2026
8d408d9
Add mock proc test fiels
C-Achard Jul 9, 2026
3a89296
Update main_window.py
C-Achard Jul 9, 2026
849a68e
Add recording file context and recorder path accessors
C-Achard Jul 10, 2026
62288f2
Add recording lifecycle hooks for processors
C-Achard Jul 10, 2026
5c62cbb
Add processor recording-context tests
C-Achard Jul 10, 2026
96ecfa5
Remove custom proc testing folder
C-Achard Jul 10, 2026
45390a1
pre-commit
C-Achard Aug 17, 2026
3e94863
Use shared worker-build processor helper
C-Achard Aug 17, 2026
ef3e0e2
Preserve processor recording context lifecycle
C-Achard Aug 17, 2026
f4e4446
Defer DLC processor cleanup until worker exits
C-Achard Aug 17, 2026
712c0b2
Fix processor recording context cleanup
C-Achard Aug 17, 2026
832503c
Improve processor reset and recording hooks
C-Achard Aug 17, 2026
46d5ea8
Disable debug log
C-Achard Aug 17, 2026
871f939
Fix save path and recording context resolution
C-Achard Aug 17, 2026
2e1340c
Expand recording context test coverage
C-Achard Aug 17, 2026
1dfc4d5
Fix recording start flag and add worker test
C-Achard Aug 17, 2026
6fc96d2
fix: save processor data before destroying it when stopping inference…
deruyter92 Jul 23, 2026
44a7eec
revert 3eba29f85b7e187c37bb791307c4a1b0e94caa27
deruyter92 Jul 23, 2026
9c246bb
fix dlc_processor: clean up custom processor during DLC shutdown
deruyter92 Jul 23, 2026
cb8e01d
warn: confirm before stopping inference while recording
deruyter92 Jul 23, 2026
6daedd9
Update dlclivegui/gui/main_window.py
deruyter92 Aug 10, 2026
f5608af
Update dlclivegui/gui/main_window.py
deruyter92 Aug 10, 2026
42a2318
Fix message when stopping inference while recording
C-Achard Aug 10, 2026
22e7a01
Fix camera startup state and sink arg handling
C-Achard Aug 21, 2026
5718db4
Copy frames before queueing for recorder
C-Achard Aug 21, 2026
44a107a
Handle recording stop failures in UI
C-Achard Aug 21, 2026
84b30d1
Clarify stop-inference data loss warning
C-Achard Aug 21, 2026
6d1e49a
Remove unused recording frame callback
C-Achard Aug 21, 2026
743ce2e
Cover preview stop during camera startup
C-Achard Aug 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,8 @@ venv.bak/
!dlclivegui/config.py
# uv package files
uv.lock

# profiling
profile*.svg
scalene*.json
scalene*.html
20 changes: 17 additions & 3 deletions dlclivegui/cameras/backends/aravis_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import numpy as np

from ...config import CameraSettings
from ..base import CameraBackend, SupportLevel, register_backend
from ..base import CameraBackend, CapturedFrame, SupportLevel, register_backend
from ..factory import DetectedCamera

LOG = logging.getLogger(__name__)
Expand Down Expand Up @@ -52,6 +52,8 @@ def __init__(self, settings):
self._actual_width: int | None = None
self._actual_height: int | None = None
self._actual_fps: float | None = None
self._camera_pixel_format: str | None = None
self._actual_output_format: str | None = None

self._camera = None
self._stream = None
Expand All @@ -69,6 +71,16 @@ def actual_fps(self) -> float | None:
"""Return the actual frame rate of the camera after opening."""
return self._actual_fps

@property
def actual_pixel_format(self) -> str | None:
"""Camera/native pixel format requested/reported for Aravis."""
return self._camera_pixel_format or self._pixel_format

@property
def actual_output_format(self) -> str | None:
"""Current Aravis backend emits BGR uint8 frames."""
return self._actual_output_format or "BGR8"

@classmethod
def is_available(cls) -> bool:
"""Check if Aravis is available on this system."""
Expand Down Expand Up @@ -360,7 +372,7 @@ def open(self) -> None:

self._camera.start_acquisition()

def read(self) -> tuple[np.ndarray, float]:
def read(self) -> CapturedFrame:
"""Read a frame from the camera."""
if self._camera is None or self._stream is None:
raise RuntimeError("Aravis camera not initialized")
Expand Down Expand Up @@ -418,7 +430,7 @@ def read(self) -> tuple[np.ndarray, float]:
# Always push buffer back to stream
self._stream.push_buffer(buffer)

return frame, timestamp
return CapturedFrame(frame=frame, software_timestamp=timestamp, timestamp_metadata=None)

def stop(self) -> None:
"""Stop camera acquisition."""
Expand Down Expand Up @@ -615,10 +627,12 @@ def _configure_pixel_format(self) -> None:

if self._pixel_format in format_map:
self._camera.set_pixel_format(format_map[self._pixel_format])
self._camera_pixel_format = self._pixel_format
LOG.info(f"Pixel format set to '{self._pixel_format}'")
else:
# Try setting as string
self._camera.set_pixel_format_from_string(self._pixel_format)
self._camera_pixel_format = self._pixel_format
LOG.info(f"Pixel format set to '{self._pixel_format}' (from string)")
except Exception as e:
LOG.warning(f"Failed to set pixel format '{self._pixel_format}': {e}")
Expand Down
Loading
Loading