- new photos on the server appear automatically: the grid polls the newest page every ~30 s while settled; dedup_new_assets drops already-known ids (and also guards page fetches against server-side pagination drift) - rebuild_keep_view pins the scroll and selection to the same photo across every relayout (page fetch, poll, sync), so loads no longer move the view - R/L month jump anchors the landed month's header to the top of the screen, and R fetches ahead until the next month is actually loaded - portrait videos play upright: the asset's exif orientation is kept (g_asset_rot) and the player rotates decoded frames (draw_video_frame) - "loading..." texts replaced by a spinning throbber: centered when an item has no preview yet, a small corner one while the full-res loads over the thumb (never both) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.8 KiB
3.8 KiB
vitaImmich — Goals
Task list for the current round of work. Checked items are done.
1. Make asset/local storage scalable (remove 1000 / 500 caps)
- Replace fixed
MAX_ASSETS(1000) server-asset arrays with dynamically grown (realloc, doubling) arrays. - Replace fixed
MAX_LOCAL(500) local-media arrays with dynamically grown arrays (grown during the startup scan, fixed afterward). - Replace the fixed
g_disp[DISP_MAX]merged-timeline array with a grown array. - Decouple the thumbnail worker thread from the growable arrays (pass the request id/path through dedicated buffers) so a realloc on the main thread can never dangle a pointer the worker is reading.
2. Zoom and pan in the image viewer
- Enable analog-stick sampling.
- R trigger zoom in / L trigger zoom out in the detail view.
- Left stick pans when zoomed in; pan is clamped to the image bounds.
- Zoom/pan reset when moving to another photo; browsing left/right is disabled while zoomed.
3. Group the gallery by month and year
- Compute a grid layout with section headers inserted whenever the month/year of the (date-sorted) timeline changes.
- Draw "Month YYYY" headers; render items under the right header.
- Scroll, selection-follow, visible-range and thumb eviction all use the computed per-item positions.
4. Show more relevant info in the SELECT (sync) menu
- Photo vs video breakdown for server + local.
- Total local media size, backed-up size and percentage.
- Details for the currently selected item (name, date, size, state).
5. Fix the fast-scroll crash (pre-existing, reproduced in Vita3K)
- Root cause: freeing a thumbnail texture unmaps its memblock while the
GPU side (Vita3K's texture cache re-reads guest memory of cached
textures) may still touch it — random-looking crashes deep in OpenSSL /
libjpeg / strlen whenever eviction ran during a scroll. Fixed by
recycling thumbnails through a texture pool (
tex_acquire/tex_release) instead of ever freeing them mid-run. - Pace the main loop with
sceDisplayWaitVblankStart()— without it the loop free-runs in the emulator, racing the held d-pad into a page-fetch storm (30+ requests/second against the server). - Suspend thumbnail loads/eviction and page fetches while the selection is
still moving (
scrolling_fastsettle counter). - Serialize all
curl_easy_performcalls behind one mutex — vitasdk's OpenSSL 1.0.2 is built without thread support, so concurrent TLS from the main/worker/sync threads is unsafe (also installed OpenSSL locking callbacks for defense in depth). - Pre-grow the newlib heap (96 MB, trim disabled) at boot so heap memblock mapping never happens while multiple threads run.
- Verified: repeated 10–12 s held-scroll cycles to photo 1780+ across multiple pages, zero GPU faults / zero crashes (previous builds died within ~10 s).
6. Open bugs / polish
- R (month jump) lands on the next month, but when more pages load the view shifts away from the landing spot — fixed: rebuild_keep_view pins the scroll/selection to the same photo across every rebuild (page fetch, poll, sync), and R now fetches ahead until the next month is actually loaded before jumping.
- R scrolls the jumped-to month to the top of the screen, header band included.
- Portrait videos play sideways — fixed: the asset's exif orientation is kept (g_asset_rot) and the player rotates decoded frames upright (draw_video_frame).
- Replaced the "loading..." texts with a spinning throbber: centered when there is no preview at all, a small corner one while the full-res loads over the thumb.