gsm_encode.c 11 KB

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