Commit Graph
15 Commits
Author SHA1 Message Date
quoije 4d66cc73db Fix menu renderer to use the 854x480 framebuffer space
RCO menu objects are authored in the PSP movie player's 854x480 FWVGA
framebuffer, not the 480x272 LCD. The renderer was laying everything out in
the wrong coordinate space, which is why no menu items were visible.
2026-09-16 00:17:58 -04:00
quoije 9a1e048264 Decode on a single background thread; add intro skip key
PlaybackEngine now runs one daemon decode thread that routes packets into
bounded queues, while the video/audio presenter threads only consume and
pace. This removes the demuxer contention that caused stutter, bursts, and
the speed-up/catch-up behavior.

Press S (or media next) during playback to skip the current playlist and
advance the menu's intro chain quickly.
2026-09-16 00:04:25 -04:00
quoije 3ded804b94 Make PlaybackEngine thread-safe to fix FFmpeg segfault
Video and audio threads both pull from the same engine, racing on the
MPS demuxer file pointer and feeding corrupted H.264 data to FFmpeg (which
segfaults). Synchronize the pull methods and wait for the audio thread
before closing the engine.
2026-09-15 23:47:41 -04:00
quoije 0a16d3d3ec Fix RCO menu coordinates and smooth video pacing
RCO object positions are screen-center with +Y up, but the renderer drew
them as top-left, pushing menu items off-screen. Convert to top-left in
the 480x272 design space before drawing.

Also use precise parkNanos pacing and reuse per-frame ARGB/WritableImage
buffers to remove the 1.4MB allocations per video frame.
2026-09-15 23:45:30 -04:00
quoije 7d601dd1fd Add pause/resume (Space, P, and media Play/Pause keys)
Pausing stops the audio line and blocks both playback threads; the A/V
clock is re-anchored on resume so video and audio continue exactly where
they left off without fast-forwarding.
2026-09-15 23:38:20 -04:00
quoije d38d7f59aa Render focused button's focus image in the menu
Buttons with a focus image now swap to it while selected, giving visible
feedback when navigating with the arrow keys.
2026-09-15 23:35:40 -04:00
quoije 663c70dd7b Double the default window size to 960x544
The PSP logical screen stays 480x272 for the RCO menu and VSMX scripts,
but the initial window now opens at 2x so it is visible on high-DPI
screens. Users can still resize freely.
2026-09-15 23:33:33 -04:00
quoije 7513ae3a43 Make window resizable and preserve aspect ratio on resize
Video now scales to fill the window while keeping its 16:9 display ratio
in both windowed and fullscreen modes. The RCO menu is scaled to fill the
window at its native 480x272 aspect ratio.
2026-09-15 23:32:33 -04:00
quoije e035d0c118 Play ATRAC3+ audio through the system audio line
The audio thread writes decoded PCM to a SourceDataLine and acts as the
master A/V clock; video frames are now paced against that shared clock so
audio and video stay in sync.
2026-09-15 23:29:33 -04:00
quoije 67b3c4a8cd Add fullscreen toggle (F11) with aspect-preserving 16:9 video scaling
Windowed mode still stretches the anamorphic frame to fill 480x272 like
the PSP. In fullscreen the video scales to fit the screen while keeping
its 16:9 display ratio, letterboxing as needed.
2026-09-15 23:26:22 -04:00
quoije d749d6753e Use PSP native 480x272 dimensions
Window, menu canvas and video surface are now 480x272 (the PSP screen
size). Video is stretched to fill the screen like the PSP player, rather
than aspect-preserving letterboxing.
2026-09-15 23:23:51 -04:00
quoije d4d3378b31 Fix white screen, center video, and advance after playback
- Rejoin whitespace-split program args so ISO paths with spaces work
  (Gradle --args splits on spaces, which caused a silent load failure
  and a blank white window).
- Black scene background and black video canvas fill; scale video to
  fit and center it instead of drawing top-left at native size.
- Playback completion now invokes MoviePlayer.onPlayListEnd so the menu
  advances past the anti-piracy warning instead of freezing.
2026-09-15 23:21:46 -04:00
quoije a4f0d5992b Add JavaFX menu renderer and player window
- RcoRenderer implements Display: draws the live RCO object tree onto a
  Canvas, decodes PNG textures, handles focus and resource changes
  (thread-safe via Platform.runLater).
- PageObject now implements root/children semantics and open/close/display
  so opening a page adds its objects to the renderer.
- Object getImage() returns the ImageObject so the UI can decode PNGs.
- PlayerApp wires menu + video: loads the RCO, runs the VSMX script,
  executes onAutoPlay, plays video via PlaybackEngine with YUV->ARGB
  blitting and PTS pacing, and routes arrow/Enter keys to the controller.
- Runs end-to-end on Batman Begins (window, menu load, playback).
2026-09-15 23:14:18 -04:00
quoije b1896cd71b Fix playListNumber to stream-name mapping; add JavaFX ui module
- Playlist.streamForPlayListNumber maps the 1-based playListNumber to the
  actual stream entry; stream names are not sequential across discs
  (The Dark Knight: 00001/00003/00004; The Day After Tomorrow has
  duplicate 00002 names).
- CLI menu playback now resolves the correct .MPS file for every region.
- ui module: JavaFX via org.openjfx.javafxplugin + PlayerApp smoke test
  (window verified on this display).
- Validated menus + playback on 4 discs: Batman Begins (USA), Jackass
  (Australia), The Dark Knight (Europe), The Day After Tomorrow (Japan).
2026-09-15 23:04:24 -04:00
quoije 797b0507bd Scaffold Java 21 multi-module project with UMD ISO + SFO parsing
- Gradle Kotlin DSL multi-module (core, ui, cli) with JPMS modules
- UMD ISO 9660 reader (UmdIsoReader/UmdIsoFile + sector devices)
- SFO (param.sfo) parser
- 'dump' CLI command: metadata + recursive file listing
- JUnit 5 + AssertJ tests (SFO and ISO reader)
- Switch license from MIT to GPL-3.0-or-later
2026-09-15 21:00:22 -04:00