LR-IMP-FORMATS: ARW6 corpus hashes live in RAW_SAMPLES; drop docs/arw6-corpus.sha256

The RawDB entries in xtask carry their SHA-256 as the third field, which
`cargo xtask corpus --download` checks; the corpus test keeps only the
sensor sum checks.

Co-Authored-By: Claude <[email protected]>
This commit is contained in:
dev-null-undefinedandClaude committed 2026-10-10 21:08:17 +02:00
1 parent fa7f1e8d6c
commit 1be303ca00
3 files changed
+6 -26

No files matched your search

+5 -11
View File
@@ -861,19 +861,13 @@ fn corpus_fujifilm_compressed_samples() {
eprintln!("verified {seen} Fujifilm compressed sensor arrays");
}
/// Checks each available `(name, width, height, sum, weighted)` case against the pinned SHA-256 in `checksums`
/// and the decoder's sensor array; absent corpus files are skipped. Returns how many were verified.
fn verify_sensor_arrays(checksums: &str, cases: &[(&str, usize, usize, u64, u64)]) -> usize {
use sha2::{Digest, Sha256};
/// Checks each available `(name, width, height, sum, weighted)` case against the decoder's sensor array (the file's
/// identity is checked by `cargo xtask corpus --download`); absent corpus files are skipped. Returns how many were verified.
fn verify_sensor_arrays(cases: &[(&str, usize, usize, u64, u64)]) -> usize {
let dir = corpus_root().join("raw");
let mut seen = 0;
for &(name, width, height, sum, weighted) in cases {
let path = format!("corpus/raw/{name}");
let checksum = checksums.lines().filter_map(|s| s.split_once(" ")).find(|(_, p)| *p == path).unwrap().0;
assert_eq!(checksum.len(), 64, "{name}: missing published SHA-256");
let Ok(bytes) = std::fs::read(dir.join(name)) else { continue };
let actual_sha: String = Sha256::digest(&bytes).iter().map(|b| format!("{b:02x}")).collect();
assert_eq!(actual_sha, checksum, "{name}: corpus file differs from its pinned identity");
let img = decode(&bytes).unwrap_or_else(|e| panic!("{name}: {e}"));
assert_eq!((img.width, img.height), (width, height), "{name}");
let lightcraft_raw::RawData::U16(data) = img.data else { panic!("{name}: float data") };
@@ -900,7 +894,7 @@ fn corpus_sony_arw6_samples() {
("arw6-sony-ilce7rm6-ff-port-hq.arw", 10016, 6672, 242772794178, 8043470668590476975),
("arw6-sony-ilce7rm6-ff-port-c.arw", 10016, 6672, 241868995482, 8014659803009871380),
];
let seen = verify_sensor_arrays(include_str!("../../../docs/arw6-corpus.sha256"), cases);
let seen = verify_sensor_arrays(cases);
eprintln!("verified {seen} Sony ARW6 sensor arrays");
}
@@ -914,7 +908,7 @@ fn corpus_sony_ilce7rm6_lossless_samples() {
("arw-sony-ilce7rm6-ff-land-lossless.arw", 10240, 7168, 128728791716, 4922490451480041632),
("arw-sony-ilce7rm6-ff-port-lossless.arw", 10240, 7168, 120718314835, 4098302368966213583),
];
let seen = verify_sensor_arrays(include_str!("../../../docs/arw6-corpus.sha256"), cases);
let seen = verify_sensor_arrays(cases);
eprintln!("verified {seen} Sony ILCE-7RM6 lossless sensor arrays");
}
+1 -1
View File
@@ -72,7 +72,7 @@ LibRaw assumes the full-frame grid (s = 0) for every tile. On the APS-C crop tha
| `arw-sony-ilce7rm6-ff-land-lossless.arw` | `raw_modes/ILCE-7RM6_FF_land_RAW.ARW` | 100 851 712 | `5cb3c870bc961cf6b079d56c860d0cdf11acd1afd04e5fb8dbe041bcfd2d6201` |
| `arw-sony-ilce7rm6-ff-port-lossless.arw` | `raw_modes/ILCE-7RM6_FF_port_RAW.ARW` | 100 884 480 | `b1a4026aa6adbaa27973b8b3426d8b4aa0c1cae1845cf5102359327d3b069691` |
These 12 files are CC0 1.0 per the RawDB record of the set (uploaded by abbradar; <https://rawdb.dnglab.org/sets/Sony/ILCE-7RM6>); the server answers 303 to a signed object URL, so fetch with `curl -L` from `https://rawdb.dnglab.org/api/download/Sony/ILCE-7RM6/<source path>`. They live in the gitignored corpus; `cargo xtask corpus --download` fetches them and [arw6-corpus.sha256](arw6-corpus.sha256) pins their identities. `cargo test -p lightcraft-raw corpus_sony -- --nocapture` verifies each available file's checksum, then the decoder's sensor sum and position-weighted sum. The 8 ARW6 files are checked against the Phase 0 reference sums; the 4 lossless siblings go through the existing LJ92 path and their sums are regression values from LightCraft's own decoder. The test skips absent files.
These 12 files are CC0 1.0 per the RawDB record of the set (uploaded by abbradar; <https://rawdb.dnglab.org/sets/Sony/ILCE-7RM6>); the server answers 303 to a signed object URL, so fetch with `curl -L` from `https://rawdb.dnglab.org/api/download/Sony/ILCE-7RM6/<source path>`. They live in the gitignored corpus; `cargo xtask corpus --download` fetches them and checks each against its SHA-256, pinned in `RAW_SAMPLES` (`xtask/src/main.rs`). `cargo test -p lightcraft-raw corpus_sony -- --nocapture` verifies the decoder's sensor sum and position-weighted sum of each available file. The 8 ARW6 files are checked against the Phase 0 reference sums; the 4 lossless siblings go through the existing LJ92 path and their sums are regression values from LightCraft's own decoder. The test skips absent files.
Nine further full-frame HQ photos from the maintainer's A7R VI were compared with the oracle locally; they are private and never committed or published. All 9 private FF photos (ISO 100-12800, incl. two near-black night shots) decode bit-exact over the full frame (0 mismatching pixels of 66.8 MP each).
-14
View File
@@ -1,14 +0,0 @@
# Sony ILCE-7RM6 ARW files (ARW6 Compressed / HQ and lossless siblings); CC0 1.0, RawDB (rawdb.dnglab.org), uploaded by abbradar.
# SHA-256 values verified 2026-10-09; see docs/arw6-compression.md.
b60a7e752d2a8102ccbe6eebcfdbf533c6b0f2545739090873e9e8eb32cc0637 corpus/raw/arw6-sony-ilce7rm6-apsc-land-hq.arw
1c803304e63ec508b2b5f9d59d4a7e30ed279315b35fa4c5d75f959bed62198b corpus/raw/arw6-sony-ilce7rm6-apsc-land-c.arw
0b6d782571e86868670f613de9fa1f1364623b24fbfd21b704b2c516d7a1c1cb corpus/raw/arw6-sony-ilce7rm6-apsc-port-hq.arw
c41674a485ffcf6d873e20e545ae62936192d94e95be3d53548e93bc543ecfd4 corpus/raw/arw6-sony-ilce7rm6-apsc-port-c.arw
559fa26501d7813e56afecde2aea3d9965a99228162b194752d986193abb172c corpus/raw/arw6-sony-ilce7rm6-ff-land-hq.arw
d900d6cbe838be864269ad54de4a33fcac7eb3a3d4f91009739f770b8f85a23b corpus/raw/arw6-sony-ilce7rm6-ff-land-c.arw
81c709633cb8f6340e612c3f53bb6ec6b0cccfe5b713c67efb1e977ece9e266d corpus/raw/arw6-sony-ilce7rm6-ff-port-hq.arw
f4448485629c3f82ff1955fd046404350e9a1f09b346038574b89c074d7c50fd corpus/raw/arw6-sony-ilce7rm6-ff-port-c.arw
7aaf0b3941509d7364a6f03844783155ebc912d246d1c456e5cdb4693ec09fbc corpus/raw/arw-sony-ilce7rm6-apsc-land-lossless.arw
0f011933ee96525a39710daa50b59d39702b4ec5934fa0206742e2128c55f366 corpus/raw/arw-sony-ilce7rm6-apsc-port-lossless.arw
5cb3c870bc961cf6b079d56c860d0cdf11acd1afd04e5fb8dbe041bcfd2d6201 corpus/raw/arw-sony-ilce7rm6-ff-land-lossless.arw
b1a4026aa6adbaa27973b8b3426d8b4aa0c1cae1845cf5102359327d3b069691 corpus/raw/arw-sony-ilce7rm6-ff-port-lossless.arw