port: P4 -- the intro video plays inside the boot sequence
The exporter transcodes ADV.wmv and S00A.wmv to Ogg Theora and records the exact ffmpeg command in the manifest, per MISSION §6, so a modder who dislikes the quality re-runs one line rather than reverse-engineering what was done. Quality was MEASURED, not judged: SSIM against the decoded source over a 10 s sample is 0.9863 / 0.9896 / 0.9924 at -q:v 6 / 8 / 10, and at 200 % zoom on the reel's hardest case -- fine serif text and soft gradients over near-black, where Theora breaks first -- q8 is indistinguishable. So MISSION §6's permitted FFmpeg-GDExtension fallback is NOT needed and is NOT being proposed. No new runtime dependency. -ac 2 because the source is 6-channel WMA Pro; that downmix is a decision, so it lives in the recorded command rather than in prose. Encoding is cached on a .cmd sidecar holding the command and the source size -- any change to either re-encodes. export/ is still regenerated wholesale; this is derived state validating derived state, not a hand-edit, and without it every re-export pays ~4 minutes to produce a byte-identical file. The player renders INTO the design SubViewport. Parenting it to the Boot node played the movie to the window instead, and every captured frame came out black -- which is worth more than a capture-bug note: a movie outside the 1280x720 design space is outside the coordinate system every screen is expressed in. (A) skips a movie, because Q9 measured that (title at 57 s vs a 193 s baseline). NOT VERIFIED, and stated as such: audible playback. This container has no audio device and Godot falls back to the dummy driver. The Vorbis stream exists, is 2-channel and decodes; whether Godot emits it is unconfirmed.
This commit is contained in:
@@ -682,3 +682,71 @@ renderer. The three known differences are unchanged: `title` 6 (paint-order tie)
|
||||
carry `rotation_deg` in a future FORMAT v3 because carrying a decoded field the
|
||||
renderer ignores beats dropping it, but it will not draw it until the
|
||||
divergence question is settled.
|
||||
|
||||
---
|
||||
|
||||
## P4 — the intro video, 2026-08-29
|
||||
|
||||
### Theora at 720p is fine here, and no runtime dependency is requested
|
||||
|
||||
MISSION §6 anticipated that Theora might be too poor at 720p and permitted the
|
||||
FFmpeg-GDExtension fallback to be **proposed**. It is not needed, and this was
|
||||
measured rather than judged by eye alone. SSIM against the decoded source over a
|
||||
10 s sample: **0.9863 at `-q:v 6`, 0.9896 at 8, 0.9924 at 10**. At 200 % zoom on
|
||||
the reel's hardest case — fine serif text and soft gradients over near-black,
|
||||
where Theora breaks first — q8 is indistinguishable from the source.
|
||||
|
||||
`-q:v 8`, and **no GDExtension is being proposed or adopted**.
|
||||
|
||||
`-ac 2` because the source is **6-channel** WMA Pro and Godot's Theora path is
|
||||
not a surround one. That downmix is a decision, so it lives in the recorded
|
||||
command where a modder can see and change it rather than in prose.
|
||||
|
||||
### The exact command is in the manifest, per MISSION §6
|
||||
|
||||
`export/manifest.json` gains a `videos` array, each entry carrying the verbatim
|
||||
`ffmpeg` line that produced it. A modder who dislikes the quality re-runs one
|
||||
line instead of reverse-engineering what was done to their video — which is the
|
||||
whole reason this project converts the disc rather than reading it at runtime.
|
||||
|
||||
### A cache, and why that is not a hand-edit
|
||||
|
||||
`export/` is regenerated wholesale, but re-encoding 232 s of video on every run
|
||||
costs ~4 minutes to produce a byte-identical file, and an exporter nobody re-runs
|
||||
is worse than a cache. So each movie gets a `.cmd` sidecar recording the command
|
||||
and the source size, and the encode is skipped only when both match exactly. Any
|
||||
change to either re-encodes. This is derived state validating derived state, not
|
||||
a hand-edit.
|
||||
|
||||
### The player renders into the design viewport, not beside it
|
||||
|
||||
First attempt parented the `VideoStreamPlayer` to the Boot node. It played, and
|
||||
every captured frame was **black**: the capture reads the SubViewport, and the
|
||||
player was rendering to the window. Worth stating as more than a capture bug —
|
||||
everything this port draws composes in the export's own 1280×720 design space,
|
||||
and a movie outside that space is outside the coordinate system every screen is
|
||||
expressed in.
|
||||
|
||||
### Ⓐ skips, because Q9 measured it
|
||||
|
||||
The only input the port handles so far. HANDOFF Q9: one Ⓐ press skips a movie,
|
||||
measured — the title was reached at 57 s against a 193 s baseline. Menu
|
||||
navigation is still P5.
|
||||
|
||||
## P4 gate
|
||||
|
||||
`godot --path port -- --boot --film=…` runs
|
||||
`publisher_logo → developer_logos → ADV.ogv → title`, unattended. The filmstrip
|
||||
shows the SQUARE ENIX ident, then the reel's live-action-styled CG, then the
|
||||
title. The movie's place in the boot is **measured, not decoded** — Q9 decodes
|
||||
`ADVERTISE_MOVIE → ADV.wmv` from the movie manifest, but *where it sits in the
|
||||
boot order* is what the RE agent watched, and `authored/flow.json` says so.
|
||||
|
||||
### What I cannot verify from here
|
||||
|
||||
**Audible playback.** This container has no audio device — Godot falls back to
|
||||
the dummy driver. What is verified is that the Vorbis stream exists in the
|
||||
transcode, is 2-channel, and decodes. Whether Godot emits it audibly is
|
||||
unconfirmed and is stated as unconfirmed rather than assumed from the stream's
|
||||
presence. It is a cheap check for anyone with a sound device and an impossible
|
||||
one here.
|
||||
|
||||
Reference in New Issue
Block a user