diff --git a/doc/bin/cli.md b/doc/bin/cli.md index d3b3b27388e..c8dd21d2694 100644 --- a/doc/bin/cli.md +++ b/doc/bin/cli.md @@ -118,7 +118,7 @@ service; `export ts --passthrough` writes it back out. FLV accepts the same legacy and enhanced-RTMP codecs as the [RTMP gateway](/bin/rtmp). fMP4 import splits each fragment into one frame per sample, so players need no -MP4 parser. `import fmp4 --passthrough` publishes each fragment whole as +MP4 parser. `import fmp4 --cmaf` publishes each fragment whole as [`cmaf`](/concept/hang#container) instead, keeping the source's exact sample timing. @@ -418,7 +418,7 @@ ending with `EXT-X-ENDLIST`. A dropped connection or an error closes the broadcast at once, and a reconnect, which publishes a newer [epoch](/concept/moq-lite#publisher-epochs) at the same path, ends the wait. -`export ts`, `export flv`, and `export mkv` take `--delay` instead, like an SRT +`export ts`, `export flv`, `export rtmp`, and `export mkv` take `--delay` instead, like an SRT receiver's latency, all tracks in decode order, so two exporters of one broadcast emit the same order. FLV and MKV mux each frame that long after its decode time (default 500 ms). TS output runs that far behind the source (default 1 s): the @@ -429,7 +429,7 @@ top. A frame arriving after its deadline is dropped, and video resumes at its next keyframe. The delay also bounds how stale a group may get, so `--delay 0` writes each frame as soon as it is read and drops none as late, but still skips a stalled group once a newer one is ready. -FLV and MKV reject their former `--max-delay` spelling with a migration +FLV, MKV and RTMP refuse the released `--max-age` spelling with a migration message. The output follows the source's clock within what ISO/IEC 13818-1 allows a TS PCR. A source further off fails the export, naming its rate, once it has used half the delay; a brief network stall only drops what it made late. diff --git a/doc/bin/gstreamer.md b/doc/bin/gstreamer.md index b77e58889fb..d03f1b35345 100644 --- a/doc/bin/gstreamer.md +++ b/doc/bin/gstreamer.md @@ -61,11 +61,15 @@ Each `sink_%u` request pad is one track. Pad properties: `track` names it [LOC](/concept/standard#loc) instead of the legacy hang container, `encoder=true` marks it as fed by a local encoder, and `track-status`/`track-error` report its lifecycle. Element properties: -`url`, `broadcast`, `tls-disable-verify`, `quic-idle-timeout`, `quic-keylog`, -`quic-keep-alive`, `linger`, and read-only `status`, `connected`, `moq-version`, and +`url`, `broadcast`, `connect-version`, `tls-disable-verify`, `quic-idle-timeout`, `quic-keylog`, +`quic-keep-alive`, and read-only `status`, `connected`, `moq-version`, and `estimated-send-rate`, `estimated-recv-rate`, `connection-stats`, and `sessions`. The sink reconnects for as long as the pipeline runs and only reports `failed` on an answer redialing can't change, such as a rejected token. +Both elements accept the same connection properties. `connect-version` is a +comma-separated list, matching the CLI's repeatable `--connect-version`; +unknown versions fail startup. QUIC durations are milliseconds, with zero +disabling the local idle timeout or keep-alive. Each run from `READY` publishes under a fresh [publisher epoch](/concept/moq-lite#publisher-epochs), so on moq-lite 07 (opt-in) or moq-transport draft 17 and later, viewers switch to a restarted pipeline at once instead of stalling on the old @@ -77,12 +81,7 @@ it is released, reaches EOS, or fails; a flush or new stream after that EOS holds it back again. Opaque data pads are not listed. Later catalog updates do not wait for newly requested pads. -Once every pad reaches EOS, the sink finishes the broadcast and posts EOS. -With `linger=true` it first keeps serving the finished broadcast until its -media is stale (30 seconds for audio and video), so a viewer still catching up -gets the tail, and posts EOS only then, which is when `gst-launch-1.0 -e` -exits. Stopping the pipeline, such as a second Ctrl-C under `-e`, closes the -broadcast at once. +Once every pad reaches EOS, the sink closes the broadcast and posts EOS. All pads share one media timeline on one wall clock. The first timed buffer places it using UNIX or NTP reference timestamp metadata; other clock domains use the @@ -143,9 +142,9 @@ on its own. Losing the relay connection also holds the pads: `moqsrc` redials without a retry deadline and resumes when the broadcast returns. A refused connection, refused path or catalog, or malformed protocol input or catalog posts an error. Properties: `url`, -`broadcast`, `versions` (comma-separated protocol versions to offer, most +`broadcast`, `connect-version` (comma-separated protocol versions to offer, most preferred first; every stable version by default), `tls-disable-verify`, -`quic-keylog`. +`quic-idle-timeout`, `quic-keep-alive`, and `quic-keylog`. Debug with `GST_DEBUG=*:4` for GStreamer and `RUST_LOG=debug` for the plugin. To decrypt a capture, set `quic-keylog=true` on either element along with diff --git a/doc/bin/hls.md b/doc/bin/hls.md index 490a0323af0..96f9976a01e 100644 --- a/doc/bin/hls.md +++ b/doc/bin/hls.md @@ -67,13 +67,14 @@ returns HTTP 400. A live-only timeline or range past a finished recording returns HTTP 416 instead of a partial clip, and a failed timeline returns 500. `--listen-tls-cert`/`--listen-tls-key` or `--listen-tls-generate` serve HTTPS, -and `--cors-origin` opens it to browsers. See `moq export hls --help`. +and `--cors-origin` opens it to browsers. HLS TLS reads `MOQ_HLS_TLS_*`; +`MOQ_LISTEN_TLS_*` configures only the MoQ listener. See `moq export hls --help`. ## Import Import handles classic HLS; LL-HLS parts are not implemented. It publishes the playlist's own media times, and anchors the catalog clock on the first imported -segment. Each fMP4 segment is split into one frame per sample; `--passthrough` +segment. Each fMP4 segment is split into one frame per sample; `--cmaf` publishes each fragment whole as CMAF instead, keeping its exact sample timing. The library, including the recorder cursors for mirroring a broadcast to diff --git a/doc/bin/rtmp.md b/doc/bin/rtmp.md index df5ff22bcb4..1ec618cc968 100644 --- a/doc/bin/rtmp.md +++ b/doc/bin/rtmp.md @@ -38,7 +38,7 @@ and anchors the catalog clock on the first frame, so it names the wall time the push arrived. A group starting before the previous group's start, such as an encoder restarting its timestamps mid-push, ends that push with an error. -Egress uses `--max-delay` (default 500 ms) for both the FLV release delay and +Egress uses `--delay` (default 500 ms) for both the FLV release delay and the stalled-group budget. Frames go out in decode order; a late video frame is dropped and video resumes at the next keyframe. Zero releases available frames immediately without deadline drops. diff --git a/doc/lib/js/publish.md b/doc/lib/js/publish.md index a9cb0263b66..70a92171d94 100644 --- a/doc/lib/js/publish.md +++ b/doc/lib/js/publish.md @@ -34,7 +34,6 @@ WebCodecs, writes the catalog, and publishes a hang broadcast. | `preview` | What the nested element shows: the raw `source` (default), a decoded copy of the `encoded` stream to see what viewers get, or `none`. | | `backend` | How a `` preview is drawn; see [@moq/video](/lib/js/video). `auto` (default), `webgpu`, or `2d`. | | `announce` | When to advertise: once the `source` is live (default), `always`, or `never`. Nobody can see or subscribe to the broadcast until it is announced. | -| `linger` | Finish the broadcast cleanly when advertising stops, such as a `source` that ends, instead of unannouncing it at once. It stays up while its media is fresh so viewers drain the tail, and the next announce publishes a new broadcast. Removing the element ends it at once. Off by default. | Every attribute is also a reactive property. The [README](https://www.npmjs.com/package/@moq/publish) lists types and defaults. diff --git a/js/publish/README.md b/js/publish/README.md index bfd1d907f34..f8a152cf403 100644 --- a/js/publish/README.md +++ b/js/publish/README.md @@ -72,7 +72,6 @@ The simplest way to publish a stream: | `preview` | string | `"source"` | What the preview renders: `"source"`, `"encoded"`, `"none"` | | `backend` | string | `"auto"` | Graphics API for a `` preview: `"auto"`, `"webgpu"`, `"2d"` | | `announce` | string | `"source"` | When to advertise: `"always"`, `"never"`, `"source"` (once media is captured). A camera source waits for every enabled track, and `"source"` waits until each captured track's config resolves or fails, so the first catalog lists every rendition. The broadcast is created while connected either way. | -| `linger` | boolean | false | When advertising stops, finish the broadcast cleanly instead of unannouncing it: it stays up while its media is fresh so viewers drain the tail, and the next announce publishes a new one. | A nested `