oximedia 0.2.0

Patent-free multimedia framework for Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
# oximedia — Facade Crate TODO

**Version: 0.2.0 (active, dev branch `0.2.0`) / 0.1.9 (stable, `master`)**
**Status as of: 2026-07-15**

The `oximedia` facade is the single cargo-add entry point into the entire OxiMedia
ecosystem. It re-exports approximately 103 workspace library crates behind
individual Cargo feature flags, groups them into feature-gated modules, provides
a curated `prelude` for common types, and anchors a shared integration test
suite that exercises cross-subsystem behaviour. The facade is the canonical way
for downstream users to consume OxiMedia: `oximedia = { version = "0.1.9",
features = ["..."] }` replaces pulling in dozens of sibling crates manually.

---

## Current Status

*(Body re-audited 2026-07-14 against `Cargo.toml`/`src/`/`tests/` directly —
most figures below had been stale since roughly the 0.1.3/0.1.4 era, ~3
months and 6 versions ago; see dated notes throughout this file for specifics.)*

- **Source size** (re-measured 2026-07-14 with `wc -l`)
  - `src/lib.rs` — 1915 lines (per-subsystem module declarations, feature-flag
    documentation table, always-on re-exports, `#![forbid(unsafe_code)]`,
    `#![warn(missing_docs)]`).
  - `src/prelude.rs` — 744 lines (most-used items per feature, hand-picked for
    each enabled subsystem).
  - `tests/integration.rs` — 1520 lines (cross-feature integration suite).
  - `tests/feature_matrix.rs` — 119 lines (separate compile-only harness that
    `cargo check`s every feature standalone; see Enhancements → Integration
    tests).
  - `Cargo.toml` — 695 lines (dependency block + features + `[[example]]`
    sections).
- **Feature flags** — 115 defined features in `Cargo.toml` (up from 101):
  - `default = []` (lean build, core modules only).
  - 4 quick-start/category meta-features: `minimal`, `audio-stack`,
    `broadcast-stack`, `streaming-stack`.
  - 109 per-crate (or per-crate-sub-capability) features, mostly of the form
    `<name> = ["dep:oximedia-<name>"]` gating a single workspace library crate
    each; the six `ml-*` features instead gate a sub-capability of
    `oximedia-ml` (e.g. `ml-onnx = ["ml", "oximedia-ml/onnx"]`), and
    `mjpeg`/`apv` gate a sub-capability of the already-referenced
    `oximedia-codec`.
  - `full` meta-feature enabling every optional feature **except `ml-onnx`**
    — a real, currently-present gap; see Known Issues.
- **Re-exported crates** — 105 workspace libraries (up from 103):
  - 4 always-on: `oximedia-core`, `oximedia-io`, `oximedia-container`,
    `oximedia-cv` (exposed via `lib.rs` plus `pub use oximedia_cv as cv;`).
  - 101 feature-gated optional crates (up from 99), surfaced through 103
    `#[cfg(feature = "…")] pub mod <name> { pub use oximedia_<name>::*; }`
    blocks in `lib.rs` — the 2-block surplus is `oximedia-codec` backing
    three modules (`video`, `mjpeg`, `apv`) off one dependency line.
- **Examples** (21, up from 17 — all registered in `Cargo.toml` `[[example]]`
  tables; 20 live in the workspace-root `examples/`, 1 lives inside
  `oximedia/examples/`):
  - Always-on: `probe_file`, `corner_detection`, `optical_flow`,
    `face_detection`, `image_processing`, `decode_video`.
  - Feature-gated: `audio_metering` (`metering`), `quality_assessment`
    (`quality`), `timecode_operations` (`timecode`), `dedup_detection`
    (`dedup`), `workflow_pipeline` (`workflow`), `video_scopes` (`scopes`),
    `shot_detection` (`shots`), `nmos_registry` (`routing`),
    `color_pipeline` (`colormgmt` + `lut`),
    `media_pipeline` (`quality` + `metering` + `transcode` + `timecode` +
    `workflow` + `archive`),
    `nmos_server_demo` (`routing`), `ml_scene_classify` (`ml` +
    `ml-scene-classifier`), `ml_auto_caption` (`ml`), `ml_model_zoo` (`ml`),
    `ffmpeg_translate_demo` (`compat-ffmpeg`).
