You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+36-71Lines changed: 36 additions & 71 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,37 +1,18 @@
1
1
# OpenMOQ Publisher
2
2
3
-
`moqxr` is a C++20 contribution project for an OpenMOQ publisher targeting Linux and macOS.
3
+
`moqxr` is a C++20 OpenMOQ publisher contribution project for Linux and macOS.
4
4
5
-
The current codebase focuses on the media packaging side of a publisher:
5
+
It packages MP4 input into CMSF-style publishable objects, supports MOQT draft-specific framing for drafts 14 and 16, and can either inspect the generated publish plan locally or publish it over a picoquic-backed transport when local `picoquic` and `picotls` checkouts are available.
6
6
7
-
- primary MOQT behavior modeled after `draft-ietf-moq-transport-14`
8
-
- secondary compatibility surface for `draft-ietf-moq-transport-16`
9
-
- MP4 ingest for AAC-LC or Opus audio and H.264 or H.265 video
10
-
- CMSF-oriented object planning for MOQT publication
11
-
12
-
It is buildable and testable today, but it is not yet a full interoperable MOQT publisher.
- Remuxes non-fragmented MP4 input into synthesized fragmented media objects
10
+
- Remuxes progressive MP4 input into synthesized fragmented media objects
18
11
- Extracts track metadata and RFC 6381 codec identifiers from MP4 sample tables
19
-
- Builds a publish plan consisting of initialization and media objects
20
-
- Emits planned objects to disk for inspection
21
-
- Keeps fragmented input on a zero-copy fast path where possible
22
-
- Isolates MOQT draft-version mapping from the media packaging code
23
-
- Builds a picoquic-backed QUIC transport path when local `picoquic` and `picotls` checkouts are available
24
-
- Publishes a draft-aware control stream plus per-object streams in the current session layer
25
-
- Supports a configurable published track namespace for relay and interop testing
26
-
- Supports optional paced publication using fragment media timestamps
27
-
28
-
## Current limitations
29
-
30
-
- External relay interoperability is still incomplete
31
-
- Progressive MP4 remux support is intentionally narrow
32
-
- Edit lists, richer interleaving cases, and broader timing edge cases are not fully handled yet
33
-
- The current remux path synthesizes fragments from `stbl` sample tables but does not attempt a full general-purpose MP4 muxer implementation
34
-
- Current external relay tests complete setup and namespace announcement for draft-14, but do not yet result in inbound subscriptions or a complete draft-16 session
12
+
- Builds a publish plan with initialization and media objects
13
+
- Emits generated objects and catalog metadata to disk for inspection
14
+
- Supports a configurable track namespace, optional paced publication, and draft-aware MOQT control/object encoding
15
+
- Includes packaging, CLI, and MOQT session tests through CTest
35
16
36
17
## Design overview
37
18
@@ -51,7 +32,7 @@ For non-fragmented input:
51
32
- it synthesizes a fragmented initialization segment by adding `mvex` and `trex`
52
33
- it builds synthetic `moof` + `mdat` payloads from the original sample data
53
34
54
-
This keeps the project aligned with CMAF-style publication while avoiding unnecessary redesign later when transport is added.
35
+
This keeps the project aligned with CMAF-style publication while reusing the same publish-plan model for local inspection and transport-driven publication.
55
36
56
37
### Draft handling
57
38
@@ -72,7 +53,7 @@ This keeps the project aligned with CMAF-style publication while avoiding unnece
72
53
73
54
### Baseline build
74
55
75
-
This is the default path if you only want the packaging and session-layer code:
- QUIC handshake succeeds against `draft-14.cloudflare.mediaoverquic.com:443`, `interop-relay.cloudflare.mediaoverquic.com:443`, and `moq-relay.red5.net:8443`
198
-
-`CLIENT_SETUP` succeeds and the client prints the negotiated connection ID to stdout after setup
199
-
-`PUBLISH_NAMESPACE` is accepted with `PUBLISH_NAMESPACE_OK`
200
-
- with `--forward 0`, the current client waits for inbound `SUBSCRIBE`; relays may consume `SUBSCRIBE_NAMESPACE` themselves and only forward `SUBSCRIBE` to the publisher
201
-
-`--timeout <seconds>` controls how long the publisher waits for inbound `SUBSCRIBE` requests before failing the publish attempt
202
-
- the Cloudflare endpoints accepted setup and namespace announce in testing, but did not issue subscriptions, so the publish attempt timed out waiting for control-stream data
203
-
- with `--forward 1`, `moq-relay.red5.net:8443` now progresses through `PUBLISH_OK` for the catalog and media tracks, after which the client begins sending object streams
204
-
-`fb.mvfst.net:9448` now accepts the draft-14 publish flow end-to-end after switching `PUBLISH`, `PUBLISH_OK`, and `PUBLISH_ERROR` control messages to `u16` outer lengths; the current draft-16 flow is still rejected with MOQT application error `3` (`PROTOCOL_VIOLATION`) immediately after setup
205
-
-`--paced` only affects media-object sends; it does not delay setup, namespace announce, or track publish requests
187
+
-`--forward 0` waits for inbound `SUBSCRIBE` requests before sending matching media objects
188
+
-`--forward 1` proactively publishes tracks and objects after namespace setup completes
189
+
-`--timeout <seconds>` controls how long the publisher waits for inbound `SUBSCRIBE` requests
190
+
-`--paced` applies pacing only to media-object sends; setup and publish control messages are sent immediately
- the smoke test passes when run in an environment that allows real UDP sockets
220
-
- restricted sandboxes can still fail early during socket setup
221
-
- keep this option off for routine packaging-only development, and run the smoke binary directly when validating transport changes
202
+
The smoke test requires an environment that permits real UDP sockets. Keep it disabled for routine packaging or session work, and run the smoke binary directly when validating transport changes.
222
203
223
204
## Usage
224
205
@@ -259,20 +240,6 @@ ALPN selection:
259
240
- draft-16 defaults to `moqt-16`
260
241
-`--alpn` overrides either default when you need to target a specific relay
261
242
262
-
Current status:
263
-
264
-
- the packaging pipeline is fully usable today
265
-
- the session layer now emits typed control messages for setup, namespace publication, and subscription servicing
266
-
-`--endpoint` now enters the real picoquic-backed transport path when the project is built with local picoquic and picotls support
267
-
- the local picoquic loopback handshake works, including object publication over QUIC streams
268
-
-`--namespace` lets you choose the advertised track namespace during transport tests
269
-
-`--forward 0|1` selects whether the publisher waits for `SUBSCRIBE` (`0`) or immediately sends `PUBLISH` requests and forwards objects after namespace announce (`1`)
270
-
-`--timeout <seconds>` sets the subscriber wait timeout used when the publisher is waiting for `SUBSCRIBE`
271
-
- ALPN is selected from the requested draft unless `--alpn` explicitly overrides it
272
-
-`--paced` delays media-object sends to match fragment media timestamps instead of sending the whole file as fast as possible; it only has an effect once object transmission begins
273
-
- after setup completes, the CLI prints `connection_id=<hex>` to stdout
274
-
- interoperability against external relays is partially working at draft-14 setup and namespace announcement, but not yet at end-to-end subscription delivery and not yet complete for draft-16 setup
275
-
276
243
Catalog note:
277
244
278
245
-`catalog.json` uses the CMSF-style `role` field such as `video` and `audio`
@@ -314,18 +281,16 @@ GitHub Actions is configured to build and test the project on:
314
281
-`ubuntu-latest`
315
282
-`macos-latest`
316
283
317
-
The workflow currently runs the same CMake configure, build, and CTest steps on both platforms.
284
+
The workflow runs the same CMake configure, build, and CTest steps on both platforms.
318
285
319
-
## Picoquic status
286
+
## Transport Notes
320
287
321
-
The repository now includes a transport abstraction and a picoquic-backed client wrapper.
288
+
The repository includes a transport abstraction and a picoquic-backed client wrapper.
322
289
323
290
- if local picoquic and picotls source trees are available, CMake can compile the real picoquic transport path into this project
324
291
- if those dependencies are not available, the project still builds and tests normally, and the transport layer falls back cleanly
325
-
- in this workspace, picoquic and picotls compile successfully as subprojects
326
-
- the loopback smoke test now completes successfully when run outside restricted sandboxes
327
-
- the current session layer uses a draft-aware control-message module instead of ad hoc string formatting
328
-
- the next remaining transport step is external interoperability, not local handshake bring-up
292
+
- the session layer uses a draft-aware control-message module instead of ad hoc string formatting
293
+
- the optional loopback smoke test is the intended local validation path for real QUIC transport changes
0 commit comments