Retest Kiyo Pro USB3 cadence

This commit is contained in:
Meta Vens 2026-05-21 21:32:30 +01:00
commit 9b2b0c0e80
5 changed files with 82 additions and 14 deletions

View file

@ -235,3 +235,32 @@ 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.

View file

@ -392,6 +392,23 @@ std::string accessText(ULONG accessFlags)
return text.empty() ? "none" : text;
}
const char* usbSpeedText(UCHAR speed)
{
switch (speed)
{
case UsbLowSpeed:
return "UsbLowSpeed";
case UsbFullSpeed:
return "UsbFullSpeed";
case UsbHighSpeed:
return "UsbHighSpeed";
case UsbSuperSpeed:
return "UsbSuperSpeed";
default:
return "unknown";
}
}
bool getTopologyNodes(HANDLE filter, std::vector<GUID>& nodes)
{
KSPROPERTY property{};
@ -796,9 +813,10 @@ void printUsbVideoDescriptors(USHORT vendorId, USHORT productId)
}
std::printf(
"USB descriptor match: hub=%s port=%lu speed=%d configs=%u bcdUSB=0x%04x bcdDevice=0x%04x\n",
"USB descriptor match: hub=%s port=%lu speed=%s(%d) configs=%u bcdUSB=0x%04x bcdDevice=0x%04x\n",
hubPath.c_str(),
static_cast<unsigned long>(port),
usbSpeedText(connection->Speed),
static_cast<int>(connection->Speed),
connection->DeviceDescriptor.bNumConfigurations,
connection->DeviceDescriptor.bcdUSB,
@ -1375,7 +1393,16 @@ int main(int argc, char** argv)
{
std::setvbuf(stdout, nullptr, _IONBF, 0);
const std::string targetVid = argc > 1 ? argv[1] : "vid_f182";
const bool controlsOnly = argc > 2 && std::string(argv[2]) == "--controls-only";
bool controlsOnly = false;
bool baselineOnly = false;
bool allWebcamFormats = false;
for (int arg = 2; arg < argc; ++arg)
{
const std::string option = argv[arg];
controlsOnly = controlsOnly || option == "--controls-only";
baselineOnly = baselineOnly || option == "--baseline-only";
allWebcamFormats = allWebcamFormats || option == "--all-webcam-formats";
}
const bool leapMode = targetVid == "vid_f182" || targetVid == "VID_F182";
const auto paths = enumerateCapturePaths();
std::printf("capture interfaces: %zu\n", paths.size());
@ -1439,17 +1466,23 @@ int main(int argc, char** argv)
{"camera.exposure", ControlSet::Camera, KSPROPERTY_CAMERACONTROL_EXPOSURE, -8, camManual}}},
{"gain minimum", {{"procamp.gain", ControlSet::VideoProcAmp, KSPROPERTY_VIDEOPROCAMP_GAIN, 0, procManual}}},
};
const std::vector<ControlScenario> baselineScenarios = {
{"baseline", {}},
};
const auto& scenarios = baselineOnly ? baselineScenarios : webcamScenarios;
bool measuredAny = false;
for (const auto& candidate : candidates)
{
const double targetFps = candidate.interval100ns > 0
? 10000000.0 / static_cast<double>(candidate.interval100ns)
: 0.0;
const auto subtype = fourccOrGuid(candidate.subtype);
const bool interesting =
((candidate.width == 1920 && candidate.height == 1080) ||
(candidate.width == 1280 && candidate.height == 720)) &&
targetFps >= 25.0 &&
fourccOrGuid(candidate.subtype) == "MJPG";
(subtype == "MJPG" ||
(allWebcamFormats && (subtype == "YUY2" || subtype == "NV12" || subtype == "H264")));
if (!interesting)
{
continue;
@ -1461,9 +1494,9 @@ int main(int argc, char** argv)
candidate.width,
candidate.height,
candidate.bitCount,
fourccOrGuid(candidate.subtype).c_str(),
subtype.c_str(),
targetFps);
for (const auto& scenario : webcamScenarios)
for (const auto& scenario : scenarios)
{
measuredAny = measureScenario(filter.value, candidate, scenario) || measuredAny;
}

View file

@ -47,10 +47,12 @@ Get-Content .\state\evidence.jsonl -Tail 8
output management.
- Keep PowerShell/FFmpeg/SRT as bridge utilities until native program output
replaces them.
- Kiyo Pro has two UVC extension units, but the immediate 60 fps blocker now
looks like bus topology: the local Pro is behind a Genesys Logic USB hub as
USB high-speed / `bcdUSB=0x0210`, not SuperSpeed. Move/verify it on a USB 3.x
path before poking writable vendor selectors.
- Kiyo Pro has two UVC extension units. Moving it to a motherboard USB3 port
changed the descriptor path to `root_hub30` / `bcdUSB=0x0320` and exposed
720p/1080p YUY2/MJPG/H264/NV12 at 60 fps, but Windows still reports
`UsbHighSpeed` rather than `UsbSuperSpeed`; measured cadence remains about
25 fps across all tested formats. Verify cable/port SuperSpeed before poking
writable vendor selectors.
## Immediate Re-entry Instruction

View file

@ -10,3 +10,4 @@
{"ts":"2026-05-21T21:55:00+00:00","type":"verification","status":"ok","note":"Online Kiyo Pro research found matching trouble reports: Razer documents 1080p60/720p60, HDR can reduce frame rate, anti-flicker/powerline can interact with frame rate, and Microsoft maps low-light compensation to AUTO_EXPOSURE_PRIORITY, which can vary frame rate. Local KS follow-up found Kiyo Pro reports low-light priority=1 and powerline=50Hz. Setting low-light priority to 0 did not improve cadence; setting powerline to 60Hz moved 720p/1080p MJPG only from about 25 fps to about 29 fps. Standard KS controls are not enough; next step is compare Synapse/OBS and inspect vendor/extension controls or firmware state."}
{"ts":"2026-05-21T22:15:00+00:00","type":"verification","status":"ok","note":"Kiyo Pro HDR-off test added KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR get/set with filter-scope and pin-0 extended-property headers. The camera returns Element not found for standard extended Video HDR, and setting HDR off does not change cadence: 720p/1080p MJPG remain about 25 fps. HDR may still be controlled through Razer/Synapse, but not via the standard Windows extended Video HDR KS property on this path."}
{"ts":"2026-05-21T22:45:00+00:00","type":"verification","status":"ok","note":"Kiyo Pro controls-only probe parsed USB descriptors through hub IOCTLs without Synapse. The device exposes UVC extension units {2c49d16a-32b8-4485-3ea8-643a152362f2} and {23e49ed0-1178-4f31-ae52-d2fb8a8d3b48}; the second answers KS selector probes including writable selectors 1,3,4,6,11,12,14,15 and readable selector 10 returns ASCII PYTHON_V2B. Stronger finding: the local Kiyo Pro is behind a Genesys Logic VID_05E3&PID_0610 hub at USB speed 2 / bcdUSB 0x0210, so it is on a high-speed USB 2.x path rather than SuperSpeed USB 3.x. Verify/move bus topology before mutating unknown vendor controls."}
{"ts":"2026-05-21T23:10:00+00:00","type":"verification","status":"ok","note":"After moving Kiyo Pro to a motherboard USB3 port, the descriptor path changed to root_hub30 port 7 with bcdUSB 0x0320 and 720p/1080p YUY2/MJPG/H264/NV12 all advertised at 60 fps. Windows still reports USB speed enum 2 (UsbHighSpeed, not UsbSuperSpeed). Baseline cadence remains locked around 25 fps across all tested 720p/1080p formats: YUY2 24.96/24.98, MJPG 25.20/25.03, H264 25.19/25.01, NV12 25.07/25.16. Verify a true SuperSpeed cable/port path before blaming unknown vendor selectors."}

View file

@ -94,11 +94,14 @@ current_status:
cadence to about 29 fps, and standard extended Video HDR is not exposed on
this KS path. The controls-only probe now parses USB VideoControl
descriptors and found the Kiyo Pro's two vendor extension units. One
extension unit answers writable KS selectors, but the stronger local cause
is bus topology: the Pro is currently behind a Genesys Logic USB hub as
high-speed USB 2.x (`bcdUSB=0x0210`, speed `2`), not SuperSpeed USB 3.x.
extension unit answers writable KS selectors. Moving the Pro directly to a
motherboard USB3 port changed the path to `root_hub30`, `bcdUSB=0x0320`,
and exposed 720p/1080p YUY2/MJPG/H264/NV12 at 60 fps, but Windows still
reports `UsbHighSpeed` rather than `UsbSuperSpeed`, and baseline cadence is
still about 25 fps across every tested format.
next_action: >
Turn the warmed, queued Leap KS path into an `IMimirVideoCaptureDriver`,
preserve direct control hooks for timing-camera state, and decide whether
Kiyo Pro reaches 60 fps after moving it to a verified SuperSpeed USB path
before mutating unknown vendor extension selectors.
Kiyo Pro reaches 60 fps after confirming a true `UsbSuperSpeed` cable/port
path; if it remains locked at 25 fps there, inspect explicit frame-interval
negotiation or vendor selectors.