Skip to content

Commit 0249047

Browse files
committed
docs: refresh README overview and testing guidance
1 parent 0e19786 commit 0249047

1 file changed

Lines changed: 36 additions & 71 deletions

File tree

README.md

Lines changed: 36 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,18 @@
11
# OpenMOQ Publisher
22

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.
44

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.
66

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.
13-
14-
## Current capabilities
7+
## Overview
158

169
- Parses fragmented MP4 input with `ftyp` + `moov` + `moof`/`mdat`
17-
- Remuxes non-fragmented MP4 input into synthesized fragmented media objects
10+
- Remuxes progressive MP4 input into synthesized fragmented media objects
1811
- 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
3516

3617
## Design overview
3718

@@ -51,7 +32,7 @@ For non-fragmented input:
5132
- it synthesizes a fragmented initialization segment by adding `mvex` and `trex`
5233
- it builds synthetic `moof` + `mdat` payloads from the original sample data
5334

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.
5536

5637
### Draft handling
5738

@@ -72,7 +53,7 @@ This keeps the project aligned with CMAF-style publication while avoiding unnece
7253

7354
### Baseline build
7455

75-
This is the default path if you only want the packaging and session-layer code:
56+
This is the default path for local development:
7657

7758
```bash
7859
cmake -S . -B build -DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
@@ -113,23 +94,32 @@ Useful CMake options:
11394

11495
### Packaging and session tests
11596

116-
For routine development, run the packaging and session-layer tests:
97+
For routine development, run the packaging, CLI, and transport tests from the default build directory:
11798

11899
```bash
119-
cmake -S . -B build-nosmoke -DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
120-
cmake --build build-nosmoke
121-
ctest --test-dir build-nosmoke --output-on-failure
100+
cmake -S . -B build -DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
101+
cmake --build build
102+
ctest --test-dir build --output-on-failure
122103
```
123104

124105
This covers:
125106

126107
- fragmented MP4 packaging
127108
- progressive MP4 remux into CMAF-style objects
109+
- CLI option parsing and validation
128110
- MOQT setup encoding and decoding
129111
- binary namespace announcement plus subscribe-serving or forward-publish control/object sequencing
130112
- paced send scheduling against fragment media timestamps
131113
- QUIC varint boundary coverage
132114

115+
If you want the packaging and transport tests without the CLI target, use the secondary build tree:
116+
117+
```bash
118+
cmake -S . -B build-nosmoke -DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
119+
cmake --build build-nosmoke
120+
ctest --test-dir build-nosmoke --output-on-failure
121+
```
122+
133123
### Picoquic loopback smoke test
134124

135125
When you want to exercise the live QUIC path locally, enable the smoke test target:
@@ -160,15 +150,15 @@ Use `--emit-dir` to inspect the emitted catalog and media objects on disk:
160150
./build/openmoq-publisher --input sample.mp4 --draft 14 --emit-dir out/
161151
```
162152

163-
The output directory should currently contain:
153+
The output directory should contain:
164154

165155
- `catalog.json`
166156
- one `*_init.mp4` file per media track
167157
- one `*_media.mp4` file per emitted media object
168158
- one `*_probe.mp4` file per emitted media object for direct `ffprobe` use
169159
- `publish-plan.txt`
170160

171-
The current catalog format includes:
161+
The catalog format includes:
172162

173163
- `role` with values such as `video` and `audio`
174164
- RFC 6381 `codec` strings such as `avc1.64000C` and `mp4a.40.2`
@@ -192,17 +182,12 @@ OPENMOQ_PICOQUIC_TRACE=1 ./build/openmoq-publisher \
192182
--insecure
193183
```
194184

195-
Current status as of March 13, 2026:
185+
Behavior notes:
196186

197-
- 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
206191

207192
### Optional picoquic smoke test
208193

@@ -214,11 +199,7 @@ cmake --build build --target openmoq-publisher-picoquic-smoke-tests
214199
ctest --test-dir build --output-on-failure
215200
```
216201

217-
Current status:
218-
219-
- 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.
222203

223204
## Usage
224205

@@ -259,20 +240,6 @@ ALPN selection:
259240
- draft-16 defaults to `moqt-16`
260241
- `--alpn` overrides either default when you need to target a specific relay
261242

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-
276243
Catalog note:
277244

278245
- `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:
314281
- `ubuntu-latest`
315282
- `macos-latest`
316283

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.
318285

319-
## Picoquic status
286+
## Transport Notes
320287

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.
322289

323290
- if local picoquic and picotls source trees are available, CMake can compile the real picoquic transport path into this project
324291
- 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
329294

330295
## Roadmap
331296

0 commit comments

Comments
 (0)