This release expands hardware synchronization, high-throughput multi-camera recording, frame timestamp reporting, monochrome capture, and custom processor integration. It also improves data safety, diagnostics, and general usability.
- Hardware trigger configuration for compatible GenTL and Basler cameras
- Trigger roles for common synchronization setups:
- Off / Free-run for continuous acquisition
- External trigger for cameras driven by an external hardware signal
- Follower for cameras synchronized to a master camera or shared trigger source
- Master output for free-running cameras that emit a synchronization signal
- Configuration for trigger selector, input source, activation condition, and frame read timeout
- Strict mode to reject unsupported trigger configurations instead of applying them best-effort
- Added a dedicated trigger settings dialog to the camera configuration workflow
- Active camera labels now show configured trigger roles
- Multi-camera startup now prioritizes external and follower cameras before free-running cameras and trigger-generating masters
- Improved handling of unsupported or incomplete trigger configurations
- Improved expected timeout handling while cameras wait for hardware trigger pulses
- Improved trigger cleanup when cameras stop or close
- Optional hardware frame timestamp reporting for supported cameras
- Basler camera timestamp-counter reporting with raw tick values and tick-frequency metadata when available
- An updated timestamp JSON schema containing:
- Per-frame software timestamps
- Optional per-frame hardware timestamp values supplied by cameras or SDKs
- Timestamp source, timebase, unit, and conversion metadata
- Explicit indexes for written frames
- Software and hardware timestamp sources are now described separately
- Timestamp entries are added only after frames are successfully written by the encoder
- Documentation now distinguishes Unix wall-clock timestamps from device-specific camera clock values
- Improved timestamp consistency when frames are dropped before encoding
- Preserved raw hardware timestamp values alongside converted values
- Improved fallback behavior when hardware timestamps or conversion metadata are unavailable
- An optional Use faster encoding parameters setting for supported FFmpeg software codecs
- This can improve encoding throughput for high-resolution or high-frame-rate recordings, at the cost of larger files
- A dedicated full-rate recording path for each active camera
- Recording is independent of the inference and display pipelines
- Display or inference slowdowns no longer directly limit recording throughput
- Recorder diagnostics for throughput, write latency, queue depth, and dropped frames
- Decoupled GUI display from camera capture, pose inference, and recording rates
- The GUI display is capped at 30 FPS while cameras can continue running at their full rate
- Inference continues to discard stale frames
- Improved use of each camera's reported runtime frame rate when configuring its recorder
- Moved recording dispatch and frame transformations closer to camera workers to reduce work on the GUI thread
- Reorganized recording logic into dedicated services
- Prevented asynchronously queued frames from being modified through reused camera buffers or NumPy views
- Improved frame-size mismatch and encoder error handling
- Improved recording shutdown, retry, cleanup, and UI recovery behavior
- Prevented recording controls from remaining disabled after a failed stop operation
- A Preserve mono frames option for supported backends
- This avoids unnecessary conversion of monochrome frames to three-channel color
- Native monochrome frame support for compatible GenTL and Basler cameras
- Camera output-format settings and runtime format reporting
- Camera probing for detected pixel format, emitted frame format, and recommended mono handling
- Camera labels and diagnostics now indicate preserved mono output
- Improved reporting when the camera pixel format differs from the frame format emitted to the application
- Grayscale conversion remains available in the recorder when required by the selected encoding path
- Improved handling of monochrome and higher-bit-depth frames before display and encoding
- Processor hooks for recording start and stop events
- These allow custom processing, saving, and cleanup to remain synchronized with recording
- Recording context containing session, run folder, filename, and output file information
- Support for processor plugins that must be constructed in the inference worker
- Clearer processor status and recording state information in the GUI
- Improved custom processor discovery, selection, enablement, and settings persistence
- Processor-controlled recording now uses the standard recording lifecycle
- Stopping inference while recording now provides a clearer warning that processor data may remain unsaved or unpaired, depending on the processor implementation
- Improved processor cleanup and finalization when recording stops
- Prevented duplicate recording start notifications
- Improved handling of processors that do not implement optional saving methods
- Explicit handling for cameras that are starting, running, or stopping
- Support for cancelling preview while cameras are still opening
- Runtime reporting of actual camera frame rate, resolution, pixel format, and output format
- Stop Preview remains available during camera startup
- User-configured camera order is preserved in the tiled display while trigger startup ordering is handled separately
- Stable internal camera identities are now separated from human-readable display labels
- Improved partial multi-camera startup when some cameras open successfully and others fail
- Prevented cameras from reporting a successful start after startup was cancelled
- Improved cleanup of partially initialized backends and worker threads
- Improved detection and rejection of duplicate camera configurations
- Improved recovery from camera disconnections, repeated empty frames, and startup failures
- Improved controller shutdown finalization
- Help → View documentation action for opening the DeepLabCut-Live-GUI documentation
- Detected camera resolution, frame rate, pixel format, and output format in the camera configuration dialog
- Improved recording path previews with session and run-folder placeholders
- Persistent preferences for recording names, processor selection, inference camera, and encoding options
- Improved camera discovery, configuration, reset, and preview workflows
- Improved camera and recorder status summaries
- Improved recording session naming and container-aware filename handling
- Improved control availability during camera startup, inference, recording, and shutdown
- Improved asynchronous error reporting so background failures are visible in the GUI
- Improved cleanup when closing camera dialogs or the main application window
- Improved handling of unavailable cameras restored from saved configurations
- Improved configuration persistence and restoration across application sessions
- Timing diagnostics for camera workers, controller dispatch, inference, and recording
- Expanded automated coverage for camera backends, trigger modes, recording, timestamps, processor hooks, and GUI lifecycle behavior
- Improved logging for camera discovery, runtime information, recording state, and processor lifecycle events
- Expanded backend contract tests for camera reads, trigger waits, timestamp propagation, and cleanup
- Improved handling of stale camera identities and GenTL producer paths
- Improved best-effort cleanup without hiding the original failure
- Improved consistency between camera backend results and downstream capture, inference, and recording code
- Update README install instructions for PyPI release by @C-Achard in #64
- Fix save_original bug in the processors by @arturoptophys in #75
- Add validation + compatibility tests for DeepLabCut-live by @deruyter92 in #56
- Several fixes to worker logic by @C-Achard in #57
- Upgrade & fix GenTL multi-camera mode by @C-Achard in #76
- Feature: triggered cameras, master and follower scheme by @C-Achard in #96
- Feature: encoding, UI and performance improvements by @C-Achard in #114
Full Changelog: https://github.com/DeepLabCut/DeepLabCut-live-GUI/compare/v2.0.0rc1...v2.0.0