G726APack.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. /**************************************************************************
  2. *
  3. * ITU-T SOFTWARE TOOLS' GENERAL PUBLIC LICENSE
  4. *
  5. * This "General Public License" is published in the Annex 1 of the
  6. * ITU-T Recommendation on "SOFTWARE TOOLS FOR HOMOGENITY OF RESULTS
  7. * IN THE STANDARDIZATION PROCESS OF SPEECH AND AUDIO CODERS",
  8. * approved in Geneva, 2000.
  9. *
  10. * TERMS AND CONDITIONS
  11. *
  12. * 1. This License Agreement applies to any module or other work
  13. * related to the ITU-T Software Tool Library, and developed by the
  14. * User's Group on Software Tools. The "Module", below, refers to any
  15. * such module or work, and a "work based on the Module" means either
  16. * the Module or any work containing the Module or a portion of it,
  17. * either verbatim or with modifications. Each licensee is addressed
  18. * as "you".
  19. *
  20. * 2. You may copy and distribute verbatim copies of the Module's
  21. * source code as you receive it, in any medium, provided that you:
  22. * - conspicuously and appropriately publish on each copy an appropriate
  23. * copyright notice and disclaimer of warranty;
  24. * - keep intact all the notices that refer to this General Public
  25. * License and to the absence of any warranty; and
  26. * - give any other recipients of the Module a copy of this General
  27. * Public License along with the Module.
  28. * You may charge a fee for the physical act of transferring a copy.
  29. *
  30. * 3. You may modify your copy or copies of the Module or any portion
  31. * of it, and copy and distribute such modifications under the terms
  32. * of Paragraph 1 above, provided that you also do the following:
  33. *
  34. * o cause the modified files to carry prominent notices stating
  35. * that you changed the files and the date of any change; and
  36. *
  37. * o cause the whole of any work that you distribute or publish,
  38. * that in whole or in part contains the Module or any part
  39. * thereof, either with or without modifications, to be licensed
  40. * at no charge to all third parties under the terms of this
  41. * General Public License (except that you may choose to grant
  42. * warranty protection to some or all third parties, at your
  43. * option).
  44. *
  45. * o If the modified module normally reads commands interactively
  46. * when run, you must cause it, when started running for such
  47. * interactive use in the simplest and most usual way, to print or
  48. * display an announcement including an appropriate copyright
  49. * notice and a notice that there is no warranty (or else, saying
  50. * that you provide a warranty) and that users may redistribute
  51. * the module under these conditions, and telling the user how to
  52. * view a copy of this General Public License.
  53. *
  54. * You may charge a fee for the physical act of transferring a copy,
  55. * and you may at your option offer warranty protection in exchange
  56. * for a fee.
  57. *
  58. * Mere aggregation of another independent work with the Module (or
  59. * its derivative) on a volume of a storage or distribution medium
  60. * does not bring the other work under the scope of these terms.
  61. *
  62. * 4. You may copy and distribute the Module (or a portion or
  63. * derivative of it, under Paragraph 2) in object code or executable
  64. * form under the terms of Paragraphs 1 and 2 above provided that you
  65. * also do one of the following:
  66. *
  67. * o accompany it with the complete corresponding machine-
  68. * readable source code, which must be distributed under the terms
  69. * of Paragraphs 1 and 2 above; or,
  70. *
  71. * o accompany it with a written offer, valid for at least three
  72. * years, to give any third party free (except for a nominal
  73. * charge for the cost of distribution) a complete machine-
  74. * readable copy of the corresponding source code, to be
  75. * distributed under the terms of Paragraphs 1 and 2 above; or,
  76. *
  77. * o accompany it with the information you received as to where
  78. * the corresponding source code may be obtained. (This
  79. * alternative is allowed only for noncommercial distribution and
  80. * only if you received the module in object code or executable
  81. * form alone.)
  82. *
  83. * Source code for a work means the preferred form of the work for
  84. * making modifications to it. For an executable file, complete
  85. * source code means all the source code for all modules it contains;
  86. * but, as a special exception, it need not include source code for
  87. * modules which are standard libraries that accompany the operating
  88. * system on which the executable file runs, or for standard header
  89. * files or definitions files that accompany that operating system.
  90. *
  91. * 5. You may not copy, modify, sublicense, distribute or transfer
  92. * the Module except as expressly provided under this General Public
  93. * License. Any attempt otherwise to copy, modify, sublicense,
  94. * distribute or transfer the Module is void, and will automatically
  95. * terminate your rights to use the Module under this License.
  96. * However, parties who have received copies, or rights to use copies,
  97. * from you under this General Public License will not have their
  98. * licenses terminated so long as such parties remain in full
  99. * compliance.
  100. *
  101. * 6. By copying, distributing or modifying the Module (or any work
  102. * based on the Module) you indicate your acceptance of this license
  103. * to do so, and all its terms and conditions.
  104. *
  105. * 7. Each time you redistribute the Module (or any work based on the
  106. * Module), the recipient automatically receives a license from the
  107. * original licensor to copy, distribute or modify the Module subject
  108. * to these terms and conditions. You may not impose any further
  109. * restrictions on the recipients' exercise of the rights granted
  110. * herein.
  111. *
  112. * 8. The ITU-T may publish revised and/or new versions of this
  113. * General Public License from time to time. Such new versions will
  114. * be similar in spirit to the present version, but may differ in
  115. * detail to address new problems or concerns.
  116. *
  117. * Each version is given a distinguishing version number. If the
  118. * Module specifies a version number of the license which applies to
  119. * it and "any later version", you have the option of following the
  120. * terms and conditions either of that version or of any later version
  121. * published by the ITU-T. If the Module does not specify a version
  122. * number of the license, you may choose any version ever published by
  123. * the ITU-T.
  124. *
  125. * 9. If you wish to incorporate parts of the Module into other free
  126. * modules whose distribution conditions are different, write to the
  127. * author to ask for permission. For software which is copyrighted by
  128. * the ITU-T, write to the ITU-T Secretariat; exceptions may be made
  129. * for this. This decision will be guided by the two goals of
  130. * preserving the free status of all derivatives of this free software
  131. * and of promoting the sharing and reuse of software generally.
  132. *
  133. *
  134. * NO WARRANTY
  135. *
  136. * 10. BECAUSE THE MODULE IS LICENSED FREE OF CHARGE, THERE IS NO
  137. * WARRANTY FOR THE MODULE, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
  138. * EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
  139. * AND/OR OTHER PARTIES PROVIDE THE MODULE "AS IS" WITHOUT WARRANTY OF
  140. * ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED
  141. * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  142. * PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
  143. * PERFORMANCE OF THE MODULE IS WITH YOU. SHOULD THE MODULE PROVE
  144. * DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR
  145. * OR CORRECTION.
  146. *
  147. * 11. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
  148. * WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
  149. * MODIFY AND/OR REDISTRIBUTE THE MODULE AS PERMITTED ABOVE, BE LIABLE
  150. * TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
  151. * CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
  152. * THE MODULE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
  153. * RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR
  154. * A FAILURE OF THE MODULE TO OPERATE WITH ANY OTHER MODULES), EVEN IF
  155. * SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
  156. * SUCH DAMAGES.
  157. *
  158. * END OF TERMS AND CONDITIONS
  159. ***************************************************************************/
  160. #include "G726APack.h"
  161. int G726APack(unsigned char * src, void * dest, int nSrcSamples, G726A_BIT_RATES rate)
  162. {
  163. unsigned int packedWord;
  164. unsigned int shiftedEncSample;
  165. int sample;
  166. int samplesPerPackedWord;
  167. unsigned int * packedWordDest = (unsigned int *) dest;
  168. int subFrameIndex;
  169. int packedSampleIndex;
  170. if (nSrcSamples <= 0)
  171. {
  172. /* Nothing to do. */
  173. return(0);
  174. }
  175. switch(rate)
  176. {
  177. case G726A_16KBPS:
  178. /* For 16Kbps, each encoded sample is 2 bits. So
  179. * a 16 bit word can pack 8 encoded samples.
  180. */
  181. samplesPerPackedWord = 8;
  182. break;
  183. case G726A_24KBPS:
  184. /* For 24Kbps, each encoded sample is 3 bits. So
  185. * a 16 bit word can pack 5 encoded samples.
  186. */
  187. samplesPerPackedWord = 5;
  188. break;
  189. case G726A_32KBPS:
  190. /* For 32Kbps, each encoded sample is 4 bits. So
  191. * a 16 bit word can pack 4 encoded samples.
  192. */
  193. samplesPerPackedWord = 4;
  194. break;
  195. case G726A_40KBPS:
  196. /* For 40Kbps, each encoded sample is 5 bits. So
  197. * a 16 bit word can pack 3 encoded samples.
  198. */
  199. samplesPerPackedWord = 3;
  200. break;
  201. default:
  202. /* Unknown rate */
  203. return(0);
  204. }
  205. /* Perform the packing */
  206. sample = 0;
  207. packedWord = 0;
  208. subFrameIndex = 0;
  209. packedSampleIndex = 0;
  210. while (sample < nSrcSamples)
  211. {
  212. shiftedEncSample = src[sample];
  213. shiftedEncSample = shiftedEncSample << (subFrameIndex * rate);
  214. packedWord = packedWord | shiftedEncSample;
  215. subFrameIndex ++;
  216. sample ++;
  217. if(subFrameIndex == samplesPerPackedWord)
  218. {
  219. /* This means that the maximum number of
  220. * encoded samples were encoded in this
  221. * 16 bit word. Store the 16 bit sample
  222. * and get ready for the next word.
  223. */
  224. packedWordDest[packedSampleIndex] = packedWord;
  225. subFrameIndex = 0;
  226. packedSampleIndex ++;
  227. packedWord = 0;
  228. }
  229. }
  230. /* Check if any samples are left over. This happens if the
  231. * total encoded samples is not a integral multiple of the
  232. * number of encoded bits per sample.*/
  233. if(subFrameIndex != 0)
  234. {
  235. packedWordDest[packedSampleIndex] = packedWord;
  236. packedSampleIndex ++;
  237. }
  238. /* Return the number of bytes written */
  239. return(packedSampleIndex * 2);
  240. }
  241. int G726AUnpack(void * src, unsigned char * dest, int nSrcSamples, G726A_BIT_RATES rate)
  242. {
  243. int samplesPerPackedWord;
  244. unsigned int * packedWordArray = (unsigned int *)src;
  245. unsigned int packedWord;
  246. unsigned char unpacked;
  247. int subFrameIndex;
  248. int sample;
  249. int packedWordIndex;
  250. int mask;
  251. switch(rate)
  252. {
  253. case G726A_16KBPS:
  254. /* For 16Kbps, each encoded sample is 2 bits. So
  255. * a 16 bit word can pack 8 encoded samples.
  256. */
  257. samplesPerPackedWord = 8;
  258. mask = 0x3;
  259. break;
  260. case G726A_24KBPS:
  261. /* For 24Kbps, each encoded sample is 3 bits. So
  262. * a 16 bit word can pack 5 encoded samples.
  263. */
  264. samplesPerPackedWord = 5;
  265. mask = 0x7;
  266. break;
  267. case G726A_32KBPS:
  268. /* For 32Kbps, each encoded sample is 4 bits. So
  269. * a 16 bit word can pack 4 encoded samples.
  270. */
  271. samplesPerPackedWord = 4;
  272. mask = 0xF;
  273. break;
  274. case G726A_40KBPS:
  275. /* For 40Kbps, each encoded sample is 5 bits. So
  276. * a 16 bit word can pack 3 encoded samples.
  277. */
  278. samplesPerPackedWord = 3;
  279. mask = 0x1F;
  280. break;
  281. default:
  282. /* Unknown rate */
  283. return(0);
  284. }
  285. packedWordIndex = 0;
  286. sample = 0;
  287. packedWord = packedWordArray[packedWordIndex];
  288. subFrameIndex = 0;
  289. while(sample < nSrcSamples)
  290. {
  291. unpacked = (packedWord >> (subFrameIndex * rate));
  292. unpacked = unpacked & mask;
  293. dest[sample] = unpacked;
  294. sample ++;
  295. subFrameIndex ++;
  296. if(subFrameIndex == samplesPerPackedWord)
  297. {
  298. subFrameIndex = 0;
  299. packedWordIndex ++;
  300. packedWord = packedWordArray[packedWordIndex];
  301. }
  302. }
  303. return(sample);
  304. }