Repository navigation
EdgeFirst Camera v2.9.0
EdgeFirst Camera v2.9.0
Installation
Download Binaries
| Platform | Binary |
|---|---|
| Linux x86_64 | edgefirst-camera-linux-x86_64 |
| Linux ARM64 | edgefirst-camera-linux-aarch64 |
| Configuration | camera.default |
# Download and install (ARM64 example)
wget https://github.com/EdgeFirstAI/camera/releases/download/v2.9.0/edgefirst-camera-linux-aarch64
chmod +x edgefirst-camera-linux-aarch64
sudo mv edgefirst-camera-linux-aarch64 /usr/local/bin/edgefirst-camera
# Install default configuration (optional)
sudo cp camera.default /etc/default/cameraWhat's Changed
Capture-rate honesty for the H.264 encoder, H.264 on by default, configurable
JPEG quality, and capture-loop resilience. Wire format is unchanged from 2.8.0.
Added
- Dropped-frame counters. Frames discarded because an encoder channel was
full were previously invisible -- the discard arm was empty -- so an
operator could not tell a captured frame from a discarded one, or know
a recording had holes. Drops are now counted per sink and summarised in
one rate-limited log line every 10s (EDGEAI-1403). camera.defaultdocumentsRECORD,REPLAY,REPLAY_LOOPand
REPLAY_FPS, which were settable from the environment but undocumented.
RECORDwrites continuously with no size cap or rotation, so leaving it
set will fill the filesystem; that is now stated (EDGEAI-1403).
Changed
- The H.264 frame queue holds three frames instead of one. This is not
what fixed the dropped frames above, and it changes nothing while the
encoder keeps up -- the queue stays empty and latency is unchanged. It
only matters under saturation, where it trades up to two frames of
latency for frames that would otherwise be discarded outright:
measured 6.9% loss down to 5.1% with JPEG encoding running
(EDGEAI-1403). - H.264 output is now on by default. It was off unless
--h264or
H264=truewas given, so a bareedgefirst-camerapublished no video
at all. The service never saw this --/etc/default/camerasets
H264=true-- but it caught out every manual run.--h264 falseand
H264=falsestill turn it off (EDGEAI-1230). - JPEG encodes at quality 85 by default instead of a hardcoded 100, and
the quality is configurable via--jpeg-quality/JPEG_QUALITY
(1-100). Measured at 1080p30 on a Verdin iMX8MP, this recovers about 3
percentage points of CPU; enabling JPEG at all costs about 77, so
quality is a weak lever and the setting is documented as such
(EDGEAI-1230). - SBOM CI installs its pinned Cargo tools with their published lockfiles,
preventing newly released transitive dependencies from breaking release
artifact generation.
Fixed
- The H.264 encoder is now told the frame rate the camera is actually
configured for, read from the driver withVIDIOC_G_PARM, instead of a
hardcoded 30. On a 1080p60 sensor the encoder was being told half the
real rate, and that -- not queue depth -- was what made the capture
path drop frames: measured 26 of 3600 frames lost over 60s before, and
0 of 3601 after, on an otherwise idle device (EDGEAI-1403). - The low-frame-rate warning compares against the configured rate rather
than a fixed 30, so it can actually fire. At 1080p60 it previously
could not warn until capture had collapsed below 27fps -- more than a
55% drop went unreported (EDGEAI-1403). - Recording metadata records the real capture rate rather than 30.
- Tile frame pacing is now phase locked to the requested rate. It
restarted its interval from the instant a frame was accepted, so
jitter pushed each deadline later and the error accumulated: a 30fps
source asked for 15 measured 11.5, and asked for 10 measured 8.5. The
deadline now advances by exactly one interval, and the interval is
computed in nanoseconds rather than truncated milliseconds
(EDGEAI-1230). STREAM_SIZElarger thanCAMERA_SIZEis rejected at startup with an
error naming both settings. The ISP scales down but never up, so the
combination produced a stream the WebUI would not display, with no
diagnostic (EDGEAI-1230).- A failed camera read no longer kills the process on the first failure.
vsl_camera_get_datareports a timeout by returning NULL, leaving
videostreamto surface whatevererrnohappened to hold, so the
error cannot be trusted to distinguish a transient gap from a dead
camera. The capture loop now spends a budget of 5 consecutive failures
before giving up, logging each retry (EDGEAI-1403). H264_TILES_FPS=0no longer divides by zero and takes the tile
encoder threads down silently. Zero now means no limit, and is
documented as such (EDGEAI-1403).- Topic and frame-ID options are now settable from the environment.
--frame-topic,--info-topic,--jpeg-topic,--h264-topic,
--h264-tiles-topics,--base-frame-idand--camera-frame-idhad a
command-line flag but noenvbinding, soFRAME_TOPICand friends
were silently ignored -- including from/etc/default/camera, which
systemd applies as anEnvironmentFile. All seven are now documented
incamera.default(EDGEAI-1438). - A calibration file that cannot be loaded no longer aborts the node.
CAM_INFO_PATHpointing at a missing, unreadable, malformed, or
structurally invalid JSON is now reported with a warning and the node
continues on the same built-in defaults it uses when no calibration is
configured, socamera/infokeeps publishing. Calibration only
describes the geometry on that one topic; losing it should not take the
capture pipeline down, nor starve a subscriber that requires
camera/infoto exist (EDGEAI-1441).
Full Documentation: https://github.com/EdgeFirstAI/camera#readme