mirror of
https://github.com/freemkv/libfreemkv.git
synced 2026-10-07 18:13:10 +00:00
pipeline: one run context, KeyRing, Source, Read stage, block and tree sinks
One run context (halt, events, loss counters) serves every stage; keys come from KeyEvidence into a KeyRing. open_source opens every input, disc:// included, replacing MuxSource; PesSource/PesSink replace pes::Stream; one Read stage replaces DiscStream and the byte prefetcher. iso://, null:// and dir:// are sinks. Dead error variants (E9009, E9063, E9082) and scaffolding removed.
This commit is contained in:
@@ -52,7 +52,8 @@ for title in &disc.titles {
|
||||
|
||||
// Stream pipeline — read PES frames from any source, write to any output
|
||||
let opts = libfreemkv::InputOptions::default();
|
||||
let mut input = libfreemkv::input("iso://Disc.iso", &opts)?;
|
||||
let ctx = libfreemkv::Ctx::default(); // halt, events, loss counters for the run
|
||||
let mut input = libfreemkv::input("iso://Disc.iso", &opts, &ctx)?;
|
||||
let title = input.info().clone();
|
||||
let mut output = libfreemkv::output("mkv://Movie.mkv", &title)?;
|
||||
while let Ok(Some(frame)) = input.read() {
|
||||
@@ -86,15 +87,15 @@ cannot call into it; front-ends get recovery from the engine directly.
|
||||
|
||||
| Stream | Input | Output | Transport |
|
||||
|--------|-------|--------|-----------|
|
||||
| DiscStream | Yes | -- | Optical drive via SCSI |
|
||||
| IsoStream | Yes | -- | Blu-ray ISO image file (read via stream pipeline; written by `freemkv_engine::recovery`) |
|
||||
| `disc://` | Yes | -- | Optical drive via SCSI (live Read policy: adaptive batches, recovery read, skip or fail) |
|
||||
| `iso://` / `dir://` | Yes | -- | Disc image file or folder (image Read policy; written by `freemkv_engine::recovery`) |
|
||||
| MkvStream | Yes | Yes | Matroska container |
|
||||
| M2tsStream | Yes | Yes | BD transport stream with FMKV metadata header |
|
||||
| NetworkStream | Yes (listen) | Yes (connect) | TCP with FMKV metadata header |
|
||||
| StdioStream | Yes (stdin) | Yes (stdout) | Raw byte pipe |
|
||||
| NullStream | -- | Yes | Discard sink (byte counter for benchmarks) |
|
||||
|
||||
Streams implement a single unified `pes::Stream` trait (re-exported as `PesStream`) exposing `read()` and `write()` on one type. `input()` / `output()` resolve URL strings to PES stream instances. All URLs use the `scheme://path` format — bare paths are rejected.
|
||||
Inputs implement `PesSource` (`read()`) and outputs `PesSink` (`write()`); a format that is both implements both. `open_source()` / `input()` open every input URL (`disc://` included) and `output()` every output URL. All URLs use the `scheme://path` format — bare paths are rejected.
|
||||
|
||||
### Keys
|
||||
|
||||
@@ -119,10 +120,12 @@ Disc — scan titles, streams, AACS/CSS state
|
||||
├── AACS — key resolution + content decryption
|
||||
└── CSS — DVD CSS (bus auth → player-key disc crack → known-plaintext title-key attack)
|
||||
|
||||
Streams — unified PES pipeline
|
||||
├── PesStream — pes::Stream: one trait, read()/write() PES frames
|
||||
├── DiscStream — sectors → decrypt → TS demux → PES
|
||||
├── IsoStream — ISO file → decrypt → TS demux → PES
|
||||
Streams — one PES pipeline
|
||||
├── Source — open_source(url): drive, image, folder, file, socket, pipe
|
||||
├── Read stage — extents → chunks under the source's ReadPolicy (live | image)
|
||||
├── Decrypt stage — AACS / CSS, content-detected, damage blanked and counted
|
||||
├── Demux — TS / PS → PES (one demux for every sector source)
|
||||
├── PesSource/PesSink — read()/write() PES frames
|
||||
├── MkvStream — MKV mux/demux
|
||||
├── M2tsStream — BD transport stream
|
||||
├── NetworkStream — TCP with FMKV metadata header
|
||||
|
||||
Reference in New Issue
Block a user