Covox ADPCM: Difference between revisions

From MultimediaWiki
Jump to navigation Jump to search
m (→‎4-bit ADPCM: make a numbered list)
(Fill info about 3- and 2-bit ADPCM too)
Line 23: Line 23:
* FF AA AA AA - end of sound
* FF AA AA AA - end of sound


== 4-bit ADPCM ==
For 3-bit ADPCM they are cut to 3 bytes (FF 55 55 and FF AA AA respectively).
 
After silence block ADPCM decoding state should be reset.
 
== ADPCM decoding ==
 
This is generalized decoding procedure for all know ADPCM variants. <i>n</i> will denote the number of bits used in ADPCM (<i>n</i>=2 for 2-bit ADPCM, etc).


Decoding procedure:
Decoding procedure:
# read 4 bytes
# look at the next 3 or 4 bytes, if they make a marker, do action for this marker
# if they make a marker, do action for this marker
# read <i>n</i> bytes
# decode 8 deltas from it by taking high bits from 4 values and shifting them
# decode 8 deltas from them by taking high bits from <i>n</i> values and shifting them
# apply these deltas to get decoded values
# apply these deltas to get decoded values


Update procedure:
Update procedure:


  mul = step_table[step] * mult_table[delta & 7];
high_bit = 1 << (n-1);
  if(delta & 8)
low_bits = (1 << (n-1)) - 1;
  mul = step_table[step] * mult_table[delta & low_bits];
  if(delta & high_bit)
   val -= mul;
   val -= mul;
  else  
  else  
   val += mul;
   val += mul;
  val = clip(val, 0, 0xFFFF);
  val = clip(val, 0, 0xFFFF);
  step = clip(step + step_update_table[delta & 7], 0, 71);
  step = clip(step + step_update_table[delta & low_bits], 0, step_max);
 
== ADPCM Tables ==


Step table:
{| border="1" cellpadding="5" style="border-collapse: collapse; border-style: dashed; border-color: #2f6fab;"
|- bgcolor="#f0f0f0" |
! Value !! 4-bit ADPCM !! 3-bit ADPCM !! 2-bit ADPCM
|-
| Max. step value || 72 || 96 || 80
|-
| Step update table
| -8, -6, -4, -2, 2, 4, 8, 16
| -4, -2, 4, 16
| -6, 6
|-
| Multiplication table
| 0.5, 1.0, 2.0, 3.0, 4.5, 5.0, 9.0, 12.0
| 1.0, 1.5, 2.0, 2.5
| 1.0, 3.0
|}
 
Step table (it has much more values than needed):


  0x0080, 0x008C, 0x0098, 0x00A6, 0x00B5, 0x00C5, 0x00D7, 0x00EB,
  0x0080, 0x008C, 0x0098, 0x00A6, 0x00B5, 0x00C5, 0x00D7, 0x00EB,
Line 51: Line 78:
  0x2000, 0x22E5, 0x260E, 0x2980, 0x2D41, 0x315A, 0x35D1, 0x3AB0,
  0x2000, 0x22E5, 0x260E, 0x2980, 0x2D41, 0x315A, 0x35D1, 0x3AB0,
  0x4000, 0x45CB, 0x4C1C, 0x52FF, 0x5A82, 0x62B4, 0x6BA2, 0x7560,
  0x4000, 0x45CB, 0x4C1C, 0x52FF, 0x5A82, 0x62B4, 0x6BA2, 0x7560,
  0x8000, 0x8B96, 0x9838, 0xA5FF, 0xB505, 0xC567, 0xD745, 0xEAC1
  0x8000, 0x8B96, 0x9838, 0xA5FF, 0xB505, 0xC567, 0xD745, 0xEAC1,
 
Step update table:
0x00C0, 0x00D1, 0x00E4, 0x00F9, 0x0110, 0x0128, 0x0143, 0x0160,
 
0x0180, 0x01A3, 0x01C9, 0x01F2, 0x021F, 0x0250, 0x0286, 0x02C0,
  -8, -6, -4, -2, 2, 4, 8, 16};
0x0300, 0x0346, 0x0391, 0x03E4, 0x043E, 0x04A0, 0x050C, 0x0581,
Multiplication table:
0x0600, 0x068B, 0x0723, 0x07C8, 0x087C, 0x0941, 0x0A17, 0x0B01,
 
0x0C00, 0x0D16, 0x0E45, 0x0F90, 0x10F8, 0x1282, 0x142E, 0x1602,
  0.5, 1.0, 2.0, 3.0, 4.5, 5.0, 9.0, 12.0};
0x1800, 0x1A2C, 0x1C8A, 0x1F20, 0x21F1, 0x2503, 0x285D, 0x2C04,
 
