MVE File Format

MVE is Interplay's full-motion video container used by Fallout, Fallout 2, and several other Interplay-era games. In Fallout it stores intro, ending, logo, credits, and cutscene movies below art\cuts. The companion subtitle file, when present, is a plain text SVE file below text\<language>\cuts.

This page describes the Interplay MVE format used by Fallout's .mve movies. Do not confuse it with unrelated files that happen to use an .mve extension, such as the Wing Commander III MVE format.

Format Properties

PropertyDescription
File typeBinary movie container with custom video and optional audio streams.
Typical Fallout pathart\cuts\*.mve, or localized art\<language>\cuts\*.mve.
Header signatureInterplay MVE File, followed by DOS EOF byte 0x1A and NUL.
Byte orderContainer fields are little-endian, unlike many Fallout game-data formats.
VideoInterplay video. Fallout-era content is usually 8-bit paletted video; later Interplay variants can use 16-bit RGB555.
AudioPCM or Interplay DPCM, depending on audio init flags.
Palette8-bit movies carry VGA-style 6-bit RGB palette updates inside the movie stream.
CompressionThe MVE file itself is not a DAT archive or gzip file. It may be stored inside master.dat or another DAT archive.

Fallout Lookup

Fallout 2 CE keeps a fixed movie-name table for the shipped Fallout 2 movies:

IndexFileTypical use
0iplogo.mveInterplay logo.
1intro.mveOpening narration.
2elder.mveElder cutscene.
3vsuit.mveVault suit/character-related cutscene.
4afailed.mveArroyo failed ending/cutscene.
5adestroy.mveArroyo destroyed ending/cutscene.
6car.mveCar movie.
7cartucci.mveCathedral/Tucci-style special movie entry.
8timeout.mveTime-out ending.
9tanker.mveTanker cutscene.
10enclave.mveEnclave cutscene.
11derrick.mveDerrick/oil-related cutscene.
12artimer1.mveArroyo timer movie 1.
13artimer2.mveArroyo timer movie 2.
14artimer3.mveArroyo timer movie 3.
15artimer4.mveArroyo timer movie 4.
16credits.mveCredits.

The Fallout 2 CE lookup order is:

  1. If the configured language is not English, try art\<language>\cuts\<movie>.mve.
  2. If that file is missing, fall back to art\cuts\<movie>.mve.
  3. If subtitles are enabled, build text\<language>\cuts\<movie>.SVE from the movie filename.

Subtitles use special palette files for some movies. Fallout 2 CE uses art\cuts\introsub.pal, eldersub.pal, artmrsub.pal, crdtssub.pal, or the default art\cuts\subtitle.pal depending on the movie index.

File Header

An Interplay MVE begins with a fixed 26-byte header:

OffsetSizeFieldDescription
0x000020SignatureASCII Interplay MVE File, byte 0x1A, and byte 0x00.
0x00142Magic word 1Little-endian 0x001A.
0x00162Magic word 2Little-endian 0x0100.
0x00182Magic word 3Little-endian 0x1133.

ScummVM asserts the three magic words when loading an MVE. FFmpeg's demuxer searches for the signature in probe/read-header code, then positions the stream at the first chunk.

Container Layout

After the header, the file is a sequence of chunks. Each chunk contains one or more opcodes.

MVE file
    header
    chunk
        opcode
        opcode
        ...
    chunk
        opcode
        ...

Chunk Header

OffsetSizeFieldDescription
0x002chunk_sizeLittle-endian byte length of chunk payload, not including this 4-byte chunk header.
0x022chunk_typeLittle-endian chunk type.

Opcode Header

OffsetSizeFieldDescription
0x002opcode_sizeLittle-endian byte length of opcode payload, not including this 4-byte opcode header.
0x021opcode_typeOperation id, normally 0x00..0x15.
0x031opcode_versionVersion/subtype byte for that opcode.

Some source code displays opcodes as a big-endian 16-bit pair such as 0x0502, which means type 0x05, version 0x02. A binary parser should still read the type and version as separate bytes.

Chunk Types

TypeNameDescription
0x0000Init audioAudio stream setup, usually contains opcode 0x03.
0x0001Audio onlyAudio prebuffer or audio-only chunk.
0x0002Init videoVideo mode/buffer/palette setup.
0x0003VideoMain movie chunk, commonly contains audio, decoding maps, video data, and send-buffer opcode.
0x0004ShutdownEnd-of-playback/shutdown chunk.
0x0005EndTerminal end chunk. Usually no useful payload.

Stream Opcodes

