diff --git a/cpp/moq/MIGRATE.md b/cpp/moq/MIGRATE.md index 986d21b524..ed2216eaf5 100644 --- a/cpp/moq/MIGRATE.md +++ b/cpp/moq/MIGRATE.md @@ -9,6 +9,13 @@ How to update your code for each breaking change, newest first. `Anchor` gains a `Time` case holding `timestamp_us`, the group containing that presentation time, so exhaustive visits need a case for it. `TrackConsumer::update` now returns a result, failing with `TimestampMismatch` on a time anchor an untimed track can't serve. +### Rebuild the matching raw bindings + +The documentation update changes UniFFI's audio-producer method metadata checksums. +Regenerate the C++ binding headers and sources from the rebuilt native library, +then rebuild the application; older generated guards reject the rebuilt library. +Application calls are unchanged. + ### JSON consumers return `JsonValue` (#5677) `JsonSnapshotConsumer::next()` and `JsonStreamConsumer::next()` return `JsonValue` (`value`, `timestamp_us`) instead of a string; `timestamp_us` is empty when untimed. diff --git a/dart/moq/MIGRATE.md b/dart/moq/MIGRATE.md index b280596e61..3f57b3d0ba 100644 --- a/dart/moq/MIGRATE.md +++ b/dart/moq/MIGRATE.md @@ -9,6 +9,13 @@ How to update your code for each breaking change, newest first. `Anchor` gains a time variant, so exhaustive switches need a case for it. `TrackConsumer.update` now throws on a time anchor an untimed track can't serve. +### Rebuild the matching raw bindings + +The documentation update changes UniFFI's audio-producer method metadata checksums. +Update `moq_ffi` and its native library together; older generated guards reject the rebuilt library. +For a custom native library, regenerate its matching Dart bindings with `just dart generate`. +Application calls are unchanged. + ### JSON consumers return `Value` (#5677) `SnapshotConsumer.next()` and `StreamConsumer.next()` return `Value` (`value`, `timestampUs`) instead of a string; `timestampUs` is null when untimed. diff --git a/dart/moq_ffi/MIGRATE.md b/dart/moq_ffi/MIGRATE.md new file mode 100644 index 0000000000..fcfb6c6b00 --- /dev/null +++ b/dart/moq_ffi/MIGRATE.md @@ -0,0 +1,12 @@ +# Migrating the Dart moq\_ffi package + +How to update your code for each breaking change, newest first. + +## Unreleased + +### Regenerate the matching bindings + +Documentation on `MoqAudioProducer::write` and `finish` changes their UniFFI metadata checksums. +Keep the generated Dart code and native library together. +For a custom native build, regenerate the matching bindings with `just dart generate`. +The method signatures and behavior are unchanged. diff --git a/dart/moq_ffi/lib/src/moq.dart b/dart/moq_ffi/lib/src/moq.dart index f47baef063..da3f0f3eeb 100644 --- a/dart/moq_ffi/lib/src/moq.dart +++ b/dart/moq_ffi/lib/src/moq.dart @@ -8,9 +8,7 @@ import "dart:ffi"; import "dart:io" show Platform, File, Directory; import "dart:isolate"; import "dart:typed_data"; - import "package:ffi/ffi.dart"; - import "uniffi_runtime.dart"; export "uniffi_runtime.dart"; @@ -18570,7 +18568,7 @@ void _checkApiChecksums() { if (uniffi_moq_ffi_checksum_method_moqaudioproducer_demand() != 42822) { throw UniffiInternalError.panicked("UniFFI API checksum mismatch"); } - if (uniffi_moq_ffi_checksum_method_moqaudioproducer_finish() != 6287) { + if (uniffi_moq_ffi_checksum_method_moqaudioproducer_finish() != 52976) { throw UniffiInternalError.panicked("UniFFI API checksum mismatch"); } if (uniffi_moq_ffi_checksum_method_moqaudioproducer_reanchor() != 34412) { @@ -18579,7 +18577,7 @@ void _checkApiChecksums() { if (uniffi_moq_ffi_checksum_method_moqaudioproducer_reservation() != 43848) { throw UniffiInternalError.panicked("UniFFI API checksum mismatch"); } - if (uniffi_moq_ffi_checksum_method_moqaudioproducer_write() != 22094) { + if (uniffi_moq_ffi_checksum_method_moqaudioproducer_write() != 48796) { throw UniffiInternalError.panicked("UniFFI API checksum mismatch"); } if (uniffi_moq_ffi_checksum_method_moqbandwidth_reserve() != 27807) { diff --git a/go/ffi/MIGRATE.md b/go/ffi/MIGRATE.md new file mode 100644 index 0000000000..943e86f1f1 --- /dev/null +++ b/go/ffi/MIGRATE.md @@ -0,0 +1,11 @@ +# Migrating the Go moq-ffi module + +How to update your code for each breaking change, newest first. + +## Unreleased + +### Regenerate the matching bindings + +Documentation on `MoqAudioProducer::write` and `finish` changes their UniFFI metadata checksums. +Regenerate the Go sources and bundle the matching static libraries, then rebuild callers. +The method signatures and behavior are unchanged. diff --git a/go/wrapper/MIGRATE.md b/go/wrapper/MIGRATE.md index 0331ac824c..083ccb38da 100644 --- a/go/wrapper/MIGRATE.md +++ b/go/wrapper/MIGRATE.md @@ -13,6 +13,13 @@ A positional `TrackInfo{...}` literal adds a trailing `false`; keyed literals ne `AnchorTime` names the group containing a presentation time, and type switches over `Anchor` need a case for it. `TrackConsumer.Update` also fails on a time anchor an untimed track can't serve. +### Rebuild the matching raw bindings + +The documentation update changes UniFFI's audio-producer method metadata checksums. +Update generated `moq.dev/moq-ffi` sources and its bundled static libraries together, +then rebuild the application; older generated guards reject the rebuilt library. +Application calls are unchanged. + ### JSON consumers return `*json.Timed` (#5677) `SnapshotConsumer.Next`, `StreamConsumer.Next`, and `All` return `*Timed{Value, Timestamp}` instead of the raw message; `Timestamp` is a `*time.Duration`, nil when untimed. diff --git a/go/wrapper/errors.go b/go/wrapper/errors.go index fb6df76c5c..2dfb8be0d6 100644 --- a/go/wrapper/errors.go +++ b/go/wrapper/errors.go @@ -41,7 +41,7 @@ var ( ErrVideo = ffi.ErrMoqErrorVideo // ErrURL matches a malformed URL passed when connecting or publishing. ErrURL = ffi.ErrMoqErrorUrl - // ErrTimeOverflow matches a timestamp that overflowed its timescale. + // ErrTimeOverflow matches a timestamp outside the supported range. ErrTimeOverflow = ffi.ErrMoqErrorTimeOverflow // ErrLogLevel matches an unparseable log level string passed to LogLevel. ErrLogLevel = ffi.ErrMoqErrorLogLevel diff --git a/kt/moq-ffi/MIGRATE.md b/kt/moq-ffi/MIGRATE.md new file mode 100644 index 0000000000..2eecf89713 --- /dev/null +++ b/kt/moq-ffi/MIGRATE.md @@ -0,0 +1,11 @@ +# Migrating the Kotlin moq-ffi package + +How to update your code for each breaking change, newest first. + +## Unreleased + +### Regenerate the matching bindings + +Documentation on `MoqAudioProducer::write` and `finish` changes their UniFFI metadata checksums. +Regenerate the Kotlin sources and package matching native libraries, then rebuild callers. +The method signatures and behavior are unchanged. diff --git a/kt/moq/MIGRATE.md b/kt/moq/MIGRATE.md index 9a3ad22f29..05a0620475 100644 --- a/kt/moq/MIGRATE.md +++ b/kt/moq/MIGRATE.md @@ -9,6 +9,13 @@ How to update your code for each breaking change, newest first. `Anchor` gains `AnchorTime`, so exhaustive `when` expressions need a branch for it. `TrackConsumer.update` now throws `MoqException` on a time anchor an untimed track can't serve. +### Rebuild the matching raw bindings + +The documentation update changes UniFFI's audio-producer method metadata checksums. +Regenerate the Kotlin sources and update the native libraries in `moq-ffi` together, +then rebuild the application; older generated guards reject the rebuilt library. +Application calls are unchanged. + ### JSON consumers emit timestamps (#5677) `values()` emits `json.Value` (`value`, plus `timestamp` as a `Duration?`) instead of a string, and `valuesAs()` emits `Timed(value, timestamp)`. diff --git a/kt/moq/src/jvmAndAndroidMain/kotlin/dev/moq/audio/Audio.kt b/kt/moq/src/jvmAndAndroidMain/kotlin/dev/moq/audio/Audio.kt index ac9e6d37e1..bbead7c43f 100644 --- a/kt/moq/src/jvmAndAndroidMain/kotlin/dev/moq/audio/Audio.kt +++ b/kt/moq/src/jvmAndAndroidMain/kotlin/dev/moq/audio/Audio.kt @@ -12,7 +12,7 @@ typealias EncoderInput = uniffi.moq.MoqAudioEncoderInput typealias EncoderOutput = uniffi.moq.MoqAudioEncoderOutput /** The PCM layout a [Consumer] delivers, how stale a group may get, and its playout delay. */ typealias DecoderOutput = uniffi.moq.MoqAudioDecoderOutput -/** Interleaved PCM with its presentation timestamp. */ +/** PCM samples in the configured layout with their presentation timestamp. */ typealias Frame = uniffi.moq.MoqAudioFrame /** One encoded payload from an [Encoder]. */ typealias Packet = uniffi.moq.MoqAudioPacket diff --git a/py/moq-ffi/MIGRATE.md b/py/moq-ffi/MIGRATE.md new file mode 100644 index 0000000000..e88a41ac96 --- /dev/null +++ b/py/moq-ffi/MIGRATE.md @@ -0,0 +1,11 @@ +# Migrating the Python moq-ffi package + +How to update your code for each breaking change, newest first. + +## Unreleased + +### Regenerate the matching bindings + +Documentation on `MoqAudioProducer::write` and `finish` changes their UniFFI metadata checksums. +Rebuild or reinstall the complete wheel so its generated Python code and native library match. +The method signatures and behavior are unchanged. diff --git a/py/moq-rs/MIGRATE.md b/py/moq-rs/MIGRATE.md index 59f06c9963..afc40f5f1d 100644 --- a/py/moq-rs/MIGRATE.md +++ b/py/moq-rs/MIGRATE.md @@ -9,6 +9,12 @@ How to update your code for each breaking change, newest first. `Anchor` gains a `TIME` variant, the group containing a presentation time. `TrackConsumer.update` now raises on a time anchor an untimed track can't serve. +### Rebuild the matching raw bindings + +The documentation update changes UniFFI's audio-producer method metadata checksums. +Rebuild or reinstall the complete `moq-ffi` wheel, keeping its generated Python code +and native library together; application calls are unchanged. + ### JSON consumers yield `json.Timed` (#5677) `json.SnapshotConsumer` and `json.StreamConsumer` yield `Timed(value, timestamp)` instead of the bare value; `timestamp` is a `timedelta`, or `None` when untimed. diff --git a/quest/m1/README.md b/quest/m1/README.md index 7b42ed8e64..e561aa0cce 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -108,7 +108,6 @@ lands before the cut. - [Exporters follow a rendition to a new track](/quest/m1/export-rendition-rebind.md) - the fMP4, TS, MKV and FLV exporters rebuild a rendition whose resolved `track` or `broadcast` changes under the same ID - [lite-06 max sequence](/quest/m1/lite06-max-sequence.md) - group sequence 2^62-1 reaches a lite-06 subscriber or is refused loudly, instead of vanishing - [Track live signal](/quest/m1/track-live.md) - a reader can wait for its track's feed to be live, so a player skips old cached groups while a fresh upstream subscription starts -- [Binding docs](/quest/m1/docs-bindings.md) - every public moq-ffi and moq-c item has rustdoc, carried into the generated bindings and `moq.h` - [C++ and OBS package proof](/quest/m1/cpp-package-check.md) - the installed artifacts pass before their first release diff --git a/quest/m1/docs-bindings.md b/quest/m1/docs-bindings.md deleted file mode 100644 index c89a595def..0000000000 --- a/quest/m1/docs-bindings.md +++ /dev/null @@ -1,22 +0,0 @@ -# [M] Document the moq-ffi and moq-c APIs - -## Goal - -Every public item in `moq-ffi` and `moq-c` has a one-line rustdoc, so the -generated bindings and `moq.h` carry it, and both crates set -`#![warn(missing_docs)]`. - -## Plan - -The m0 documentation audit (2026-10-19) found 116 undocumented public items -in `moq-ffi` (42 in `error.rs`, the rest across `media`, `audio`, `origin`, -`video`, and the producer and consumer types) and 133 in `moq-c` (39 in -`error.rs`, 63 in `api.rs`, plus `audio` and `video`). Error codes and -variants make up most of it. - -Count them with `cargo rustdoc -p --lib --all-features -- -W -missing_docs`. Check that the docs reach the outputs a binding user reads: -UniFFI copies rustdoc into the generated Python, Swift, Kotlin, and Go code, -and cbindgen copies it into `moq.h`. The hand-written wrappers listed in the -Cross-Package Sync table keep their own docs; align them where they restate -the same item. diff --git a/rs/moq-c/src/api.rs b/rs/moq-c/src/api.rs index c000402518..cb0921214e 100644 --- a/rs/moq-c/src/api.rs +++ b/rs/moq-c/src/api.rs @@ -44,6 +44,7 @@ pub struct moq_container { /// The CMAF init segment (ftyp+moov), or NULL. /// Read only when `kind` is `MOQ_CONTAINER_KIND_CMAF`, where it is required. pub init: *const u8, + /// The length in bytes of `init`. pub init_len: usize, } @@ -321,10 +322,12 @@ fn container_format_from_u32(value: u32) -> Result Result