diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index 4c5c7525..8faa1d64 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -880,3 +880,19 @@ agent's loop prompt, i.e. nowhere durable. See [`README.md`](README.md) for the stuck before it was timed. If the change under test is not in the mesh path, `build-reborn t -p ` scopes around it — note that `build-reborn test` itself passes `--workspace` and will ignore a `-p`. + +* **Never measure a file another process is still writing.** `ffprobe` on a + half-written transcode reported 33 s against a 137 s source — the shape of + catastrophic truncation, with no error and no warning, and it nearly became a + filed bug. The tell was the mtime and a climbing packet count, not anything in + the tool's output. Before comparing an artifact you did not produce, check that + whoever produces it has finished; across two agents sharing a repo this is a + race, not an edge case. + +* **A difference-signal RMS means nothing until the two are aligned.** Comparing a + transcode against its source gave source RMS −25.3 dB and difference RMS + −34.2 dB — only ~9 dB down, which looks like a failure. It is inconclusive: a + one-sample offset makes the difference nearly as loud as the source. Any such + test needs cross-correlation to align first and an agreed downmix, and only then + is a pass mark like ">40 dB down" meaningful. Reporting the 9 dB as a result + would have been a confident wrong number. diff --git a/docs/re/data/movie-audio-layouts.csv b/docs/re/data/movie-audio-layouts.csv new file mode 100644 index 00000000..ae51ffc1 --- /dev/null +++ b/docs/re/data/movie-audio-layouts.csv @@ -0,0 +1,97 @@ +ADV.wmv,wmapro,48000,6,5.1 +RT01A.wmv,wmav2,48000,2,unknown +RT01B.wmv,wmav2,48000,2,unknown +RT01C_1.wmv,wmav2,48000,2,unknown +RT01C_2.wmv,wmav2,48000,2,unknown +RT02A.wmv,wmav2,48000,2,unknown +RT02B.wmv,wmav2,48000,2,unknown +RT02C.wmv,wmav2,48000,2,unknown +RT02D_1.wmv,wmav2,48000,2,unknown +RT02D_2.wmv,wmav2,48000,2,unknown +RT03A.wmv,wmav2,48000,2,unknown +RT03B.wmv,wmav2,48000,2,unknown +RT03C.wmv,wmav2,48000,2,unknown +RT03D.wmv,wmav2,48000,2,unknown +RT04A.wmv,wmav2,48000,2,unknown +RT04B.wmv,wmav2,48000,2,unknown +RT05A.wmv,wmav2,48000,2,unknown +RT05B.wmv,wmav2,48000,2,unknown +RT05C.wmv,wmav2,48000,2,unknown +RT06A.wmv,wmav2,48000,2,unknown +RT06B.wmv,wmav2,48000,2,unknown +RT06C.wmv,wmav2,48000,2,unknown +RT06D.wmv,wmav2,48000,2,unknown +RT07A.wmv,wmav2,48000,2,unknown +RT07B.wmv,wmav2,48000,2,unknown +RT07C.wmv,wmav2,48000,2,unknown +RT08A.wmv,wmav2,48000,2,unknown +RT08B.wmv,wmav2,48000,2,unknown +RT08C.wmv,wmav2,48000,2,unknown +RT09A.wmv,wmav2,48000,2,unknown +RT09B.wmv,wmav2,48000,2,unknown +RT09C.wmv,wmav2,48000,2,unknown +RT09D.wmv,wmav2,48000,2,unknown +RT10A.wmv,wmav2,48000,2,unknown +RT10B.wmv,wmav2,48000,2,unknown +RT11A.wmv,wmav2,48000,2,unknown +RT11B.wmv,wmav2,48000,2,unknown +RT11C.wmv,wmav2,48000,2,unknown +RT12A.wmv,wmav2,48000,2,unknown +RT12B_1.wmv,wmav2,48000,2,unknown +RT12B_2.wmv,wmav2,48000,2,unknown +RT13A.wmv,wmav2,48000,2,unknown +RT13B_1.wmv,wmav2,48000,2,unknown +RT13B_2.wmv,wmav2,48000,2,unknown +RT14A.wmv,wmav2,48000,2,unknown +RT14B.wmv,wmav2,48000,2,unknown +RT14C.wmv,wmav2,48000,2,unknown +RT15A.wmv,wmav2,48000,2,unknown +RT15B.wmv,wmav2,48000,2,unknown +RT15C.wmv,wmav2,48000,2,unknown +RT16C.wmv,wmav2,48000,2,unknown +S00A.wmv,wmapro,48000,6,5.1 +S01A.wmv,wmapro,48000,6,5.1 +S02A.wmv,wmapro,48000,6,5.1 +S02B.wmv,wmapro,48000,6,5.1 +S02C.wmv,wmapro,48000,6,5.1 +S03A.wmv,wmapro,48000,6,5.1 +S04A.wmv,wmapro,48000,6,5.1 +S04B.wmv,wmapro,48000,6,5.1 +S05A.wmv,wmapro,48000,6,5.1 +S06A.wmv,wmapro,48000,6,5.1 +S06B.wmv,wmapro,48000,6,5.1 +S07A.wmv,wmapro,48000,6,5.1 +S07B.wmv,wmapro,48000,6,5.1 +S09B.wmv,wmapro,48000,6,5.1 +S10B.wmv,wmapro,48000,6,5.1 +S11A.wmv,wmapro,48000,6,5.1 +S11C.wmv,wmapro,48000,6,5.1 +S12A.wmv,wmapro,48000,6,5.1 +S12B.wmv,wmapro,48000,6,5.1 +S12C.wmv,wmapro,48000,6,5.1 +S13A.wmv,wmapro,48000,6,5.1 +S13B.wmv,wmapro,48000,6,5.1 +S14A.wmv,wmapro,48000,6,5.1 +S15A.wmv,wmapro,48000,6,5.1 +S15B.wmv,wmapro,48000,6,5.1 +S15C.wmv,wmapro,48000,6,5.1 +S16A.wmv,wmapro,48000,6,5.1 +hokyu_DS_s02A.wmv,wmav2,48000,2,unknown +hokyu_DS_s07A.wmv,wmav2,48000,2,unknown +hokyu_DS_s07H.wmv,wmav2,48000,2,unknown +hokyu_DS_s08A.wmv,wmav2,48000,2,unknown +hokyu_DS_s13A.wmv,wmav2,48000,2,unknown +hokyu_DS_s14H.wmv,wmav2,48000,2,unknown +hokyu_LS_s02A.wmv,wmav2,48000,2,unknown +hokyu_LS_s02H.wmv,wmav2,48000,2,unknown +hokyu_LS_s03A.wmv,wmav2,48000,2,unknown +hokyu_LS_s03H.wmv,wmav2,48000,2,unknown +hokyu_LS_s06A.wmv,wmav2,48000,2,unknown +hokyu_LS_s06H.wmv,wmav2,48000,2,unknown +hokyu_LS_s09A.wmv,wmav2,48000,2,unknown +hokyu_LS_s09H.wmv,wmav2,48000,2,unknown +hokyu_LS_s11A.wmv,wmav2,48000,2,unknown +hokyu_LS_s14A.wmv,wmav2,48000,2,unknown +hokyu_LS_s15A.wmv,wmav2,48000,2,unknown +hokyu_LS_s24A.wmv,wmav2,48000,2,unknown +hokyu_LS_s27A.wmv,wmav2,48000,2,unknown diff --git a/docs/re/structures/movie-audio-channels.md b/docs/re/structures/movie-audio-channels.md new file mode 100644 index 00000000..b7ec849b --- /dev/null +++ b/docs/re/structures/movie-audio-channels.md @@ -0,0 +1,47 @@ +# ✅ The disc ships movies in **two** audio profiles — and one of them is 5.1 + +**Status:** ✅ `DECODED`, disc-wide (97 of 97 movies probed). Found while checking +a transcode, not while looking for it. + +## The split + +``` +$ ffprobe -select_streams a -show_entries stream=codec_name,sample_rate,channels,channel_layout +``` + +| profile | count | codec | rate | channels | which | +|---|---|---|---|---|---| +| **surround** | **28** | `wmapro` | 48 kHz | **6 (5.1)** | `ADV.wmv` + every `S*.wmv` story cutscene | +| stereo | 69 | `wmav2` | 48 kHz | 2 | every `RT*.wmv` and `hokyu_*.wmv` | + +Full list in [`data/movie-audio-layouts.csv`](../data/movie-audio-layouts.csv). + +The split is not arbitrary: the **cinematics** are 5.1 and the **in-mission radio +chatter** is stereo. `ADV.wmv` (137.714 s) and `S00A.wmv` — the boot/attract intro +and the new-game intro, i.e. **both movies the menu milestone needs** — are in the +surround group. + +## ⚠️ Why this matters to anything that transcodes + +A single `ffmpeg` command over `dat/movie/` produces **two different kinds of +result** and records neither: + +* the 69 stereo files pass through channel-wise unchanged; +* the 28 surround files are **downmixed 5.1 → stereo by ffmpeg's default matrix**, + folding centre-channel dialogue into L/R at a weighting nobody chose. + +That default is a *content* decision — it sets how loud the dialogue is against +the music — and it is **not stable across ffmpeg versions**. A pipeline that wants +a reproducible result has to state the downmix explicitly rather than inherit it, +and record it beside the command. + +🟡 Whether the game itself plays these in surround, and with what downmix when the +console is set to stereo, is **not established here**. This page is about what is +on the disc. + +## How it was found, and the trap next to it + +Checking a transcode against its source, `ffprobe` reported the output as 33 s +against the source's 137 s — which reads as catastrophic truncation and is not: +the file was **being written at that moment**. Measuring a live write produces a +confident wrong answer with no error. See [`../METHOD.md`](../METHOD.md).