# Changelog ## 0.5.0 (2026-04-09) ### Read pipeline — 5x speed improvement - **Kernel transfer limit detection**: auto-detect `max_hw_sectors_kb` via sysfs, resolve sg→block device. Previously hardcoded to 510 sectors (1MB) which exceeded the 120KB kernel limit, causing all reads to error and fall back to 6KB reads at 4.8 MB/s. Now auto-tunes to 48 sectors (96KB) or whatever the device supports. - **Result: 12.5 MB/s sustained, 23 MB/s peak** (was 4.8 MB/s) ### LibreDrive — full init pipeline - **All 10 ARM handlers translated**: unlock, firmware upload (A: WRITE_BUFFER, B: MODE SELECT), calibrate (256 zones), register reads, status, probe, set_read_speed, keepalive, timing - **Cold boot firmware upload**: WRITE_BUFFER 1888B (A variant) or MODE SELECT 2496B (B variant) proven on hardware - **Speed calibration**: 256+ disc surface probes, 64-entry speed table, triple SET_CD_SPEED - **Platform trait locked down**: `pub(crate)`, 3 methods only (init, set_read_speed, is_ready) - **Init guard**: prevents double-init, signature mismatch aborts early ### MPLS parser fixes - **PGS in audio slots**: subtitle language read at correct offset (was truncated: "ng " → "eng") - **Secondary PG entries**: n_pip_pg loop added for correct STN position tracking - **Secondary stream types**: stream_type 5 (sec audio), 6 (sec video), 7 (DV EL) attribute parsing - **Empty stream filter**: coding_type 0x00 entries (padding) no longer appear as "Unknown(0)" ### Profiles - **206 profiles with full per-drive data**: ld_microcode (base64), all CDBs, speed tables, signatures - **Automated pipeline**: `sdf_unpack --profiles` → profiles.json (no manual merging) ## 0.4.0 (2026-04-07) ### Labels — complete rewrite - **Detect-then-parse architecture**: each BD-J authoring format has its own parser module with `detect()` and `parse()` functions. Drop in a new parser with one line in the registry. - **5 format parsers**: Paramount (`playlists.xml`), Criterion (`streamproperties.xml`), Pixelogic (`bluray_project.bin`), Warner CTRM (`menu_base.prop` / `language_streams.txt`), shared label vocabulary (`vocab.rs`) - **Raw disc data principle**: label data passes through as-is from disc. Only BD-standard codec identifiers (MLP, AC3, DTS) are mapped to display names. Unknown authoring tool codes (csp, eda, cf) pass through raw. - **`variant` field**: replaces `region` — language dialect codes from authoring tools, not BD spec regions - Removed: old `jar` module (superseded by labels) - Removed: dead label apply functions from disc.rs ### Drive - **`DriveSession::eject()`**: sends PREVENT ALLOW MEDIUM REMOVAL then START STOP UNIT. Works reliably after raw mode unlock. - **`DiscRegion` enum**: Free, BluRay(A/B/C), Dvd(1-8). UHD always region-free. ### Capture - **Fixed sector range collection**: captures ALL files on disc (only skips STREAM/ video files and >50MB). Previously skipped BACKUP/, DUPLICATE/, and files >10MB which missed JAR content. ## 0.3.1 - Labels module: 4 disc file parsers for stream labels - Simplified labels API ## 0.3.0 - Initial public release - SCSI transport (Linux SG_IO, macOS IOKit) - UDF 2.50 filesystem reader - MPLS/CLPI parsers with full STN support - Drive identification + profile matching - 206 bundled drive profiles - AACS 1.0 decryption (VUK + unit keys)