PMM: Difference between revisions

From MultimediaWiki
Jump to navigation Jump to search
m (Update samples link)
(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]]

Latest revision as of 09:06, 12 March 2011

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.

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