- Extension: m95
- Samples: http://samples.mplayerhq.hu/game-formats/cyberia2-m95/
M95 files are FMV files used in the game Cyberia 2: Resurrection. Quite predictably, M95 files are an extension of the C93 FMV files found on the predecessor game, Cyberia. M95 files can use all of the coding modes present in C93 and adds several new modes. The frame layout is also revised. Please refer to the original C93 description for more details on that original format, as this page covers only changes between C93 and M95.
Multi-byte numbers are little endian. The contents table remains the same as in C93, but holds 1024 records vs. 512.
The frame descriptor, however, is greatly changed (all offsets are relative to the block):
4 bytes frame_offset - offset of the particular frame 4 bytes unk_offset_1 - points to something after palette, useless (?) 4 bytes unknown 4 bytes sound_offset - offset of the sound portion 12 bytes unknown 4 bytes palette_offset - offset of the palette 4 bytes unk_offset_2 - 4 bytes unk_offset_3 - both fields, when non-zero, also offsets of something
Sound is stored as a complete WAV file. The palette begins with a byte indicating which (in-block) frame number it belongs to, and is followed by 256 BGR triplets.
Before proceeding to the decoding, read a 2-byte value from the stream. If it is non-zero, perform extra dictionary unpacking, located at offset (frame + value). Then continue frame decoding. The dictionary contains a variable number of 8x8 blocks packed using a simple LZ-like algorithm. To decompress:
repeat read 16-bit tag value for each bit of tag (low to high) if bit is set output = next byte of the stream else offset = 10 bits of the stream count = next 6 bits of the stream + 3 if offset is zero finish the unpacking else output count bytes located at output - offset
New video compression modes, in addition to the methods supported in C93:
Read 8 color bytes from the stream. Paint pixels by reading 3 bits from the stream and selecting one of 8 colors as indexed by these bits.
Copy 8x8 block from the previous frame.
Paint next 8x8 pixels from the dictionary.
Motion block. For each 2x2 subblock read 4 bits of x delta, then 4 bits of y delta. The deltas are 4-bit 2s complement signed quantities; if bit 3 of delta is set, then delta = delta - 16. Copy subblock from the previous frame shifted by that delta relatively current position.
Same as mode 9, but operating 4x4 subblocks.