adpcm.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /****************************************
  2. *****************************************/
  3. #include "adpcm.h"
  4. // define the resampling struct information
  5. #define FRAC_BITS 16
  6. #define FRAC (1 << FRAC_BITS)
  7. /* Intel ADPCM step variation table */
  8. static const int indexTable[16] = {
  9. -1, -1, -1, -1, 2, 4, 6, 8,
  10. -1, -1, -1, -1, 2, 4, 6, 8,
  11. };
  12. static const int stepsizeTable[89] = {
  13. 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
  14. 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
  15. 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
  16. 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
  17. 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
  18. 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
  19. 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
  20. 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
  21. 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
  22. };
  23. extern unsigned char wav_first_flag;
  24. void adpcm_decoder(char indata[], short outdata[], int len, adpcm_state *state, int avi_flag)
  25. {
  26. signed char *inp; /* Input buffer pointer */
  27. short *outp; /* output buffer pointer */
  28. int sign; /* Current adpcm sign bit */
  29. int delta; /* Current adpcm output value */
  30. int step; /* Stepsize */
  31. int valpred; /* Predicted value */
  32. int vpdiff; /* Current change to valpred */
  33. int index; /* Current step change index */
  34. int inputbuffer = 0; /* place to keep next 4-bit value */
  35. int bufferstep; /* toggle between inputbuffer/input */
  36. //int *outLR;
  37. //int length = len;
  38. outp = outdata;
  39. //outLR = (int*)outdata;
  40. inp = (signed char *)indata;
  41. valpred = state->valprev;
  42. index = state->index;
  43. step = stepsizeTable[index];
  44. bufferstep = 0;
  45. for( ; len > 0 ; len-- ) {
  46. /* Step 1 - get the delta value */
  47. if(avi_flag)
  48. {
  49. if ( !bufferstep )
  50. {
  51. inputbuffer = *inp++;
  52. delta = inputbuffer & 0xf;
  53. }
  54. else
  55. {
  56. delta = (inputbuffer >> 4) & 0xf;
  57. }
  58. }
  59. else
  60. {
  61. if ( bufferstep )
  62. {
  63. delta = inputbuffer & 0xf;
  64. }
  65. else
  66. {
  67. inputbuffer = *inp++;
  68. delta = (inputbuffer >> 4) & 0xf;
  69. }
  70. }
  71. bufferstep = !bufferstep;
  72. /* Step 2 - Find new index value (for later) */
  73. index += indexTable[delta];
  74. if ( index < 0 )
  75. index = 0;
  76. if ( index > 88 )
  77. index = 88;
  78. /* Step 3 - Separate sign and magnitude */
  79. sign = delta & 8;
  80. delta = delta & 7;
  81. /* Step 4 - Compute difference and new predicted value */
  82. /*
  83. ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
  84. ** in adpcm_coder. */
  85. vpdiff = step >> 3;
  86. if ( delta & 4 )
  87. vpdiff += step;
  88. if ( delta & 2 )
  89. vpdiff += step>>1;
  90. if ( delta & 1 )
  91. vpdiff += step>>2;
  92. if ( sign )
  93. valpred -= vpdiff;
  94. else
  95. valpred += vpdiff;
  96. /* Step 5 - clamp output value */
  97. if ( valpred > 32767 )
  98. valpred = 32767;
  99. else if ( valpred < -32768 )
  100. valpred = -32768;
  101. /* Step 6 - Update step value */
  102. step = stepsizeTable[index];
  103. /* Step 7 - Output value */
  104. #if 0
  105. *outLR++ = (valpred&0xffff)|(valpred<<16);
  106. #else
  107. *outp++ = valpred;
  108. //*outp++ = valpred;//
  109. #endif
  110. }
  111. state->valprev = valpred;
  112. state->index = index;
  113. }