OpcodeNamePayload and behavior
0x00End of streamNo payload. Stops playback.
0x01End of chunkNo payload in normal files. Decoder moves to the next chunk.
0x02Create timerVersion 0, size 6: uint32 rate, uint16 subdivision. Frame interval is rate * subdivision microseconds.
0x03Init audio buffersVersion 0 size 8 or version 1 size 10. Contains unknown word, flags, sample rate, and buffer length.
0x04Start/stop audioPlayback-control opcode. Common demuxers skip the payload.
0x05Init video buffersVersion 0/1/2. Width and height are stored in 8-pixel blocks. Version 2 can indicate 16-bit video.
0x06Video data format 6Older 8-bit video frame format. FFmpeg treats its decoding map as embedded at the start of the video payload.
0x07Send bufferMarks the current decoded frame ready for display. ScummVM also reads palette start/count from version 1 payload.
0x08Audio frameAudio payload: sequence index, stream mask, stream length, and audio data.
0x09Silence frameSilent audio payload: sequence index, stream mask, and stream length.
0x0AInit video modeUsually contains width, height, and flags. Fallout/ScummVM playback code reads and ignores these values after setup.
0x0BCreate gradientDocumented/recognized by demuxers, but often skipped for normal playback.
0x0CSet palettePalette start, palette count, then 3 bytes per entry in 6-bit VGA RGB format.
0x0DSet compressed paletteCompressed palette update. FFmpeg recognizes and skips it; older specs describe 32 groups of 8 palette entries selected by bit masks.
0x0ESet skip mapStores the skip map used by video format 0x10.
0x0FSet decoding mapStores the block decoding map used by video formats 0x10 and 0x11.
0x10Video data format 108-bit video frame format using separate skip map and decoding map opcodes.
0x11Video data format 11Interplay block-coded video. FFmpeg supports 8-bit paletted and 16-bit RGB555 variants.
0x12..0x15Unknown/documented opcodesRecognized in old specs and FFmpeg as documented-but-unknown values. Normal decoders skip them or treat unrecognized payloads conservatively.

Timing

The timer opcode stores a 32-bit rate and a 16-bit subdivision. The effective frame interval is:

frame_interval_us = timer_rate * timer_subdivision
fps = 1000000 / frame_interval_us

Older MVE notes mention a common timer rate of 8341 and subdivision 8, giving about 14.99 frames per second. Do not hardcode that value: read the timer opcode because files can differ.

Audio

Audio is optional. FFmpeg checks whether the first chunk after video initialization is another video chunk; if so, it treats the file as silent. Otherwise it expects an audio initialization chunk.

Audio Init Flags

BitMeaning
00 mono, 1 stereo.
10 8-bit samples, 1 16-bit samples.
2Version 1 only: 0 uncompressed PCM, 1 Interplay DPCM.

Uncompressed audio is PCM: 8-bit unsigned PCM or 16-bit little-endian PCM. Compressed audio is Interplay DPCM.

Audio Frame Payload

OffsetSizeFieldDescription
0x002Sequence indexSequential audio frame number.
0x022Stream maskBitmask selecting one or more of up to 16 audio tracks.
0x042Stream lengthLength of the following audio data for opcode 0x08; silence duration for opcode 0x09.
0x06variableAudio dataPresent only for opcode 0x08.

ScummVM exposes a selectable audio track index and queues only audio frames whose stream mask includes that track. This matters for multi-language MVE files, even though Fallout usually relies on localized files and a single active audio stream.

Interplay DPCM

Interplay DPCM uses a 256-entry signed delta table. Each chunk begins with one signed 16-bit little-endian predictor for mono audio, or two predictors for stereo audio. The remaining bytes are delta-table indexes. For each byte, the decoder adds the selected delta to the current predictor, clamps to signed 16-bit range, and outputs the new sample. Stereo samples are interleaved left/right.

Palette

8-bit MVE video uses palette indexes. Palette opcode 0x0C carries a start index, count, and RGB triplets. Each RGB component is a VGA-style 6-bit value from 0 to 63. Decoders typically expand to 8-bit display color with a shift and low-bit fill, for example (value << 2) | (value >> 4).

Palette changes are frame-adjacent state. A demuxer should attach palette updates to the next decoded video packet or apply them before showing the corresponding frame.

Video Setup

Video buffer initialization stores width and height in 8-pixel blocks. For example, width block count 80 and height block count 60 describe a 640x480 movie. FFmpeg multiplies both fields by 8 when setting stream dimensions.