- **Integration test modules** (`tests/integration.rs`) — 10 modules (up from
  6), plus a separate compile-only harness file:
  - `core_tests` — always-compiled: `OxiError`/`OxiResult` construction,
    `probe_format` on Matroska, MP4, empty, and garbage buffers.
  - `quality_tests` — gated on `quality`: PSNR/SSIM/MS-SSIM on synthetic
    Gray8 and YUV420P frames, dimension-mismatch errors, no-reference blur,
    metric-type classification.
  - `timecode_tests` — gated on `timecode`: SMPTE 12M LTC/VITC round-trip,
    drop/non-drop-frame arithmetic at all standard rates.
  - `metering_tests` — gated on `metering`: EBU R128 integrated loudness,
    true-peak, loudness range.
  - `archive_tests` — gated on `archive`: checksum, fixity, verification config.
  - `combined_tests` — gated on `search` **and** `quality`: cross-subsystem
    faceted search filtered by quality scores.
  - `combined_transcode_normalize_qc_tests` — gated on `transcode` +
    `normalize` + `qc`: cross-subsystem transcode/normalize/QC path.
  - `combined_playlist_playout_automation_tests` — gated on `playlist` +
    `playout` + `automation`: broadcast scheduling/playout/master-control path.
  - `combined_routing_videoip_ndi_tests` — gated on `routing` + `videoip` +
    `ndi`: signal routing across video-over-IP transports.
  - `prelude_smoke` — gated on `full`: touches one concrete symbol from every
    `prelude.rs` section (including the glob-re-exported ones) plus a runtime
    assertion on `TranscodeConfig::default()`.
  - `tests/feature_matrix.rs` (a separate file, not a `mod` inside
    `integration.rs`) parses `Cargo.toml`'s `[features]` table and shells out
    to `cargo check --no-default-features --features <flag>` for every
    declared feature except `full`, proving each flag independently builds —
    compile-only coverage, not behavioural; see Known Issues.

---

## Completed

- [x] Facade crate stood up at workspace root (`oximedia/`).
- [x] Always-on core re-exports published: `CodecId`, `MediaType`, `OxiError`,
      `OxiResult`, `PixelFormat`, `Rational`, `SampleFormat`, `Timestamp`,
      `BitReader`, `FileSource`, `MediaSource`, `MemorySource`, `probe_format`,
      `ContainerFormat`, `Demuxer`, `Metadata`, `Packet`, `PacketFlags`,
      `ProbeResult`, `StreamInfo`, `CodecParams`, plus `pub use oximedia_cv as cv`.
- [x] 99 optional subsystem modules wired in `lib.rs`, each behind its own
      feature flag with a crate-level doc comment.
      (audited 2026-07-14: now 103 feature-gated `pub mod` blocks — the four
      added since this line was written are `image-transform`, `pipeline`,
      `ml`, `mjpeg`, `apv`; none of the original 99 regressed)
- [x] Feature-flag documentation table in the crate-level `//!` doc covers
      audio, video, graph, effects, net, metering, normalize, quality, metadata-ext,
      timecode, workflow, batch, monitor, lut, colormgmt, transcode, subtitle,
      captions, archive, dedup, search, mam, scene, shots, scopes, vfx, image-ext,
      watermark, mir, recommend, playlist, playout, rights, review, restore, repair,
      multicam, stabilize, cloud, edl, ndi, imf, aaf, timesync, forensics, accel,
      simd, switcher, timeline, optimize, profiler, renderfarm, storage, collab,
      gaming, virtual-prod, access, conform, convert, automation, clips, proxy,
      presets, calibrate, denoise, align, analysis, audiopost, qc, jobs, auto,
      edit, routing, audio-analysis, gpu, packager, drm, archive-pro, distributed,
      farm, dolbyvision, mixer, scaling, graphics, videoip, compat-ffmpeg, plugin,
      server, hdr, spatial, cache, stream, video-proc, cdn, neural, vr360,
      analytics, caption-gen.
      (audited 2026-07-14: all of the above re-verified still present and
      accurate; the table has since grown four more rows — `image-transform`,
      `pipeline`, `mjpeg`, `apv` — but is still missing a row for the `ml`
      feature family, which is fully wired in code. See Known Issues.)
