octacam 0.3.0
The 0.3.0 line is a large step beyond 0.2: octacam gains a multi-vendor camera
backend cascade, trigger-hardware plugins, a frame-rate benchmark, GPU encoding,
one-command post-processing, and a much richer web GUI.
Added
- Backend cascade —
backend = "auto"resolves each camera to the highest
available tier:basler(pypylon) →flir(Spinnaker/PySpin) →spinnaker
(libSpinnaker_Cvia ctypes) →pycameleon(libusb floor, always present).
Multiple backends run at once; sensor params persist as native GenApi TSV
(.txt), so a rig can switch flir↔spinnaker on shared param files. - triggerbox plugin — drives the EPFL common-trigger-circuit (Arduino Nano
ESP32): self-describing wire protocol v2, three symmetric light channels, and
server-side auto strobe duty; auto-recovers a wedged USB CDC link. - Arduino firmware auto-flash — per-plugin source-hash fingerprinting and
one-command flashing (octacam flash) viaarduino-cli. - Benchmark / diagnostics (
octacam benchmark+ a GUI tab) — measures grab,
encode, and end-to-end ceilings and names the bottleneck. - Post-processing (
octacam process) — transcode, tile into grid videos,
and mirror to storage, driven by a per-recording config snapshot. - CLI —
doctor(install/rig diagnosis; never opens a camera),config
(interactive rig scaffold), Rich-styled help, and a rig instance-lock. - Web GUI — adaptive per-client preview (adaptive resolution, sharp
maximize, scroll-zoom, server-side crop of the zoomed region), a full
Camera-tab GenApi node-map browser, plugin tabs in a responsive overflow menu,
a configurable colour theme, and keyboard shortcuts with a?help overlay. - GPU encoding — opt-in NVIDIA NVENC H.264, with the session cap
auto-detected and overflow falling back to CPU encoding. - Recording — per-frame timestamps in one
timestamps.npz; a configurable
writer queue depth (record.writer_queue_size, default 64); and a
trigger-source model (software / managed / external) mirrored in the live
preview.
Changed
octacam.__version__is single-sourced from the installed package metadata.- FLIR
DeviceLinkThroughputLimitis raised to max at open, and
TriggerOverlap=ReadOutis set best-effort in every backend to lift the
software-trigger frame rate. - Every backend restores the config trigger source on save, so a preview's
software trigger is never baked into a param file. - Every grab loop is capped at
round(fps × duration)frames so all cameras
stop at the same count.
Fixed
- Hardened teardown and error paths across the recording pipeline (dozens of
verified robustness fixes); every camera now captures the same frame count. - Stopped Spinnaker/GenTL teardown crashes — the
spinnakerctypes tier exists
specifically to avoid the Spinnaker GenTL producer's GIL-holdingDevClose.
Removed
- The GenTL/
harvestersbackend and the mvIMPACT path — the always-present
libusbpycameleonfloor covers the general GenICam-USB3 camera without a
vendor producer or EULA.