== 3-bit ADPCM ==
0x0240, 0x0274, 0x02AD, 0x02EB, 0x032F, 0x0378, 0x03C9, 0x0420,
 
0x0480, 0x04E8, 0x055A, 0x05D6, 0x065D, 0x06F1, 0x0791, 0x0841,
== 2-bit ADPCM ==
0x0900, 0x09D1, 0x0AB4, 0x0BAC, 0x0CBA, 0x0DE1, 0x0F23, 0x1082,
 
0x1200, 0x13A1, 0x1568, 0x1758, 0x1975, 0x1BC3, 0x1E46, 0x2103,
0x2400, 0x2742, 0x2AD0, 0x2EB0, 0x32E9, 0x3785, 0x3C8B, 0x4206,
0x4800, 0x4E84, 0x559F, 0x5D5F, 0x65D3, 0x6F0A, 0x7917, 0x840C,
0x02C0, 0x0300, 0x0345, 0x0391, 0x03E4, 0x043E, 0x04A0, 0x050B,
  0x0580, 0x05FF, 0x068A, 0x0722, 0x07C7, 0x087B, 0x0940, 0x0A16,
0x0B00, 0x0BFF, 0x0D15, 0x0E44, 0x0F8E, 0x10F7, 0x1280, 0x142D,
0x1600, 0x17FE, 0x1A2A, 0x1C88, 0x1F1D, 0x21EE, 0x2500, 0x2859,
0x2C00, 0x2FFB, 0x3453, 0x3910, 0x3E3A, 0x43DB, 0x4A00, 0x50B2,
0x5800, 0x5FF7, 0x68A6, 0x721F, 0x7C73, 0x87B7, 0x93FF, 0xA165,
  0x03C0, 0x0417, 0x0476, 0x04DD, 0x054E, 0x05C9, 0x064F, 0x06E1,
0x0780, 0x082E, 0x08EB, 0x09BA, 0x0A9B, 0x0B91, 0x0C9D, 0x0DC1,
0x0F00, 0x105C, 0x11D7, 0x1374, 0x1537, 0x1722, 0x193A, 0x1B83,
0x1E00, 0x20B7, 0x23AD, 0x26E8, 0x2A6D, 0x2E44, 0x3274, 0x3705,
0x3C00, 0x416E, 0x475A, 0x4DCF, 0x54DA, 0x5C88, 0x64E8, 0x6E0A,
0x7800, 0x82DC, 0x8EB4, 0x9B9F, 0xA9B5, 0xB911, 0xC9D1, 0xDC15


[[Category:Audio Codecs]]
[[Category:Audio Codecs]]
[[Category:ADPCM Audio Codecs]]
[[Category:ADPCM Audio Codecs]]
[[Category:Undiscovered Audio Codecs]]
[[Category:Undiscovered Audio Codecs]]

Revision as of 23:26, 2 April 2007

This is a family of ADPCM formats used for compressing 8-bit unsigned PCM for Covox Sound Master. There are 2-,3- and 4-bit ADPCM formats.

Header

File header consists of 16 bytes:

 FF 55 FF AA FF 55 FF AA
 <type> - 1 byte
 unknown/unused - 7 bytes

Type may be one of the following:

  • 0x08 - raw 8-bit unsigned PCM
  • 0x82 - 2-bit ADPCM
  • 0x83 - 3-bit ADPCM
  • 0x84 - 4-bit ADPCM

Markers

There are two types of markers known:

  • FF 55 55 55 - silence block, next 16-bit little-endian value specifies number of silence samples - 27
  • FF AA AA AA - end of sound

For 3-bit ADPCM they are cut to 3 bytes (FF 55 55 and FF AA AA respectively).

After silence block ADPCM decoding state should be reset.

ADPCM decoding

This is generalized decoding procedure for all know ADPCM variants. n will denote the number of bits used in ADPCM (n=2 for 2-bit ADPCM, etc).

Decoding procedure:

  1. look at the next 3 or 4 bytes, if they make a marker, do action for this marker
  2. read n bytes
  3. decode 8 deltas from them by taking high bits from n values and shifting them
  4. apply these deltas to get decoded values

Update procedure:

high_bit = 1 << (n-1);
low_bits = (1 << (n-1)) - 1;
mul = step_table[step] * mult_table[delta & low_bits];
if(delta & high_bit)
 val -= mul;
else 
 val += mul;
val = clip(val, 0, 0xFFFF);
step = clip(step + step_update_table[delta & low_bits], 0, step_max);

ADPCM Tables

