g711codec.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #include "precompile.h"
  2. #include "g711codec.h"
  3. #include <spandsp.h>
  4. static codec_factory_t g_g711alaw_factory;
  5. static codec_t* g711alaw_codec_create(apr_pool_t *pool, int clock, int ptime)
  6. {
  7. codec_t *codec;
  8. codec = apr_palloc(pool, sizeof(codec_t));
  9. codec->pool = pool;
  10. codec->ptime = ptime;
  11. codec->clock = clock;
  12. codec->factory = &g_g711alaw_factory;
  13. codec->kvp_table = apr_table_make(pool, 3);
  14. return codec;
  15. }
  16. static void g711alaw_codec_destroy(codec_t *codec)
  17. {
  18. }
  19. static apr_status_t g711alaw_codec_set_param(codec_t *codec,
  20. const char *key,
  21. const char *value)
  22. {
  23. return APR_ENOTIMPL;
  24. }
  25. static apr_status_t g711alaw_codec_get_param(codec_t *codec,
  26. const char *key,
  27. char *value)
  28. {
  29. return APR_ENOTIMPL;
  30. }
  31. static apr_status_t g711alaw_codec_init(codec_t *codec)
  32. {
  33. return APR_SUCCESS;
  34. }
  35. static apr_status_t g711alaw_codec_term(codec_t *codec)
  36. {
  37. return APR_SUCCESS;
  38. }
  39. static apr_status_t g711alaw_codec_encode(codec_t *codec,
  40. const void *inbuf,
  41. int insize,
  42. void *outbuf,
  43. int *outsize)
  44. {
  45. if (insize) {
  46. int i;
  47. int samples = insize >> 1;
  48. for (i = 0; i < samples; ++i) {
  49. *((unsigned char*)outbuf+i) = linear_to_alaw(*((short*)inbuf+i));
  50. }
  51. *outsize = samples;
  52. } else {
  53. *outsize = 0;
  54. }
  55. return APR_SUCCESS;
  56. }
  57. static apr_status_t g711alaw_codec_decode(codec_t *codec,
  58. const void *inbuf,
  59. int insize,
  60. void *outbuf,
  61. int *outsize)
  62. {
  63. if (insize) {
  64. int i;
  65. int samples = insize;
  66. if (*outsize < 2*samples)
  67. return APR_EGENERAL;
  68. for (i = 0; i < samples; ++i) {
  69. *((short*)outbuf+i) = alaw_to_linear(*((unsigned char*)inbuf+i));
  70. }
  71. *outsize = 2*samples;
  72. } else {
  73. *outsize = 0;
  74. }
  75. return APR_SUCCESS;
  76. }
  77. apr_status_t pcma_codec_decode(
  78. const void *inbuf,
  79. int insize,
  80. void *outbuf,
  81. int *outsize)
  82. {
  83. g711alaw_codec_decode(NULL, inbuf, insize, outbuf, outsize);
  84. return APR_SUCCESS;
  85. }
  86. static codec_factory_t g_g711ulaw_factory;
  87. static codec_t* g711ulaw_codec_create(apr_pool_t *pool, int clock, int ptime)
  88. {
  89. codec_t *codec;
  90. apr_status_t status;
  91. apr_pool_t *subpool;
  92. status = apr_pool_create(&subpool, pool);
  93. if (status != APR_SUCCESS)
  94. return NULL;
  95. codec = apr_palloc(pool, sizeof(codec_t));
  96. codec->pool = subpool;
  97. codec->ptime = ptime;
  98. codec->clock = clock;
  99. codec->factory = &g_g711ulaw_factory;
  100. codec->kvp_table = apr_table_make(subpool, 3);
  101. return codec;
  102. }
  103. static void g711ulaw_codec_destroy(codec_t *codec)
  104. {
  105. apr_pool_destroy(codec->pool);
  106. }
  107. static apr_status_t g711ulaw_codec_set_param(codec_t *codec,
  108. const char *key,
  109. const char *value)
  110. {
  111. return APR_ENOTIMPL;
  112. }
  113. static apr_status_t g711ulaw_codec_get_param(codec_t *codec,
  114. const char *key,
  115. char *value)
  116. {
  117. return APR_ENOTIMPL;
  118. }
  119. static apr_status_t g711ulaw_codec_init(codec_t *codec)
  120. {
  121. return APR_SUCCESS;
  122. }
  123. static apr_status_t g711ulaw_codec_term(codec_t *codec)
  124. {
  125. return APR_SUCCESS;
  126. }
  127. static apr_status_t g711ulaw_codec_encode(codec_t *codec,
  128. const void *inbuf,
  129. int insize,
  130. void *outbuf,
  131. int *outsize)
  132. {
  133. if (insize) {
  134. int i;
  135. int samples = insize >> 1;
  136. if (*outsize < samples)
  137. return APR_EGENERAL;
  138. for (i = 0; i < samples; ++i) {
  139. *((unsigned char*)outbuf+i) = linear_to_ulaw(*((short*)inbuf+i));
  140. }
  141. *outsize = samples;
  142. } else {
  143. *outsize = 0;
  144. }
  145. return APR_SUCCESS;
  146. }
  147. static apr_status_t g711ulaw_codec_decode(codec_t *codec,
  148. const void *inbuf,
  149. int insize,
  150. void *outbuf,
  151. int *outsize)
  152. {
  153. if (insize) {
  154. int i;
  155. int samples = insize;
  156. if (*outsize < 2*samples)
  157. return APR_EGENERAL;
  158. for (i = 0; i < samples; ++i) {
  159. *((short*)outbuf+i) = ulaw_to_linear(*((unsigned char*)inbuf+i));
  160. }
  161. *outsize = 2*samples;
  162. } else {
  163. *outsize = 0;
  164. }
  165. return APR_SUCCESS;
  166. }
  167. apr_status_t pcmu_codec_decode(const void *inbuf,int insize,void *outbuf,int *outsize)
  168. {
  169. g711ulaw_codec_decode(NULL, inbuf, insize, outbuf, outsize);
  170. return APR_SUCCESS;
  171. }
  172. apr_status_t g711_codec_factory_init()
  173. {
  174. apr_status_t status;
  175. g_g711alaw_factory.name = "PCMA";
  176. g_g711alaw_factory.create = &g711alaw_codec_create;
  177. g_g711alaw_factory.destroy = &g711alaw_codec_destroy;
  178. g_g711alaw_factory.set_param = &g711alaw_codec_set_param;
  179. g_g711alaw_factory.get_param = &g711alaw_codec_get_param;
  180. g_g711alaw_factory.init = &g711alaw_codec_init;
  181. g_g711alaw_factory.term = &g711alaw_codec_term;
  182. g_g711alaw_factory.encode = &g711alaw_codec_encode;
  183. g_g711alaw_factory.decode = &g711alaw_codec_decode;
  184. status = codec_factory_register(&g_g711alaw_factory);
  185. if (status != APR_SUCCESS)
  186. return status;
  187. g_g711ulaw_factory.name = "PCMU";
  188. g_g711ulaw_factory.create = &g711ulaw_codec_create;
  189. g_g711ulaw_factory.destroy = &g711ulaw_codec_destroy;
  190. g_g711ulaw_factory.set_param = &g711ulaw_codec_set_param;
  191. g_g711ulaw_factory.get_param = &g711ulaw_codec_get_param;
  192. g_g711ulaw_factory.init = &g711ulaw_codec_init;
  193. g_g711ulaw_factory.term = &g711ulaw_codec_term;
  194. g_g711ulaw_factory.encode = &g711ulaw_codec_encode;
  195. g_g711ulaw_factory.decode = &g711ulaw_codec_decode;
  196. status = codec_factory_register(&g_g711ulaw_factory);
  197. if (status != APR_SUCCESS)
  198. return status;
  199. return status;
  200. }
  201. apr_status_t g711_codec_factory_term()
  202. {
  203. apr_status_t status;
  204. status = codec_factory_unregister(&g_g711alaw_factory);
  205. if (status != APR_SUCCESS)
  206. return status;
  207. status = codec_factory_unregister(&g_g711ulaw_factory);
  208. if (status != APR_SUCCESS)
  209. return status;
  210. return status;
  211. }