feat(server): walk the replayed sample instead of freezing it

A still replayed as frames gave every frame the same boxes, so the live path
never saw a track move. /v1/samples/{id}?pan=N now returns a portrait 720x1280
window slid N*PAN_STEP pixels along the sample, reversing at each edge, at the
frame size and JPEG quality the phone sends.

The decoded image is cached by (mtime, size): re-reading a 1500x2000 JPEG per
frame cost more than the encode and made the walk slower than PAN_STEP says.
Measured after the cache: 3.3 ms mean per panned frame, 301 frames/s ceiling.

Two tests, both verified to fail before the change.
This commit is contained in:
kiyo9w 2026-09-29 09:28:07 +09:00
parent 4b00323ae2
commit 4ce41ecb17
3 changed files with 106 additions and 2 deletions

View file

@ -36,3 +36,6 @@ data/external-shelves/*/*.png
data/packshots/research/*/images/
data/packshots/research/*/pages/
data/packshots/research/*/*.jpg
# Rebuildable sweep cache (code/sweep_accept_lines.py --cache).
*.pkl