Files
libfreemkv/docs/pipelined-stream.md
T
Matthew Jackson 6e14fc0c0c libfreemkv: 1.7.0 groundwork — sector-recycle soundness + CI hardening
Security
- Remove the unsafe Vec::set_len over recycled sector buffers — UB reachable
  from safe code (GHSA-j8ww-f5fg-9pmh, low). Uses Vec::resize; pooling unchanged.

CI / tooling
- clippy on stable with the MSRV single-sourced from Cargo.toml; cargo-deny
  dependency-audit gate with first-party git sources allowed (#15); audience-based
  comment-guard (#17).

Docs
- README (keydb ownership, BD-J parser count), drive-access transport/reset
  notes, mux timeline module-doc links.
2026-09-02 12:40:55 -07:00

1.8 KiB

PipelinedPesStream

The read-side of the freemkv mux highway. Given a DemuxThread (which has the producer + demux workers already spawned), a set of codec parsers, and the title metadata, this struct implements crate::pes::Stream by running codec parse on the caller's thread and emitting PesFrames one at a time.

Threading

The pipeline runs three threads in parallel:

Thread A: read + decrypt   (PrefetchedSectorSource / BytePrefetcher)
Thread B: M2TS demux       (DemuxThread)
Thread C: codec parse      (this struct, on the caller's thread)

Communication between A→B and B→C is via bounded channels with recycled buffer pools — no allocations or memcpys in the steady-state hot loop.

This is the only read-side Stream impl in tree. Both the ISO file mux and the BD-TS (m2ts://) file mux input paths are built by crate::mux::resolve (build_iso_pipeline / the m2ts pipeline builder) and hand back a PipelinedPesStream; the differences are in how the producer thread (A) is configured — sector-aligned reads with AACS decrypt for ISO, raw byte reads for M2TS. (crate::mux::M2tsStream itself is a write-only sink and does not construct this type.)

DVD seek-index regression (highway-level test)

The real CLI mux runs PsDemuxer → PipelinedPesStream (codec parse) → frame out, NOT the codec parser straight into the muxer. The keyframe flag and per-frame duration the Mpeg2Parser sets on each Frame must survive that path (from_codec_frame) so the muxer's cluster/cue logic — which opens a cluster + pushes a cue on keyframe && track 0 — actually fires. If the highway dropped the keyframe flag, every video I-frame would arrive as a non-keyframe and the DVD MKV would get thousands of clusters with ZERO cues (chapter-seek only, no scrub).