Value 4-bit ADPCM 3-bit ADPCM 2-bit ADPCM
Max. step value 72 96 80
Step update table -8, -6, -4, -2, 2, 4, 8, 16 -4, -2, 4, 16 -6, 6
Multiplication table 0.5, 1.0, 2.0, 3.0, 4.5, 5.0, 9.0, 12.0 1.0, 1.5, 2.0, 2.5 1.0, 3.0

Step table (it has much more values than needed):

0x0080, 0x008C, 0x0098, 0x00A6, 0x00B5, 0x00C5, 0x00D7, 0x00EB,
0x0100, 0x0117, 0x0130, 0x014C, 0x016A, 0x018B, 0x01AF, 0x01D6,
0x0200, 0x022E, 0x0261, 0x0298, 0x02D4, 0x0316, 0x035D, 0x03AB,
0x0400, 0x045D, 0x04C2, 0x0530, 0x05A8, 0x062B, 0x06BA, 0x0756,
0x0800, 0x08B9, 0x0983, 0x0A60, 0x0B50, 0x0C56, 0x0D74, 0x0EAC,
0x1000, 0x1173, 0x1307, 0x14C0, 0x16A1, 0x18AD, 0x1AE9, 0x1D58,
0x2000, 0x22E5, 0x260E, 0x2980, 0x2D41, 0x315A, 0x35D1, 0x3AB0,
0x4000, 0x45CB, 0x4C1C, 0x52FF, 0x5A82, 0x62B4, 0x6BA2, 0x7560,
0x8000, 0x8B96, 0x9838, 0xA5FF, 0xB505, 0xC567, 0xD745, 0xEAC1,

0x00C0, 0x00D1, 0x00E4, 0x00F9, 0x0110, 0x0128, 0x0143, 0x0160,
0x0180, 0x01A3, 0x01C9, 0x01F2, 0x021F, 0x0250, 0x0286, 0x02C0,
0x0300, 0x0346, 0x0391, 0x03E4, 0x043E, 0x04A0, 0x050C, 0x0581,
0x0600, 0x068B, 0x0723, 0x07C8, 0x087C, 0x0941, 0x0A17, 0x0B01,
0x0C00, 0x0D16, 0x0E45, 0x0F90, 0x10F8, 0x1282, 0x142E, 0x1602,
0x1800, 0x1A2C, 0x1C8A, 0x1F20, 0x21F1, 0x2503, 0x285D, 0x2C04,

0x0240, 0x0274, 0x02AD, 0x02EB, 0x032F, 0x0378, 0x03C9, 0x0420,
0x0480, 0x04E8, 0x055A, 0x05D6, 0x065D, 0x06F1, 0x0791, 0x0841,
0x0900, 0x09D1, 0x0AB4, 0x0BAC, 0x0CBA, 0x0DE1, 0x0F23, 0x1082,
0x1200, 0x13A1, 0x1568, 0x1758, 0x1975, 0x1BC3, 0x1E46, 0x2103,
0x2400, 0x2742, 0x2AD0, 0x2EB0, 0x32E9, 0x3785, 0x3C8B, 0x4206,
0x4800, 0x4E84, 0x559F, 0x5D5F, 0x65D3, 0x6F0A, 0x7917, 0x840C,

0x02C0, 0x0300, 0x0345, 0x0391, 0x03E4, 0x043E, 0x04A0, 0x050B,
0x0580, 0x05FF, 0x068A, 0x0722, 0x07C7, 0x087B, 0x0940, 0x0A16,
0x0B00, 0x0BFF, 0x0D15, 0x0E44, 0x0F8E, 0x10F7, 0x1280, 0x142D,
0x1600, 0x17FE, 0x1A2A, 0x1C88, 0x1F1D, 0x21EE, 0x2500, 0x2859,
0x2C00, 0x2FFB, 0x3453, 0x3910, 0x3E3A, 0x43DB, 0x4A00, 0x50B2,
0x5800, 0x5FF7, 0x68A6, 0x721F, 0x7C73, 0x87B7, 0x93FF, 0xA165,

0x03C0, 0x0417, 0x0476, 0x04DD, 0x054E, 0x05C9, 0x064F, 0x06E1,
0x0780, 0x082E, 0x08EB, 0x09BA, 0x0A9B, 0x0B91, 0x0C9D, 0x0DC1,
0x0F00, 0x105C, 0x11D7, 0x1374, 0x1537, 0x1722, 0x193A, 0x1B83,
0x1E00, 0x20B7, 0x23AD, 0x26E8, 0x2A6D, 0x2E44, 0x3274, 0x3705,
0x3C00, 0x416E, 0x475A, 0x4DCF, 0x54DA, 0x5C88, 0x64E8, 0x6E0A,
0x7800, 0x82DC, 0x8EB4, 0x9B9F, 0xA9B5, 0xB911, 0xC9D1, 0xDC15