Add a GStreamer (moqsrc) subscriber to the media matrix#5
Merged
Conversation
fb0fb66 to
41a7c18
Compare
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>
41a7c18 to
161c75d
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
moq-gstships themoqsink/moqsrcGStreamer elements via apt (gstreamer1.0-moq), brew, rpm, nix, and release tarballs — but the only coverage was agst-inspectload check in the moq repo. Nothing proved a real pipeline moves bytes end-to-end against the other implementations.What
A
gstsubscriber cell. Like the C client, it downloads the latestmoq-gstprebuilt tarball, pointsGST_PLUGIN_PATHat 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 systemlibgstreamer. The subscriber runs:and grabs one byte — the same "did a frame's bytes arrive" bar and the same
head -c 1early-exit idiom as the rust subscriber (no decode). Subscribe-only for now; publishing viamoqsinkneeds an encoder + request-pad muxing (a follow-up), mirroring how Swift/Kotlin/C are subscribe-only.Current state: red, on purpose
No
moq-gstrelease has been cut yet (nomoq-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 newMOQ_GST_PLUGIN_DIRoverride,moqsrcreads a rust-published H.264 broadcast end-to-end:Negative control (no publisher →
moqsrctimes out) and the broken-channel path (onlygstcells fail, rest stay green) both verified. The cell flips green automatically once the first release ships.Wiring
gstreamer1.0-{tools,plugins-base,plugins-good}/ brewgstreamer) +gstadded to the subscriber list.smoke.shresolves the newestmoq-gst-v*release (never pinned), mirroring the libmoq check.gstadded tojust full.MOQ_GST_PLUGIN_DIRpoints the cell at a localcargo build -p moq-gstoutput, analogous toRELAY_BIN/MOQ_BIN.Validation
smoke.sh; actionlint clean on the workflow. (shfmt isn't CI-enforced and the existingsmoke.shalready carries its compact one-liner-guard style;gst_preparematchesc_prepareexactly.)🤖 Generated with Claude Code