GSM_IMPL.C
Upload User: tianfasz
Upload Date: 2008-11-09
Package Size: 80k
Code Size: 11k
Category:

Voice Compress

Development Platform:

C/C++

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