Version 2 of the video-buffer opcode can select 16-bit video. In FFmpeg, 8-bit output is PAL8 and 16-bit output is RGB555. Fallout's normal cutscene path is paletted, and the movie window is a 640 by 480 indexed-color window.

Video Data Formats

FormatOpcodeMapsDescription
0x060x06Embedded decoding mapOlder block copy format. FFmpeg requires 8-bit video and rejects external skip/decoding maps for this format.
0x100x10Separate skip map and decoding map8-bit block copy format using opcode 0x0E skip map and 0x0F decoding map.
0x110x11Separate decoding mapInterplay block codec. 8-bit and 16-bit variants are supported by FFmpeg.

Each decoded frame is built from 8 by 8 blocks. The codec keeps previous frames because many block modes copy from the previous frame, the second previous frame, or a previously decoded block in the current frame.

Format 0x11 Block Modes

For video format 0x11, the decoding map is a packed stream of 4-bit block opcodes, one per 8x8 block. FFmpeg's decoder names block modes 0x0 through 0xF:

Block opcode8-bit meaning
0x0Copy 8x8 block from previous frame at the same position.
0x1Copy 8x8 block from the second previous frame at the same position.
0x2Copy from the second previous frame using a one-byte motion vector.
0x3Copy from the current frame using an up/left motion vector.
0x4Copy from the previous frame using a small one-byte motion vector.
0x5Copy from the previous frame using two signed motion-vector bytes.
0x6Mystery/rare mode in the 8-bit decoder. FFmpeg logs it as suspicious but does not consume extra data.
0x72-color encoding for either individual pixels or 2x2 blocks, depending on color ordering.
0x82-color encoding split by quadrants or by half-frame regions inside the 8x8 block.
0x94-color encoding with pixel, 2x2, 2x1, or 1x2 grouping depending on color ordering.
0xA4-color encoding split by quadrants or half-block regions.
0xBRaw 64-color block: one byte per pixel.
0xC16-color block: one color per 2x2 cell.
0xD4-color block: one color per 4x4 quadrant-style area.
0xESolid-color block.
0xFDithered two-color block.

The 16-bit variant uses the same broad block-mode table but reads RGB555 words instead of palette indexes for color-coded modes. FFmpeg maps 16-bit MVE frames to RGB555.

Frame Assembly

A demuxer should not pass raw opcode payloads independently to a video decoder. FFmpeg combines the frame format byte, send-buffer flag, video data, decoding map, skip map, and palette side data into a single video packet. ScummVM keeps the latest skip/decoding maps in decoder state and applies them when a video opcode arrives.

The send-buffer opcode controls when a decoded frame is actually displayed. A video-data opcode may update decode buffers, while the send opcode marks the frame complete for presentation and increments the visible frame count.

Subtitles

Fallout subtitles are not embedded in the MVE stream. The movie subsystem builds a subtitle filename from the movie filename:

art\cuts\intro.mve
text\english\cuts\intro.SVE

The SVE parser reads lines of the form frame:text. When playback reaches or passes that frame number, the text replaces the previous subtitle. Fallout 2 CE renders subtitles centered below the movie image, using the selected subtitle palette and font.

A same-basename CFG sidecar can also exist beside an MVE to define movie palette fade effects. For example, art\cuts\intro.mve can be accompanied by art\cuts\intro.cfg.

Savegame Relationship

SAVE.DAT handler 21 stores MOVIE_COUNT bytes of movie-seen flags. The movie files themselves are not copied into save slots. A save only records whether each movie index in the engine's fixed table has already been seen.

Implementation Notes

Source Code Map

SourceWhat it confirms
FFmpeg libavformat/ipmovie.cHeader probing, chunk types, opcode types, timer/audio/video/palette demuxing, packet assembly.
FFmpeg libavcodec/interplayvideo.cVideo frame formats 0x06, 0x10, 0x11, block opcodes, previous-frame use, 8-bit and 16-bit output.
ScummVM video/mve_decoder.cppPractical player structure, signature/magic-word checks, selectable audio track, Fallout-like format 6/10 handling.
Fallout 2 CE game_movie.ccFallout movie filename table, localized movie lookup, subtitle filename construction, subtitle palette selection, movie-seen save flags.
Fallout 2 CE movie.ccMovie playback integration, subtitle loading/rendering, SVE line parsing, frame-count-based subtitle display.

References

History

2026-05-07 - Added dedicated MVE documentation covering Fallout lookup behavior, container/chunk/opcode structure, audio, palette, video frame formats, block modes, subtitles, and savegame relationship.