#683

Automatic capture leaves the cursor/UI stale until another input; DDX resolves it

OpenEckobrewopened 10d ago

Bug Symptoms

With VibePollo v2 and Windows capture set to Automatic, a static Desktop stream can retain an out-of-date cursor/UI image:

  • When using a controller stick as a mouse, the streamed arrow occasionally remains offset from a browser marker drawn at the received mouse coordinates after the stick is released.
  • A desktop right-click is received, but the context menu sometimes only becomes visible after the next mouse movement. This initially looked like a missing or delayed controller click.
  • Enabling a small continuous animation on the host page removes the cursor/marker mismatch. Disabling it brings the mismatch back.
  • Selecting DDX in VibePollo, saving, and reconnecting removes both the cursor mismatch and delayed context-menu display, with animation disabled.

The problem reproduced with both Metal and Native (AVSampleBuffer) presentation in the same macOS client. An on-demand PNG export of the last decoded CVPixelBuffer already contained the arrow/marker mismatch before either presenter, which narrows the issue to the image reaching the presentation stage rather than the presenter drawing the wrong coordinates. This does not independently rule out every decoder issue, but the host-backend comparison strongly points to host capture/composition.

Reproduction

  1. Open the attached standalone pointer-probe.html in Chrome on the Windows host. It requires no server, sends no telemetry, and starts with Animation OFF.
  2. Set VibePollo's Windows capture method to Automatic, save, and connect a Desktop stream.
  3. Enable the client's controller stick mouse mode. In the tested client, hold Start/Menu for about one second and release it. Move the stick over the page, then release it; repeat several times.
  4. Observe that the arrow can remain offset from the green circle after the stick stops, until another input changes the screen.
  5. Press Space on the page to enable its small animation. Repeat the stick movement: the arrow and circle stay aligned. Turn animation off to reproduce again.
  6. For the separate menu symptom, right-click on the Windows desktop. The diagnostic page deliberately suppresses its own context menu and displays received right-button/contextmenu counters instead. With Automatic capture, the desktop menu can appear only after further movement.
  7. Select DDX in VibePollo, save, and reconnect. Repeat with animation off: both symptoms disappear.

Expected Behavior

The final cursor position and desktop UI changes should reach the client without another mouse movement or continuous host animation. A received right-click should display its context menu promptly on a static desktop.

Environment

  • Host: Windows 11 26H2, based on the reporter describing the newest Windows release. Exact installed build was not collected. Microsoft lists 26H2 as the latest generally available annual release; the October 13 security build is 26300.9711. Microsoft release information.
  • VibePollo: v2 (reporter supplied; exact patch/build not recorded).
  • Installation package: Windows EXE installer.
  • Host GPU: NVIDIA GeForce GTX 1070. Driver: 582.78 WHQL security-update driver, based on the reporter describing the latest GTX 1070 driver. NVIDIA lists 582.78, released September 30, 2026, with GTX 1070 support. The installed version was not independently read from the host. NVIDIA driver release.
  • Capture setting: Automatic reproduces; DDX resolves after reconnect. The backend selected by Automatic has not been confirmed from host logs.
  • Client: custom native Moonlight Mac release build using moonlight-common-c; base commit f885755 with local multi-window/controller changes. This has not yet been reproduced in stock moonlight-qt or moonlight-macos-enhanced.
  • Client OS: macOS 15.8.1 (24H32), x86_64.
  • Controller: 8BitDo Ultimate wireless, Bluetooth to the Mac.
  • Stream: Desktop, 2560 × 1600, 60 FPS, HEVC, 40 Mbps, HDR off, frame pacing off. Both Metal and AVSampleBuffer were tested.
  • Normal gamepad mode was reported to work; the original symptom was noticed in controller stick mouse mode.

Evidence

Attach cursor-detail.png (close-up), decoded-frame-mismatch.png (full frame), and the ZIP containing the standalone pointer-probe.html from this folder. The PNG is an export of the decoded stream image, not a capture of the Mac pointer overlay. The arrow/green-circle offset is small (roughly one motion step) but can persist after movement stops.

Host logs were not collected during this comparison. If available, attach Troubleshooting → Export Logs → Vibeshine logs ZIP. They would establish the actual Automatic capture backend and any frame-admission/capture activity around the reproduction. There is no claim of measured packet loss in this test.

Possible Code Path — Unconfirmed

In the published 2.0.0-ds5 tag, process_frame() only queues a WGC frame when admit_activity_frame() accepts it. Frames inside the admission interval are discarded, with no deferred latest-frame delivery visible in that branch. If that is the final update before the desktop becomes idle, it may leave the captured image stale until a later update.

This is a hypothesis for investigation, not a confirmed diagnosis of the exact code-level cause or proof that the installed host uses this path.

Suggested investigation / regression coverage

  • Confirm which capture backend Automatic selected and record its activity-admission FPS, rejected activity-frame count, and final captured/delivered frame timestamps.
  • Check whether the newest frame rejected by the rate limiter is ever delivered when no further FrameArrived event occurs. Repeating an older cached frame would not correct its stale desktop/cursor contents.
  • A targeted regression scenario is two updates inside one admission interval followed by a completely static desktop. The latest update must eventually reach the encoder without another mouse event. If deferral is needed, it should retain/coalesce a bounded latest update and wake independently of future capture activity, while respecting WGC frame-pool and texture ownership.

No host source change was made during testing. DDX is the experimentally verified comparison, while the exact WGC mechanism remains a source-level hypothesis.

pointer-probe.html

vibepollo-cursor-reproduction.zip

vibeshine_logs-20261028-002437.zip

Please note: GPT-6.1 Sol made this bug report. I have no clue what I'm doing :D

Activity

1
Eckobrew10d ago

Just read this properly and it didn't really explain how I came to this issue; I was having a issue where the mouse would appear to jump every so often and the right click context menu on the desktop wasn't appearing when using a controller as mouse. I thought it was an issue on my side so we sent some tokens trying to debug it, during that process GPT-6.1 Sol said it noticed a "bug" with vibepollos WGC and that's how we ended up here. We tried DDX (not at the PC ATM) and I couldn't reproduce the issue. I have no idea about any of this really I'm just a guy trying to do a thing and maybe learn along the way, it's probably likely not really a vibepollo issue and actually I just did something wrong but the AI claimed vibepollo may of had a bug so I thought I'd report it. I have a apparently "fix" for the described issue that I'll be testing but again no clue if it's actually a vibepollo thing or a me thing

I use the moonlight-mac build on my GitHub, will test moonlight-qt when I get the chance