From 4ed245868eb4e6ceac72cab6a0cf3fbedfcc199a Mon Sep 17 00:00:00 2001 From: Matthew Jackson <1085847+MattJackson@users.noreply.github.com> Date: Wed, 29 Jul 2026 19:15:21 -0700 Subject: [PATCH] Revert "Distinguish a failed key source from one with no entry" This reverts commit 22a3e3fd01a5e41f80b4f138c3835621310e92c4. --- src/aacs/trace.rs | 5 ----- src/keysource.rs | 16 +++------------- src/mux/codec/dts.rs | 13 ++++++------- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src/aacs/trace.rs b/src/aacs/trace.rs index c499593..4699d99 100644 --- a/src/aacs/trace.rs +++ b/src/aacs/trace.rs @@ -77,11 +77,6 @@ pub enum KeyNode { MatchedDisc, /// The source had no entry for this disc. NoEntry, - /// The source FAILED — it errored rather than reporting no entry. Distinct - /// from [`Self::NoEntry`]: an unreachable key server or an unreadable keydb is - /// a fixable condition, whereas "this disc is not in the database" is not, and - /// collapsing the two told the front-end the wrong cause. - SourceFailed, /// Pre-decrypted unit keys were found. FoundUnitKeys, /// A VUK was found. diff --git a/src/keysource.rs b/src/keysource.rs index 5854c3b..a7c3c16 100644 --- a/src/keysource.rs +++ b/src/keysource.rs @@ -350,25 +350,15 @@ pub fn resolve_and_apply_traced( outcome: KeyOutcome::NoKey, }); } - // No key from this source either way, but WHY differs and the caller - // renders it: a source that errored is a fixable condition (server - // unreachable, keydb unreadable), while "no entry for this disc" is - // not. Recording both as NoEntry lost that distinction — the same one - // drive_unit_keys / drive_fmts_indexes were refactored to preserve. - Ok(_) => { + // Empty (no key here) or a source failure — both are "no key from + // this source"; move on to the next. + Ok(_) | Err(_) => { trace.keys.push(KeyStep { who, path: vec![KeyNode::NoEntry], outcome: KeyOutcome::NoKey, }); } - Err(_) => { - trace.keys.push(KeyStep { - who, - path: vec![KeyNode::SourceFailed], - outcome: KeyOutcome::NoKey, - }); - } } } (false, trace) diff --git a/src/mux/codec/dts.rs b/src/mux/codec/dts.rs index 627cb12..accfe65 100644 --- a/src/mux/codec/dts.rs +++ b/src/mux/codec/dts.rs @@ -690,13 +690,12 @@ fn dts_core_duration_ns(data: &[u8]) -> u64 { const DTS_PCMBLOCK_SAMPLES: u32 = 32; const DTS_SUBBAND_SAMPLES: u32 = 8; /// Number of LEGAL `AMODE` (channel-arrangement) codes. The 6-bit AMODE field -/// (ETSI TS 102 114 §5.3.1) defines 16 channel arrangements, codes 0-15, of -/// which 10-15 are the 6/7/8-channel layouts; codes 16-63 are -/// reserved/user-defined and undecodable. A frame is dropped only when -/// `audio_mode >= DTS_AMODE_COUNT` (i.e. a truly reserved 16-63 code); dropping a -/// legal 10-15 multichannel core would silence recoverable audio. The per-AMODE -/// channel counts live in `DTS_AMODE_CH` in `mux/mp4/audio.rs`, cross-checked -/// against the speaker masks in `DTS_AMODE_LAYOUT` by an invariant test. +/// (ETSI TS 102 114 §5.3.1) has 16 defined channel arrangements, codes 0-15; +/// only 16-63 are reserved/user-defined and undecodable. ffmpeg's +/// `ff_dca_channels[16] = {1,2,2,2,2,3,3,4,4,5,6,6,6,7,8,8}` confirms all 16 are +/// decodable — codes 10-15 are the 6/7/8-channel layouts. A frame is dropped +/// only when `audio_mode >= DTS_AMODE_COUNT` (i.e. a truly reserved 16-63 code); +/// dropping a legal 10-15 multichannel core would silence recoverable audio. const DTS_AMODE_COUNT: u32 = 16; const DTS_LFE_FLAG_INVALID: u32 = 3;