Mimir/docs/native-capture-cadence.md
2026-05-22 00:37:24 +01:00

589 lines
24 KiB
Markdown

# Native Capture Cadence
This file records measured driver-path camera cadence. It is evidence, not a
promise.
## 2026-05-21: PS3 Eye Raw USB Probe
Original probe location: temp workspace only, outside this repo. The dual-camera
probe now has a repo-owned copy at `native/probes/ps3eye_cadence` and can emit
JSON frame events for Mimir's diagnostic rolling-buffer adapter.
Probe path:
- raw PS3 Eye userspace driver reference;
- libusb/WinUSB interface 0;
- Bayer frame output;
- no DirectShow;
- no Media Foundation;
- no frame processing;
- five-second measurement window.
Installed device state:
- two PS3 Eyes present as `VID_1415&PID_2000`;
- interface 0 is available through the WinUSB/libusb-style path;
- interface 1 remains the media/audio side and is not the capture path measured
here.
Sequential results:
| Camera | Requested Mode | Frames | Elapsed | Delivered FPS | Avg Delta |
| --- | ---: | ---: | ---: | ---: | ---: |
| 0 | 320x240 @ 187 | 934 | 5.002s | 186.72 | 5.355 ms |
| 1 | 320x240 @ 187 | 917 | 5.001s | 183.35 | 5.454 ms |
| 0 | 640x480 @ 60 | 292 | 5.006s | 58.33 | 17.118 ms |
| 1 | 640x480 @ 60 | 290 | 5.010s | 57.89 | 17.237 ms |
Dual-camera results in one process:
| Camera | Requested Mode | Frames | Elapsed | Delivered FPS | Avg Delta |
| --- | ---: | ---: | ---: | ---: | ---: |
| 0 | 320x240 @ 187 | 915 | 5.005s | 182.81 | 5.476 ms |
| 1 | 320x240 @ 187 | 916 | 5.005s | 183.01 | 5.460 ms |
| 0 | 640x480 @ 60 | 294 | 5.009s | 58.69 | 17.068 ms |
| 1 | 640x480 @ 60 | 286 | 5.009s | 57.09 | 17.478 ms |
Conclusion: the two PS3 Eyes can be treated as roughly 183 fps timing/marker
witnesses at 320x240 on the current USB topology when using the raw USB path.
At 640x480 they are roughly 57-59 fps.
Runtime note: `ps3eye_dual_cadence --emit-json-frames` emits one JSON line per
captured frame with `sourceId` values `ps3-eye-0` and `ps3-eye-1`; Mimir.Runtime
uses this only as a diagnostic witness until the native capture driver owns the
buffer handles directly.
The probe reported one unrelated invalid USB descriptor from
`USB\VID_0000&PID_0002`; it did not prevent PS3 Eye capture.
## 2026-05-21: LeapUVC Kernel Streaming Probe
The Leap Motion Controller is currently present as `VID_F182&PID_0003` and bound
to `usbvideo.sys`, which means the active mode is LeapUVC/UVC. That mode is
mutually exclusive with the Ultraleap SDK path for this device.
Probe path:
- Windows Kernel Streaming capture interface for `KSCATEGORY_CAPTURE`;
- LeapUVC through `usbvideo.sys`;
- no Media Foundation;
- no DirectShow graph;
- no OpenCV;
- no frame processing;
- five-second measurement window per advertised mode.
Probe source:
- `native/probes/ks_camera_cadence`
- `--multi-ks-baseline --emit-json-frames` emits JSON frame metadata for
`leap-stereo-ir`, `kiyo-pro-rgb`, and `kiyo-rgb`.
Advertised modes and measured queued KS pull rates:
| Mode | Advertised FPS | Frames | Elapsed | Delivered FPS | Bytes / Frame |
| --- | ---: | ---: | ---: | ---: | ---: |
| 752x480 YUY2 | 50.00 | 173 | 5.008s | 34.55 | 721,920 |
| 640x480 YUY2 | 57.50 | 204 | 5.017s | 40.66 | 614,400 |
| 640x240 YUY2 | 115.00 | 415 | 5.004s | 82.93 | 307,200 |
| 640x120 YUY2 | 214.00 | 777 | 5.000s | 155.39 | 153,600 |
| 752x240 YUY2 | 100.00 | 308 | 5.013s | 61.44 | 360,960 |
| 752x120 YUY2 | 190.00 | 589 | 5.008s | 117.62 | 180,480 |
Conclusion: the current direct KS probe can pull real frames from LeapUVC, but
even eight queued asynchronous reads do not reach the device's advertised
cadence. The useful stereo IR mode is `640x240 YUY2`, advertised at 115 fps and
currently measured at about 83 fps. The next cut should either tune LeapUVC
controls that affect exposure/frame interval or deliberately rebind to a
WinUSB/libusb UVC path if we decide the Windows UVC stack is the bottleneck.
Follow-up control sweep:
- the probe now reports known LeapUVC-ish controls directly through KS;
- it discards a two-second warm-up before the five-second measurement window;
- `640x240 YUY2` steady-state cadence lands at about 110.7 fps;
- `640x120 YUY2` steady-state cadence lands at about 205.9 fps.
Steady-state `640x240 YUY2` control sweep:
| Scenario | Result |
| --- | ---: |
| baseline | 554 frames / 5.007s = 110.65 fps |
| exposure 10us | 554 frames / 5.006s = 110.68 fps |
| gamma off | 554 frames / 5.002s = 110.76 fps |
| HDR off | 554 frames / 5.003s = 110.73 fps |
| LEDs on | 554 frames / 5.003s = 110.72 fps |
| LEDs off | 554 frames / 5.006s = 110.68 fps |
| gain minimum | 554 frames / 5.007s = 110.64 fps |
| dark-frame interval 0 | 555 frames / 5.009s = 110.80 fps |
| fast combined | 554 frames / 5.001s = 110.77 fps |
Rejected controls:
- digital gain via `KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS = 0` returned
`ERROR_INVALID_PARAMETER`;
- the old LeapUVC FPS-ratio selector through `KSPROPERTY_VIDEOPROCAMP_GAIN`
returned `ERROR_INVALID_PARAMETER`.
Conclusion: the earlier 83 fps number was mostly startup drag inside the short
measurement window. Once the Leap is hot, the useful stereo mode is close to its
advertised cadence through the current KS path. The half-height mode can beat
the PS3 Eyes on raw frame rate, but the PS3 Eyes still win when comparing their
full 320x240 frames against Leap's useful 640x240 stereo stream.
## 2026-05-21: Razer Kiyo Kernel Streaming Probe
Installed device state:
- `Razer Kiyo` camera: `VID_1532&PID_0E03&MI_00`;
- `Razer Kiyo Pro` camera: `VID_1532&PID_0E05&MI_00`;
- both expose UVC camera interfaces through the Windows Kernel Streaming
capture category.
Probe path:
- Windows Kernel Streaming capture interface for `KSCATEGORY_CAPTURE`;
- no Media Foundation;
- no DirectShow graph;
- no OpenCV;
- eight queued asynchronous reads;
- two-second warm-up discarded before each five-second measurement.
Kiyo Pro advertised `MJPG` modes and measured cadence:
| Device | Mode | Advertised FPS | Best Measured FPS | Note |
| --- | --- | ---: | ---: | --- |
| Kiyo Pro | 1280x720 MJPG | 60.00 | 25.20 | manual exposure did not improve cadence |
| Kiyo Pro | 1920x1080 MJPG | 60.00 | 25.18 | manual exposure did not improve cadence |
Plain Kiyo advertised `MJPG` modes and measured cadence:
| Device | Mode | Advertised FPS | Best Measured FPS | Best Setting |
| --- | --- | ---: | ---: | --- |
| Kiyo | 1920x1080 MJPG | 30.00 | 30.27 | manual exposure `-9` or `-10` |
| Kiyo | 1280x720 MJPG | 60.00 | 51.51 | gain minimum after manual exposure sweep |
Conclusion: plain Kiyo is exposure-limited by default and becomes usable once
manual exposure is forced shorter. Kiyo Pro advertises 60 fps modes but the
current KS path delivers about 25 fps regardless of manual exposure, so it needs
a separate driver/control investigation before it should be trusted for high
cadence capture.
Online follow-up:
- Razer's support page for the Kiyo Pro confirms `1080p @ 60/30/24FPS`,
`720p @ 60FPS`, USB 3.0 connectivity, and HDR support, but also says HDR must
be toggled off to keep output aligned with the selected frame rate.
- Razer's firmware updater page lists `v1.5.0.1_r1` as the current RZ19-0364
updater lineage and includes a factory-default reset command in that firmware.
- Razer's flicker/banding guidance says capture frame rate and powerline
frequency can interact, and points users to the anti-flicker/powerline
setting.
- Microsoft documents `KSPROPERTY_CAMERACONTROL_AUTO_EXPOSURE_PRIORITY` as the
UVC low-light compensation control, and says it allows the device to vary
frame rate under lighting conditions.
- Razer community reports show other users seeing Kiyo Pro firmware or control
states stuck below 60 fps, including one report that Linux and Windows both
failed to reach 60 fps after a firmware update.
Local follow-up after that research:
| Device | Mode | Scenario | Result |
| --- | --- | --- | ---: |
| Kiyo Pro | 1280x720 MJPG | baseline, low-light priority value `1`, powerline `50Hz` | 127 frames / 5.009s = 25.35 fps |
| Kiyo Pro | 1280x720 MJPG | low-light compensation off | 125 frames / 5.039s = 24.81 fps |
| Kiyo Pro | 1280x720 MJPG | powerline `60Hz` | 145 frames / 5.008s = 28.95 fps |
| Kiyo Pro | 1920x1080 MJPG | baseline, low-light priority value `1`, powerline `50Hz` | 126 frames / 5.006s = 25.17 fps |
| Kiyo Pro | 1920x1080 MJPG | low-light compensation off | 126 frames / 5.006s = 25.17 fps |
| Kiyo Pro | 1920x1080 MJPG | powerline `60Hz` | 145 frames / 5.020s = 28.88 fps |
Conclusion: the Kiyo Pro's 25 fps result matches the kind of low-light /
anti-flicker / firmware trouble reported elsewhere, but the standard KS
properties are not enough to recover 60 fps locally. Powerline `60Hz` moves the
needle only to about 29 fps. The next investigation should compare this direct
KS path with Synapse/OBS and inspect whether the firmware exposes a vendor or
extension control that selects the real 60 fps profile.
HDR follow-up:
- the probe now tries `KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR` with both
filter-scope and pin-0 extended-property headers;
- the Kiyo Pro reports `ERROR_FILE_NOT_FOUND` / `Element not found`;
- setting extended Video HDR off also reports `Element not found`;
- measured cadence is unchanged at about 25 fps for both `720p MJPG` and
`1080p MJPG`.
Conclusion: HDR may still be part of the Razer/Synapse control story, but it is
not exposed through the standard Windows extended Video HDR KS property on this
device path. The next useful cut is vendor-extension enumeration or an
OBS/Synapse comparison to see whether Razer flips a private UVC extension before
opening the real 60 fps stream.
Vendor/USB descriptor follow-up:
- Synapse is not installed and was not used.
- The probe now has a controls-only mode:
`ks_camera_cadence.exe vid_1532&pid_0e05&mi_00 --controls-only`.
- The Kiyo Pro exposes two `KSNODETYPE_DEV_SPECIFIC` topology nodes.
- USB VideoControl descriptor parsing found two UVC extension units:
`{2c49d16a-32b8-4485-3ea8-643a152362f2}` with unit id `2`, six controls,
and `bmControls=3f00`; `{23e49ed0-1178-4f31-ae52-d2fb8a8d3b48}` with unit id
`6`, five declared controls, and `bmControls=ff6f`.
- The second extension GUID answers KS selector probes on node `2`. Selectors
`1`, `3`, `4`, `6`, `11`, `12`, `14`, and `15` report writable support;
selectors `2`, `5`, `7`, `8`, `9`, `10`, and `15` return current payloads.
Selector `10` returns ASCII `PYTHON_V2B`, which looks like camera/firmware
identity rather than an FPS switch.
- The first extension GUID is present in the descriptor but did not answer the
current KS selector sweep.
- The local Kiyo Pro is currently behind a Genesys Logic `VID_05E3&PID_0610`
hub and reports USB speed `2` with `bcdUSB=0x0210`, i.e. high-speed USB 2.x,
not SuperSpeed USB 3.x.
Conclusion: the strongest current explanation for the Pro's 25-29 fps ceiling
is bus topology, not HDR or low-light mode. Razer documents the Kiyo Pro's
60 fps modes as USB 3.0 operation; locally the device is sitting on a USB 2.x
hub path. Move it to a verified SuperSpeed root/hub path before spending more
time mutating unknown vendor selectors.
Motherboard USB3 port follow-up:
- After moving the Kiyo Pro off the external hub and directly onto the
motherboard USB3 port, the device moved to
`\\?\usb#root_hub30#...` port `7` and reports `bcdUSB=0x0320`.
- Windows still reports the negotiated connection speed enum as `2`
(`UsbHighSpeed`, not `UsbSuperSpeed`). The probe now prints the enum name so
this is harder to misread.
- The advertised mode surface improved: `1280x720` and `1920x1080` now expose
`YUY2`, `MJPG`, `H264`, and `NV12` at 60 fps.
- Baseline measured cadence stayed around 25 fps for every 720p/1080p format:
| Mode | Advertised FPS | Delivered FPS |
| --- | ---: | ---: |
| 1280x720 YUY2 | 60.00 | 24.96 |
| 1920x1080 YUY2 | 60.00 | 24.98 |
| 1280x720 MJPG | 60.00 | 25.20 |
| 1920x1080 MJPG | 60.00 | 25.03 |
| 1280x720 H264 | 60.00 | 25.19 |
| 1920x1080 H264 | 60.00 | 25.01 |
| 1280x720 NV12 | 60.00 | 25.07 |
| 1920x1080 NV12 | 60.00 | 25.16 |
Conclusion: the direct motherboard port improved enumeration but did not fix
cadence. Because Windows still reports `UsbHighSpeed`, verify the cable and
port path before assuming the private firmware selectors are guilty. If the
same 25 fps lock remains after `UsbSuperSpeed` is confirmed, the next cut is
explicit frame-interval negotiation or cautious vendor-selector tracing.
Second motherboard USB3 port check:
- Moving the Kiyo Pro to another motherboard USB3 port changed the composite
device to `Port_#0008.Hub_#0003` on the same AMD `ROOT_HUB30`.
- The descriptor path remains `bcdUSB=0x0320`, but the negotiated connection
speed is still `UsbHighSpeed(2)`, not `UsbSuperSpeed(3)`.
- The full cadence run was not repeated because the link state is still the
same high-speed fallback state that measured about 25 fps across formats.
Conclusion: two motherboard USB3 ports have now failed to negotiate SuperSpeed
with the Kiyo Pro's stock cable. The next useful physical test is a known-good
USB3 data cable or a known-good SuperSpeed device on the same ports.
Raven host check:
- The neighbor sender machine is now codenamed Raven.
- With the Kiyo Pro plugged into Raven, Windows reports the camera, media, USB
composite, and microphone interfaces as present.
- The descriptor-only probe reports the Kiyo Pro on a USB3 root hub at port `6`
with `bcdUSB=0x0320`, but negotiated speed is still `UsbHighSpeed(2)`, not
`UsbSuperSpeed(3)`.
- Raven's hub inventory reports zero currently connected SuperSpeed devices.
Conclusion: the same Kiyo Pro/cable also falls back to high-speed on Raven.
That makes the stock cable or the Kiyo Pro's own SuperSpeed lane the stronger
suspect than the receiver workstation's rear ports.
## 2026-05-21: Simultaneous Local Camera Pull
The first simultaneous pull used one process for KS/UVC cameras and the raw
PS3 Eye probe beside it. Current local visibility is only three camera devices:
- Leap Motion Controller / LeapUVC camera interface;
- Razer Kiyo Pro camera interface;
- one PS3 Eye raw libusbk camera interface.
The regular Kiyo and second PS3 Eye were not present on this rig during this
run.
Probe changes:
- `ks_camera_cadence.exe --multi-ks-baseline` starts all matched KS camera
streams from one process with one start gate.
- The raw PS3 Eye probe was launched at the same time as the KS multi-stream
harness.
- KS matching now limits Kiyo/Leap profiles to `MI_00` so media/audio
interfaces do not masquerade as cameras.
Simultaneous results with PS3 Eye at `640x480@60`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 40.12 |
| Kiyo Pro | 1920x1080 MJPG | 24.99 |
| PS3 Eye | 640x480 Bayer | 56.06 |
Simultaneous results with PS3 Eye at `320x240@187`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 81.10 |
| Kiyo Pro | 1920x1080 MJPG | 25.33 |
| PS3 Eye | 320x240 Bayer | 185.74 |
Conclusion: the current local topology can pull the three visible cameras
concurrently, but Leap cadence collapses under shared load compared with its
solo/KS-only result. The PS3 Eye's 320x240 mode is much less damaging than its
640x480 mode, but still drags Leap below its ~110 fps warm steady-state. Before
claiming six-camera viability, plug in the missing regular Kiyo and second PS3
Eye and split high-rate cameras across controllers/hubs deliberately.
After port swapping, the regular Kiyo and second PS3 Eye appeared, making five
camera devices visible and six optical sensors present: LeapUVC's packed
left/right stereo IR pair, Kiyo Pro, Kiyo, and two PS3 Eyes. The Kiyo Pro still
reports `UsbHighSpeed(2)` on `root_hub30` with `bcdUSB=0x0320`; no hub reported
a SuperSpeed device.
Five-camera simultaneous results with both PS3 Eyes at `640x480@60`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 57.33 |
| Kiyo Pro | 1920x1080 MJPG | 24.97 |
| Kiyo | 1920x1080 MJPG | 30.30 |
| PS3 Eye 0 | 640x480 Bayer | 59.59 |
| PS3 Eye 1 | 640x480 Bayer | 57.60 |
Five-camera simultaneous results with both PS3 Eyes at `320x240@187`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 81.05 |
| Kiyo Pro | 1920x1080 MJPG | 24.97 |
| Kiyo | 1920x1080 MJPG | 30.28 |
| PS3 Eye 0 | 320x240 Bayer | 187.60 |
| PS3 Eye 1 | 320x240 Bayer | 187.03 |
Conclusion: all six currently intended optical sensors can be pulled at once
through the current direct-driver probes, with the Leap stereo pair delivered
as one packed UVC frame. The PS3 Eyes are healthiest at `320x240@187`; at
`640x480@60` they stay near target, but Leap drops farther. Leap is not yet a
stable ground-truth timing camera under this shared USB topology.
Follow-up port isolation test:
- Leap was moved to be the only camera on the blue rear USB3 group.
- Both Kiyos were moved to the red rear USB3 group.
- The PS3 Eyes were moved to remaining front/back USB-A ports.
- Windows then showed only one PS3 Eye enumerated.
- Leap was on `root_hub30#5` port 3.
- Kiyo Pro and regular Kiyo were both on `root_hub30#7&18eea21b`.
- The visible PS3 Eye was on `root_hub30#7&124f193f` port 4.
Visible-sensor simultaneous result with the isolated Leap topology and one PS3
Eye at `320x240@187`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 80.99 |
| Kiyo Pro | 1920x1080 MJPG | 24.93 |
| Kiyo | 1920x1080 MJPG | 30.37 |
| PS3 Eye 0 | 320x240 Bayer | 185.85 |
Conclusion: isolating Leap at the root-hub level did not restore its solo
~110 fps cadence while the other visible cameras were active. The remaining
loss is likely broader xHCI/controller scheduling, interrupt/CPU pressure, or
the KS/usbvideo path under multi-device load rather than only a same-row port
collision.
After splitting cameras across Mimir and Raven, the local Mimir host had only
LeapUVC, regular Kiyo, and one PS3 Eye enumerated. The local split did not
restore Leap cadence:
| Local active set | Leap FPS | Other delivered FPS |
| --- | ---: | --- |
| Leap + Kiyo + one PS3 Eye at 320x240@187 | 81.34 | Kiyo 30.27, PS3 Eye 185.56 |
| Leap + Kiyo only | 82.77 | Kiyo 16.83 |
| Leap only, baseline control scenario | 84.18 | n/a |
| Leap only, best fast-combined scenario in that pass | 92.87 | n/a |
Conclusion: offloading the Kiyo Pro and one PS3 Eye to Raven did not by itself
cure the local Leap cadence loss. In this port/controller state, Leap is below
its previous ~110.8 fps result even when measured alone, so the next check is
Leap physical/controller state rather than assuming total local camera bandwidth
was the only problem.
Follow-up: the Focusrite Scarlett Solo had been sharing the Leap's USB row.
After moving it away, Leap cadence recovered substantially:
| Local active set after moving Focusrite | Leap FPS | Other delivered FPS |
| --- | ---: | --- |
| Leap only, baseline control scenario | 95.48 | n/a |
| Leap only, best fast-combined scenario in that pass | 101.67 | n/a |
| Leap only, 640x120 baseline | 192.83 | n/a |
| Leap + Kiyo + one PS3 Eye at 320x240@187 | 105.10 | Kiyo 30.17, PS3 Eye 185.81 |
Conclusion: the split-host local set is viable when the Focusrite is not on the
Leap's USB neighborhood. Full-height Leap stereo is still a little below the
old ~110.8 fps best result, but the catastrophic ~81 fps band was caused by the
local USB layout, not by needing every camera off the machine.
## 2026-05-21: Raven PS3 Eye Driver Bring-Up
Raven initially enumerated the PS3 Eye composite and media interfaces, but the
raw `VID_1415&PID_2000&MI_00` camera interface had no driver binding and showed
`Error`.
The working Mimir host binding was exported and installed on Raven:
- provider: `libwdi`;
- service: `WinUSB`;
- local source INF: `oem26.inf`;
- Raven published INF: `oem34.inf`;
- device interface GUID from the INF: `{6ACBF2FC-1246-418C-A63D-0FE38B45129B}`.
The libwdi self-signed catalog certificate had to be copied to Raven and added
to both `Root` and `TrustedPublisher` before `pnputil /add-driver ... /install`
would accept the package.
After binding, Raven's raw Eye interface reported `OK` and the copied
`ps3eye_dual_cadence.exe` could open the camera. Cadence is not yet viable:
| Raven PS3 Eye Mode | Delivered FPS | Notes |
| --- | ---: | --- |
| 320x240@187 | 132.24 | first run, max gap 202.841 ms |
| 320x240@187 | 78.93 | second run, max gap 283.247 ms |
| 640x480@60 | 6.32 | max gap 2998.965 ms |
Conclusion: Raven's PS3 Eye driver binding is fixed enough to open the device,
but the current Raven USB path/device state is not delivering usable cadence.
Next Raven work is port/controller isolation and a clean single-process cadence
run before treating the Eye as a usable remote timing witness.
## 2026-05-22: Restored Local Five-Device Pull
After moving the Raven PS3 Eye back to the Mimir host, local enumeration showed:
- LeapUVC stereo IR pair;
- regular Razer Kiyo;
- two PS3 Eyes;
- Focusrite Scarlett Solo moved away from the Leap USB neighborhood.
The Kiyo Pro was not local for this run.
Simultaneous local results with both PS3 Eyes at `320x240@187`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 106.07 |
| Kiyo | 1920x1080 MJPG | 30.33 |
| PS3 Eye 0 | 320x240 Bayer | 186.57 |
| PS3 Eye 1 | 320x240 Bayer | 186.14 |
Simultaneous local results with both PS3 Eyes at `640x480@60`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 108.07 |
| Kiyo | 1920x1080 MJPG | 30.34 |
| PS3 Eye 0 | 640x480 Bayer | 57.79 |
| PS3 Eye 1 | 640x480 Bayer | 58.08 |
Conclusion: the current local topology can run all local sensors in parallel:
Leap stereo plus regular Kiyo plus both PS3 Eyes. With the Focusrite out of the
Leap neighborhood and the Kiyo Pro absent, Leap stays close to its previous
best cadence instead of falling into the old ~81 fps band.
After moving the Kiyo Pro back to the Mimir host, local enumeration showed
LeapUVC, Kiyo Pro, and both PS3 Eyes. The regular Kiyo was not local for this
run. Kiyo Pro remained on high-speed USB:
- hub: `root_hub30#7&18eea21b`;
- port: 8;
- speed: `UsbHighSpeed(2)`;
- descriptor: `bcdUSB=0x0320`.
Simultaneous local results with Kiyo Pro and both PS3 Eyes at `320x240@187`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 110.80 |
| Kiyo Pro | 1920x1080 MJPG | 24.97 |
| PS3 Eye 0 | 320x240 Bayer | 187.46 |
| PS3 Eye 1 | 320x240 Bayer | 186.89 |
Simultaneous local results with Kiyo Pro and both PS3 Eyes at `640x480@60`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 110.72 |
| Kiyo Pro | 1920x1080 MJPG | 24.87 |
| PS3 Eye 0 | 640x480 Bayer | 59.91 |
| PS3 Eye 1 | 640x480 Bayer | 59.19 |
Conclusion: in the current USB layout, Kiyo Pro does not poison Leap cadence.
It remains a ~25 fps RGB source because it still negotiates high-speed USB, but
the restored local sensor set is stable with Leap stereo, Kiyo Pro, and both
PS3 Eyes active.
After moving the regular Kiyo from the front panel to a rear port, all five
camera devices / six optical sensors were visible locally. The mouse moved into
the Leap's USB neighborhood and did not disturb cadence. The regular Kiyo was
behind a Genesys hub at high-speed USB, and the Kiyo Pro remained high-speed
USB on `root_hub30#7&18eea21b` port 8.
Full local result with both PS3 Eyes at `320x240@187`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 110.84 |
| Kiyo Pro | 1920x1080 MJPG | 25.08 |
| Kiyo | 1920x1080 MJPG | 30.18 |
| PS3 Eye 0 | 320x240 Bayer | 187.59 |
| PS3 Eye 1 | 320x240 Bayer | 187.02 |
Full local result with both PS3 Eyes at `640x480@60`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 110.76 |
| Kiyo Pro | 1920x1080 MJPG | 25.14 |
| Kiyo | 1920x1080 MJPG | 30.18 |
| PS3 Eye 0 | 640x480 Bayer | 59.66 |
| PS3 Eye 1 | 640x480 Bayer | 59.95 |
Conclusion: the current USB topology can run the full intended local optical
set: Leap stereo, Kiyo Pro, regular Kiyo, and both PS3 Eyes. The remaining
limitation is Kiyo Pro cadence from high-speed USB negotiation, not whole-rig
USB collapse.
Follow-up with the regular Kiyo moved from the front panel to a rear port and a
mouse moved into the Leap's USB neighborhood produced the same healthy full-set
shape. The mouse did not disturb Leap cadence.
Full local result with both PS3 Eyes at `320x240@187`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 110.84 |
| Kiyo Pro | 1920x1080 MJPG | 25.08 |
| Kiyo | 1920x1080 MJPG | 30.18 |
| PS3 Eye 0 | 320x240 Bayer | 187.59 |
| PS3 Eye 1 | 320x240 Bayer | 187.02 |
Full local result with both PS3 Eyes at `640x480@60`:
| Device | Mode | Delivered FPS |
| --- | --- | ---: |
| LeapUVC | 640x240 YUY2 | 110.76 |
| Kiyo Pro | 1920x1080 MJPG | 25.14 |
| Kiyo | 1920x1080 MJPG | 30.18 |
| PS3 Eye 0 | 640x480 Bayer | 59.66 |
| PS3 Eye 1 | 640x480 Bayer | 59.95 |