# Legacy Single-Camera MCAP Layout This page is the reference for the older `/camera/*` MCAP wire shape. It is still used by some generic sink/tester paths in the repository, but it is no longer the default shape written by `zed_svo_to_mcap` for a single `.svo` or `.svo2` input. ## Compatibility With Copy Layout In practice, this layout is very close to the one-camera `copy` shape: - legacy single-camera uses `/camera/video`, `/camera/depth`, and related `/camera/*` topics - one-camera `copy` uses `/{label}/video`, `/{label}/depth`, and related `/{label}/*` topics So the compatibility mental model is: - treat the camera label as the literal `camera` - replace `/{label}/...` with `/camera/...` - there is still no `/bundle` - timestamps remain per-camera sample timestamps That is why legacy single-camera is conceptually compatible with `copy`, even though the topic paths are not namespaced the same way. ## Topics | Topic | Schema / Encoding | Notes | |------|------|------| | `/camera/video` | `foxglove.CompressedVideo` | H.264 or H.265 Annex B access units | | `/camera/depth` | `cvmmap_streamer.DepthMap` | RVL-compressed depth payload | | `/camera/calibration` | `foxglove.CameraCalibration` | Video intrinsics | | `/camera/depth_calibration` | `foxglove.CameraCalibration` | Written only when depth resolution differs from video | | `/camera/pose` | `foxglove.PoseInFrame` | Optional; only when pose export is enabled and tracking is valid | | `/camera/body` | raw `cvmmap.body_tracking.v1` | Optional raw body-tracking packets; see [mcap_body_tracking.md](./mcap_body_tracking.md) | ## Timestamp Semantics Legacy single-camera export preserves the original per-frame source timestamp on video, depth, and pose messages. Like `copy`, there is no separate bundle time: - `/camera/video`, `/camera/depth`, and `/camera/pose` use the original camera sample timestamp - calibration and depth-calibration messages use the timestamp of the first emitted sample ## Corruption Behavior Like `copy`, this layout has no manifest or placeholder contract: - unreadable tail frames are treated as end-of-stream - mid-stream corruption is skipped until a readable frame is found - the topic stream simply resumes at the recovered readable frame ## Validation Expectations The current validation contract is: - `/camera/video` must exist and contain at least one message - `/camera/depth` must exist and contain at least one message - `/camera/calibration` must exist exactly once - `/camera/video` and `/camera/depth` message counts must match - `/camera/depth_calibration` may appear zero or one time - `/camera/pose` is optional, but it may not outnumber `/camera/video`