Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions doc/bin/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ moq ... play --delay 500ms # trade latency for a jittery link
Decodes H.264, H.265, and AV1 video and Opus, PCM, and AAC-LC audio using
the platform hardware decoder where available. `--video-name` and
`--audio-name` pick a rendition.
HE-AAC signaled only in band (implicit SBR, as over MPEG-TS) plays as its
half-rate AAC-LC core.

Playback runs on a clock it owns. `--delay` (default 100 ms) is how far it
trails the live edge, which is both the jitter a late frame may absorb and the
Expand Down
4 changes: 4 additions & 0 deletions doc/lib/rs/moq-audio.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ policy. Decoding likewise separates low-level `decode::Config`, PCM
| `playback` | One output device mixing every track in a call, with click-free volume ramps |
| `aec` | Acoustic echo cancellation (a port of WebRTC's), so a laptop with no headset doesn't feed itself back |

AAC decoding refuses HE-AAC its config declares. HE-AAC signaled only in band
(implicit SBR, as over MPEG-TS) goes undetected and plays as its half-rate
AAC-LC core.

Highlights:

- **`encode::Publication`** advertises the track and opens the microphone only while someone listens. Stop, swap devices, and restart without changing the track subscribers know; read a level meter for the UI.
Expand Down
7 changes: 4 additions & 3 deletions quest/m1/audio-codecs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ publisher can produce AAC.
Platform first, exactly like video: AudioToolbox on macOS and iOS, Media
Foundation on Windows, MediaCodec on Android, and symphonia (AAC-LC
mono/stereo) as the software fallback that openh264 is for H.264. Linux has no
OS audio decoder, so HE-AAC and multichannel AAC stay refused there, stated in
the docs and rejected at construction. A platform backend claims every catalog
OS audio decoder, so multichannel AAC stays refused there, stated in the docs
and rejected at construction. HE-AAC signaled only in band (implicit SBR, as
over MPEG-TS) plays as its half-rate LC core on symphonia; detecting it needs a
full element walk, so the docs state it instead of refusing it. A platform backend claims every catalog
Comment on lines +20 to +22

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Document the permanent half-rate behavior now

For Symphonia users receiving implicit-SBR HE-AAC over MPEG-TS, this change abandons the only quest that would prevent silent half-rate decoding and makes documentation the mitigation, but only schedules that documentation inside the larger decode-seam quest. In the reviewed tree, doc/lib/rs/moq-audio.md and doc/bin/cli.md still merely advertise AAC-LC decoding, so affected users receive degraded audio with no warning until unrelated future work lands. Update the user-facing docs as part of this abandonment.

AGENTS.md reference: AGENTS.md:L26-L27

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, fixed in 5c61a75: doc/lib/rs/moq-audio.md and doc/bin/cli.md now say implicit-SBR HE-AAC plays as its half-rate LC core.

(Written by Claude Opus 5.5)

codec its framework opens, so AC-3, E-AC-3, MP3, and FLAC ride along on the
hosts that have them; each still needs a fixture before the backend advertises
it.
Expand All @@ -41,7 +43,6 @@ its own decode and encode quest so verification stays per host.

## Quests

- [HE-AAC refusal](/quest/m1/audio-codecs/he-aac-refusal.md) - implicit-SBR HE-AAC over TS is refused instead of half-decoded as the LC core
- [TS export PCE](/quest/m1/audio-codecs/ts-export-pce.md) - a TS export of a PCE-described AAC track writes channel_config 0 and the PCE instead of a count-derived config
- [Layout](/quest/m1/audio-codecs/layout.md) - the settled `Layout` carries up to 7.1 through decode, resample, playback, and the FFI
- [Decode seam](/quest/m1/audio-codecs/decode-backend.md) - `decode::backend` selects a platform decoder before symphonia, mirroring moq-video
Expand Down
6 changes: 4 additions & 2 deletions quest/m1/audio-codecs/decode-backend.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ stats and `moq play` surface.
AAC-LC mono/stereo only; the platform backends that follow advertise what
their framework opens and has a fixture for.
- Move today's Opus, PCM, and symphonia code behind the trait without changing
behavior; the HE-AAC sniff from [HE-AAC refusal](/quest/m1/audio-codecs/he-aac-refusal.md)
lands in the symphonia backend.
behavior. Document per host that symphonia plays implicit-SBR HE-AAC as its
half-rate LC core: finding the in-band SBR element needs a full Huffman walk
of the channel elements, and symphonia detects it internally without
exposing or refusing it.
- A backend's output rate and layout are what it produced, not what the
catalog said (HE-AAC doubles the rate); `Consumer` already resamples and
remixes to the requested output, so that stays the seam's contract.
Expand Down
33 changes: 0 additions & 33 deletions quest/m1/audio-codecs/he-aac-refusal.md

This file was deleted.

Loading