Repository navigation
docs(stereo-camera): plug-in-provided stereo camera source (ADR-043, XR_DXR_stereo_camera design) - #1743
Merged
Conversation
…ADR-043, XR_DXR_stereo_camera) Design only; nothing implemented. On 3D laptops/monitors the stereo camera is the eye tracker's and is held exclusively while tracking, so a web 3D call cannot open it with getUserMedia; when it does open it is a raw, uncalibrated grey pair. - ADR-043: the vendor plug-in is the camera source (appended xrt_plugin_iface slots, ADR-020), the service owns capture + fan-out + vendor-neutral rectification by the ACTIVE device's calibration, and the runtime enforces camera privacy (OS consent, per-exe consent with browser delegation, foreground-only, indicator, kill switch). Alternatives rejected: getUserMedia only, vendor-app bridge, vendor code in the browser (violates isolation). - Spec XR_DXR_stereo_camera (design, v1): enumerate + state events, calibration raw/rectified, start/stop, latest-wins acquire over a pinned 3-slot shared-memory ring with per-stream wake handles, optional GPU transports, eye-tracking coexistence rules, plug-in slots, sim_display fake, displayxr-cli camera probes. - Roadmap: DisplayXR Browser exposes each camera as an ordinary getUserMedia device plus one capability hint (Windows + Android), the first vendor plug-in's sourcing notes, phased plan, risks, open questions. No header / index.json note yet: they land together with R1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
Author
|
Field facts (2026-09-25/26). These feed the design, and #1746 folds them into the roadmap's §C Android section and into §F. They replace the "CNSDK gives SBS" assumption in §C.1. Android tablet (NP02J / K68), measured
WindowsOn two SR machines the eye tracker holds the stereo camera exclusively: Design consequence
Vendor asks (added to §F)
Maintainer defaults applied in R1 (recorded in roadmap §G, and implemented in #1746):
One pre-existing lint item on this PR: |
ADR-042 exists only on feat/lift-ext, so the relative link failed docs-lint on main. Name it in text instead; restore the link when lift merges. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Design only — no code, no header, no
index.jsonnote (those land together in R1; the catalog lint requires both).Why
On 3D laptops/monitors the stereo camera is the eye tracker's and is held exclusively while tracking, so the web SDK's 3D call module (
@displayxr/inline3d/call, RFC 0002) getsNotReadableError: Device in use; when the tracker is idle the device opens as a raw, uncalibrated 1280x480 grey pair. The vendor's own apps read frames from the vendor SDK's shared memory instead — vendor knowledge that belongs in the plug-in.What
docs/adr/ADR-043-stereo-camera-source.md— plug-in produces frames (appendedxrt_plugin_ifaceslots, ADR-020, after ADR-042's lift factory), service owns capture/fan-out/vendor-neutral rectification by the active device's calibration, runtime enforces camera privacy. Alternatives: getUserMedia only, vendor-app bridge, vendor code in the browser (rejected: isolation), camera-provider plug-in type (deferred).docs/specs/extensions/XR_DXR_stereo_camera.md— vendor-neutral spec: enumerate + state events, calibration raw/rectified, start/stop, latest-wins acquire over a pinned 3-slot shared-memory ring with per-stream wake handles (optional D3D11/AHB transports), eye-tracking coexistence, privacy (OS consent, per-exe consent with browser delegation, foreground-only, indicator, kill switch, anti-fingerprinting), plug-in slots, sim_display fake,displayxr-cli cameraprobes.docs/roadmap/stereo-camera-source.md— DisplayXR Browser exposes each camera as an ordinarygetUserMediadevice + one hint (MediaTrackSettings.displayxrStereo), Windows and Android; Leia SR sourcing notes; phased plan R1-R3 / L1 / B1 / A1 / B2; risks; open questions.Merge-order note
ADR index lines follow ADR-041; the lift PR (ADR-042,
feat/lift-ext) adds its line at the same spot — trivial conflict. The planned iface slots append aftercreate_dp_d3d11_lift, so R1 must land after the lift PR.Open questions (maintainer)
See roadmap §G — name/scope, iface slots vs provider plug-in type, in-process apps, runtime consent UX, SR SDK asks (versioned header w/ sequence + timestamp, non-stealing wake, calibration API, serial = folder name), CNSDK frame sharing, browser capture-service process topology, hint shape, RAW exposure to pages.
🤖 Generated with Claude Code