Xbox ADPCM

From xboxdevwiki
Revision as of 11:12, 28 June 2017 by JayFoxRox (talk | contribs) (Block format)
Jump to: navigation, search

Xbox used it's own WAV file format to encode ADPCM data. This format is often called Xbox ADPCM.

Standard IMA ADPCM WAV files would use format code 0x0011, whereas Xbox ADPCM files use format-code 0x0069.

There are always 1 (Mono) or 2 (Stereo) channels[citation needed].

All Xbox ADPCM files seem to store 64 ADPCM input nibbles per block. This value is also stored in the 'fmt ' extra-data which is always 2 bytes, containing the Bytes 0x40, 0x00 (64 as unsigned 16-bit integer). Because of that, all Xbox ADPCM files will have a block alignment of 36 (Mono) or 72 (Stereo) Bytes. As the decoder-setup in every block contains a predictor for each channel, there will be 65 samples / channel output per block (65:36 compression ratio = 44.6% compression).

Aside from what was mentioned, there are no known differences to IMA ADPCM. This is probably because the APU VP will decode ADPCM in hardware. Microsoft probably had little control over the APU ADPCM implementation and had to stay compatible to standard ADPCM. Players supporting IMA ADPCM also support Xbox ADPCM. However, they might reject files due to the different format-code.

Block format

Same as IMA ADPCM

In the following tables, the following notation is used:

  • W# denotes a 32-bit word
  • B# denotes a Byte (8-bit)
  • P denotes the ADPCM predictor for the block
  • SI denotes the Step-Index for the block
  • S# denotes a sample
  • Background color denotes the channel:
    • Blue: Left = Right
    • White: Left
    • Red: Right
  • All indices start at 0

Mono

[FIXME]

32-bit word W0 W1 W2 ... W7 W8
Byte B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B28 B29 B30 B31 B32 B33 B34 B35
Meaning P = S0 SI S2 S1 S4 S3 S6 S5 S8 S7 S10 S9 S12 S11 S14 S13 S16 S15 S50 S49 S52 S51 S54 S53 S56 S55 S58 S57 S60 S59 S62 S61 S64 S63

Stereo

[FIXME]

32-bit word W0 W1 W2 W3 W4
Byte B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
Meaning P = S0 SI P = S0 SI S2 S1 S4 S3 S6 S5 S8 S7 S2 S1 S4 S3 S6 S5 S8 S7 S10 S9 S12 S11 S14 S13 S16 S15

...

32-bit word W14 W15 W16 W17
Byte B56 B57 B58 B59 B60 B61 B62 B63 B64 B65 B66 B67 B68 B69 B70 B71
Meaning S50 S49 S52 S51 S54 S53 S56 S55 S50 S49 S52 S51 S54 S53 S56 S55 S58 S57 S60 S59 S62 S61 S64 S63 S58 S57 S60 S59 S62 S61 S64 S63

Index-Table

Same as IMA ADPCM

+0 +1 +2 +3 +4 +5 +6 +7
0 -1 -1 -1 -1 2 4 6 8
8 -1 -1 -1 -1 2 4 6 8

Step-Table

Same as IMA ADPCM

+0 +1 +2 +3 +4 +5 +6 +7 +8 +9
0 7 8 9 10 11 12 13 14 16 17
10 19 21 23 25 28 31 34 37 41 45
20 50 55 60 66 73 80 88 97 107 118
30 130 143 157 173 190 209 230 253 279 307
40 337 371 408 449 494 544 598 658 724 796
50 876 963 1060 1166 1282 1411 1552 1707 1878 2066
60 2272 2499 2749 3024 3327 3660 4026 4428 4871 5358
70 5894 6484 7132 7845 8630 9493 10442 11487 12635 13899
80 15289 16818 18500 20350 22385 24623 27086 29794 32767

Algorithm

The algorithms for encoding and decoding are the same as IMA ADPCM. For an example implementation and an explanation, refer to the related links.

Related links