Skip to content
Open
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
c0099ae
Move RecorderStats to utils.stats
C-Achard Jun 24, 2026
f31b57d
Preserve mono frames & add recorder timing
C-Achard Jun 24, 2026
6b1a991
Add preserve_mono camera option and UI support
C-Achard Jun 24, 2026
ae06ee5
Add actual_pixel_format and preserve_mono support
C-Achard Jun 24, 2026
41ab0a9
Basler: track camera pixel format and mono output
C-Achard Jun 24, 2026
6c2ab07
Show detected output format & mono option
C-Achard Jun 24, 2026
35ca5c2
Track actual pixel/output formats in camera backends
C-Achard Jun 24, 2026
75da236
Use make_two_field_row for Output row
C-Achard Jun 24, 2026
2f03dfd
Use display labels for multi-camera GUI
C-Achard Jun 24, 2026
1401da5
Update tests: display_id naming and fallback
C-Achard Jun 24, 2026
bd10448
Remove tiled frame generation and accessors
C-Achard Jun 24, 2026
10ba918
Use runtime FPS for recording; add fallbacks
C-Achard Jun 24, 2026
9d4657d
Track encoding errors with writer_timing
C-Achard Jun 24, 2026
a697150
Use _camera_pixel_format in camera backends
C-Achard Jun 24, 2026
5c86aed
Add TYPE_CHECKING in stats
C-Achard Jun 24, 2026
f72fcdd
test: remove duplicate stable camera ID test
C-Achard Jul 14, 2026
9a17e7c
Fix camera ID fallback and stop state reset
C-Achard Aug 11, 2026
d58fc22
Clear camera runtime info during shutdown
C-Achard Aug 11, 2026
00afdcc
Harden frame rate handling in video recorder
C-Achard Aug 11, 2026
34024fe
Suggest mono preserve instead of auto-enable
C-Achard Aug 11, 2026
efd05ac
Stabilize preview rendering GUI test
C-Achard Aug 11, 2026
eeb7583
Refactor WriteGear option handling
C-Achard Aug 12, 2026
2b6294c
Clarify docs: Route camera open/probe requests to UI thread
C-Achard Aug 13, 2026
bdc7265
Only check output format once in read
C-Achard Aug 18, 2026
a8bfa31
Type hint fix
C-Achard Aug 18, 2026
55c4dac
Harden recording FPS resolution logic
C-Achard Aug 18, 2026
d8656ed
Filter None WriteGear option values
C-Achard Aug 18, 2026
9a5b01d
Centralize WriteGear option validation
C-Achard Aug 18, 2026
a9f91d1
Use one-by-one Basler grab strategy
C-Achard Jun 26, 2026
512ecad
Ignore profiling output artifacts
C-Achard Jun 26, 2026
dca0fc9
Add profiling extra with Scalene
C-Achard Jun 26, 2026
4cec3fc
Optimize recording pipeline and encoder options
C-Achard Jun 26, 2026
7a0c166
Enable timing logs and enrich recorder stats
C-Achard Jun 26, 2026
b1bc235
Expand recording behavior test coverage
C-Achard Jun 26, 2026
574c960
Persist fast encoding setting in GUI
C-Achard Jun 29, 2026
37ae506
Always wire recording setting signal handlers
C-Achard Jun 29, 2026
e4462bb
Disable default timing logs and fix stats import
C-Achard Jun 29, 2026
cbe5391
Fix writer defaults and buffer time fallback
C-Achard Jun 29, 2026
5b162a4
Defer recording until preview frames are ready
C-Achard Jun 30, 2026
fa33aaf
Disable delayed auto-start of recording
C-Achard Jun 30, 2026
4a5ea48
Update main_window.py
C-Achard Jun 30, 2026
f7c4e5e
Centralize trigger debug logging flag
C-Achard Aug 11, 2026
382b8a8
Normalize WriteGear options and rename overrides
C-Achard Aug 11, 2026
b18acf7
Align tests with writer options override rename
C-Achard Aug 12, 2026
97086de
Fix merge conflict
C-Achard Aug 12, 2026
eba46f6
Guard recording start when no cameras configured
C-Achard Aug 18, 2026
1ff2629
Update tests for writegear option builder
C-Achard Aug 18, 2026
609d7ea
Add Basler acquisition stats debug logging
C-Achard Aug 19, 2026
6a9ae40
Add frame timestamp metadata helper class
C-Achard Jun 29, 2026
df22681
Propagate hardware timestamp metadata
C-Achard Jun 29, 2026
7d3d9f1
Update aravis_backend.py
C-Achard Jun 29, 2026
74c605d
Update basler_backend.py
C-Achard Jun 29, 2026
03e459b
Update gentl_backend.py
C-Achard Jun 29, 2026
6e7b18b
Update opencv_backend.py
C-Achard Jun 29, 2026
2994433
Update tests for CapturedFrame read API
C-Achard Jun 29, 2026
66dad93
Rename metadata key to frame_timestamps
C-Achard Jun 29, 2026
b573949
Add timestamp metadata coverage across tests
C-Achard Jun 29, 2026
3f2cae7
Harden Basler timestamp metadata handling
C-Achard Jun 29, 2026
5150e5c
Drop legacy timestamps assertions in tests
C-Achard Jun 29, 2026
b040cc2
Guard default timestamp field
C-Achard Jun 29, 2026
0cfcfb9
Run pre-commit
C-Achard Aug 12, 2026
0f5bf1b
Refactor Basler test fixture injection
C-Achard Aug 12, 2026
8139097
Add Basler timestamp metadata edge-case tests
C-Achard Aug 12, 2026
fc98e3c
Remove unused last_frame_timestamp_metadata
C-Achard Aug 12, 2026
a524fde
Lock processor settings during DLC inference
C-Achard Jun 30, 2026
e1ec3b1
Improve processor discovery and logging
C-Achard Jul 1, 2026
feff424
Add processors package exports
C-Achard Jul 1, 2026
daeed1e
Move example socket processors to examples module
C-Achard Jul 1, 2026
70879fe
Update plugin docs for processor examples
C-Achard Jul 1, 2026
96391e8
Skip socket base module in processor scan
C-Achard Jul 1, 2026
620e404
Update processor_utils.py
C-Achard Jul 1, 2026
4e8ace0
Warn on duplicate processor registration
C-Achard Jul 1, 2026
8af3148
Update examples.py
C-Achard Jul 1, 2026
6fce7fa
Refine processor package scan typing
C-Achard Jul 1, 2026
45cc56d
Update examples.py
C-Achard Jul 1, 2026
002bd20
Fix dlclive Processor import paths
C-Achard Jul 1, 2026
ac90f5e
Extract processor registry into new module
C-Achard Jul 1, 2026
45afb83
Fix dlclive mock structure in processor tests
C-Achard Jul 1, 2026
c71ca2b
Make Engine a str enum and normalize model_type
C-Achard Jul 1, 2026
00a3674
Persist custom processor folder in settings
C-Achard Jul 1, 2026
9e02c9b
Improve recorder error logging and handling
C-Achard Jul 1, 2026
9e27454
Hide base socket processor from discovery
C-Achard Aug 12, 2026
9beed88
Unify processor discovery and scan metadata
C-Achard Aug 12, 2026
ae21590
Deprecate legacy processor registry API
C-Achard Aug 12, 2026
1f66374
Update processor discovery tests
C-Achard Aug 12, 2026
98c2f55
Require dlclive in socket processor tests
C-Achard Aug 12, 2026
9f71adf
Add discovery tests for built-in processors
C-Achard Aug 12, 2026
5edf7fe
Update processor plugin system docs
C-Achard Aug 12, 2026
633afa9
Refine custom processor UI controls
C-Achard Aug 12, 2026
6e56be6
Improve processor session override GUI test
C-Achard Aug 12, 2026
29923dc
Add test for processor control re-enable
C-Achard Aug 12, 2026
e5b9e41
Improve processor discovery and logging
C-Achard Jul 1, 2026
cd658b6
Add processors package exports
C-Achard Jul 1, 2026
ebaff41
Move example socket processors to examples module
C-Achard Jul 1, 2026
6ab74f7
Skip socket base module in processor scan
C-Achard Jul 1, 2026
005ea51
Update processor_utils.py
C-Achard Jul 1, 2026
fd69c69
Warn on duplicate processor registration
C-Achard Jul 1, 2026
b85d3dc
Extract processor registry into new module
C-Achard Jul 1, 2026
8d9f51a
Normalize recording container handling
C-Achard Jul 2, 2026
2a17c1a
Add DLC timing instrumentation in GUI path
C-Achard Jul 2, 2026
de4249b
Prioritize latest frame when queue is full
C-Achard Jul 2, 2026
3fa34b6
Lower camera backend logs to debug
C-Achard Jul 2, 2026
78bf8a1
Harden DLC worker startup and timing logs
C-Achard Jul 2, 2026
aa5f317
Disable pose latency debug logging
C-Achard Jul 2, 2026
4f1b1e9
Fix shutdown order in camera preview stop
C-Achard Jul 2, 2026
c5fa7a3
Add mono-preserving output mode to GenTL
C-Achard Jul 2, 2026
4b7a3b7
Async recording stop and queued frame dispatch
C-Achard Jul 2, 2026
39964d1
Update recording_manager.py
C-Achard Jul 3, 2026
1885cfe
Use runner pose directly in DLC processor
C-Achard Aug 13, 2026
e0ebe7b
Split timing loggers across worker thread
C-Achard Aug 13, 2026
c2a7289
pre-commit
C-Achard Aug 13, 2026
9593891
Remove duplicate node value reader
C-Achard Aug 14, 2026
a41cd7f
Pass timestamp metadata to frame writer
C-Achard Aug 18, 2026
db6a057
Stabilize rec manager async write tests
C-Achard Aug 18, 2026
cc7494c
Lock processor settings during DLC inference
C-Achard Jun 30, 2026
ab8d82d
Improve processor discovery and logging
C-Achard Jul 1, 2026
09a0dc9
Add processors package exports
C-Achard Jul 1, 2026
976a44b
Move example socket processors to examples module
C-Achard Jul 1, 2026
a0038e5
Skip socket base module in processor scan
C-Achard Jul 1, 2026
6311a72
Update processor_utils.py
C-Achard Jul 1, 2026
bdaa56f
Warn on duplicate processor registration
C-Achard Jul 1, 2026
d668039
Fix dlclive Processor import paths
C-Achard Jul 1, 2026
b18935c
Extract processor registry into new module
C-Achard Jul 1, 2026
3b3a41e
Refactor camera worker and recording pipeline
C-Achard Jul 2, 2026
15c5959
Route recording frames through recording sink
C-Achard Jul 2, 2026
1648b32
Update recording manager test imports
C-Achard Jul 2, 2026
7bef928
Propagate capture metadata in single-camera flow
C-Achard Jul 2, 2026
8c4a84d
Add timestamp metadata to frame signal
C-Achard Jul 3, 2026
39f3916
Comment previous signals
C-Achard Jul 3, 2026
f75631c
Fix dispatcher lifecycle and add flush API
C-Achard Jul 3, 2026
b517df0
Update tests for CapturedFrame integration
C-Achard Jul 3, 2026
dc56be1
Stabilize recording and camera tests
C-Achard Jul 3, 2026
e79c78e
Harden recording dispatcher shutdown flow
C-Achard Aug 14, 2026
a4bfabd
Retry recorder stop until success
C-Achard Aug 14, 2026
6901ae3
Disable debug timing log
C-Achard Aug 14, 2026
c187b5f
Add timeout for recorder stop retries
C-Achard Aug 18, 2026
cd96790
Rename recording frame toggle API
C-Achard Aug 18, 2026
fef76cb
Respect configured OpenCV device name
C-Achard Jul 8, 2026
8f7a93c
Use display IDs in camera UI labels
C-Achard Jul 8, 2026
f6e2b20
Make controls panel scrollable with fixed footer
C-Achard Jul 8, 2026
85d2d96
Fix test assertion
C-Achard Jul 8, 2026
b477fd3
Refactor settings store and add preference APIs
C-Achard Jul 10, 2026
553d345
Persist processor and DLC camera selections
C-Achard Jul 10, 2026
a624530
Expand settings store unit test coverage
C-Achard Jul 10, 2026
f8dccc3
Improve config path handling in main window
C-Achard Jul 10, 2026
693bd4b
pre-commit
C-Achard Aug 14, 2026
e705b19
Persist recording filename in user settings
C-Achard Aug 14, 2026
89d1313
Restore local prefs only on initial config load
C-Achard Aug 17, 2026
7ba2f21
Include camera ID in unknown camera label
C-Achard Aug 17, 2026
20ca665
Fix loading of last config file setting
C-Achard Aug 18, 2026
ad871f3
Add Help menu link to documentation
C-Achard Aug 19, 2026
7430c4c
Add camera settings fixture
C-Achard Jul 8, 2026
6dd9d78
Refactor full-queue frame drop test
C-Achard Jul 8, 2026
efd5904
Add SingleCameraWorker service unit tests
C-Achard Jul 8, 2026
249932c
Add GUI tests for preview and recording lifecycle
C-Achard Jul 8, 2026
b78a7d7
Drop strobe settings when fields are hidden
C-Achard Jul 8, 2026
d7d21f4
Add trigger config dialog GUI test coverage
C-Achard Jul 8, 2026
dca4fb6
Sync settings after saving config
C-Achard Jul 10, 2026
713668d
Add unit tests for GenTL discovery utils
C-Achard Jul 10, 2026
d69cbec
Add GUI tests for config and camera fallback
C-Achard Jul 10, 2026
4b68f24
Refactor recording option tests
C-Achard Aug 12, 2026
fad1c16
Add mono output format tests for GenTL backend
C-Achard Aug 14, 2026
7ebe491
Use isHidden in trigger config test
C-Achard Aug 17, 2026
4521142
Update test_config.py
C-Achard Aug 18, 2026
fffdd55
Build processors inside DLC worker when needed
C-Achard Jul 9, 2026
2309d06
Add mock proc test fiels
C-Achard Jul 9, 2026
d8df2c0
Update main_window.py
C-Achard Jul 9, 2026
f757528
Add recording file context and recorder path accessors
C-Achard Jul 10, 2026
79ac2d3
Add recording lifecycle hooks for processors
C-Achard Jul 10, 2026
eb416ad
Add processor recording-context tests
C-Achard Jul 10, 2026
1fc8210
Remove custom proc testing folder
C-Achard Jul 10, 2026
c9c6191
pre-commit
C-Achard Aug 17, 2026
b85127c
Use shared worker-build processor helper
C-Achard Aug 17, 2026
083108e
Preserve processor recording context lifecycle
C-Achard Aug 17, 2026
a326bc3
Defer DLC processor cleanup until worker exits
C-Achard Aug 17, 2026
c27c8e5
Fix processor recording context cleanup
C-Achard Aug 17, 2026
d31d389
Improve processor reset and recording hooks
C-Achard Aug 17, 2026
f0f8b77
Disable debug log
C-Achard Aug 17, 2026
48967c0
Fix save path and recording context resolution
C-Achard Aug 17, 2026
d799ec4
Expand recording context test coverage
C-Achard Aug 17, 2026
fd2e716
Fix recording start flag and add worker test
C-Achard Aug 17, 2026
4968b24
fix: save processor data before destroying it when stopping inference…
deruyter92 Jul 23, 2026
2fcba1e
revert 3eba29f85b7e187c37bb791307c4a1b0e94caa27
deruyter92 Jul 23, 2026
75e4921
fix dlc_processor: clean up custom processor during DLC shutdown
deruyter92 Jul 23, 2026
d9f6bf2
warn: confirm before stopping inference while recording
deruyter92 Jul 23, 2026
4e1683d
Update dlclivegui/gui/main_window.py
deruyter92 Aug 10, 2026
9c2bbd6
Update dlclivegui/gui/main_window.py
deruyter92 Aug 10, 2026
fdc929c
Fix message when stopping inference while recording
C-Achard Aug 10, 2026
cd463f8
Fix camera startup state and sink arg handling
C-Achard Aug 21, 2026
f2b034c
Copy frames before queueing for recorder
C-Achard Aug 21, 2026
fbbefe7
Handle recording stop failures in UI
C-Achard Aug 21, 2026
fecfb0c
Clarify stop-inference data loss warning
C-Achard Aug 21, 2026
e1e8f93
Remove unused recording frame callback
C-Achard Aug 21, 2026
7d1dee2
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