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

流媒体/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_encode.c,v 1.2 2001/02/27 19:23:07 deepalir 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. }