Put the frame in a container with no decoder, and find the palette is not free
ROADMAP K2. DLXP1: a 49,664 B record that is 97 sectors exactly, no index and no length word, because a packed record's length is geometry rather than content. 582.0 KB/s, which is what FINDINGS 61.9 predicted to the tenth, and it encodes in 3.3 s because there is no k-means in it. px68k's own x68k/gvram.c renders the container's bytes index-exact with the harness computing no interleave -- the only test that can catch an encoder whose byte order is wrong, since a container round-trips against its own inverse either way. Both negative controls fail as they must. The picture is re-derived against this project's builder rather than PIL's (34.05 dB against 61.9's 34.08) and the GGGGGRRRRRBBBBBI word is charged for the first time in this tree: 0.53 dB, on every row, so it moves no comparison. What the control found is the finding. A packed container on a SCENE palette lands exactly on the codec's ceiling, so the whole +2.31 dB is the per-frame palette and nothing else -- and 231 of 256 entries change every frame, which makes a mismatched paint 12.8 dB worse than the correct pairing, on screen for roughly half of every frame slot if buffer mode does not blank. So B2 now decides which packed CONTAINER ships, not only which player. The fallback is already a flag: --scene-palette --no-palette is 30.79 dB, zero churn, 576.0 KB/s and still +2.07 dB on the shipping codec. 62.5 is priced and is a wash: palette first 20.32 dB, palette last 20.33. Claude-Session: https://claude.ai/code/session_01194oWYW8DQXK1SZ2DnChW6
This commit is contained in:
@@ -662,4 +662,45 @@ python3 tools/analysis/29_packed_player.py "$DLX" > tmp/packed_player.log 2>&1 \
|
||||
grep -aE "SKIP block PAIRS|free / DMAC->GVRAM / PACKED|^ CODEC, gate" \
|
||||
tmp/packed_player.log
|
||||
|
||||
echo "--- session 31: the PACKED container, and the picture re-derived (FINDINGS 63) ---"
|
||||
# ROADMAP K2. The container is REBUILT every run rather than reused when
|
||||
# present, the way the codec's gate container is: a packed encode is 3 seconds
|
||||
# because there is no k-means in it, so there is no reason to let a stale file
|
||||
# stand between the encoder and the gate.
|
||||
python3 tools/encoder/pack.py tmp/fr_singe tmp/packed_singe.dlxp \
|
||||
--nframes "$NF" > tmp/pack_encode.log 2>&1 \
|
||||
|| { cat tmp/pack_encode.log; exit 1; }
|
||||
grep -aE "^ (record|wire)" tmp/pack_encode.log
|
||||
# WHAT IS GATED. Four format invariants that a DMA channel cannot check for
|
||||
# itself -- it copies bytes and has no opinion about them (FINDINGS 62) -- and
|
||||
# the three quality claims FINDINGS 61.9 rests the whole packed branch on:
|
||||
# round-trip, sector geometry, index 0 unused, palette words agree
|
||||
# packed > the shipping codec / > the codec's CEILING / > a SCENE-palette control
|
||||
# A tree where any of the last three flipped has a different answer to ROADMAP K
|
||||
# and should say so out loud rather than let the branch keep building.
|
||||
python3 tools/analysis/30_packed_container.py tmp/packed_singe.dlxp \
|
||||
--codec "$DLX" > tmp/packed_container.log 2>&1 \
|
||||
|| { cat tmp/packed_container.log; exit 1; }
|
||||
sed -n '/^PSNR/,$p' tmp/packed_container.log | grep -aE "RGB888|CODEC|CEILING|CONTROL|PER-FRAME|packed vs|worth|costs"
|
||||
# And the container's OWN BYTES through px68k's real gvram.c, with the harness
|
||||
# computing no interleave -- the only test that can catch an encoder whose byte
|
||||
# order is wrong, because the container round-trips against its own inverse
|
||||
# either way. Same skip-not-fail rule as the C68K stage: px68k is not in here.
|
||||
if [ -f "$PX68K/x68k/gvram.c" ]; then
|
||||
make -s -C tools/bench/gvpack PX68K="$PX68K"
|
||||
# Frame 0 carries the two negative controls; the other two are there because
|
||||
# one frame rendering does not say the container's 120th record is placed
|
||||
# right, and record placement is arithmetic this format has no index to check.
|
||||
python3 tools/bench/gvpack/verify_dlxp.py tmp/packed_singe.dlxp 0 --controls || exit 1
|
||||
for f in $((NF / 2)) $((NF - 1)); do
|
||||
# NOT piped into head: `set -e` reads a pipeline's status from its LAST
|
||||
# command, so a piped verifier that failed would be reported by head's zero.
|
||||
python3 tools/bench/gvpack/verify_dlxp.py tmp/packed_singe.dlxp "$f" \
|
||||
> "tmp/dlxp_f$f.log" 2>&1 || { cat "tmp/dlxp_f$f.log"; exit 1; }
|
||||
head -1 "tmp/dlxp_f$f.log"
|
||||
done
|
||||
else
|
||||
echo " SKIPPED: no px68k at $PX68K -- the container's bytes were not rendered"
|
||||
fi
|
||||
|
||||
echo "ALL GREEN"
|
||||
|
||||
Reference in New Issue
Block a user