ARMovie
- Extensions: rpl
- Technical Description: http://multimedia.cx/AE7doc.txt
- Samples: http://samples.mplayerhq.hu/game-formats/rpl/
ARMovie is ostensibly a multimedia container format used on Acorn RISC computer systems. Perhaps the most curious aspect of the format's design is its use of variable-length strings in the file header.
While apparently designed as a general container format, its most most notable use is in various Eidos Interactive computer games (using the extension rpl for Replay) including the Tomb Raider series. These FMV files contain video encoded with the ESCAPE video codec, and the audio is either uncompressed PCM or a custom IMA ADPCM variant.
Known video codecs
Most of the codecs output RGB555 or 5-bit YUV formats.
- 1 -- Acorn Moving lines
- 2 -- 15bpp uncompressed video (YUV or RGB)
- 3 -- 10bpp YUV (4:2:2 YUV with 5-bit components)
- 4 -- 8bpp raw video
- 5 -- 8bpp YUV (4:2:0 subsampling)
- 6 -- 6bpp YUV (4:1:0 subsampling)
- 7 -- Acorn Moving Blocks
- 8 -- 24bpp RGB
- 9 -- YYUV with 8-bit components
- 10 -- YV12
- 11 -- YUV9
- 12 -- indirect MPEG (a pointer to real MPEG movie)
- 13 -- MPEG video data
- 14 -- IBM UltiMotion
- 15 -- other indirect video formats
- 16 -- another packed YV12
- 17 -- Acorn Moving Blocks HQ
- 18 -- H.263
- 19 -- Acorn Super Moving Blocks
- 20 -- Acorn Moving Blocks Beta
- 21 -- YUYV8
- 22 -- packed YUV422
- 23 -- YUV422 with 6-bit Y and 5-bit U/V components
- 24 -- YUV420 with 6-bit Y and 5-bit U/V components
- 25 -- YUV410 with 6-bit components
- 100-199 -- ESCAPE codecs from Eidos Technologies
- 500 -- Iota Software LZW-compressed frames (like in their Euclid or ACE films)
- 600 -- WSS wrapper for 8-bit Microsoft Video 1
- 601 -- WSS wrapper for 15-bit Microsoft Video 1
- 602 -- WSS wrapper for Cinepak
- 603 -- WSS wrapper for RPZA
- 604 -- WSS wrapper for SMC
- 605 -- WSS wrapper for IBM UltiMotion
- 606 -- WSS wrapper for 8-bit RGB (AVI)
- 607 -- WSS wrapper for 8-bit Microsoft RLE
- 608 -- WSS wrapper for 24-bit RGB (AVI)
- 609 -- WSS wrapper for 8-bit Apple QuickTime RLE
- 610 -- WSS wrapper for FLI
- 613 -- WSS wrapper for 4-bit Apple QuickTime RLE
- 614 -- WSS wrapper for 16-bit Apple QuickTime RLE
- 615 -- WSS wrapper for 24-bit Apple QuickTime RLE
- 622 -- WSS DL (converted to raw palettised video)
- 623 -- WSS ANM (converted to raw palettised video)
- 624 -- WSS wrapper for 8-bit RGB (QuickTime)
- 630 -- WSS wrapper for QuickTime VR
- 699 -- WSS wrapper for unknown AVI or QT codecs
- 800 -- Henrik Pedersen's LinePack
- 802 -- Henrik Pedersen's Movie 16:3
- 803 -- Henrik Pedersen's wrapper for AVI/QT codecs and FLI
Some ARMovie-specific codecs are documented below.
Moving Lines
This codec operates in RGB555 or YUV555 format. It reads one or several 16-bit words to determine operation.
Control word with LSB set means raw pixel value in top 15 bits. Otherwise depending on those top 15-bit value range a specific operation should be performed:
[0x0000..0x4800)-- motion compensation from previous frame. Low 6 bits are copy length minus two, top 9 bits are motion vector table index (you can decode it asval = idx + (idx >= 144; dx = (val % 17) - 8; dy = (val / 17) - 8;)[0x4800..0x7300)-- motion compensation from current frame. Operation length is the same as in previous case, motion values can be decoded asdx = (idx - 0x120) % 19 - 9; dy = (idx - 0x120) / 19 - 9;0x7300-- end of frame marker;[0x7301..0x7800)-- run. Low 6 bits are run length minus two, next 16-bit word is run pixel value;[0x7800..0x7C00)-- skip. Low 10 bits are skip length minus one;[0x7C00..0x7FFF]-- raw data. The following 16-bit words will contain continuously packed 15-bit values.
Moving Blocks
This codec operates on 4x4 blocks in YUV555 format. Each 4x4 block has three coding modes: raw, motion compensated (from previous or already decoded part of the current frame) and subdivide it into 2x2 blocks and code them in raw or motion compensated mode.
Format specification may be found here.
Moving Blocks HQ
This is a development of Moving Blocks with some enhancements. Now there are more allowed motion vectors and raw luma samples use delta prediction and static Huffman coding.
Block mode codewords now are:
00-- skip block10-- use motion compensation.01-- raw block00-- subdivided block
Subdivided blocks use the following mode codewords:
00-- skip subblock10-- raw subblock1-- use motion compensation.
Motion vectors are using the following mode codewords:
00-- read 3 bits and use table for 1-pixel MVs;10-- read 4 bits and use table for 2-pixel MVs;01-- read 5 bits and use a different MV table for copying from already decoded part of the frame or a table for 3-pixel MVs;00-- read 8 bits and use table for 4-8 pixel MVs.
Raw blocks have 5-bit chroma components transmitted for a whole block followed by 4 or 16 luma differences. The codec keeps last (sub)block luma average (non-rounding) and uses it as a prediction.
For 2x2 sub-block
a b c d
reconstruction is performed as
a = (a + AVG) & 31; b = (b + a) & 31; c = (c + a) & 31; d = (d + ((b + c) >> 1)) & 31; AVG = (a + b + c + d) >> 2;
For 4x4 block decoded values are reconstructed row per row, first adding left neighbour (if present), then top neighbour (if present). First value is reconstructed the same as in previous case.
Codebook for all 32 possible values:
10
111
100
1000
11101
111011
110101
1011011
1100101
1110000
1010000
11101101
10100101
11000101
10010000
110011011
101101101
001101101
010011011
00010000
01000101
00100101
00011011
0110000
0000101
0101101
010101
001101
00000
01011
0011
001
Super Moving Blocks
Super Moving Blocks is almost the same as Moving Blocks HQ but it operates in 6Y5UV format (i.e. 6 bits per luma component and chroma components are 5 bits each). As the result the codebook for luma deltas has changed and masks in prediction are now 0x3F. The new codebook:
10
111
1101
11001
11100
11000
110001
110100
110000
1100001
1101100
1010000
11000001
11001100
11101000
110100001
110001100
111010100
110010100
110010000
1010100001
1101000001
1101001100
1010010100
1100010100
10101000001
00101000001
11010001100
10101001100
00101001100
10010010100
11000010100
11010010000
01010010000
11100010000
01100010000
10000010100
00000010100
01000010100
00010010100
01010001100
0010010000
0100010000
0100010100
0010001100
0010100001
000010000
011010100
001001100
001000001
01101000
01010100
00001100
00100001
0101000
0101100
0000001
001000
010001
00000
00100
01001
0101
011
LinePack
This codec takes 16-bit little-endian words for input and outputs 15-bit RGB or YUV.
If top bit is not set the word is pixel value, otherwise bits 12-14 signal the operation and low 12 bits (with some exceptions) transmit number of pixels to perform the operation on (e.g. run or skip length).
Known operations are:
- 0 -- leave pixels unchanged from the previous frame;
- 1 -- motion: bits 0-2 are horizontal motion component plus four, bits 3-5 are vertical motion component plus four, bits 6-11 are operation length. Zero displacement means copying pixels from the line above, other values denote an offset in the previous frame;
- 2 -- run. Next 16-bit word is run value;
- 3 -- raw pixels (16-bit values are transmitted in the following bytes);
- 4 -- four-colour pattern. Next four 16-bit words are four colours, the following 16-bit words contain 2-bit colour indices for the pixels (LSB first);
- 5 -- pixel pair run. The following two 16-bit words are two colours that should be repeated the specified number of times.
Movie 16:3
This codec codes 4x4 blocks in RGB555 format using 16-bit control words (though if pixel value is stored in control word, blue component there has only 4 bits). Two top bits specify operation:
- 0 -- fill block with the pixel value from the low bits;
- 1 -- copy block from previous frame with displacement. Horizontal displacement is stored in bits 0-4 (plus sign in bit 10), vertical displacement is stored in bits 5-9 (plus sign in bit 11);
- 2 -- patterned fill. Low 14 bits from the control word are the first colour value, low 15 bits from the next word are the second colour value. If top bit on the second word is not set, read 16-bit mask word and fill the block with those two colours; if top bit is set, another pixel is read -- if its top bit is not set, this is a raw tile and 13 more pixels need to be read, otherwise read 5 more pixels and 16-bit mask and do two-colour 2x2 block patterned fill like in Microsoft Video 1;
- 3 -- paint block with three colours. For that another 16-bit word is read, top 2 bits are used for paint mode, low 14 bits are pixel value. The third colour is an average of those two colours. The patterns are ('1' mean interpolated colour):
0 1 1 2 0 0 1 1 0 0 0 0 1 1 0 0 0 1 1 2 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 2 1 1 1 2 1 1 1 1 2 1 1 1 0 1 1 2 1 1 2 2 2 2 2 2 2 2 1 1
PC Games That Use RPL Files
- Big Red Racing (Escape 122)
- Fighting Force (Escape 130)
- Ian Livingstone's Deathtrap Dungeon (Escape 130)
- Joint Strike Fighter (Escape 130)
- Legacy of Kain: Soul Reaver (Escape 130)
- Lords of Midnight (Escape 122)
- Tomb Raider (Escape 124)
- Tomb Raider II (Escape 130)
- Tomb Raider III (Escape 130)
- Warzone 2100 (Escape 130)