Difference between revisions of "Xan DPCM"

From MultimediaWiki
Jump to navigation Jump to search
(also a game format)
Line 10: Line 10:

     byte = next byte in stream
     byte = next byte in stream
     diff = (byte & 0xFC) << 8
     diff = (byte
    if bottom 2 bits of byte are both 1 (byte & 0x03)
        shifter -= (2 * (byte & 3))
    note that the shift value may not go below 0 and must be saturated here
    shift diff right by shifter value
    apply diff to the current predictor
    saturate predictor to signed, 16-bit range
Note that diff must be treated as a signed 16-bit number. For stereo data, the bytes represent interleaved samples in LRLR order.
[[Category:Audio Codecs]]
[[Category:DPCM Audio Codecs]]
[[Category:Game Formats]]

Revision as of 22:49, 10 April 2007

Company: Origin Systems

Origin's Wing Commander IV: The Price of Freedom computer game transports multimedia cutscenes in standard Microsoft AVI files. The audio in these files is encoded using a custom format that this page takes the liberty of naming Xan DPCM.

Note that an AVI file demuxer will probably need to be modified to support the algorithm. The WAVEFORMATEX headers in the Xan AVI files report the audio coding as format 0x0001: PCM. However, the file's 'auds' chunk begins with the fourcc 'Axan'. A program can either check for this or assume that the file uses Xan DPCM if it uses Xan video.

Classifying the Xan audio coding method as a DPCM algorithm is a little shaky. It actually resembles a cross between a DPCM algorithm and a APDCM algorithm. Perhaps the designers could not decide between the two algorithm families and decided to split the difference. The algorithm encodes 16-bit PCM samples as 8-bit bytes by packing a 6-bit delta value along with a 2-bit delta modifier into a byte.

For each chunk of Xan DPCM data, the first 2 or 4 bytes are the initial predictors for that chunk, depending on mono or stereo data, and are encoded as signed, 16-bit, little-endian numbers. A shifter value for each channel is initialized to 4. For each byte in the stream (assuming mono data):

   byte = next byte in stream
   diff = (byte