Repository navigation
Releases: Hackinside/M2Suite
Release list
M2Suite v0.65 — Duck TrueMotion & ReadySoft FMV
Two 3DO video formats that have never had an open decoder now play in the
viewport and export to MP4 — and a colour bug that had been flattening every
3DO sprite in the app is fixed.
Download: M2Suite-portable.zip below. Portable Windows x64 build, no
installer — unzip and run m2suite-shell.exe.
SHA256 48FE421F04B90176A0818FC372A4DACBC8F5FC09B1C3C911EA28F8C4BA2FBC37
Duck TrueMotion — Gex
The .DUK movies keep their vector codebook in sidecar files (.HDR/.TBL)
rather than compiled into the decoder, which is why FFmpeg's and ScummVM's
truemotion1 cannot read them.
The decoder is a port of The Ur-Quan Masters 0.8.0 (src/libs/video/dukvid.c
and src/libs/sound/decoders/dukaud.c) — the only known working implementation
of this variant. Full credit to the UQM project. Because that source is
GPL-2.0-or-later, libm2duck is GPL-2.0-or-later; the rest of M2Suite
remains GPL-3.0-or-later. See
THIRD_PARTY_LICENSES.md.
Verified against all four Gex movies, including the version-three decode path.
ReadySoft SASQ — Space Ace
Reverse-engineered for this release. The picture is a palettised canvas that
can be larger than the 288×216 viewport: BAC8 keyframes and MVB8 scroll-in
strips supply raw 8-bit pixels, each frame's CELL composites a standard 3DO
packed cel over them, MOVE pans the view, BPAL sets the RGB555 palette.
Audio is raw signed 8-bit PCM at 22050 Hz and the movies run at exactly 12 fps.
Dragon's Lair is not decoded. It shares the outer BNDY container but
stores its payload in an older layout with no IFF FORM. M2Suite reports its
structure rather than drawing guessed pixels.
Coded cels were rendering flat
An 8bpp coded 3DO cel packs two things into every byte: the low 5 bits index
the 32-entry PLUT, and the top 3 bits are the AMV — a per-pixel brightness
multiplier the cel engine's pixel processor applies as it draws. M2Suite was
masking those off, which discarded all the shading and posterised every sprite.
The pixel processor (PPMPC) is now modelled from the CCB's PIXC word, per the
field layout in 3DO Portfolio 2.5 hardware.h. Verified against Escape from
Monster Manor's zombie.cels and the bundled Message.cel fixture.
Two traps worth naming for anyone else implementing this: PPMPC_SF_16 is
0x0000, so a zero SF field means divide by sixteen; and the AMV is stored
as value−1 like the hardware's own MF field, so a fully lit pixel reproduces
the palette colour exactly rather than capping at 7/8.
Fixed
- A 60 MB stream froze the application. Not its size:
ice.bigstream's
Cinepak frames open with a non-standard strip marker, and the
skip-unknown-strip loop advanced bytop_size - 4. Near EOF the
bounds-checked readers return zeros, so the pointer walked backwards four
bytes per iteration forever — past a guard that only checked forward
overrun. Escape from Monster Manor's Intro carries the same marker and would
have hung too. - Every cel animation played at 1 fps.
form3do.hdocuments
AnimChunk::frameRateas "1/60s of a sec to display each frame" and types it
int32, but it is 16.16 fixed point. Read raw it computed a ~36-minute frame
time, which the clamp pinned to its one-second ceiling. Confirmed across 350+
ANIM files on real discs. - Escape from Monster Manor's movies are recognised. They open with a
CTRLchunk and carry no file extension, so nothing classified them.
Detection now validates the opening DataStreamer chunk chain rather than
matching a single leading tag. - Films encoded smaller than their header claims decode fully instead of
going black below the first strip.
Video export options
Exporting a video now opens an options dialog; image and audio exports keep
their one-click flow.
- Rate control — constant quality (CRF), target bitrate, or lossless
- Codec — H.264, H.265, VP9, or FFV1 for archiving, with the container and
audio codec following the choice - Upscaling — hqx, xBR and Super2xSaI (the emulator scalers written for
small palettes and hard edges), plus Lanczos, Spline and nearest - Also — deinterlacing, denoising, frame interpolation
Filters your ffmpeg build lacks are shown disabled with the reason, rather than
failing partway through an encode. Upscaling uses ffmpeg's own filters rather
than a Real-ESRGAN/ncnn/Vulkan stack, which would be a heavy dependency for a
preservation tool.
Known limitations
- Dragon's Lair's movies are not decoded.
- Space Ace's keyframes comb on fast motion. That is in the source — each
keyframe interleaves two fields captured a moment apart, exactly as the
console fed its CRT. Deinterlacing is available at export. - Frame interpolation invents motion that was never filmed. These movies run at
12–15 fps by design; it is for viewing, not archiving.
Credits
The Ur-Quan Masters (Duck TrueMotion decoder), Dr. Tim Ferguson (Cinepak),
vgmstream (SDX2/CBD2), FFmpeg, Mark Adler / AITD-tools, fitd / AITD_PakEdit,
Trapexit, and the 3DO Portfolio 2.5 / Toolkit 1.5 documentation and sources.
Full provenance in THIRD_PARTY_LICENSES.md.