Skip to content

video_stage: relay the Orin's video to LiveKit on the PC - #1467

Closed
gareth-morgan-nv wants to merge 1 commit into
gmorgan/EgoCapVideoStage/Transportfrom
gmorgan/EgoCapVideoStage/Relay
Closed

gareth-morgan-nv wants to merge 1 commit into
gmorgan/EgoCapVideoStage/Transportfrom
gmorgan/EgoCapVideoStage/Relay

Conversation

@gareth-morgan-nv

Copy link
Copy Markdown
Contributor

Summary

The PC relay: video_stage_worker receives the Orin's AVS1 access units over the direct link and hands them, untouched, to LiveKit or an Annex-B file. It builds without CUDA.

  • Relay: one --stream=PORT:TRACK per camera, one LiveKit participant for all tracks, and a control link for keyframe requests and the clock exchange. The relay maps the Orin's frame stamps onto its own clock; video is never withheld because of timing, but frames go without a capture time while the mapping is missing or too uncertain. An overloaded relay discards queued records and resumes at the next keyframe.
  • LiveKit wrapper moves from the camera plugin to src/livekit_publisher with the SDK fetch (including the Ubuntu 22.04 selection), so the relay and the plugin share it. The plugin still links it in this PR. EncodedVideoFrame and the clock-exchange helpers move into video_stage/wire.
  • Mock Orin sender (tests/tools/mock_orin_sender.py) runs the relay with no Orin: video_stage_worker --stream=5600:file=out.h264 --once plus the mock on port 5600.

Validation

  • Built with BUILD_VIDEO_STAGE=ON. video_stage_tcp_receiver_tests (4 cases), video_stage_sender_tests (17) and video_stage_wire_tests (51) pass, run directly; the mock-sender Python tests (19) pass.
  • Not run: publishing to a LiveKit server from this build in the final revision, and anything on an Orin.

Stacked on the transport PR.

🤖 Generated with Claude Code

video_stage_worker receives AVS1 access units from the Orin over a direct link (data plus a
control link for keyframe requests and the four-timestamp clock exchange) and hands them,
untouched, to LiveKit or a file. No decode, encode or GPU: it builds without CUDA.

The LiveKit wrapper moves from the camera plugin to src/livekit_publisher, with the SDK fetch,
so the relay and the plugin share it; the plugin links it as before. EncodedVideoFrame and the
clock-exchange helpers move into video_stage/wire. A mock Orin sender runs the relay without
an Orin.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Gareth Morgan <gmorgan@nvidia.com>
@coderabbitai

coderabbitai Bot commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

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

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
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@gareth-morgan-nv

Copy link
Copy Markdown
Contributor Author

Closing as superseded: the camera path is now the camera_streamer architecture (SIPL/Argus sender, AVS1 over TCP, PC receiver and LiveKit bridge; see #1473-#1479). Not merged; the branch and commits are kept.

🤖 Generated with Claude Code

@gareth-morgan-nv

Copy link
Copy Markdown
Contributor Author

This PR is superseded by the camera_streamer PRs:

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants