> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.stereolabs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.stereolabs.com/_mcp/server.

# ZED SDK 5.4

> **Note**
>
> Release notes of the ZED SDK 5.4 series. Patch releases are listed newest first. Download links and the full changelog, including ZED Tools and integrations, are available on the [ZED SDK 5.4 release page](https://www.stereolabs.com/developers/release/5.4).

## What's New

ZED SDK 5.4 makes the built-in NEURAL depth models noticeably faster: an optimized inference path delivers up to 20% quicker depth inference and \~15% lower GPU load on Jetson Thor, with gains carrying over to Orin and desktop GPUs and the largest wins on heavier pipelines (more cameras, NEURAL PLUS, or concurrent recording), all with outputs unchanged. The release also opens the depth pipeline to custom algorithms through the experimental `DEPTH_MODE::CUSTOM`: an externally computed disparity or depth map (for example from a custom stereo network) can be fed to the SDK each frame, and the full pipeline (point cloud, spatial mapping, object detection, plane detection) then runs on the ingested data. A companion stereo `retrieveTensor` overload pre-processes both rectified views in a single fused GPU pass, producing inference-ready tensors that bind directly to frameworks such as TensorRT.

Recording and streaming gain a leaner path. SVO recording and outbound streaming now run entirely from `Camera::read()`, and stereo rectification is performed on demand, so pure recording or streaming pipelines no longer pay its CPU/GPU cost. A new polling API retrieves encoded H264/H265 packets directly (from incoming, outgoing, or recorded streams) without a second encoding session, and new rectified `LEFT_NV12` / `RIGHT_NV12` views feed hardware encoders without an extra color conversion.

This release also extends the platform reach with experimental support for ARM desktop systems (SBSA: NVIDIA DGX Spark, GH200, and ARM CUDA servers). A new monotonic `MONOTONIC_RAW_CLOCK` timestamp option yields timestamps immune to both NTP/PTP step and frequency adjustments, the per-camera lens distortion model is now exposed through `LENS_DISTORTION_MODEL`, and SLAM GEN_3 reports per-pose confidence. Numerous stability and accuracy fixes round out the release across depth, streaming, calibration, and USB camera handling.

## 5.4.1

*Released: Jul 23, 2026*

### SDK

#### General

##### Features / Improvements

* Enabled Intra Process Communication (IPC) on Windows.
* Improved image timestamp accuracy on GMSL cameras (ZED X / ZED X One families): the frame timestamp is now captured in hardware instead of sampled in software, reducing timestamp jitter by \~10× and making it immune to CPU load. Enabled by default; set `ZED_SDK_DISABLE_HW_TSC_SOF=1` to restore the previous software-sampled timestamps.
* DGX Spark (GB10): the 5.4.0 USB camera limitation was traced to a platform kernel (xHCI) issue, fixed in Ubuntu's upcoming `linux-nvidia-7.0` kernel; with it, ZED USB cameras are fully functional on DGX Spark. Until its official rollout, the SBSA installer now offers to install that kernel on affected GB10 systems (interactive installs only).
* Improved ZED X IMU temperature reading, a valid temperature is now available directly after `sl::Camera::open`.

##### Bug Fixes

* Fixed the IMU camera moving state that was sometimes stuck to MOVING. This was introduced when IMU frequency switched from 400Hz to 200Hz.
* Fixed `Camera::open` with an SVO2 file without high-frequency IMU data: the ZED SDK now runs in degraded mode and some modules won't be available.
* Improved USB camera recovery after a disconnection. Resolves a case where grab() could freeze during automatic reconnection, prevents a hang when a camera is physically unplugged mid-recovery, and ensures images are correct after the camera comes back online. open_timeout_sec is now correctly applied to the reconnection retry window. This applies to both sync and async recovery workflows defined by `sl::InitParameters::async_grab_camera_recovery`.
* Fixed streaming from a Jetson to a Windows receiver, resolving a wire-format incompatibility that stopped a Windows client from decoding a Jetson stream.
* Fixed effect of `sl::InitParameters::open_timeout_sec` in `sl::Camera::open()`: it no longer hangs when a stream has no sender, and now returns after the given timeout instead of freezing.
* Fixed an issue where rolling SVO recording could produce empty files after the first one.
* ZED X One 4K: requesting HDR at a resolution that has no HDR sensor mode (only QHD+ and HD1200 have one) is now rejected with a warning instead of leaving the GMSL capture stack unable to reopen the camera (repeated open timeouts until the application restarts).
* Fixed calibration/configuration file parsing and writing being corrupted by the application's locale.

#### SLAM

* Fixed GEN_3 positional tracking failing to start when IMU fusion was enabled but the source provided no high-frequency IMU data (e.g. SVO v1 files or network streams without full-rate sensor data). When the source still carries an integrated orientation, tracking now runs visual-inertial using it as a rotation-only attitude prior; when no IMU data is available at all, it falls back to pure visual mode instead of never initializing.
* Fixed excessive positional tracking computation that could push `grab()` runtime to 300–400 ms.
* With Area Memory off, tracking now correctly runs as pure visual-inertial odometry (VIO) instead of the previously refined pipeline. Behavior with Area Memory enabled is unchanged.

## 5.4.0

*Released: Jun 18, 2026*

### SDK

#### General

##### Features / Improvements

* Optimized the NEURAL depth models' inference path, improving both runtime and load. Depth inference is up to 20% faster and GPU load is reduced by \~15% on Jetson Thor; gains carry over to Orin and desktop GPUs as well, though the magnitude varies by platform. The improvement scales with pipeline load: heavier workloads (more cameras, more demanding models such as NEURAL PLUS, or recording running on top) tend to see the largest gains. For example, 4 cameras running NEURAL depth on Jetson Thor now reach 60 FPS (up from 53). Outputs are unchanged.
* **(Experimental)** Added `sl::DEPTH_MODE::CUSTOM`: feed your own externally computed disparity or depth map (e.g. from a custom stereo network) to the SDK each frame via the new `sl::Camera::ingestCustomDepth()`, called between `Camera::read()` and `Camera::grab()`. The full pipeline then runs on the ingested data (point cloud, spatial mapping, object detection, plane detection, etc.). Disparity or metric depth is accepted at any resolution, in CPU or GPU memory, with an optional confidence map for graded `confidence_threshold` filtering. Available in the C++, C, Python and C# APIs. As an experimental feature, downstream modules may not be fully robust to arbitrary custom depth/confidence input and can produce unexpected behavior or reduced accuracy.
* Added a stereo overload of `sl::Camera::retrieveTensor(Tensor& left, Tensor& right, const TensorParameters&)`: both rectified views are pre-processed for inference (resize, color conversion, layout, normalization) in a single fused GPU pass, producing densely packed tensors that can be bound directly as network inputs (e.g. TensorRT). Designed for stereo networks and the new `DEPTH_MODE::CUSTOM`, usable between `read()` and `grab()`. C++ only.
* Added a new `sl::TIMESTAMP_CLOCK::MONOTONIC_RAW_CLOCK` value to the process-wide timestamp clock selector, backed by Linux `CLOCK_MONOTONIC_RAW`. Like `MONOTONIC_CLOCK`, it is immune to NTP/PTP step adjustments, but it is also not subject to NTP/PTP frequency slewing (adjtimex). Useful when correlating SDK timestamps with free-running hardware counters or with devices that are not time-disciplined by the host. Available in C++, C, Python and C# wrappers. Switch to it before opening any camera with `sl::Camera::setTimestampClock(sl::TIMESTAMP_CLOCK::MONOTONIC_RAW_CLOCK)`.
* Added a new polling API to retrieve encoded H264/H265 video packets directly from the SDK, without re-encoding. Exposed via `sl::Camera::retrieveEncodedStreamPacket(EncodedStreamPacket&, ENCODED_STREAM_SOURCE)` and the introspection method `sl::Camera::getEncodedStreamsInfo()` (also available on `sl::CameraOne`). Three sources are addressable on a single camera: `RECEIVING` (incoming network stream when opened with `INPUT_TYPE::STREAM`), `SENDING` (outgoing `enableStreaming()` bitstream, captured before RTP fragmentation), and `RECORDING` (the SVO encoder output). Each packet is delivered as Annex-B NAL units (SPS/PPS, and VPS for HEVC, inlined in front of every IDR), so writing successive packets to a `.h264` / `.hevc` file produces a self-contained stream playable by any standard player. The tap drops every packet until the first natural IDR arrives, so the first packet returned is always a keyframe; on `RECEIVING` streams this can mean a wait of up to one GOP (\~2 s with the SDK default) before the first packet is available. Common use case: muxing the SDK's outgoing or recorded stream into a custom container (mp4, mkv, etc.) without paying a second encoding session. Works with `H264`, `H265`, `H264_LOSSLESS`, and `H265_LOSSLESS` recording modes.
* SVO recording and outbound streaming now run entirely from `sl::Camera::read()`, no longer requiring a subsequent `sl::Camera::grab()` to push a frame.
* Stereo image rectification is now performed on demand instead of on every frame, eliminating its CPU/GPU cost in pure recording or streaming pipelines where rectified images are never consumed.
* The raw (unrectified) calibration values are now refined by the self-calibration algorithm. As a result, the values reported at runtime may differ slightly from those in your calibration file. These refined values guarantee a better epipolar constraint.
* Added rectified NV12 output to `sl::Camera::retrieveImage` via the new `sl::VIEW::LEFT_NV12` and `sl::VIEW::RIGHT_NV12` (also available on `sl::CameraOne`). These return the rectified image directly as NV12 (YUV 4:2:0 semi-planar), so you no longer have to retrieve BGRA and re-convert before feeding a hardware H264/H265 encoder. Unlike the existing `LEFT_NV12_UNRECTIFIED` (native-resolution, GPU-only zero-copy), the rectified variant supports resizing (even dimensions) and both CPU and GPU memory. Available in the C++, C, Python and C# wrappers.
* Exposed the lens distortion model used by each camera through a new `sl::LENS_DISTORTION_MODEL` enum (`RAD_TAN`, `FISHEYE`, `PINHOLE`) and a new `CameraParameters::lens_distortion_model` field. Raw/unrectified parameters report `RAD_TAN` or `FISHEYE`, rectified parameters report `PINHOLE`, so applications can now tell how the reported intrinsics and distortion coefficients should be interpreted instead of having to guess from the coefficient values. Available for stereo and ZED One cameras across the C++, C, Python and C# APIs.

##### Bug Fixes

* Fixed local streaming: a receiver restarted after an unclean disconnect (ctrl-c, crash, container stop) could silently stop receiving frames shortly after. Also fixed a thread-safety issue that could destabilize the sender when receivers join or leave.
* Fixed H26x streaming on Jetson Nano.
* Fixed H26x (H264/H265) SVO2 recording and playback on devices without a hardware video encoder, which previously failed.
* Fixed SVO recording of a ZED One opened from a local stream, which previously failed with an `SVO_UNSUPPORTED_COMPRESSION` error and could crash. Local streams use an uncompressed transport with no encoded bitstream to copy, so recording now transcodes automatically (as it already did for stereo cameras).
* Fixed camera exposure and gain being saved as zero in SVO files recorded from a stream (all cameras), and in live ZED One SVO2 recordings.
* Improved depth confidence accuracy: fixed two sampling bugs in the depth confidence computation. Depth values are unchanged; confidence is now more reliable, and slightly more pixels pass a given confidence threshold.
* Improved fisheye self-calibration accuracy: fixed an incorrect distortion model that biased the calibration on fisheye cameras.
* Fixed corruption on the right edge of the depth image in FILL mode at some non-standard resolutions.
* Fixed `retrieveMeasure(MEASURE::NORMALS)` occasionally mis-flagging valid normals.
* Fixed several out-of-bounds GPU memory accesses and a thread-synchronization issue in the depth pipeline, improving stability. Outputs are unchanged.
* Fixed IMU thermal compensation using an out-of-range or invalid temperature reading, which could corrupt the IMU fusion in VIO.
* Improved USB camera detection and reopen reliability on Windows. Cameras no longer intermittently fail to be re-detected after a close/reopen cycle, and `Camera::getDeviceList()` now reads the serial number through a lightweight probe instead of fully opening and streaming each camera; repeated enumeration no longer leaves devices in a bad state.
* USB cameras already in use are no longer missing from `Camera::getDeviceList()`: they are now listed as `NOT_AVAILABLE` with their path and model populated instead of being silently dropped. On Linux, opening a busy camera now correctly reports it as in-use instead of failing with a generic error.
* Fixed a freeze followed by an automatic camera recovery (reboot) that could occur when rapidly changing manual exposure or gain on USB cameras (e.g. dragging a slider). Unchanged sensor register writes are now skipped, so partial updates can no longer lock up the image sensor.
* Camera video settings get/set now degrade gracefully when a USB camera becomes unavailable, instead of crashing (Windows) or accepting values against a bogus fallback range (Linux).
* Fixed leaks of the V4L2 device descriptor on failed `Camera::open()` attempts on Linux, which could keep the camera busy across retries.
* Updated udev rules (`99-slabs.rules`): sensor (HID) access now works when the camera enumerates on a USB controller other than bus 1 (e.g. Jetson AGX Orin), and the i2c rules for ZED-GMSL now cover every i2c adapter regardless of numbering.

#### SLAM

##### Features / Improvements

* Pose confidence is now available when using the GEN_3 algorithm; access it via `sl::Pose::pose_confidence` to filter or weight tracking results by reliability.

##### Bug Fixes

* Fixed `POSITIONAL_TRACKING_MODE::GEN_3` failing to start when `PositionalTrackingParameters::enable_imu_fusion` was set to `true`.

### Platform

* Added experimental support for ARM desktop platforms (SBSA): NVIDIA DGX Spark, GH200, and ARM CUDA servers. A dedicated installer (`ZED_SDK_Ubuntu24_sbsa_cuda13.0_tensorrt10.16_*`, TensorRT libraries bundled) provides the desktop feature set on aarch64. **Known limitation:** Live USB camera support on these platforms is still experimental and may not work reliably; on the NVIDIA DGX Spark systems we've tested, ZED USB cameras are currently not functional. Behavior may differ on other GB10-based systems or with future system updates; we're investigating with the platform vendor. ZED X (GMSL) cameras are not supported. SVO playback and network‑streamed inputs are unaffected.