Skip to content

Add a GStreamer (moqsrc) subscriber to the media matrix#5

Merged
kixelated merged 1 commit into
token-interop-smokefrom
gst-subscribe-smoke
Jun 4, 2026
Merged

Add a GStreamer (moqsrc) subscriber to the media matrix#5
kixelated merged 1 commit into
token-interop-smokefrom
gst-subscribe-smoke

Conversation

@kixelated
Copy link
Copy Markdown
Contributor

Stacked on #4 (token interop). Base is token-interop-smoke; it touches some of the same files (smoke.yml, freshness.sh, justfile, README.md). Review/merge #4 first, then this retargets to main cleanly.

Why

moq-gst ships the moqsink/moqsrc GStreamer elements via apt (gstreamer1.0-moq), brew, rpm, nix, and release tarballs — but the only coverage was a gst-inspect load check in the moq repo. Nothing proved a real pipeline moves bytes end-to-end against the other implementations.

What

A gst subscriber cell. Like the C client, it downloads the latest moq-gst prebuilt tarball, points GST_PLUGIN_PATH at it, and confirms the plugin loads (gst-inspect) against the host's system GStreamer — the .deb/brew/tarball scenario, since the prebuilt plugin dynamic-links system libgstreamer. The subscriber runs:

moqsrc url=… broadcast=… ! filesink location=/dev/stdout

and grabs one byte — the same "did a frame's bytes arrive" bar and the same head -c 1 early-exit idiom as the rust subscriber (no decode). Subscribe-only for now; publishing via moqsink needs an encoder + request-pad muxing (a follow-up), mirroring how Swift/Kotlin/C are subscribe-only.

Current state: red, on purpose

No moq-gst release has been cut yet (no moq-gst-v* tag exists, so apt/brew/rpm/tarball have nothing to install). The cell marks itself broken (no moq-gst-v* release found) and fails only its own cells — like the Go cell. That red is the signal the smoke test exists to give: a real user can't install this yet.

The interop itself is validated locally: built from source (cargo build -p moq-gst) and pointed at via the new MOQ_GST_PLUGIN_DIR override, moqsrc reads a rust-published H.264 broadcast end-to-end:

  PASS  rust -> rust
  PASS  rust -> gst

Negative control (no publisher → moqsrc times out) and the broken-channel path (only gst cells fail, rest stay green) both verified. The cell flips green automatically once the first release ships.

Wiring

  • CI (smoke.yml): system GStreamer installed on every runner (apt gstreamer1.0-{tools,plugins-base,plugins-good} / brew gstreamer) + gst added to the subscriber list.
  • Freshness: asserts smoke.sh resolves the newest moq-gst-v* release (never pinned), mirroring the libmoq check.
  • justfile: gst added to just full.
  • Override: MOQ_GST_PLUGIN_DIR points the cell at a local cargo build -p moq-gst output, analogous to RELAY_BIN/MOQ_BIN.

Validation

  • shellcheck clean on smoke.sh; actionlint clean on the workflow. (shfmt isn't CI-enforced and the existing smoke.sh already carries its compact one-liner-guard style; gst_prepare matches c_prepare exactly.)
  • End-to-end pass, negative control, and broken-channel behavior all confirmed locally against brew GStreamer 1.28.3.

🤖 Generated with Claude Code

@kixelated kixelated force-pushed the gst-subscribe-smoke branch from fb0fb66 to 41a7c18 Compare June 4, 2026 01:47
moq-gst ships the moqsink/moqsrc GStreamer elements via apt
(gstreamer1.0-moq), brew, rpm, nix, and release tarballs, but the only
coverage was a gst-inspect load check in the moq repo -- nothing proved a
real pipeline moves bytes end-to-end against the other implementations.

Adds a `gst` subscriber cell. Like the C client, it downloads the latest
moq-gst prebuilt tarball, points GST_PLUGIN_PATH at it, and confirms the
plugin loads (gst-inspect) against the host's *system* GStreamer -- the
.deb/brew/tarball scenario, since the prebuilt plugin dynamic-links system
libgstreamer. The subscriber runs `moqsrc url=... broadcast=... ! filesink
location=/dev/stdout` and grabs one byte, the same "bytes moved" bar and
head -c 1 early-exit idiom as the rust subscriber (no decode). MoQ-GST is
subscribe-only for now; publishing via moqsink needs an encoder plus
request-pad muxing (a follow-up).

No moq-gst release has been cut yet, so the cell currently marks itself
broken ("no moq-gst-v* release found") and fails only its own cells, like
the Go cell -- the red is the signal. The interop itself is validated:
built from source and pointed at via the new MOQ_GST_PLUGIN_DIR override,
moqsrc reads a rust-published H.264 broadcast end-to-end. The cell flips
green automatically once the first release ships.

Wires it into CI (system gstreamer on every runner + gst in the
subscriber list), the freshness policy (moq-gst resolved at latest
release), the justfile (gst in `just full`), and the README.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@kixelated kixelated force-pushed the gst-subscribe-smoke branch from 41a7c18 to 161c75d Compare June 4, 2026 02:00
@kixelated kixelated merged commit 161c75d into token-interop-smoke Jun 4, 2026
0 of 6 checks passed
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