rainbow-dragon/docs/research/arri-cap-protocol.md

115 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ARRI CAP (Camera Access Protocol) — verified findings
Sources:
- `gambithunt/arri-camera-control` (GitHub) — contains ARRI's CAP v1.12 spec (June 2024,
covers ALEXA 35 1.3.0 / Mini LF / SXT) reformatted as markdown, plus Node + Swift clients
- ARRI public CAP feature-list PDF (arri.com, v1.11, 2026-03)
- Cyanview integration docs (field-verified default password, camera menu path)
## Verdict
Our v1 driver's REST paths are fiction. Real protocol: **CAP — binary over TCP, port 5055,
big-endian**. No REST/WebSocket/JSON on camera. Full spec behind ARRI Partner (CAP) Program;
enough is public to build the real driver.
## Transport — VERIFIED
- TCP port **5055** (spec). ⚠️ One client repo defaults 7777 — trust spec, confirm on hardware.
- Frame: `[length U16][msgType U8][msgId U16][cmdCode U16][payload]`, length includes 7-byte header.
- msgType: 0x01 COMMAND, 0x02 REPLY (same msgId), 0x03 EVENT (subscription push).
- Strings: U16 length + UTF-8.
- Keep-alive: `Live` (0x0080) every 1 s or connection drops.
- Discovery: Bonjour/mDNS (service type string unconfirmed — INFERRED).
## Handshake — VERIFIED (order); MD5 concat order INFERRED
1. TCP connect → camera sends `Welcome` (0x0087) w/ protocol version + result
(`Result_OK` / `Result_TooManyClients`)
2.`RequestPwdChallenge` (0x0081) → challenge
3.`Password` (0x0082) = MD5(challenge concat password) — **test both concat orders**;
default camera password `arri` (Cyanview, field practice)
4.`ClientName` (0x0083)
5. Normal traffic.
Result codes: OK=0, NO_SUCH_COMMAND=1, NOT_ALLOWED=2, NO_SUCH_VARIABLES=3, WRONG_PASSWD=4,
WRONG_TYPE=6, NOT_AUTHORIZED=7, TOO_MANY_CLIENTS=8, PROTOCOL_ERROR=9.
## Commands we need — VERIFIED
| Command | Code |
|---|---|
| Live (keep-alive) | 0x0080 |
| RequestPwdChallenge / Password / ClientName | 0x0081 / 0x0082 / 0x0083 |
| RequestVariables (subscribe) / Un-Request | 0x0084 / 0x0085 |
| SetVariable / GetVariable | 0x0086 / 0x0090 |
| Welcome | 0x0087 |
| GetFrameGrab | 0x0088 |
| Set3DLutFile / Set3DLutData / Set3DLutDataEx | 0x008a / 0x008c / 0x00F5 |
| SaveLookFile / LoadLookFile / AddLookFile / InstallLookFile | 0x008d / 0x00b1 / 0x00F0 / 0x00b2 |
| RecordStart / RecordStop | 0x00a0 / 0x00a1 |
| GetClipList (ALE metadata) | 0x00a4 |
## Variables we need — VERIFIED
| Purpose | ID | Type | Notes |
|---|---|---|---|
| Camera state | 0x0040 | U16 bitfield | RECORDING=0x0001, STDBY_READY=0x0004, IDLE=0x0080... |
| **CDL values** | **0x0050** | BLOB 10×F32 | slope×3 offset×3 power×3 sat (order INFERRED from ASC convention) |
| Color temperature | 0x0051 | U32 | Kelvin |
| Tint | 0x0052 | F32 | |
| Exposure index | 0x0053 | U32 | ASA |
| Reel / clip number | 0x005C / 0x005D | U16 | clip names via GetClipList |
| Sensor FPS | 0x0061 | F32 | |
| Timecode | 0x0078 | U32 BCD | HHMMSSFF |
| Look filename | 0x0041 | string | read-only |
| Look intensity (A35) | 0x00A9 | F32 | 01 |
Live status: `RequestVariables` once → EVENT frames on change (preferred over polling).
## Look control summary
- **Native CDL: yes** — SetVariable 0x0050, 10 floats, live-tweakable. Perfect for our CDL-split flow.
- **3D LUT: yes** — Set3DLutData/Ex + SaveLookFile; ALF4 on ALEXA 35 (ALF2 Mini LF);
file-transfer chunk framing NOT publicly documented (spec sections mangled) — INFERRED,
needs partner spec or hardware sniffing.
- Look intensity + parametric looks (A35, mesh points 0x00AB).
## Driver rework plan
1. Replace REST client with TCP binary CAP client (frame codec fully testable).
2. Handshake state machine incl. MD5 challenge (both concat orders behind a flag).
3. Subscribe to state/metadata variables; EVENT-driven CameraState.
4. Look push: CDL via SetVariable 0x0050 always; LUT via Set3DLutData behind a
"verified-on-hardware" flag until chunk framing confirmed.
5. capabilities: supportsNativeCDL=true; lut3dSizes stays [17,33,65] but LUT push marked
experimental.
# Sony VENICE 2 — verified findings
Sources: `sethdotfm/MultiVENICETool` (Python, archived), Cyanview + Bit Part integration docs.
## Verdict
**Closed protocol.** No public REST API; our /cna/v1 paths are fiction.
- VERIFIED: camera serves authenticated web remote at `http://<ip>/rmt.html`
(HTTP Basic, port 80, enable via Technical > Network > Setting = LAN, auth user/pass).
MultiVENICETool drives it via headless browser (DOM clicks e.g. BUTTON_REC_BUTTON) —
i.e. even open-source tooling could not find a clean wire API.
- VERIFIED (Cyanview capability list, wire format proprietary): IP control exists for
iris, ISO/gain, shutter, ND, WB (temp+tint+AWB), REC start/stop, tally, TC, scene files —
spoken natively by partner products (Cyanview RCP, Pomfort, ARRI NIA-1). Protocol
undocumented publicly.
- Look/LUT/CDL push over IP: **unknown/likely partner-only.** Monitor LUT selection exists
on camera; no public evidence of live LUT upload over IP.
## Driver posture (revised)
- Keep SonyDriver as **capability-minimal**: metadata/rec-state via whatever transport is
verified on hardware later; look push marked unsupported until partner docs or packet
capture prove otherwise. supportsNativeCDL=false; lut3dSizes=[] (was [17,33] — WRONG,
downgraded pending verification).
- Practical on-set path for Venice today: grade via SDI-chain LUT box (our DeckLink output
or Teradek/BoxIO), not camera-internal. This matches Livegrade's own Venice story.
- Escalation options: Sony partner SDK; packet-capture rmt.html backend traffic on real
camera; monitor Sony's newer BURANO/FX-line REST APIs for convergence.