PMM
From MultimediaWiki
| Revision as of 03:03, 20 August 2006 Dashcloud (Talk | contribs) (Update samples link) ← Previous diff |
Current revision VAG (Talk | contribs) (rewrite) |
||
| Line 2: | Line 2: | ||
| * Samples: [http://samples.mplayerhq.hu/game-formats/krazy-ivan-pmm/ http://samples.mplayerhq.hu/game-formats/krazy-ivan-pmm/] | * Samples: [http://samples.mplayerhq.hu/game-formats/krazy-ivan-pmm/ http://samples.mplayerhq.hu/game-formats/krazy-ivan-pmm/] | ||
| - | The game [http://www.mobygames.com/game/windows/krazy-ivan Krazy Ivan] uses multimedia files with the extension .pmm. All multi-byte numbers are little endian. The general [[FourCC]] chunk format is as follows: | + | The game [http://www.mobygames.com/game/windows/krazy-ivan Krazy Ivan] uses multimedia files with the extension .pmm. Carries encoded 15-bit video along with [[PCM]] or [[DPCM]] (never used) audio track. |
| - | bytes 0-3 chunk type | + | == File Format == |
| - | bytes 4-7 chunk size, not including 8-byte preamble | + | |
| - | bytes 8.. chunk payload | + | |
| - | A PMM file begins with the following header: | + | File structure follows general [[RIFF]] format, but uses custom chunk names. All numbers are little endian. |
| - | bytes 0-3 file signature: 'PIFF' | + | File begins with 4 * 3 bytes catalog header: |
| - | bytes 4-7 total file size, not including first 8 bytes | + | |
| - | bytes 8-11 fourcc: 'PXMT' | + | |
| - | bytes 12-15 fourcc: 'PXMH' | + | |
| - | bytes 16-19 size of header | + | |
| - | bytes 20-39 unknown | + | |
| - | bytes 40-71 apparently a freeform, NULL-terminated string that | + | |
| - | desribes certain video properties, e.g., | + | |
| - | "Windows 15Hz X2"; this example gives away the framerate | + | |
| - | and, given that the video resolution does not appear to | + | |
| - | be encoded anywhere else, may present some special coding | + | |
| - | for the width and height with 'X2' | + | |
| - | bytes 72-73 audio sample rate | + | |
| - | byte 74 audio channels (?) | + | |
| - | byte 75 audio bytes/sample (?) | + | |
| - | bytes 76-83 unknown | + | |
| - | Following the header is a CPAL chunk (provided that the file has 8-bit video). This contains a number (not necessarily 256) of RGB palette components with a full 8-bit range. | + | u32 fourcc -- "PIFF" |
| + | u32 filesize -- not including fourcc and filesize fields | ||
| + | u32 filetype -- "PXMT" /PXM Type?/ | ||
| - | Afterwards, there are a number of audio and video chunks. The first chunk appears to be a MPAL chunk which is quite large. Following that are a series of AUDO chunks which contain [[PCM]] audio, and BODY chunks which presumably carry encoded video. Details of the video coding method are unknown. | + | followed by chunks: |
| + | |||
| + | u32 fourcc -- chunk [[FOURCC]] | ||
| + | u32 chunksize -- not including fourcc and chunksize fields | ||
| + | u8 payload[chunksize] -- chunk data | ||
| + | |||
| + | === PXMH chunk === | ||
| + | /PXM Header?/ | ||
| + | Carries general movie information. | ||
| + | |||
| + | u16 unknown0 | ||
| + | u16 flags | ||
| + | u16 width -- frame width in blocks | ||
| + | u16 height -- frame height in blocks | ||
| + | u16 bwidth -- block width (always 8) | ||
| + | u16 bheight -- block height (always 8) | ||
| + | u16 framerate | ||
| + | u16 numframes | ||
| + | u32 maxframe -- size of the largest BODY chunk | ||
| + | u8 descrition[32] | ||
| + | u16 audiofreq | ||
| + | u8 audiotype -- audio compression format | ||
| + | u8 audiochnl | ||
| + | ... -- the rest is unknown/unused | ||
| + | |||
| + | === CPAL === | ||
| + | 8-bit palette. Obsolete. | ||
| + | |||
| + | === MPAL === | ||
| + | Palette? Obsolete. | ||
| + | |||
| + | === BODY === | ||
| + | Contains encoded vide frame. See below. | ||
| + | |||
| + | === AUDO === | ||
| + | Contains audio fragment. See below. | ||
| + | |||
| + | == Video Compression == | ||
| + | Vide is encoded as a series of bwidth x bheight blocks (typically, 8x8), which may further be divided in to smaller blocks. Pixel format is 15-bit RGB. | ||
| + | |||
| + | Video payload format: | ||
| + | |||
| + | u16 codetable_ofs -- offset of code table bitstream (inside the chunk) | ||
| + | u16 pixels_ofs -- offsets of pixels data (inside the chunk) | ||
| + | ... | ||
| + | u8 codetable[] -- bitstream data, read bits from the lowest of each byte | ||
| + | u8 pixels[] -- encoded pixel data (bytes) | ||
| + | |||
| + | Compression is based on selective pixel color components change within the block. To decode single block: | ||
| + | |||
| + | 1. Initialize last_pixel to 0<br> | ||
| + | 2. Read the 3-bits color_mask value. This is a bit mask, indicates which pixel components will be changed (bit 0 - Red, 1 - Green, 2 - Blue). Zero value indicates the whole block is unchanged.<br> | ||
| + | 3. Read next bit. If bit is zero, decode pixel and use it to draw the whole (sub)block; otherwise<br> | ||
| + | 4. If subblock size is 2, decode each pixel of subblock and draw it; otherwise<br> | ||
| + | 5. Split the (sub)block on to 4 equial subblocks and process recursively from step 3 (left-right-top-bottom.) | ||
| + | |||
| + | |||
| + | DecodePixel operates as follows: | ||
| + | |||
| + | 1. Read next 8-bits pixel_data (from pixels[])<br> | ||
| + | 2. If high bit of pixel_data is set, pixel value is the next entry of pixels[] (lower part) combined with 7 bits of pixel_data (upper part.); otherwise<br> | ||
| + | 3. Color_index = value in bits 5-6 of pixel_data (0 - Blue, 1 - Green, 2 - Red, 3 - Skip), color_value = bits 0-4 of pixel_data. If color_index is Skip, assume pixel value is last_pixel. Otherwise, for each color component selected by color_mask, set it to color_value if it's the same component as specified by color_index, or if color_mask indicates no change of color_index component (this case is used to change two components at once.) Reuse all untouched components from last_pixel.<br> | ||
| + | 4. Set last_pixel to newly decoded pixel value. | ||
| + | |||
| + | == Audio Compression == | ||
| + | |||
| + | According to audiotype field, audio can be stored in the following formats: | ||
| + | === Type 0 - PCM16 === | ||
| + | Raw 16-bit [[PCM]] samples. | ||
| + | === Type 1 - Packed PCM16 === | ||
| + | Only high 8 bits of 16-bits sample stored. I.e. DecodedSample = data << 8. | ||
| + | === Type 2 - DPCM === | ||
| + | Decode a sample using the following [[DPCM]] table: | ||
| + | |||
| + | -32767,-30191,-27818,-25631,-23617,-21760,-20050,-18474,-17021,-15683,-14451,-13315,-12268,-11304,-10415, -9596, | ||
| + | -8842, -8147, -7506, -6916, -6373, -5872, -5410, -4985, -4593, -4232, -3899, -3593, -3310, -3050, -2810, -2589, | ||
| + | -2386, -2198, -2025, -1866, -1719, -1584, -1460, -1345, -1239, -1142, -1052, -969, -893, -823, -758, -698, | ||
| + | -643, -593, -546, -503, -464, -427, -393, -363, -334, -308, -283, -261, -241, -222, -204, -188, | ||
| + | -173, -160, -147, -135, -125, -115, -106, -97, -90, -83, -76, -70, -65, -59, -55, -50, | ||
| + | -46, -43, -39, -36, -33, -31, -28, -26, -24, -22, -20, -19, -17, -16, -14, -13, | ||
| + | -12, -11, -10, -9, -9, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3, | ||
| + | -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, 0, | ||
| + | 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, | ||
| + | 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 12, 13, | ||
| + | 14, 16, 17, 19, 20, 22, 24, 26, 28, 31, 33, 36, 39, 43, 46, 50, | ||
| + | 55, 59, 65, 70, 76, 83, 90, 97, 106, 115, 125, 135, 147, 160, 173, 188, | ||
| + | 204, 222, 241, 261, 283, 308, 334, 363, 393, 427, 464, 503, 546, 593, 643, 698, | ||
| + | 758, 823, 893, 969, 1052, 1142, 1239, 1345, 1460, 1584, 1719, 1866, 2025, 2198, 2386, 2589, | ||
| + | 2810, 3050, 3310, 3593, 3899, 4232, 4593, 4985, 5410, 5872, 6373, 6916, 7506, 8147, 8842, 9596, | ||
| + | 10415, 11304, 12268, 13315, 14451, 15683, 17021, 18474, 20050, 21760, 23617, 25631, 27818, 30191, 32767, 32767 | ||
| [[Category:Game Formats]] | [[Category:Game Formats]] | ||
Current revision
- Extensions: pmm
- Samples: http://samples.mplayerhq.hu/game-formats/krazy-ivan-pmm/
The game Krazy Ivan uses multimedia files with the extension .pmm. Carries encoded 15-bit video along with PCM or DPCM (never used) audio track.
Contents |
File Format
File structure follows general RIFF format, but uses custom chunk names. All numbers are little endian.
File begins with 4 * 3 bytes catalog header:
u32 fourcc -- "PIFF" u32 filesize -- not including fourcc and filesize fields u32 filetype -- "PXMT" /PXM Type?/
followed by chunks:
u32 fourcc -- chunk FOURCC u32 chunksize -- not including fourcc and chunksize fields u8 payload[chunksize] -- chunk data
PXMH chunk
/PXM Header?/ Carries general movie information.
u16 unknown0 u16 flags u16 width -- frame width in blocks u16 height -- frame height in blocks u16 bwidth -- block width (always 8) u16 bheight -- block height (always 8) u16 framerate u16 numframes u32 maxframe -- size of the largest BODY chunk u8 descrition[32] u16 audiofreq u8 audiotype -- audio compression format u8 audiochnl ... -- the rest is unknown/unused
CPAL
8-bit palette. Obsolete.
MPAL
Palette? Obsolete.
BODY
Contains encoded vide frame. See below.
AUDO
Contains audio fragment. See below.
Video Compression
Vide is encoded as a series of bwidth x bheight blocks (typically, 8x8), which may further be divided in to smaller blocks. Pixel format is 15-bit RGB.
Video payload format:
u16 codetable_ofs -- offset of code table bitstream (inside the chunk) u16 pixels_ofs -- offsets of pixels data (inside the chunk) ... u8 codetable[] -- bitstream data, read bits from the lowest of each byte u8 pixels[] -- encoded pixel data (bytes)
Compression is based on selective pixel color components change within the block. To decode single block:
1. Initialize last_pixel to 0
2. Read the 3-bits color_mask value. This is a bit mask, indicates which pixel components will be changed (bit 0 - Red, 1 - Green, 2 - Blue). Zero value indicates the whole block is unchanged.
3. Read next bit. If bit is zero, decode pixel and use it to draw the whole (sub)block; otherwise
4. If subblock size is 2, decode each pixel of subblock and draw it; otherwise
5. Split the (sub)block on to 4 equial subblocks and process recursively from step 3 (left-right-top-bottom.)
DecodePixel operates as follows:
1. Read next 8-bits pixel_data (from pixels[])
2. If high bit of pixel_data is set, pixel value is the next entry of pixels[] (lower part) combined with 7 bits of pixel_data (upper part.); otherwise
3. Color_index = value in bits 5-6 of pixel_data (0 - Blue, 1 - Green, 2 - Red, 3 - Skip), color_value = bits 0-4 of pixel_data. If color_index is Skip, assume pixel value is last_pixel. Otherwise, for each color component selected by color_mask, set it to color_value if it's the same component as specified by color_index, or if color_mask indicates no change of color_index component (this case is used to change two components at once.) Reuse all untouched components from last_pixel.
4. Set last_pixel to newly decoded pixel value.
Audio Compression
According to audiotype field, audio can be stored in the following formats:
Type 0 - PCM16
Raw 16-bit PCM samples.
Type 1 - Packed PCM16
Only high 8 bits of 16-bits sample stored. I.e. DecodedSample = data << 8.
Type 2 - DPCM
Decode a sample using the following DPCM table:
-32767,-30191,-27818,-25631,-23617,-21760,-20050,-18474,-17021,-15683,-14451,-13315,-12268,-11304,-10415, -9596,
-8842, -8147, -7506, -6916, -6373, -5872, -5410, -4985, -4593, -4232, -3899, -3593, -3310, -3050, -2810, -2589,
-2386, -2198, -2025, -1866, -1719, -1584, -1460, -1345, -1239, -1142, -1052, -969, -893, -823, -758, -698,
-643, -593, -546, -503, -464, -427, -393, -363, -334, -308, -283, -261, -241, -222, -204, -188,
-173, -160, -147, -135, -125, -115, -106, -97, -90, -83, -76, -70, -65, -59, -55, -50,
-46, -43, -39, -36, -33, -31, -28, -26, -24, -22, -20, -19, -17, -16, -14, -13,
-12, -11, -10, -9, -9, -8, -7, -7, -6, -6, -5, -5, -4, -4, -4, -3,
-3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, 0,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3,
4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 12, 13,
14, 16, 17, 19, 20, 22, 24, 26, 28, 31, 33, 36, 39, 43, 46, 50,
55, 59, 65, 70, 76, 83, 90, 97, 106, 115, 125, 135, 147, 160, 173, 188,
204, 222, 241, 261, 283, 308, 334, 363, 393, 427, 464, 503, 546, 593, 643, 698,
758, 823, 893, 969, 1052, 1142, 1239, 1345, 1460, 1584, 1719, 1866, 2025, 2198, 2386, 2589,
2810, 3050, 3310, 3593, 3899, 4232, 4593, 4985, 5410, 5872, 6373, 6916, 7506, 8147, 8842, 9596,
10415, 11304, 12268, 13315, 14451, 15683, 17021, 18474, 20050, 21760, 23617, 25631, 27818, 30191, 32767, 32767
