Skip to content

media-live (2026-11-01, batch r1): video, movie audio and album JPEG verified on real titles

Branch claude/media-live-2026-11-01-r1 (Mac session, base df2f318). All runs: headless, NAPPLE_AUDIO_DEVICE=0, title data from the shared /Users/neto/NappleWork/games (MK8D base + v1376256 update + Booster DLC, LAS v0, SMO v0, ACNH base + updates + DLC), one run at a time under .run.lock. Frames and logs stay outside the repository (game data).

Verified on this Mac

  1. H.264 through nvhost-nvdec + VIC (MK8D). Menu route 15:A,19:A,23:A,27:A,31:A,35:A, 110 s: the title opens /dev/nvhost-nvdec and /dev/nvhost-vic at 23.8 s and decodes its 512x608 preview video through VideoToolbox. Engine stats: class 0xf0 180 executes / 179 frames / 0 errors on the first channel, 120 / 119 / 0 on the second (the panel changes); VIC the same, output NV12 pitch linear. The VIC frame dump (NAPPLE_VIC_DUMP) shows clean pictures (Mario's kart in front of the Mario Motors banner), and the game screenshot at frame 1500 shows the Grand Prix panel playing that video.
  2. VP9 + Vorbis through the SDK movie library (LAS). The opening movie: movie::Decoder type 3 (VP9 1920x1080, NVN texture mode) on libvpx and type 5 (Vorbis, PCM buffer mode) on stb_vorbis, both on the host by default. The Vorbis headers come out of band (2 csd blobs, complete; 48000 Hz, 6 channels) and the game opens a 6-channel audout at the same moment. 6600 video frames in 113 s, 0.8 ms per frame, 0 errors; the screenshots show the cutscene (Marin on the beach) and the title screen after it. Vorbis output level lines (new, below) show non-silent PCM: 2000 packets = 37.6 s of 6-channel audio in a 37.8 s window, RMS 1600-2400 per 500 packets, 0.01-0.27 % of samples at full scale (the decoder's float output beyond +-1.0, clamped: loud mastering, not a conversion fault; the clamp in movie_audio_core.c is exact).
  3. Movie audio default-on without regressions. LAS (above) and SMO (115 s, exit 0, no crash, reaches the in-engine intro) boot with the default. SMO creates no movie decoder in that window; neither does ACNH (90 s, exit 0).
  4. JPEG album round trip (e2e, real frames). New test_svc_caps_e2e: a 1280x720 frame (MK8D's screenshots from run 1, or a synthetic scene) goes through caps:su SaveScreenShot (jpeg_core encode) -> caps:u GetAlbumFileList -> OpenAccessorSessionForApplication -> LoadAlbumFile, and the file is decoded by caps:dc DecodeJpeg and by ImageIO; an ImageIO-encoded JPEG decodes through caps:dc too. MK8D frames: 31.8-39.9 dB against the source (ImageIO's own encoder: 32.5-41.1 dB on the same frames), caps:dc vs ImageIO on our file 38-45 dB; synthetic 51 dB. None of the four titles opens a caps service in these runs, so the round trip is e2e at the service level, not driven by a title.
  5. nvdisp-disp0: no title of the four opens it. The new device-open summary notes list every path a title opens: MK8D opens nvhost-ctrl, nvmap, nvhost-nvdec and nvhost-vic; LAS, SMO and ACNH open the nvdrv service (Initialize, SetClientPID, cmd 13) and no device at all (NVN is HLE). No title opens nvjpg, msenc or nvdisp, so their ioctls stay tested only.

Code changes

  • nvdrv_media_core.c: NAPPLE_VIC_DUMP=<prefix> (+ NAPPLE_VIC_DUMP_FRAMES) writes the NV12 picture of chosen VIC executes as <prefix>-<engine>-<frame>.ppm. Fix: the engine class's THI word 0 is INCR_SYNCPT (MK8D's NVDEC/VIC submits end with one); it was counted as an unknown register, so every MK8D run put a false "writes to registers outside the known map (last 0)" note in the summary (543 VIC / 382 NVDEC). The two real leftovers are now known registers too: VIC 0x1c1 SetControlParams (named since b7, missing from the known map) and NVDEC 0x140 (NVDEC_SET_UNNAMED_0x140: MK8D writes one constant buffer address there before every execute; name and use unknown, the decode does not need it). A final MK8D run's summary carries only the four device-open notes.
  • nvdrv.c: the first Open of each device path and the first call of each nvdisp ioctl number go to the log and the run summary (nvdrv: opened <path> (error N)), the evidence for which nodes a title really uses.
  • movie.c: Vorbis output level lines every 500 packets (PCM seconds handed over, peak, RMS and full-scale count of s16 samples) so a run with the audio device off still shows the movie's sound decodes to signal.
  • Tests: test_svc_nvdrv_media 169 -> 172 checks (THI INCR_SYNCPT, NVDEC 0x140, VIC 0x1c1); new test_svc_caps_e2e (22 checks synthetic, 23 with a real frame).
  • Docs: docs/reference/environment-variables.md rows for NAPPLE_VIC_DUMP, NAPPLE_MOVIE_VORBIS, NAPPLE_CAPS_E2E_PNG/OUT; docs/architecture/runtime-services.md section "media-live (2026-11-01, r1)".

Not done

  • AAC: no title of the four creates a type 4 (AAC) movie decoder, so no hookup was made (the library keeps it).
  • Opus: the movie library has no Opus decoder type; unchanged.
  • VP9 through NVDEC (NAPPLE_VT_VP9), RGB/block-linear VIC output, NVJPG, MSENC, nvdisp: no title of the four uses them; still tested only.

Evidence

Logs and frames (game data, outside the repository) are in the batch's shared notes folder, media-live-evidence/: MK8D runs 16:42 (route, VIC dumps) and 17:24 (clean summary), LAS 16:48 (115 s) and 17:16 (Vorbis levels), SMO 16:54, ACNH 16:58; mk8d-vic-frame120.png (a VIC frame), mk8d-grandprix-panel.png (the panel playing it), las-opening-movie.png, caps-album-mk8d.jpg (the album file caps:su wrote from a MK8D frame).