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)