gsm_decode.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:10k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

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