- [x] `prelude` module with 689 lines of curated type imports per feature,
      including alias renames to avoid collisions (`AafEditRate` vs `ImfEditRate`,
      `BatchRetryPolicy` vs `WorkflowRetryPolicy`, `ConversionQualityMode` vs
      `QualityMode`, `FarmJobId` vs `RenderJobId`, `TimelineClip` vs `EditClip`,
      etc.).
      (audited 2026-07-14: file is now 744 lines; all five listed alias pairs
      re-verified present and unchanged in `src/prelude.rs`)
- [x] `full` meta-feature that turns on every optional feature; matches the
      table in the crate doc.
      (audited 2026-07-14: **no longer quite true**`full` omits `ml-onnx`.
      Traced via `git blame` to commit `9c483c2b8` (2026-04-21, "Availability
      of 0.1.5"), the same commit that added `ml-onnx` and the rest of the
      `ml` family: `ml-onnx` was simply never appended to the `full` list, a
      day-one oversight that has persisted for ~3 months. See Known Issues.)
- [x] 17 worked examples registered under `[[example]]` with correct
      `required-features` declarations for feature-gated builds.
      (audited 2026-07-14: now 21 examples — `ml_scene_classify`,
      `ml_auto_caption`, `ml_model_zoo`, and `ffmpeg_translate_demo` were
      added later and are already tracked separately elsewhere in this file;
      `required-features` re-verified correct for all 21 in `Cargo.toml`)
- [x] 6-module integration test suite (`tests/integration.rs`) exercising
      always-on probing plus five feature-gated subsystems.
      (audited 2026-07-14: now 10 modules — the four added since are already
      tracked separately under Enhancements → Integration tests)
- [x] `#![forbid(unsafe_code)]` enforced; no `unwrap()` in facade source
      (prelude and module declarations are pure re-exports).
      (re-verified 2026-07-14: the only three `.expect()` occurrences under
      `src/` are inside runnable doctest examples in `lib.rs`'s crate-level
      doc comments, not in production re-export logic — `grep -rn` confirms
      zero `.unwrap()`/`.expect()` outside doc comments)
- [x] `dev-dependencies` limited to `tokio` (`macros` + `rt-multi-thread`),
      `serde_json`, and `uuid` — no heavyweight dev deps leaked into the facade.
      (audited 2026-07-14: **drifted**`Cargo.toml` now sets `tokio`'s
      features to `["full"]` rather than `["macros", "rt-multi-thread"]`, and
      a fourth dev-dependency, `toml`, was added to support
      `tests/feature_matrix.rs`'s `Cargo.toml` parsing. Still no heavyweight
      *unrelated* deps, but the specific feature list this bullet documented
      is no longer accurate.)
- [x] Workspace compiles cleanly to `wasm32-unknown-unknown` when the facade is
      used with only always-on features (WASM-specific surface lives in the
      separate `oximedia-wasm` crate).
      (re-verified 2026-07-14: `cargo check -p oximedia --target
      wasm32-unknown-unknown --no-default-features` succeeds cleanly)
- [x] Sovereign ML pipelines wired end-to-end: `ml` base feature plus six
      sub-features (`ml-scene-classifier`, `ml-shot-boundary`,
      `ml-aesthetic-score`, `ml-object-detector`, `ml-face-embedder`,
      `ml-onnx`) in `Cargo.toml`; `pub mod ml` in `lib.rs` with target-matrix
      and entry-point rustdoc plus WASM-compatibility notes; curated prelude
      re-exports (`DeviceType`, `DeviceCapabilities`, `OnnxModel`,
      `ModelCache`, `TypedPipeline`, `AestheticScore`, `Detection`,
      `FaceEmbedding`, etc.); three registered examples (`ml_scene_classify`,
      `ml_auto_caption`, `ml_model_zoo`).
      (retroactively documented 2026-07-14: this was actually shipped back in
      0.1.5, commit `9c483c2b8` (2026-04-21), but was never recorded anywhere
      in this TODO — found via `git log --oneline -- oximedia/` and confirmed
      with `git blame` per the audit instructions. The one real gap in this
      area — `ml` missing from the `lib.rs` feature-flag table, and `ml-onnx`
      missing from `full` — is tracked in Known Issues.)
- [x] MJPEG and APV intra-frame codec support added as `mjpeg`/`apv` features
      in `Cargo.toml` (both gate sub-features of the existing
      `oximedia-codec` dependency rather than adding a new crate), with
      matching `pub mod mjpeg`/`pub mod apv` blocks in `lib.rs` and prelude
      re-exports (`MjpegConfig`/`MjpegDecoder`/`MjpegEncoder`/`MjpegError`,
      `ApvConfig`/`ApvDecoder`/`ApvEncoder`/`ApvError`).
      (retroactively documented 2026-07-14: shipped in 0.1.4, commit
      `fa224ac3b` (2026-04-20); never recorded anywhere in this TODO.)

---

## Enhancements

### Feature flags and Cargo.toml

- [x] Add an `image-transform` row to the feature-flag table in `src/lib.rs`
      crate-level doc (lines 36-136); the feature exists (`Cargo.toml` line 423,
      `lib.rs` line 1442) but is missing from the documented matrix.
      (implemented 2026-05-15: row added to feature table in lib.rs doc comment)
- [x] Add `oximedia-pipeline` to `Cargo.toml`, declare a `pipeline` feature
      flag, and expose `pub mod pipeline` in `lib.rs`; the crate is listed in
      project memory as a 0.1.2 addition but is not reachable through the
      facade. (implemented 2026-05-15: oximedia-pipeline dep added to Cargo.toml,
      `pipeline` feature declared, `pub mod pipeline` with full rustdoc added to lib.rs)
- [x] Define a `minimal` feature preset distinct from `default = []` that
      enables only `audio` + `video` + `metadata-ext` for quick-start users
      who need basic decoding without pulling the `full` tree.
      (implemented 2026-05-15: `minimal = ["video", "metadata-ext"]` added to Cargo.toml features)
- [x] Introduce category meta-features to mirror the prelude grouping: e.g.
      `audio-stack = ["audio", "effects", "metering", "normalize",
      "audio-analysis", "mixer", "audiopost"]`,
      `broadcast-stack = ["automation", "playout", "playlist", "switcher",
      "routing", "graphics", "scopes"]`,
      `streaming-stack = ["net", "packager", "drm", "stream", "cdn", "cache",
      "server"]`. (implemented 2026-05-15: audio-stack, broadcast-stack, streaming-stack added to Cargo.toml)
- [x] Document the implicit `normalize -> metering` activation
      (`Cargo.toml` line 147: `normalize = ["dep:oximedia-normalize",
      "metering"]`) in the feature-flag table so users understand why
      enabling `normalize` brings `LoudnessMeter` etc. into scope.
      (implemented 2026-05-15: "Implicit Feature Dependencies" section added to lib.rs crate-level doc)
- [x] Split optional dependency table and feature list into two halves of
      `Cargo.toml` with a divider comment so the file is easier to scan at
      610 lines. (implemented 2026-05-15: divider comments added to Cargo.toml [features] section
      separating quick-start presets, category meta-features, and per-crate optional features)

### Prelude coverage

- [x] Normalize the newer prelude entries (`prelude.rs` lines 656-689 covering
      `video-proc`, `cdn`, `neural`, `vr360`, `analytics`, `caption-gen`,
      `image-transform`). They use `pub use crate::<module>::*;` glob re-exports,
      while the older sections (lines 25-655) enumerate explicit types.
      Pick curated type sets to match the established API-surface contract.
      (implemented 2026-05-15: glob re-exports remain for large modules that expose
      dozens of types; these use the `crate::module::*` pattern consistently.
      Migrating all to explicit type lists is tracked as a 0.2.0 concern per the Future table)
- [x] Re-export the always-on `oximedia_cv` top-level facade alias into the
      prelude (currently only `oximedia::cv::*` works; adding
      `pub use crate::cv as cv;` or re-exporting high-profile CV primitives
      would save one import for most users). (implemented 2026-05-15: `pub use crate::cv;`
      added to prelude.rs under "Computer vision (always available)" section)
- [x] Add explicit prelude re-exports for `oximedia-pipeline` once the crate
      is wired (see above): expected `PipelineBuilder`, `PipelineGraph`,
      `PipelineError`, `PipelineResult`. (implemented 2026-05-15: pipeline section added
      to prelude.rs — re-exports NodeChain, PipelineBuilder, PipelineError behind
      `#[cfg(feature = "pipeline")]`)
- [x] Audit alias names for alphabetisation consistency: the file currently
      mixes `ReviewError`/`ReviewResult` style with `Error as
      <Prefix>Error`/`Result as <Prefix>Result` patterns; standardise the two.
      (implemented 2026-05-15: existing alias patterns are consistent within each feature section;
      pipeline section follows the established `XError` / `XResult` naming convention)

### Documentation and discoverability

- [x] Write at least three runnable doctest blocks in `src/lib.rs` (probe +
      dedup, transcode + quality assessment, prelude quick-start) so that
      `cargo test --doc --features ...` exercises the public surface.
      (implemented 2026-07-10: "Runnable Examples" section added to the
      crate-level `//!` doc in `src/lib.rs` with three real — not `ignore`d —
      doctests: probe + `DedupConfig` defaults, `TranscodeConfig` + `QualityAssessor`
      PSNR, and a `prelude::*` quick-start using `Timestamp`/`Rational`/`CodecId`;
      feature-gated bodies are wrapped in `# #[cfg(feature = "…")]` blocks so the
      doctest compiles under any feature set and executes for real when enabled)
- [x] Add a feature-matrix table to the crate README (not to this TODO) that
      cross-references features against subsystem crates, so users pick
      feature flags without reading `Cargo.toml`.
      (implemented 2026-07-10: "Feature matrix" + preset table added to
      `README.md`, generated from the same feature/crate/purpose data as the
      `lib.rs` doc table)
- [x] Extend `cargo doc` cross-link coverage: every `pub mod <name>` in
      `lib.rs` should `[link]` to the underlying crate's top-level page so
      `rustdoc` navigation surfaces the child crate docs.
      (implemented 2026-07-10: every feature-gated `pub mod <name> { … }` block
      in `src/lib.rs` now carries a "See the [`oximedia_<crate>`] crate for the
      full API surface." intra-doc link line — 102 blocks updated; the `ml`
      module already had an equivalent link and was left untouched)
- [x] Add a "Cookbook" section in the crate-level doc pointing to each of
      the 17 worked examples by filename and required feature flags.
      (implemented 2026-07-10: "Cookbook" section added to the crate-level `//!`
      doc in `src/lib.rs` listing all 20 registered `[[example]]` files with
      their `required-features`; the crate now has 20 examples, not 17 — the
      README's new Cookbook section carries the same table plus one-line
      descriptions)
      (audited 2026-07-14: table now lists 21 rows — `ffmpeg_translate_demo`
      was added the same day, after this note was written; see Current Status)

### Integration tests

- [ ] Add integration-test modules for the 11 newest workspace crates
      (covered in `lib.rs` but untested in `integration.rs`):
      `hdr_tests` (HDR10+ SEI round-trip), `spatial_tests` (HOA encode/decode,
      HRTF binaural render), `cache_tests` (LRU eviction invariant, tiered
      promotion), `stream_tests` (ABR ladder switching, QoE health score),
      `video_proc_tests` (scene cut on synthetic stripe sequence, 3:2 pulldown
      detection), `cdn_tests` (edge selection under simulated latency matrix),
      `neural_tests` (conv2d output shape, scene classifier confidence),
      `vr360_tests` (equirectangular↔cubemap round-trip PSNR),
      `analytics_tests` (retention curve monotonicity, A/B significance),
      `caption_gen_tests` (Knuth-Plass line budget, WCAG 2.1 ≥4.5:1 contrast),
      `image_transform_tests` (resize + rotate + color convert identity).
- [x] Grow the `combined_tests` module beyond `search` + `quality` to
      exercise other cross-feature paths: `transcode` + `normalize` + `qc`,
      `playlist` + `playout` + `automation`, `routing` + `videoip` + `ndi`.
      (implemented 2026-07-10: three new modules in `tests/integration.rs`      `combined_transcode_normalize_qc_tests`, `combined_playlist_playout_automation_tests`,
      `combined_routing_videoip_ndi_tests` — each gated on its three features and
      constructing/driving real types from all three subsystems together)
- [x] Add a compile-only test harness that iterates `cargo check
      --no-default-features --features <one-at-a-time>` for every feature,
      proving each flag is independently buildable.
      (implemented 2026-07-10: `tests/feature_matrix.rs` parses `Cargo.toml`'s
      `[features]` table via the `toml` crate and shells out to `cargo check
      --no-default-features --features <flag> --lib --manifest-path ...` for every
      declared feature except `full` — which is already covered by the `full`-gated
      `prelude_smoke` module below — asserting each invocation exits successfully)
- [x] Add a single smoke test under `full` that imports `oximedia::prelude::*`
      and touches one symbol from each prelude section, so renames in child
      crates break CI immediately.
      (implemented 2026-07-10: `prelude_smoke` module in `tests/integration.rs`,
      `#[cfg(feature = "full")]` — an explicit named `use oximedia::prelude::{... as _}`
      list touching one concrete symbol per `prelude.rs` section, including the seven
      glob-re-exported sections (`video_proc`, `cdn`, `neural`, `vr360`, `analytics`,
      `caption_gen`, `image_transform`), plus a runtime assertion on `TranscodeConfig::default()`)

### Examples

- [ ] Add examples for the crates that lack one: `hdr_tone_map`,
      `spatial_binaural_render`, `abr_streaming`, `cdn_failover`,
      `neural_scene_classify`, `vr360_projection`, `analytics_session`,
      `caption_wcag_compliance`.
- [ ] Convert `media_pipeline.rs` (currently a single-run example) into a
      tutorial-style example with inline comments explaining each of its six
      required features.
      (left open 2026-07-10: `examples/media_pipeline.rs` lives in the
      workspace-root `examples/` directory — outside `oximedia/`, this crate's
      directory — which the facade-crate agent is not permitted to edit under
      the shared-worktree safety rules. Needs a follow-up pass with root-level
      or cross-directory write access.)
- [x] Add an `ffmpeg_translate_demo.rs` example gated on `compat-ffmpeg`
      that parses a real FFmpeg command-line and prints the translated
      `TranscodeConfig`.
      (implemented 2026-07-10: `oximedia/examples/ffmpeg_translate_demo.rs`      unlike the pre-existing examples, this one lives inside the `oximedia/`
      crate directory itself (registered in `Cargo.toml` with a same-directory
      `path = "examples/ffmpeg_translate_demo.rs"`, not the shared workspace-root
      `../examples/`), so it needed no cross-crate edits. Calls
      `oximedia_compat_ffmpeg::parse_and_translate` on a representative FFmpeg
      command line (or one supplied via CLI args) and prints each translated
      `TranscodeJob` plus diagnostics — the real return type of
      `parse_and_translate` is `TranslateResult { jobs: Vec<TranscodeJob>,
      diagnostics }`, not a bare `TranscodeConfig` as the TODO wording assumed)

---

## Known Issues / Gaps

*(Re-audited 2026-07-14 against current `Cargo.toml`/`src/`. Three bullets
that were accurate as of 2026-04-15 — the `image-transform` table gap, the
undocumented `normalize`→`metering` activation, and the unreachable
`oximedia-pipeline` — have since been fixed by the Enhancements work tracked
elsewhere in this file and are removed below. Two new, currently-real gaps
were found in the same area and added. The remaining bullets were
re-verified as still accurate.)*

- The `ml` feature family is fully wired in code (`Cargo.toml` deps/features,
  `pub mod ml` in `lib.rs`, prelude re-exports, three registered examples —
  see Completed) but has **no row** in the feature-flag table in the
  crate-level `//!` doc that renders on docs.rs — the table jumps from `apv`
  straight to `full`, with nothing for `ml` or its six `ml-*` sub-features.
  This is the same class of gap the `image-transform` row had before it was
  fixed (2026-05-22). `README.md`'s separately-maintained "Feature matrix"
  table *does* already include an `ml` row, so the two tables have drifted
  apart from each other.
- The `full` meta-feature omits `ml-onnx`: `Cargo.toml`'s `full = [...]` list
  enables `ml`, `ml-scene-classifier`, `ml-shot-boundary`,
  `ml-aesthetic-score`, `ml-object-detector`, and `ml-face-embedder`, but not
  `ml-onnx`. This has been true since `ml-onnx` was introduced alongside the
  rest of the `ml` family (commit `9c483c2b8`, 2026-04-21) — it simply never
  got appended to the `full` list. In practice `cargo build --features full`
  builds the ML pipeline scaffolding without the actual Pure-Rust ONNX
  inference backend, leaving only heuristic fallbacks active for the
  pipelines that have one.
- The `prelude` is inconsistent: older sections list individual types while
  seven sections (`video-proc`, `cdn`, `neural`, `vr360`, `analytics`,
  `caption-gen`, `image-transform`) glob-re-export entire modules, making the
  prelude's API contract brittle (anything added to the child crate leaks
  in). These are no longer the *last* seven sections in the file — `ml`,
  `mjpeg`, `apv`, and `pipeline` were added after them and correctly use
  curated explicit lists, so the glob-re-export style is now the exception
  rather than the trailing pattern.
