ima_oki_adpcm.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:9k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (c) 2007 <robs@users.sourceforge.net>
  3. ** Copyright (C) 2007-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  4. **
  5. ** This library is free software; you can redistribute it and/or modify it
  6. ** under the terms of the GNU Lesser General Public License as published by
  7. ** the Free Software Foundation; either version 2 of the License, or (at
  8. ** your option) any later version.
  9. **
  10. ** This library is distributed in the hope that it will be useful, but
  11. ** WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
  13. ** General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU Lesser General Public License
  16. ** along with this library.  If not, write to the Free Software Foundation,
  17. ** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA.
  18. */
  19. /* ADPCM: IMA, OKI <==> 16-bit PCM. */
  20. #include "sfconfig.h"
  21. #include <string.h>
  22. /* Set up for libsndfile environment: */
  23. #include "common.h"
  24. #include "ima_oki_adpcm.h"
  25. #define MIN_SAMPLE -0x8000
  26. #define MAX_SAMPLE 0x7fff
  27. static int const ima_steps [] = /* ~16-bit precision */
  28. { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
  29. 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230,
  30. 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963,
  31. 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
  32. 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442,
  33. 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794,
  34. 32767
  35. } ;
  36. static int const oki_steps [] = /* ~12-bit precision */
  37. { 256, 272, 304, 336, 368, 400, 448, 496, 544, 592, 656, 720, 800, 880, 960,
  38. 1056, 1168, 1280, 1408, 1552, 1712, 1888, 2080, 2288, 2512, 2768, 3040, 3344,
  39. 3680, 4048, 4464, 4912, 5392, 5936, 6528, 7184, 7904, 8704, 9568, 10528,
  40. 11584, 12736, 14016, 15408, 16960, 18656, 20512, 22576, 24832
  41. } ;
  42. static int const step_changes [] = { -1, -1, -1, -1, 2, 4, 6, 8 } ;
  43. void
  44. ima_oki_adpcm_init (IMA_OKI_ADPCM * state, IMA_OKI_ADPCM_TYPE type)
  45. {
  46. memset (state, 0, sizeof (*state)) ;
  47. if (type == IMA_OKI_ADPCM_TYPE_IMA)
  48. { state->max_step_index = ARRAY_LEN (ima_steps) - 1 ;
  49. state->steps = ima_steps ;
  50. state->mask = (~0) ;
  51. }
  52. else
  53. { state->max_step_index = ARRAY_LEN (oki_steps) - 1 ;
  54. state->steps = oki_steps ;
  55. state->mask = (~0) << 4 ;
  56. } ;
  57. } /* ima_oki_adpcm_init */
  58. int
  59. adpcm_decode (IMA_OKI_ADPCM * state, int code)
  60. { int s ;
  61. s = ((code & 7) << 1) | 1 ;
  62. s = ((state->steps [state->step_index] * s) >> 3) & state->mask ;
  63. if (code & 8)
  64.      s = -s ;
  65. s += state->last_output ;
  66. if (s < MIN_SAMPLE || s > MAX_SAMPLE)
  67. { int grace ;
  68. grace = (state->steps [state->step_index] >> 3) & state->mask ;
  69. if (s < MIN_SAMPLE - grace || s > MAX_SAMPLE + grace)
  70. state->errors ++ ;
  71. s = s < MIN_SAMPLE ? MIN_SAMPLE : MAX_SAMPLE ;
  72. } ;
  73. state->step_index += step_changes [code & 7] ;
  74. state->step_index = SF_MIN (SF_MAX (state->step_index, 0), state->max_step_index) ;
  75. state->last_output = s ;
  76. return s ;
  77. } /* adpcm_decode */
  78. int
  79. adpcm_encode (IMA_OKI_ADPCM * state, int sample)
  80. { int delta, sign = 0, code ;
  81. delta = sample - state->last_output ;
  82. if (delta < 0)
  83. { sign = 8 ;
  84. delta = -delta ;
  85. } ;
  86. code = 4 * delta / state->steps [state->step_index] ;
  87. code = sign | SF_MIN (code, 7) ;
  88. adpcm_decode (state, code) ; /* Update encoder state */
  89. return code ;
  90. } /* adpcm_encode */
  91. void
  92. ima_oki_adpcm_decode_block (IMA_OKI_ADPCM * state)
  93. { unsigned char code ;
  94. int k ;
  95. for (k = 0 ; k < state->code_count ; k++)
  96. { code = state->codes [k] ;
  97. state->pcm [2 * k] = adpcm_decode (state, code >> 4) ;
  98. state->pcm [2 * k + 1] = adpcm_decode (state, code) ;
  99. } ;
  100. state->pcm_count = 2 * k ;
  101. } /* ima_oki_adpcm_decode_block */
  102. void
  103. ima_oki_adpcm_encode_block (IMA_OKI_ADPCM * state)
  104. { unsigned char code ;
  105. int k ;
  106. /*
  107. ** The codec expects an even number of input samples.
  108. **
  109. ** Samples should always be passed in even length blocks. If the last block to
  110. ** be encoded is odd length, extend that block by one zero valued sample.
  111. */
  112. if (state->pcm_count % 2 == 1)
  113. state->pcm [state->pcm_count ++] = 0 ;
  114. for (k = 0 ; k < state->pcm_count / 2 ; k++)
  115. { code = adpcm_encode (state, state->pcm [2 * k]) << 4 ;
  116. code |= adpcm_encode (state, state->pcm [2 * k + 1]) ;
  117. state->codes [k] = code ;
  118. } ;
  119. state->code_count = k ;
  120. } /* ima_oki_adpcm_encode_block */
  121. #ifdef TEST
  122. static const unsigned char test_codes [] =
  123. { 0x08, 0x08, 0x04, 0x7f, 0x72, 0xf7, 0x9f, 0x7c, 0xd7, 0xbc, 0x7a, 0xa7, 0xb8,
  124. 0x4b, 0x0b, 0x38, 0xf6, 0x9d, 0x7a, 0xd7, 0xbc, 0x7a, 0xd7, 0xa8, 0x6c, 0x81,
  125. 0x98, 0xe4, 0x0e, 0x7a, 0xd7, 0x9e, 0x7b, 0xc7, 0xab, 0x7a, 0x85, 0xc0, 0xb3,
  126. 0x8f, 0x58, 0xd7, 0xad, 0x7a, 0xd7, 0xad, 0x7a, 0x87, 0xd0, 0x2b, 0x0e, 0x48,
  127. 0xd7, 0xad, 0x78, 0xf7, 0xbc, 0x7a, 0xb7, 0xa8, 0x4b, 0x88, 0x18, 0xd5, 0x8d,
  128. 0x6a, 0xa4, 0x98, 0x08, 0x00, 0x80, 0x88,
  129. } ;
  130. static const short test_pcm [] =
  131. { 32, 0, 32, 0, 32, 320, 880, -336, 2304, 4192, -992, 10128, 5360, -16352,
  132. 30208, 2272, -31872, 14688, -7040, -32432, 14128, -1392, -15488, 22960,
  133. 1232, -1584, 21488, -240, 2576, -15360, 960, -1152, -30032, 10320, 1008,
  134. -30032, 16528, 1008, -30032, 16528, -5200, -30592, 15968, 448, -30592,
  135. 15968, 448, -2368, 30960, 3024, -80, 8384, 704, -1616, -29168, -1232, 1872,
  136. -32768, 13792, -1728, -32768, 13792, 4480, -32192, 14368, -7360, -32752,
  137. 13808, -1712, -21456, 16992, 1472, -1344, 26848, -1088, 2016, -17728, 208,
  138. -2112, -32768, 1376, -1728, -32768, 13792, -1728, -32768, 13792, -1728,
  139. -32768, 13792, -1728, -32768, 13792, -1728, -4544, 32767, -1377, 1727,
  140. 15823, -2113, 207, -27345, 591, -2513, -32768, 13792, -1728, -32768, 13792,
  141. 10688, -31632, 14928, -6800, -32192, 14368, -1152, -20896, 17552, 2032,
  142. -784, 22288, 560, -2256, -4816, 2176, 64, -21120, 9920, 6816, -24224, 16128,
  143. 608, -13488, 9584, 272, -2544, 16, -2304, -192, 1728, -16, 1568, 128, -1184,
  144. } ;
  145. static void
  146. test_oki_adpcm (void)
  147. {
  148. IMA_OKI_ADPCM adpcm ;
  149. unsigned char code ;
  150. int i, j ;
  151. printf ("    Testing encoder          : ") ;
  152. fflush (stdout) ;
  153. ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
  154. for (i = 0 ; i < ARRAY_LEN (test_codes) ; i++)
  155. for (j = 0, code = test_codes [i] ; j < 2 ; j++, code <<= 4)
  156. if (adpcm_decode (&adpcm, code >> 4) != test_pcm [2 * i + j])
  157. { printf ("nnFail at i = %d, j = %d.nn", i, j) ;
  158. exit (1) ;
  159. } ;
  160. puts ("ok") ;
  161. printf ("    Testing decoder          : ") ;
  162. fflush (stdout) ;
  163. ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
  164. for (i = 0 ; i < ARRAY_LEN (test_pcm) ; i += j)
  165. { code = adpcm_encode (&adpcm, test_pcm [i]) ;
  166. code = (code << 4) | adpcm_encode (&adpcm, test_pcm [i + 1]) ;
  167. if (code != test_codes [i / 2])
  168. { printf ("nnFail at i = %d, %d should be %dnn", i, code, test_codes [i / 2]) ;
  169. exit (1) ;
  170. } ;
  171. } ;
  172. puts ("ok") ;
  173. } /* test_oki_adpcm */
  174. static void
  175. test_oki_adpcm_block (void)
  176. {
  177. IMA_OKI_ADPCM adpcm ;
  178. int k ;
  179. if (ARRAY_LEN (adpcm.pcm) < ARRAY_LEN (test_pcm))
  180. { printf ("nnLine %d : ARRAY_LEN (adpcm->pcm) > ARRAY_LEN (test_pcm) (%d > %d).nn", __LINE__, ARRAY_LEN (adpcm.pcm), ARRAY_LEN (test_pcm)) ;
  181. exit (1) ;
  182. } ;
  183. if (ARRAY_LEN (adpcm.codes) < ARRAY_LEN (test_codes))
  184. { printf ("nnLine %d : ARRAY_LEN (adcodes->codes) > ARRAY_LEN (test_codes).n", __LINE__) ;
  185. exit (1) ;
  186. } ;
  187. printf ("    Testing block encoder    : ") ;
  188. fflush (stdout) ;
  189. ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
  190. memcpy (adpcm.pcm, test_pcm, sizeof (adpcm.pcm [0]) * ARRAY_LEN (test_pcm)) ;
  191. adpcm.pcm_count = ARRAY_LEN (test_pcm) ;
  192. adpcm.code_count = 13 ;
  193. ima_oki_adpcm_encode_block (&adpcm) ;
  194. if (adpcm.code_count * 2 != ARRAY_LEN (test_pcm))
  195. { printf ("nnLine %d : %d * 2 != %dnn", __LINE__, adpcm.code_count * 2, ARRAY_LEN (test_pcm)) ;
  196. exit (1) ;
  197. } ;
  198. for (k = 0 ; k < ARRAY_LEN (test_codes) ; k++)
  199. if (adpcm.codes [k] != test_codes [k])
  200. { printf ("nnLine %d : Fail at k = %d, %d should be %dnn", __LINE__, k, adpcm.codes [k], test_codes [k]) ;
  201. exit (1) ;
  202. } ;
  203. puts ("ok") ;
  204. printf ("    Testing block decoder    : ") ;
  205. fflush (stdout) ;
  206. ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ;
  207. memcpy (adpcm.codes, test_codes, sizeof (adpcm.codes [0]) * ARRAY_LEN (test_codes)) ;
  208. adpcm.code_count = ARRAY_LEN (test_codes) ;
  209. adpcm.pcm_count = 13 ;
  210. ima_oki_adpcm_decode_block (&adpcm) ;
  211. if (adpcm.pcm_count != 2 * ARRAY_LEN (test_codes))
  212. { printf ("nnLine %d : %d * 2 != %dnn", __LINE__, adpcm.pcm_count, 2 * ARRAY_LEN (test_codes)) ;
  213. exit (1) ;
  214. } ;
  215. for (k = 0 ; k < ARRAY_LEN (test_pcm) ; k++)
  216. if (adpcm.pcm [k] != test_pcm [k])
  217. { printf ("nnLine %d : Fail at i = %d, %d should be %d.nn", __LINE__, k, adpcm.pcm [k], test_pcm [k]) ;
  218. exit (1) ;
  219. } ;
  220. puts ("ok") ;
  221. } /* test_oki_adpcm_block */
  222. int
  223. main (void)
  224. {
  225. test_oki_adpcm () ;
  226. test_oki_adpcm_block () ;
  227. return 0 ;
  228. } /* main */
  229. #endif