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

Audio

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
  3.  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
  4.  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  5.  */
  6. #include "gsm610_priv.h"
  7. #include "gsm.h"
  8. int gsm_decode (gsm s, gsm_byte * c, gsm_signal * target)
  9. {
  10. word   LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
  11. #ifdef WAV49
  12. if (s->wav_fmt) {
  13. uword sr = 0;
  14. s->frame_index = !s->frame_index;
  15. if (s->frame_index) {
  16. sr = *c++;
  17. LARc[0] = sr & 0x3f;  sr >>= 6;
  18. sr |= (uword)*c++ << 2;
  19. LARc[1] = sr & 0x3f;  sr >>= 6;
  20. sr |= (uword)*c++ << 4;
  21. LARc[2] = sr & 0x1f;  sr >>= 5;
  22. LARc[3] = sr & 0x1f;  sr >>= 5;
  23. sr |= (uword)*c++ << 2;
  24. LARc[4] = sr & 0xf;  sr >>= 4;
  25. LARc[5] = sr & 0xf;  sr >>= 4;
  26. sr |= (uword)*c++ << 2; /* 5 */
  27. LARc[6] = sr & 0x7;  sr >>= 3;
  28. LARc[7] = sr & 0x7;  sr >>= 3;
  29. sr |= (uword)*c++ << 4;
  30. Nc[0] = sr & 0x7f;  sr >>= 7;
  31. bc[0] = sr & 0x3;  sr >>= 2;
  32. Mc[0] = sr & 0x3;  sr >>= 2;
  33. sr |= (uword)*c++ << 1;
  34. xmaxc[0] = sr & 0x3f;  sr >>= 6;
  35. xmc[0] = sr & 0x7;  sr >>= 3;
  36. sr = *c++;
  37. xmc[1] = sr & 0x7;  sr >>= 3;
  38. xmc[2] = sr & 0x7;  sr >>= 3;
  39. sr |= (uword)*c++ << 2;
  40. xmc[3] = sr & 0x7;  sr >>= 3;
  41. xmc[4] = sr & 0x7;  sr >>= 3;
  42. xmc[5] = sr & 0x7;  sr >>= 3;
  43. sr |= (uword)*c++ << 1; /* 10 */
  44. xmc[6] = sr & 0x7;  sr >>= 3;
  45. xmc[7] = sr & 0x7;  sr >>= 3;
  46. xmc[8] = sr & 0x7;  sr >>= 3;
  47. sr = *c++;
  48. xmc[9] = sr & 0x7;  sr >>= 3;
  49. xmc[10] = sr & 0x7;  sr >>= 3;
  50. sr |= (uword)*c++ << 2;
  51. xmc[11] = sr & 0x7;  sr >>= 3;
  52. xmc[12] = sr & 0x7;  sr >>= 3;
  53. sr |= (uword)*c++ << 4;
  54. Nc[1] = sr & 0x7f;  sr >>= 7;
  55. bc[1] = sr & 0x3;  sr >>= 2;
  56. Mc[1] = sr & 0x3;  sr >>= 2;
  57. sr |= (uword)*c++ << 1;
  58. xmaxc[1] = sr & 0x3f;  sr >>= 6;
  59. xmc[13] = sr & 0x7;  sr >>= 3;
  60. sr = *c++; /* 15 */
  61. xmc[14] = sr & 0x7;  sr >>= 3;
  62. xmc[15] = sr & 0x7;  sr >>= 3;
  63. sr |= (uword)*c++ << 2;
  64. xmc[16] = sr & 0x7;  sr >>= 3;
  65. xmc[17] = sr & 0x7;  sr >>= 3;
  66. xmc[18] = sr & 0x7;  sr >>= 3;
  67. sr |= (uword)*c++ << 1;
  68. xmc[19] = sr & 0x7;  sr >>= 3;
  69. xmc[20] = sr & 0x7;  sr >>= 3;
  70. xmc[21] = sr & 0x7;  sr >>= 3;
  71. sr = *c++;
  72. xmc[22] = sr & 0x7;  sr >>= 3;
  73. xmc[23] = sr & 0x7;  sr >>= 3;
  74. sr |= (uword)*c++ << 2;
  75. xmc[24] = sr & 0x7;  sr >>= 3;
  76. xmc[25] = sr & 0x7;  sr >>= 3;
  77. sr |= (uword)*c++ << 4; /* 20 */
  78. Nc[2] = sr & 0x7f;  sr >>= 7;
  79. bc[2] = sr & 0x3;  sr >>= 2;
  80. Mc[2] = sr & 0x3;  sr >>= 2;
  81. sr |= (uword)*c++ << 1;
  82. xmaxc[2] = sr & 0x3f;  sr >>= 6;
  83. xmc[26] = sr & 0x7;  sr >>= 3;
  84. sr = *c++;
  85. xmc[27] = sr & 0x7;  sr >>= 3;
  86. xmc[28] = sr & 0x7;  sr >>= 3;
  87. sr |= (uword)*c++ << 2;
  88. xmc[29] = sr & 0x7;  sr >>= 3;
  89. xmc[30] = sr & 0x7;  sr >>= 3;
  90. xmc[31] = sr & 0x7;  sr >>= 3;
  91. sr |= (uword)*c++ << 1;
  92. xmc[32] = sr & 0x7;  sr >>= 3;
  93. xmc[33] = sr & 0x7;  sr >>= 3;
  94. xmc[34] = sr & 0x7;  sr >>= 3;
  95. sr = *c++; /* 25 */
  96. xmc[35] = sr & 0x7;  sr >>= 3;
  97. xmc[36] = sr & 0x7;  sr >>= 3;
  98. sr |= (uword)*c++ << 2;
  99. xmc[37] = sr & 0x7;  sr >>= 3;
  100. xmc[38] = sr & 0x7;  sr >>= 3;
  101. sr |= (uword)*c++ << 4;
  102. Nc[3] = sr & 0x7f;  sr >>= 7;
  103. bc[3] = sr & 0x3;  sr >>= 2;
  104. Mc[3] = sr & 0x3;  sr >>= 2;
  105. sr |= (uword)*c++ << 1;
  106. xmaxc[3] = sr & 0x3f;  sr >>= 6;
  107. xmc[39] = sr & 0x7;  sr >>= 3;
  108. sr = *c++;
  109. xmc[40] = sr & 0x7;  sr >>= 3;
  110. xmc[41] = sr & 0x7;  sr >>= 3;
  111. sr |= (uword)*c++ << 2; /* 30 */
  112. xmc[42] = sr & 0x7;  sr >>= 3;
  113. xmc[43] = sr & 0x7;  sr >>= 3;
  114. xmc[44] = sr & 0x7;  sr >>= 3;
  115. sr |= (uword)*c++ << 1;
  116. xmc[45] = sr & 0x7;  sr >>= 3;
  117. xmc[46] = sr & 0x7;  sr >>= 3;
  118. xmc[47] = sr & 0x7;  sr >>= 3;
  119. sr = *c++;
  120. xmc[48] = sr & 0x7;  sr >>= 3;
  121. xmc[49] = sr & 0x7;  sr >>= 3;
  122. sr |= (uword)*c++ << 2;
  123. xmc[50] = sr & 0x7;  sr >>= 3;
  124. xmc[51] = sr & 0x7;  sr >>= 3;
  125. s->frame_chain = sr & 0xf;
  126. }
  127. else {
  128. sr = s->frame_chain;
  129. sr |= (uword)*c++ << 4; /* 1 */
  130. LARc[0] = sr & 0x3f;  sr >>= 6;
  131. LARc[1] = sr & 0x3f;  sr >>= 6;
  132. sr = *c++;
  133. LARc[2] = sr & 0x1f;  sr >>= 5;
  134. sr |= (uword)*c++ << 3;
  135. LARc[3] = sr & 0x1f;  sr >>= 5;
  136. LARc[4] = sr & 0xf;  sr >>= 4;
  137. sr |= (uword)*c++ << 2;
  138. LARc[5] = sr & 0xf;  sr >>= 4;
  139. LARc[6] = sr & 0x7;  sr >>= 3;
  140. LARc[7] = sr & 0x7;  sr >>= 3;
  141. sr = *c++; /* 5 */
  142. Nc[0] = sr & 0x7f;  sr >>= 7;
  143. sr |= (uword)*c++ << 1;
  144. bc[0] = sr & 0x3;  sr >>= 2;
  145. Mc[0] = sr & 0x3;  sr >>= 2;
  146. sr |= (uword)*c++ << 5;
  147. xmaxc[0] = sr & 0x3f;  sr >>= 6;
  148. xmc[0] = sr & 0x7;  sr >>= 3;
  149. xmc[1] = sr & 0x7;  sr >>= 3;
  150. sr |= (uword)*c++ << 1;
  151. xmc[2] = sr & 0x7;  sr >>= 3;
  152. xmc[3] = sr & 0x7;  sr >>= 3;
  153. xmc[4] = sr & 0x7;  sr >>= 3;
  154. sr = *c++;
  155. xmc[5] = sr & 0x7;  sr >>= 3;
  156. xmc[6] = sr & 0x7;  sr >>= 3;
  157. sr |= (uword)*c++ << 2; /* 10 */
  158. xmc[7] = sr & 0x7;  sr >>= 3;
  159. xmc[8] = sr & 0x7;  sr >>= 3;
  160. xmc[9] = sr & 0x7;  sr >>= 3;
  161. sr |= (uword)*c++ << 1;
  162. xmc[10] = sr & 0x7;  sr >>= 3;
  163. xmc[11] = sr & 0x7;  sr >>= 3;
  164. xmc[12] = sr & 0x7;  sr >>= 3;
  165. sr = *c++;
  166. Nc[1] = sr & 0x7f;  sr >>= 7;
  167. sr |= (uword)*c++ << 1;
  168. bc[1] = sr & 0x3;  sr >>= 2;
  169. Mc[1] = sr & 0x3;  sr >>= 2;
  170. sr |= (uword)*c++ << 5;
  171. xmaxc[1] = sr & 0x3f;  sr >>= 6;
  172. xmc[13] = sr & 0x7;  sr >>= 3;
  173. xmc[14] = sr & 0x7;  sr >>= 3;
  174. sr |= (uword)*c++ << 1; /* 15 */
  175. xmc[15] = sr & 0x7;  sr >>= 3;
  176. xmc[16] = sr & 0x7;  sr >>= 3;
  177. xmc[17] = sr & 0x7;  sr >>= 3;
  178. sr = *c++;
  179. xmc[18] = sr & 0x7;  sr >>= 3;
  180. xmc[19] = sr & 0x7;  sr >>= 3;
  181. sr |= (uword)*c++ << 2;
  182. xmc[20] = sr & 0x7;  sr >>= 3;
  183. xmc[21] = sr & 0x7;  sr >>= 3;
  184. xmc[22] = sr & 0x7;  sr >>= 3;
  185. sr |= (uword)*c++ << 1;
  186. xmc[23] = sr & 0x7;  sr >>= 3;
  187. xmc[24] = sr & 0x7;  sr >>= 3;
  188. xmc[25] = sr & 0x7;  sr >>= 3;
  189. sr = *c++;
  190. Nc[2] = sr & 0x7f;  sr >>= 7;
  191. sr |= (uword)*c++ << 1; /* 20 */
  192. bc[2] = sr & 0x3;  sr >>= 2;
  193. Mc[2] = sr & 0x3;  sr >>= 2;
  194. sr |= (uword)*c++ << 5;
  195. xmaxc[2] = sr & 0x3f;  sr >>= 6;
  196. xmc[26] = sr & 0x7;  sr >>= 3;
  197. xmc[27] = sr & 0x7;  sr >>= 3;
  198. sr |= (uword)*c++ << 1;
  199. xmc[28] = sr & 0x7;  sr >>= 3;
  200. xmc[29] = sr & 0x7;  sr >>= 3;
  201. xmc[30] = sr & 0x7;  sr >>= 3;
  202. sr = *c++;
  203. xmc[31] = sr & 0x7;  sr >>= 3;
  204. xmc[32] = sr & 0x7;  sr >>= 3;
  205. sr |= (uword)*c++ << 2;
  206. xmc[33] = sr & 0x7;  sr >>= 3;
  207. xmc[34] = sr & 0x7;  sr >>= 3;
  208. xmc[35] = sr & 0x7;  sr >>= 3;
  209. sr |= (uword)*c++ << 1; /* 25 */
  210. xmc[36] = sr & 0x7;  sr >>= 3;
  211. xmc[37] = sr & 0x7;  sr >>= 3;
  212. xmc[38] = sr & 0x7;  sr >>= 3;
  213. sr = *c++;
  214. Nc[3] = sr & 0x7f;  sr >>= 7;
  215. sr |= (uword)*c++ << 1;
  216. bc[3] = sr & 0x3;  sr >>= 2;
  217. Mc[3] = sr & 0x3;  sr >>= 2;
  218. sr |= (uword)*c++ << 5;
  219. xmaxc[3] = sr & 0x3f;  sr >>= 6;
  220. xmc[39] = sr & 0x7;  sr >>= 3;
  221. xmc[40] = sr & 0x7;  sr >>= 3;
  222. sr |= (uword)*c++ << 1;
  223. xmc[41] = sr & 0x7;  sr >>= 3;
  224. xmc[42] = sr & 0x7;  sr >>= 3;
  225. xmc[43] = sr & 0x7;  sr >>= 3;
  226. sr = *c++; /* 30 */
  227. xmc[44] = sr & 0x7;  sr >>= 3;
  228. xmc[45] = sr & 0x7;  sr >>= 3;
  229. sr |= (uword)*c++ << 2;
  230. xmc[46] = sr & 0x7;  sr >>= 3;
  231. xmc[47] = sr & 0x7;  sr >>= 3;
  232. xmc[48] = sr & 0x7;  sr >>= 3;
  233. sr |= (uword)*c++ << 1;
  234. xmc[49] = sr & 0x7;  sr >>= 3;
  235. xmc[50] = sr & 0x7;  sr >>= 3;
  236. xmc[51] = sr & 0x7;  sr >>= 3;
  237. }
  238. }
  239. else
  240. #endif
  241. {
  242. /* GSM_MAGIC  = (*c >> 4) & 0xF; */
  243. if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
  244. LARc[0]  = (*c++ & 0xF) << 2; /* 1 */
  245. LARc[0] |= (*c >> 6) & 0x3;
  246. LARc[1]  = *c++ & 0x3F;
  247. LARc[2]  = (*c >> 3) & 0x1F;
  248. LARc[3]  = (*c++ & 0x7) << 2;
  249. LARc[3] |= (*c >> 6) & 0x3;
  250. LARc[4]  = (*c >> 2) & 0xF;
  251. LARc[5]  = (*c++ & 0x3) << 2;
  252. LARc[5] |= (*c >> 6) & 0x3;
  253. LARc[6]  = (*c >> 3) & 0x7;
  254. LARc[7]  = *c++ & 0x7;
  255. Nc[0]  = (*c >> 1) & 0x7F;
  256. bc[0]  = (*c++ & 0x1) << 1;
  257. bc[0] |= (*c >> 7) & 0x1;
  258. Mc[0]  = (*c >> 5) & 0x3;
  259. xmaxc[0]  = (*c++ & 0x1F) << 1;
  260. xmaxc[0] |= (*c >> 7) & 0x1;
  261. xmc[0]  = (*c >> 4) & 0x7;
  262. xmc[1]  = (*c >> 1) & 0x7;
  263. xmc[2]  = (*c++ & 0x1) << 2;
  264. xmc[2] |= (*c >> 6) & 0x3;
  265. xmc[3]  = (*c >> 3) & 0x7;
  266. xmc[4]  = *c++ & 0x7;
  267. xmc[5]  = (*c >> 5) & 0x7;
  268. xmc[6]  = (*c >> 2) & 0x7;
  269. xmc[7]  = (*c++ & 0x3) << 1; /* 10 */
  270. xmc[7] |= (*c >> 7) & 0x1;
  271. xmc[8]  = (*c >> 4) & 0x7;
  272. xmc[9]  = (*c >> 1) & 0x7;
  273. xmc[10]  = (*c++ & 0x1) << 2;
  274. xmc[10] |= (*c >> 6) & 0x3;
  275. xmc[11]  = (*c >> 3) & 0x7;
  276. xmc[12]  = *c++ & 0x7;
  277. Nc[1]  = (*c >> 1) & 0x7F;
  278. bc[1]  = (*c++ & 0x1) << 1;
  279. bc[1] |= (*c >> 7) & 0x1;
  280. Mc[1]  = (*c >> 5) & 0x3;
  281. xmaxc[1]  = (*c++ & 0x1F) << 1;
  282. xmaxc[1] |= (*c >> 7) & 0x1;
  283. xmc[13]  = (*c >> 4) & 0x7;
  284. xmc[14]  = (*c >> 1) & 0x7;
  285. xmc[15]  = (*c++ & 0x1) << 2;
  286. xmc[15] |= (*c >> 6) & 0x3;
  287. xmc[16]  = (*c >> 3) & 0x7;
  288. xmc[17]  = *c++ & 0x7;
  289. xmc[18]  = (*c >> 5) & 0x7;
  290. xmc[19]  = (*c >> 2) & 0x7;
  291. xmc[20]  = (*c++ & 0x3) << 1;
  292. xmc[20] |= (*c >> 7) & 0x1;
  293. xmc[21]  = (*c >> 4) & 0x7;
  294. xmc[22]  = (*c >> 1) & 0x7;
  295. xmc[23]  = (*c++ & 0x1) << 2;
  296. xmc[23] |= (*c >> 6) & 0x3;
  297. xmc[24]  = (*c >> 3) & 0x7;
  298. xmc[25]  = *c++ & 0x7;
  299. Nc[2]  = (*c >> 1) & 0x7F;
  300. bc[2]  = (*c++ & 0x1) << 1; /* 20 */
  301. bc[2] |= (*c >> 7) & 0x1;
  302. Mc[2]  = (*c >> 5) & 0x3;
  303. xmaxc[2]  = (*c++ & 0x1F) << 1;
  304. xmaxc[2] |= (*c >> 7) & 0x1;
  305. xmc[26]  = (*c >> 4) & 0x7;
  306. xmc[27]  = (*c >> 1) & 0x7;
  307. xmc[28]  = (*c++ & 0x1) << 2;
  308. xmc[28] |= (*c >> 6) & 0x3;
  309. xmc[29]  = (*c >> 3) & 0x7;
  310. xmc[30]  = *c++ & 0x7;
  311. xmc[31]  = (*c >> 5) & 0x7;
  312. xmc[32]  = (*c >> 2) & 0x7;
  313. xmc[33]  = (*c++ & 0x3) << 1;
  314. xmc[33] |= (*c >> 7) & 0x1;
  315. xmc[34]  = (*c >> 4) & 0x7;
  316. xmc[35]  = (*c >> 1) & 0x7;
  317. xmc[36]  = (*c++ & 0x1) << 2;
  318. xmc[36] |= (*c >> 6) & 0x3;
  319. xmc[37]  = (*c >> 3) & 0x7;
  320. xmc[38]  = *c++ & 0x7;
  321. Nc[3]  = (*c >> 1) & 0x7F;
  322. bc[3]  = (*c++ & 0x1) << 1;
  323. bc[3] |= (*c >> 7) & 0x1;
  324. Mc[3]  = (*c >> 5) & 0x3;
  325. xmaxc[3]  = (*c++ & 0x1F) << 1;
  326. xmaxc[3] |= (*c >> 7) & 0x1;
  327. xmc[39]  = (*c >> 4) & 0x7;
  328. xmc[40]  = (*c >> 1) & 0x7;
  329. xmc[41]  = (*c++ & 0x1) << 2;
  330. xmc[41] |= (*c >> 6) & 0x3;
  331. xmc[42]  = (*c >> 3) & 0x7;
  332. xmc[43]  = *c++ & 0x7; /* 30  */
  333. xmc[44]  = (*c >> 5) & 0x7;
  334. xmc[45]  = (*c >> 2) & 0x7;
  335. xmc[46]  = (*c++ & 0x3) << 1;
  336. xmc[46] |= (*c >> 7) & 0x1;
  337. xmc[47]  = (*c >> 4) & 0x7;
  338. xmc[48]  = (*c >> 1) & 0x7;
  339. xmc[49]  = (*c++ & 0x1) << 2;
  340. xmc[49] |= (*c >> 6) & 0x3;
  341. xmc[50]  = (*c >> 3) & 0x7;
  342. xmc[51]  = *c & 0x7; /* 33 */
  343. }
  344. Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
  345. return 0;
  346. }