Summary of what Wave 5 landed in the 0.1.5 cycle. Source pointers are relative to the repository root.
TranscodePipeline::execute()incrates/oximedia-transcode/src/pipeline.rs(line 1165). Constructs an internalPipelinefrom the storedPipelineConfigand drives it to completion. The companionTranscodePipelineBuildersupplies the fluent construction API.MultiTrackExecutor<M: Muxer>incrates/oximedia-transcode/src/multi_track.rs(line 285) — DTS-ordered multi-track interleaving for synchronous mux of video / audio / subtitle tracks.
Pure-Rust, no FFI:
crates/oximedia-transcode/src/hw_accel/macos.rs:probe_macos()readssysctl -n hw.optional.arm64andmachdep.cpu. brand_string, identifiesM1/M2/M3/M4or Intel Mac, and returns aHwAccelCapabilitieswith the VideoToolbox codec matrix (M3/M4 adds AV1 decode).crates/oximedia-transcode/src/hw_accel/linux.rs:probe_linux()walks/sys/class/drm/, reads PCI vendor IDs (0x8086Intel,0x1002AMD,0x10deNVIDIA) viastd::fs::read_to_string, and emits per-card codec capabilities. No libva, no DRM ioctls.- Shared
capabilities.rstype (HwAccelCapabilities,HwAccelDevice,HwKind) consumed by the transcode pipeline to pick hardware codecs.
crates/oximedia-net/src/abr/bba1.rsimplements Huang et al. SIGCOMM 2014 "A Buffer-Based Approach to Rate Adaptation" with three-zone variant selection:- Reservoir
[0, r]→ lowest variant. - Cushion
(r, r+c]→ linear-interpolate variant index. - Above-cushion
(r+c, ∞)→ highest variant.
- Reservoir
BbaParams::default()(B=30 s, r=10 s, c=20 s) matches the paper;BbaParams::low_latency()(B=10 s, r=2 s, c=8 s) for live streaming.select_variant(buffer_level, ¶ms, &variants) -> usizeis a stateless pure function — no controller object required.
crates/oximedia-container/src/mux/mpegts/scte35.rsemits ad-marker PES payloads with MPEG-2 CRC-32:emit_splice_null()(line 182) — heartbeat.emit_splice_insert(&SpliceInsertConfig)(line 238) — ad-break in/out with PTS.emit_time_signal(pts: Option<Duration>)(line 160) — programme signalling.
crates/oximedia-container/src/demux/mpegts/scte35.rsparser:Scte35Parser(line 258) parses the same payloads back into typed events.crates/oximedia-container/src/metadata/batch.rsintroducesBatchMetadataUpdate(line 111) — container-agnostic in-place tag updates on MP4 / MKV / FLAC / Vorbis metadata without rewriting the whole file.
crates/oximedia-core/src/error_context.rs— structured error chains:ErrorFrame(line 94) — one frame in the chain (file, line, function, message).ErrorContext(line 234) — owns aVec<ErrorFrame>, emitted as the trace when an error propagates.ErrorChain(line 406) — iterator over the full chain.ErrorContextBuilder(line 494) — fluent construction.
crates/oximedia-core/src/codec_negotiation.rs— decoder/encoder format selection:FormatCosttrait (line 699) — cost function abstraction.FormatNegotiator<'a, F>(line 874) — negotiates a preferred pixel/sample format pair between source and sink, minimising cost.
Docs round 3: codec_status.md (unchanged since
Action A), rate_control.md,
simd_dispatch.md, and this file.
oximedia-transcode: 1174 tests pass.oximedia-net: 1606 tests pass.oximedia-container: 1282 tests pass, 65 skipped.oximedia-core: 1022 tests pass.- Zero clippy warnings on all four crates.
No source behaviour changed in Slice F — documentation only.