Skip to content

fix(streamer): re-sweep video SETUP on a bounded pace when the rig has no peer yet - #993

Merged
zortos293 merged 1 commit into
devfrom
fix/nvst-setup-paced-peer-retry
Sep 19, 2026
Merged

zortos293 merged 1 commit into
devfrom
fix/nvst-setup-paced-peer-retry

Conversation

@zortos293

Copy link
Copy Markdown
Collaborator

Summary

Alliance diagnostic showed a rig answering video SETUP with 200 but a zero-byte Transport header (no peer allocated yet), then 400s on the remaining forms. The negotiator fired all 4 URI x 2 Transport forms in ~800ms and terminally failed with \missing-video-peer.

The official Linux client (Bifrost) negotiates through paced progress callbacks (\Waiting for WebRtcTransport ready) and tolerates missing transport (\Disabling ICE since server did not provide transport) instead of failing fast. This mirrors the paced half of that behavior: when at least one 200 arrives without a usable peer, re-sweep with 3s pauses, at most 3 extra rounds, inside the existing 20s request budget.

Changes


  • ative/opennow-streamer/.../nvst_rtsp.rs: split the sweep out of \setup_video; new bounded retry wrapper (200-without-peer only; pure 400/404/459+ still fail fast; terminal \missing-video-peer\ code unchanged; new \�ideo-setup-retry\ INFO line per round, no addresses logged).

  • vst_rtsp_setup_tests.rs: harness takes rounds/delay; 3 new tests (peer on retry round succeeds; exhaustion keeps terminal code; pure rejections never retry). All pre-existing tests pass unmodified in behavior (0-retry pinning).
  • \docs/qt-acceptance.md: documents the paced re-attempts.

Verification

  • \cargo test -p opennow-streamer-core: 147 passed, 0 failed; fmt clean; clippy clean.
  • First SETUP request byte-identical (existing order/metadata test untouched and passing).
  • Live validation pending: needs a reproducing seat (200-without-peer rig). Requested provider/region/retry-behavior from the reporter.

…s no peer yet

A rig whose video streamer is still starting answers SETUP with 200 but
an empty Transport header. The negotiator fired all URI/Transport forms
in under a second and terminally failed with missing-video-peer, never
giving the rig a chance.

Re-sweep on a bounded pace (3s pauses, at most 3 extra rounds) when at
least one 200 arrived without a usable peer, inside the existing 20s
request budget. Pure rejections still fail fast, the first SETUP request
is byte-identical, and the terminal missing-video-peer code is unchanged
after exhaustion. New video-setup-retry log line keeps rounds observable
without logging addresses.
@coderabbitai

coderabbitai Bot commented Sep 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 72e8fbf4-a5fb-4c80-be98-ba9ed5ca35d3

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@zortos293
zortos293 merged commit f10cf33 into dev Sep 19, 2026
14 checks passed
@zortos293
zortos293 deleted the fix/nvst-setup-paced-peer-retry branch September 19, 2026 18:45
zortos293 added a commit that referenced this pull request Sep 20, 2026
…hen rigs omit Transport (#998)

Live YES/ABYA rigs 200 the first video SETUP with an empty Transport
header and 400 every further form; ANNOUNCE after such a burst is then
rejected, while a single SETUP followed by ANNOUNCE succeeds. Sweeping
all forms poisons these sessions, and the old code did exactly that.

Stop each sweep at the first 200 (with or without a peer). Peerless 200s
still re-issue the same stopped-at form on the bounded #993 pace for
late-starting encoders, and terminal exhaustion with a CloudMatch bundle
peer proceeds on it (mirroring the official client, which carries on when
the server omits transport) instead of failing the seat. Pure rejections
still fail fast; the first SETUP request is byte-identical.

Also adds redaction-safe DESCRIBE shape logging and an
OPENNOW_STREAMER_LOG_FILE sink for the standalone child so headless
negotiation failures stay diagnosable.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant