From f9510405c30f43db5eaa022bf15cf3837072f4fe Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sat, 19 Sep 2026 12:54:15 +0200 Subject: [PATCH] FR-MRG-3: the composite is a RAW at the source's native scale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Camera-linear u16 samples on the first source's black-subtracted scale with its white level, never rescaled to fill 16 bits, with its body, matrices, illuminants and as-shot neutral carried — so the panorama is developed afterwards as one photograph from the sensor's own numbers. The only thing a warp cannot preserve is the colour filter array, and the clause says so. --- docs/panorama.md | 20 ++++++++++++++++++-- docs/requirements.md | 21 +++++++++++++-------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/docs/panorama.md b/docs/panorama.md index 852a402..f96217f 100644 --- a/docs/panorama.md +++ b/docs/panorama.md @@ -220,8 +220,24 @@ the way S9 calibrates R1. ## 8. The output file -FR-MRG-3. Scene-linear, ≥ 16 bits, wide gamut, the first source's capture -metadata, named from the first source with a `-pano` suffix, beside it. +FR-MRG-3. A linear DNG at the source's native scale: `u16` samples on the +first source's black-subtracted scale, `WhiteLevel` = its white minus its +black (13 023 for the 6D set: 15 070 − 2 047), `BlackLevel` = 0. Not rescaled +to 65 535 — the sensor had 14 bits and the file says so, and a value the +sensor could not have produced is not invented by a multiply. The first +source's `Make`, `Model`, `UniqueCameraModel`, `ColorMatrix1/2`, +`CalibrationIlluminant1/2`, `AsShotNeutral` and EXIF are carried, so the +composite develops through the same profile as its sources. Named from the +first source with a `-pano` suffix, beside it. + +Three samples per pixel rather than a CFA: the warp resamples, and there is no +sensor grid to mosaic back onto. Nothing else about being a RAW is lost — +no white balance, no curve, no matrix, no clip has been applied — and the +photographer develops the panorama afterwards as one photograph. + +The sources are portrait frames in the 6D set: `Orientation` is applied +before alignment (learned features are not rotation-invariant) and the +composite is written upright with `Orientation = 1`. Two containers were candidates and S15.1 decided, on 2026-09-19: diff --git a/docs/requirements.md b/docs/requirements.md index 4624c2b..d4eceb7 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -1712,15 +1712,20 @@ White balance sits below it because the sensor saw the same light in every frame camera RGB agrees across the overlaps whether or not the camera's auto white balance drifted, and the balanced values would not. -**FR-MRG-3 — The output file.** *(general to any merge)* Scene-linear, at least 16 bits per -channel, in a wide gamut with the colour transform resolved or the profile carried, with capture -metadata from the first source. Named from the first source with a stated suffix and placed -beside it. Where the sources' folder is not writable — a remote-only tier, a read-only mount — -it goes where an export goes (FR-EXP-6) and the interface says so before the merge starts. +**FR-MRG-3 — The output file.** *(general to any merge)* A RAW, in every sense that survives a +warp: camera-linear samples at the **source's native scale** — integers on the first source's +black-subtracted scale with its white level, never rescaled to fill 16 bits — with the first +source's body, colour matrices, illuminants and as-shot neutral carried, and its capture +metadata. What a merge cannot preserve is the colour filter array: a warped image has no sensor +grid to re-mosaic onto, so the composite is three samples per pixel. Named from the first source +with a stated suffix and placed beside it. Where the sources' folder is not writable — a +remote-only tier, a read-only mount — it goes where an export goes (FR-EXP-6) and the interface +says so before the merge starts. -The container is a spike result (S15), not a requirement: a linear DNG if rawler reads back what -the application writes, else a float TIFF with a decode path of its own. The choice is invisible -to everything above the decoder. +The container is a linear DNG (S15.1, decided 2026-09-19): rawler reads back what the application +writes, and the composite re-enters as `Format::Dng` through the decoder every camera DNG uses. +The point of the whole clause is that the panorama is *developed afterwards* — white balance, +profile, exposure, everything in §3.3 — as one photograph, from the sensor's own numbers. **FR-MRG-4 — Projection and framing.** Cylindrical, spherical or perspective, chosen from the field of view and overridable; the horizon levelled from the estimated rotations, overridable by a