v1.2.0: bump version + reconcile CHANGELOG to [1.2.0]
This commit is contained in:
+35
-12
@@ -1,6 +1,40 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [1.1.1]
|
## [1.2.0] — 2026-06-28
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **Mux loss concealment — a logged gap still produces a decode-clean file.**
|
||||||
|
When a unit genuinely cannot be decrypted on the mux read path (a key the disc
|
||||||
|
never yielded, after the rip's own decrypt-verify already failed loud and
|
||||||
|
re-read), the mux no longer passes ciphertext downstream or emits a broken
|
||||||
|
frame. The undecryptable aligned unit is concealed as NULL transport-stream
|
||||||
|
packets (PID 0x1FFF, invisible to every real stream), and the codec layer
|
||||||
|
**drops forward to the next keyframe** so no frame with a dangling reference
|
||||||
|
reaches the muxer. An ffmpeg deep scan of the result is clean — no missing
|
||||||
|
references, no partial frames. The loss is tallied and logged, never silently
|
||||||
|
dropped, and the mux always completes. Audio and subtitle tracks have no
|
||||||
|
cross-frame references, so only the directly-affected frames are dropped there.
|
||||||
|
Decrypt-verify remains a **rip** gate (fail loud → re-read), never a mux gate.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **One hex parser.** All hex parsing (keys, IDs, key-source inputs) routes
|
||||||
|
through a single `libfreemkv::hex` parser instead of several ad-hoc decoders,
|
||||||
|
so length/odd-nibble/invalid-digit handling is identical everywhere.
|
||||||
|
- **Robust encrypted-unit sampling + a single MKB framing walker.** Up-front
|
||||||
|
AACS sampling tolerates content layouts that previously yielded too few
|
||||||
|
encrypted units to resolve a key, and the Media Key Block is now walked by one
|
||||||
|
framing routine shared across the in-band and out-of-band readers (no
|
||||||
|
divergent record-stride logic). AACS resolution hardened around these paths.
|
||||||
|
- **One reader, one `DiscInputs`.** `Disc::inputs()` is now the single, complete
|
||||||
|
source of a disc's AACS inputs (inf, MKB, VID, disc_hash, version), and
|
||||||
|
`read_aacs_inputs*` returns the version alongside inf+MKB. Both the CLI and
|
||||||
|
autorip resolve through `Disc::inputs()`; the duplicate out-of-band readers
|
||||||
|
(autorip's `key_files()`/`volume_id()`) and the stale mapfile-VID read are
|
||||||
|
removed. AACS file paths and the AACS major versions are now named constants
|
||||||
|
(`aacs::PATH_*`, `aacs::AACS_MAJOR_*`, `AacsVersion::major`/`from_major`) so a
|
||||||
|
fallback or stride change lives in exactly one place.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
@@ -38,17 +72,6 @@
|
|||||||
- **`verify::push_ranges` uses saturating arithmetic** so a corrupt-disc LBA near
|
- **`verify::push_ranges` uses saturating arithmetic** so a corrupt-disc LBA near
|
||||||
`u32::MAX` can't panic (matches `udf::merge_ranges`).
|
`u32::MAX` can't panic (matches `udf::merge_ranges`).
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- **One reader, one `DiscInputs`.** `Disc::inputs()` is now the single, complete
|
|
||||||
source of a disc's AACS inputs (inf, MKB, VID, disc_hash, version), and
|
|
||||||
`read_aacs_inputs*` returns the version alongside inf+MKB. Both the CLI and
|
|
||||||
autorip resolve through `Disc::inputs()`; the duplicate out-of-band readers
|
|
||||||
(autorip's `key_files()`/`volume_id()`) and the stale mapfile-VID read are
|
|
||||||
removed. AACS file paths and the AACS major versions are now named constants
|
|
||||||
(`aacs::PATH_*`, `aacs::AACS_MAJOR_*`, `AacsVersion::major`/`from_major`) so a
|
|
||||||
fallback or stride change lives in exactly one place.
|
|
||||||
|
|
||||||
## [1.1.0]
|
## [1.1.0]
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "libfreemkv"
|
name = "libfreemkv"
|
||||||
version = "1.1.0"
|
version = "1.2.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
rust-version = "1.86"
|
rust-version = "1.86"
|
||||||
license = "AGPL-3.0-only"
|
license = "AGPL-3.0-only"
|
||||||
|
|||||||
Reference in New Issue
Block a user