Two problems, both invisible until the whole graph is looked at together. DEAD: num-bigint, sha2, num-traits, num-integer, cmac and cbc are declared here and referenced nowhere -- not in src, tests or benches. They were being compiled, audited and offered version bumps forever for no reason. Removing beats bumping. cbc nearly survived the sweep: a substring search for "cbc" matches 44 occurrences of ycbcr_to_rgb in the DVD subtitle decoder, so it looked used. Only a word-boundary search exposed it. SKEW: this crate was the outlier on every shared dependency -- aes 0.8, rand 0.8, base64 0.22.1 and zip 2 against 0.9 / 0.10 / 0.23 / 8 elsewhere. Cargo cannot unify across a major version, so it compiled BOTH: 32 duplicated crates in the freemkv binary's graph, including two complete AES implementations (aes 0.8 + 0.9, cipher 0.4 + 0.5), two digest stacks and two getrandom. Two crypto stacks in one product is worth removing on its own. The aes bump is an API rename -- BlockCipher-prefixed traits, Array for GenericArray -- and the obvious translation uses Array::from_slice, which the new version deprecates and clippy's -D warnings would reject. These use the From<[T; N]> conversion the crate points at instead. 3441 tests pass in debug and release. The AACS crypto here is covered by known-answer tests, so a byte-order or sizing mistake in that rename could not have passed.
74 lines
2.8 KiB
TOML
74 lines
2.8 KiB
TOML
[package]
|
|
name = "libfreemkv"
|
|
version = "1.6.2"
|
|
edition = "2024"
|
|
rust-version = "1.97"
|
|
license = "MIT"
|
|
description = "Open source raw disc access library for optical drives"
|
|
repository = "https://github.com/freemkv/libfreemkv"
|
|
keywords = ["bluray", "uhd", "optical", "scsi", "disc"]
|
|
categories = ["hardware-support", "multimedia"]
|
|
# Keep internal AI-instruction / private notes out of the published crate.
|
|
exclude = ["CLAUDE.md"]
|
|
# OFF crates.io: libfreemkv git-deps freemkv-unlock (firmware, never published),
|
|
# so libfreemkv itself can only be consumed by git tag. Clients git-tag-pin it.
|
|
publish = false
|
|
|
|
[profile.release]
|
|
lto = "thin"
|
|
codegen-units = 1
|
|
|
|
[dependencies]
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
sha1 = "0.10"
|
|
aes = "0.9"
|
|
# Interim path dep for local cross-repo dev; the release script re-pins this to
|
|
# `{ git = ".../freemkv-unlock", tag = "vX.Y.Z" }` before tagging libfreemkv (so
|
|
# the released tag resolves freemkv-unlock from git, not a sibling path).
|
|
freemkv-unlock = { path = "../freemkv-unlock" }
|
|
rand = "0.10"
|
|
zip = { version = "8", default-features = false, features = ["deflate"] }
|
|
base64 = "0.23"
|
|
# Read-only XML DOM parser (pure Rust, forbid(unsafe_code), entity-expansion
|
|
# bounded). Parses the HD-DVD Advanced-Content playlist `ADV_OBJ/VPLST000.XPL`
|
|
# — untrusted disc bytes — into authoritative titles/clips/chapters. A real
|
|
# parser, not a hand-rolled scanner: the XPL is genuine XML (comments, varied
|
|
# attribute order, self-closing tags).
|
|
roxmltree = "0.20"
|
|
# Trace-level instrumentation for the read/transport path (SgIoTransport::execute
|
|
# and friends). Permitted
|
|
# under CLAUDE.md ("Acceptable strings: debug/trace logging"). Consumers (autorip)
|
|
# wire a tracing subscriber and pipe events into the JSONL debug log.
|
|
tracing = "0.1"
|
|
# Bounded MPSC channel with kernel-wakeup send_timeout. Used by `io::pipeline`
|
|
# so the halt-aware send/finish loops can BLOCK on consumer drain instead of
|
|
# polling — the 50 ms poll cadence of the previous mpsc-based impl capped mux
|
|
# throughput at ~1 MB/s (0.21.7).
|
|
crossbeam-channel = "0.5"
|
|
# Persistent work-stealing thread pool for parallel AACS unit
|
|
# decryption. Per-call std::thread::scope spawned fresh OS threads
|
|
# and that overhead dominated for typical batch sizes (60 units).
|
|
# rayon's global pool initialises once on first use.
|
|
rayon = "1"
|
|
# SIMD-accelerated bytestring search. Drives the HEVC/H.264 start-code
|
|
# scan in `mux::codec::h264::find_start_code` — naive byte-by-byte
|
|
# walk is ~500 MB/s single-thread on x86_64; memchr's vectorised
|
|
# `memmem::find` for the 3-byte `00 00 01` needle hits ~5 GB/s on
|
|
# AVX2-capable hosts.
|
|
memchr = "2"
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
libc = "0.2"
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
libc = "0.2"
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3"
|
|
|
|
[[bench]]
|
|
name = "sgio_read"
|
|
harness = false
|
|
|