MIVF Player for Nintendo 3DS
A homebrew video player for the Nintendo 3DS. MIVF is a custom, page‑based video container with its own software codecs, a native C player that runs on the console, and a standalone encoder that turns ordinary .mp4 or .mkv files into .mivf.
It is built for the real hardware: the codecs are tuned for the ARM11, the player streams pages from the SD card with a background reader, and the whole UI (file browser, transport, settings) is drawn straight into the RGB565 framebuffers.
Status: Works on real hardware and on the Azahar emulator. Tested primarily at 400×240, 30 fps.
- Custom codecs: M2Y1 (raw token YUV420) and M2Y2 (the same picture, entropy‑coded with a division‑free binary range coder, ~24% smaller and still a locked 30 fps on hardware). Also reads RAWV, M2Y0, and PC16/IA4M audio.
- File browser: Includes thumbnails, posters, synopsis, and favorites.
- Auto‑resume bookmarks: Pick up exactly where you left off.
- Playlists / auto‑advance: Automatically play the next file in the folder.
- Aspect‑ratio modes: FIT (letterbox), STRETCH (fill), NATIVE (1:1).
- A/B scene looper: Mark two points and loop the section.
- Playback speed: 0.5× to 2.0×, audio stays in sync.
- Sleep timer + clamshell pause/park: Closes cleanly and resumes on wake.
- Customization: Subtitles (
.srt, multiple tracks), chapters, themes, adjustable brightness, font scale, and a persistent settings menu. - Touch transport: Drag the timeline to scrub.
| Button | Action |
|---|---|
| D‑Pad ↑/↓ | Move selection |
| A | Play |
| Y | Toggle favorite |
| B / START | Exit |
| Button | Action |
|---|---|
| A | Play / pause |
| ← / → | Seek −/+ (~5 s) |
| Touch + drag | Scrub timeline |
| X | Cycle playback speed (0.5×–2.0×) |
| B | A/B loop: set A → set B → clear |
| Y | Cycle subtitle track |
| L + D‑Pad | Audio (volume / stereo) |
| R + ↑/↓ | Screen brightness |
| R + ←/→ | Previous / next chapter |
| SELECT | Open settings |
| START | Stop and return to the browser |
Use D‑Pad ↑/↓ to move, A / ← / → to change, and B or SELECT to close and save.
Items include: Resume bookmarks, Auto dim, Dim timeout/brightness, Force stereo, Debug overlay, Subtitle tracks, Chapters, Favorites, Theme skin, Font scale, Sleep on lid close, Screen brightness, Aspect ratio, Playback speed, Auto‑advance, and Sleep timer.
Note: Settings, bookmarks, favorites, logs, cache, and benchmark data now live under
sdmc:/3ds/mivf_player_3ds/appdata/. Legacy root-level settings/bookmark/favorites files are still read for migration.
The easiest way to install MIVF Player is to grab the latest release from the Releases Page.
- For a HOME-menu icon: Download
mivf_player_3ds.ciaand install it using a title manager like FBI. - For the Homebrew Launcher: Download
mivf_player_3ds.3dsx, place it insdmc:/3ds/, and launch it via the Homebrew Launcher.
Put your compiled .mivf video files in sdmc:/mivf/ (the player also scans sdmc:/3ds/mivf_player_3ds/ and the SD root).
Place these next to yourvideo.mivf:
| File | Purpose |
|---|---|
yourvideo.srt, yourvideo.1.srt |
Subtitle tracks (cycle with Y) |
yourvideo.chapters |
Chapter marks: SECONDS Label, H:MM:SS Label, or just SECONDS |
yourvideo.cover |
Poster (raw RGB565, browser‑preview sized) |
yourvideo.nfo |
Synopsis text shown in the browser |
You can download the standalone PC encoder from the Releases Page to easily convert .mp4 files into .mivf formats without needing to install Python.
The encode_mivf tool wraps ffmpeg and the native encoder to process a single file or a whole folder.
Requirement:
ffmpegmust be available on your system (either bundled next to the executable or added to your system's PATH).
Windows Example:
:: Smaller, entropy-coded M2Y2 (Recommended):
encode_mivf.exe input.mp4 output.mivf --m2y2
:: Faster, raw token M2Y1:
encode_mivf.exe input.mp4 output.mivf
::Best Balanced
encode_mivf.exe input.mp4 output.mivf --m2y2 --fps 24 --audio-rate 48000 --jobs 6 --seek-preroll 2 --keep 4 --mv-range 1 --qp 38 --lambda 34
Linux Example:
./encode_mivf input.mp4 output.mivf --m2y2
(Developers can also run the Python front-end directly via python encode_mivf.py input.mp4 output.mivf --m2y2).
You need devkitPro with the 3ds-dev group (devkitARM + libctru).
# Make sure DEVKITPRO / DEVKITARM are set and the toolchain is on PATH, then:
make
This produces mivf_player_3ds.3dsx with the embedded SMDH icon/metadata. To skip the icon, run make NO_SMDH=1.
The .cia needs two third‑party tools that are not part of devkitPro:
Drop both executables into devkitPro/tools/bin (or anywhere on your PATH), then:
make cia
This builds the banner, reuses the SMDH icon, and packages everything per meta/app.rsf into mivf_player_3ds.cia.
source/- Native 3DS player (C).main.cis the app;mivf_*.c/.hare modules.mivf_rc.his the shared M2Y2 range coder.tools/- Native encoder + M2Y2 transcoder/verifier and helpers.meta/- Icon, banner, banner audio, makerom RSF, asset generator.Makefile- Builds the.3dsx(andmake ciafor the installable title).encode_mivf.py- Python front-end for ffmpeg ->.mivfencoding.
Built with devkitPro / devkitARM and libctru. CIA packaging uses makerom and bannertool.
Released under the MIT License.