Repository navigation
feat(bindings)!: decoders read gaps and ends - #6745
Conversation
Quest-Claim: b5871bd855598651
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…for decoder reads Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kotlin flows are renamed to reads(), Python's video Read uses Union, and the C++ probe, OBS tests, and interop clients accept encoder ends without shadowing their sample counters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 6 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 42c8d03
No actionable bugs found in inspected changes. Exposing frame/gap/end reads consistently across bindings is the right direction; mirroring the Rust enum avoids a separate signaling mechanism. C read-handle lifetime and Go canceled-video-read cleanup preserve frame ownership, and migration notes make breaking API changes explicit.
Verification: static conversions, wrappers, OBS adaptation, generated Dart serialization and tests inspection. No builds, tests or interop checks run; platform-specific binding behavior remains unverified.
|
Landing summary:
(Written by Claude Opus 5.5) |
|
Maintainer decision (2026-10-25): the hand-written moq-c ships at this cut with parity, so its decoders read gaps and ends like the other bindings. Please also mark the binding shape as settled in (Written by Claude Opus 5.5) |
Gap reads carry a typed duration, following the typed-Duration convention from #6720. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Took over the stale merge hold and resolved the
Checks: (Written by Claude Opus 5.5) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merged
(Written by Claude Opus 5.5) |
# Conflicts: # quest/m1/api-audit/README.md
|
Merge-queue takeover after the
(Written by Claude Opus 5.5) |
Keep both sides' Unreleased MIGRATE entries in moq-ffi, moq-c, and each wrapper: this branch's Credential and Allocator renames and main's decoder reads from #6745. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Completes quest/m1/api-audit/decode-read-bindings.md.
Every binding now reads the same audio and video decode stream that Rust does: frames, gaps, and encoder ends. Before this,
moq_audio::decode::Readandmoq_video::decode::Readlost theirGapandEndvariants at the FFI boundary. A player could not tell lost media or a publisher's encoder restart apart from continuous media.Public API impact
Every item below is breaking. Each package's
MIGRATE.mdhas a "Decoders read gaps and ends" section.MoqAudioConsumer::nextnow returnsOption<MoqAudioRead>andMoqVideoConsumer::nextreturnsOption<MoqVideoRead>.Frame { frame },Gap { timestamp_us, duration }, orEnd { end_us }.durationis a typedDuration, like every other moq-ffi duration since moq-dev/moq#6720; timestamps stay microseconds.Frameand takingframe.moq_decode_{audio,video}_frame[_free]are nowmoq_decode_{audio,video}_read[_free]. They fillmoq_audio_read/moq_video_read, which carrykind(moq_decode_read_kind),frame,gap(moq_decode_gap), andend_us.kind == MOQ_DECODE_READ_FRAMEbefore usingframe.next()yieldsmoq::AudioRead/moq::VideoRead. Usestd::get_if<moq::AudioRead::kFrame>(&read->get_variant()).Read = Frame | Gap | End, using the newmoq.audio.Gap/End(and the video equivalents).Readtypealias. Usecase .frame(let frame).Read/ReadFrame/ReadGap/ReadEndtypealiases.Consumer.frames()is nowConsumer.reads().Read/ReadFrame/ReadGap/ReadEndtypedefs. Useif (read is ReadFrame).Nextreturns the sealedReadinterface (ReadFrame,ReadGap,ReadEnd), andAllranges over reads.ReadFramestill owns its frame handle.Docs:
doc/lib/{c,dart,py,swift,kt,go}are updated.Wire: none.
Choices made
kinddiscriminant plus flat fields (a C-friendly union shape) behind the existing read-id slab.Durationin moq-ffi and every wrapper (Dart drops itsdurationextension getter for the generated field). moq-c keepsduration_us, matching its other microsecond fields.Checks
just checkpasses.just test interop --allpasses: 172 checks.raw_audio_decode_reports_encoder_ends(reanchor and finish).audio_raw_decode_reads_the_encoder_end.Decisions
Settled by the maintainer on 2026-10-25.
MoqMediaTrackConsumer(moq-ffi) and moq-c'smoq_consume_*also drop container gaps and ends.Suggested follow-ups
MoqMediaTrackConsumerin moq-ffi and moq-c'smoq_consume_*get the same tagged-record read shape, plus every wrapper over them. Plan it with/quest-planunder the m1 API audit.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code