diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ef89b6..7b1b9dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # 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 diff --git a/README.md b/README.md index a98d45b..08a28da 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ Rust library for 4K UHD / Blu-ray optical drives. Drive access, disc scanning, stream labels, AACS decryption, KEYDB updates, and content reading in one crate. Bundled drive profiles — no external files needed. +**12-23 MB/s** read speeds on BD. Full LibreDrive init: unlock, firmware upload, speed calibration — all from pure Rust. + Multi-lingual by design — the library outputs structured data and numeric error codes, never English text. Build any UI or localization on top. **[API Documentation](https://docs.rs/libfreemkv)** · **[Technical Docs](docs/)** @@ -16,7 +18,7 @@ Part of the [freemkv](https://github.com/freemkv) project. ```toml [dependencies] -libfreemkv = "0.4" +libfreemkv = "0.5" ``` ## Quick Start @@ -44,12 +46,13 @@ while let Some(unit) = reader.read_unit()? { ## What It Does -- **Drive access** — open, identify, unlock, eject +- **Drive access** — open, identify, unlock, firmware upload, speed calibration, eject +- **12-23 MB/s reads** — auto-detects kernel transfer limits, full disc speed - **Disc scanning** — UDF 2.50 filesystem, MPLS playlists, CLPI clip info - **Stream labels** — 5 BD-J format parsers (Paramount, Criterion, Pixelogic, CTRM, Deluxe) - **AACS decryption** — transparent key resolution and content decrypt (1.0, 2.0 in progress) - **KEYDB updates** — download, verify, save from any HTTP URL (zero deps, raw TCP) -- **Content reading** — sector reads with automatic decryption +- **Content reading** — adaptive batch reads with automatic decryption and error recovery AACS decryption requires a KEYDB.cfg file. If available at `~/.config/aacs/KEYDB.cfg` or passed via `ScanOptions`, the library handles everything — handshake, key derivation, and per-sector decryption — without the application needing to know anything about encryption.