- Extentions: vb, son
- Samples: http://samples.mplayerhq.hu/game-formats/SIFF/
Certain PC games developed by Beam Software use a multimedia format with the file signature 'SIFF'. The format can transport audio and video (which are .vb files) or just audio (which are .son files).
The general fourcc chunk format is as follows:
bytes 0-3 chunk type bytes 4-7 chunk size (not including 8-byte chunk preamble and usually in MSB format) bytes 8.. chunk payload
It is important to note that in the fourcc chunk preamble, the size field is big-endian. However, all other multi-byte numbers in the file are little-endian.
A VB file begins with a 'SIFF' file signature, followed by the total length of the file, minus 8 bytes. Bytes 8-11 contain the version fourcc, e.g. 'VBV1'. Then comes the header, which is laid out as follows:
bytes 0-3 header fourcc ('VBHD') bytes 4-7 header length (should be 32 == 0x20) bytes 8-9 unknown, but might be header version bytes 10-11 video width bytes 12-13 video height bytes 14-17 zeroes bytes 18-19 number of frames bytes 20-21 bits per audio sample? bytes 22-23 audio sample rate bytes 24-39 zeroes
All data is stored in 'BODY' chunk in blocks. Block format:
bytes 0-3 block size (with header) bytes 4-5 flags bytes 6.. block payload
bit 0 - frame has global motion vector bit 2 - block contains audio bit 3 - block contains video bit 4 - palette change bit 5 - block has frame duration
Global motion vector is stored as two signed words.
Palette change data:
byte 0 - start index byte 1 - number of entries to change bytes 2.. - RGB entry, 3 bytes per entry
Video Frame Format
Frame is divided into 4x4 blocks. Block type is stored in two bits, which are grouped into one byte for four consequent blocks.
- 0 - skip block
- 1 - motion compensated block, next byte contains motion vector (with values -8..7). If motion vector is zero then block is uncompressed and its data is contained in the next 16 bytes.
- 2 - block is filled with color stored in the next byte
- 3 - pattern fill, pattern method and value is stored in the next byte.
Pattern type (for block type 3) is stores in high two bits, pattern index is stored in 6 low bits. Pattern type meanings:
- 0 - read 2 bytes and paint block with them
- 1 - read one bytes and paint only pixels where pattern bit is zero
- 2 - read one bytes and paint only pixels where pattern bit is one
- 3 - invalid value
Motion compensation may wrap, i.e. pixels from the previous or next line may be read.
There are 64 possible patterns:
0x0660, 0xFF00, 0xCCCC, 0xF000, 0x8888, 0x000F, 0x1111, 0xFEC8, 0x8CEF, 0x137F, 0xF731, 0xC800, 0x008C, 0x0013, 0x3100, 0xCC00, 0x00CC, 0x0033, 0x3300, 0x0FF0, 0x6666, 0x00F0, 0x0F00, 0x2222, 0x4444, 0xF600, 0x8CC8, 0x006F, 0x1331, 0x318C, 0xC813, 0x33CC, 0x6600, 0x0CC0, 0x0066, 0x0330, 0xF900, 0xC88C, 0x009F, 0x3113, 0x6000, 0x0880, 0x0006, 0x0110, 0xCC88, 0xFC00, 0x00CF, 0x88CC, 0x003F, 0x1133, 0x3311, 0xF300, 0x6FF6, 0x0603, 0x08C6, 0x8C63, 0xC631, 0x6310, 0xC060, 0x0136, 0x136C, 0x36C8, 0x6C80, 0x324C