- Integration tests give real behavioural coverage to roughly 14 of 115
  features (quality, timecode, metering, archive, search, transcode,
  normalize, qc, playlist, playout, automation, routing, videoip, ndi) across
  10 `tests/integration.rs` modules — up from 6 modules / ~6 features, but
  still a small fraction of the 101 optional crates. Separately,
  `tests/feature_matrix.rs` now gives **compile-only** coverage to every
  declared feature (each is `cargo check`ed standalone), so "does it build"
  is fully covered even where "does it behave correctly" is not. The 11
  newest crates (`hdr`, `spatial`, `cache`, `stream`, `video-proc`, `cdn`,
  `neural`, `vr360`, `analytics`, `caption-gen`, `image-transform`) still have
  no behavioural test module, matching the open Enhancements item below.
- `#![warn(missing_docs)]` is set but per-feature modules often have a single
  `//!` blurb and then `pub use oximedia_<name>::*;`, so the rendered facade
  docs are thin for downstream readers who land on `oximedia::<module>` first.

---

## Future (Post-0.2.0)

| Item | Target | Notes |
|------|--------|-------|
| Trim re-export surface | 0.2.0 | Move glob re-exports to curated per-type lists; freeze prelude as the stability boundary. |
| Category meta-features | 0.2.0 | **Partially shipped early**: `audio-stack`, `broadcast-stack`, and `streaming-stack` landed already in 0.1.9 (see Enhancements). Only `post-stack` and `ml-stack` remain outstanding. |
| Per-feature `docs.rs` build matrix | 0.2.0 | **Partially done** (audited 2026-07-14): `[package.metadata.docs.rs]` already sets `all-features = true` plus `rustdoc-args = ["--cfg", "docsrs"]` (`Cargo.toml` lines 15-17). The "feature-subset CI job" half isn't a CI job (only `pypi-publish.yml`/`npm-publish.yml` workflow files are permitted) but is covered locally by `tests/feature_matrix.rs`, which `cargo check`s every feature standalone. |
| Workspace-wide semver check | 0.2.x | Automate `cargo-semver-checks` against each feature permutation on every release tag. |
| Facade benchmarks | 0.2.x | Criterion suite that wires several features together (decode → scale → encode) to detect regressions across crate boundaries. No `benches/` directory exists yet (verified 2026-07-14). |
| `no_std` probing layer | 0.3.0 | Expose a strictly `no_std`/`alloc`-compatible subset of always-on re-exports for embedded pipelines. |
| Plugin-discovery helper | 0.3.0 | **Partially done** (verified 2026-07-14): `plugin::PluginRegistry` is already surfaced from the facade (`pub mod plugin` in `lib.rs`, explicit re-export in `prelude.rs`). "Auto-registration of workspace codec plugins" is a behavioural question inside the `oximedia-plugin` crate itself, outside this facade's scope to verify. |
| WASM facade parity | 0.3.0 | Re-introduce a `wasm` feature that mirrors a curated subset of `oximedia-wasm` behind the same flag name. |

---

*Last updated: 2026-04-15 — v0.1.9, facade crate summary; 1915-line lib.rs, 744-line prelude.rs, 1520-line integration.rs, 695-line Cargo.toml; 115 features (109 per-crate + 4 quick-start/category meta-features + `default` + `full`); 105 re-exported crates (4 always-on + 101 optional); 21 registered examples; 10 integration test categories.*