AMRPlugin.cpp
上传用户:mony888
上传日期:2022-07-26
资源大小:1247k
文件大小:6k
源码类别:

Windows CE

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include "stdafx.h"
  3. //#include "AMRPlugin.h"
  4. //#include "interf_enc.h"
  5. //#include "sp_enc.h"
  6. // #include "interf_rom.h"
  7. #define CODEC_ID_AMR      0x1234
  8. // #define OUTFRAMES         16
  9. #define FRAMMAXSIZ        32
  10. static INT32 read_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
  11. typedef struct AMREnc_stru 
  12. {
  13. INT32 bytesLeft;
  14. INT32 outOfData;                  //readBuf 是否不足一帧的数据
  15. INT32 eofReached;
  16. INT32 nFrames;
  17. UINT8 *readBuf;
  18. UINT8 *readPtr;
  19. UINT8 *outBuf;
  20. INT32 outBufSize;
  21. INT32 BytesFilled;
  22. UINT16 framerate;                 //播放器的播放帧率(一个FRAMES_FILLED相当于播放器的一帧)
  23. AMR_Encode_State *encInterface;
  24. INT32 usedBytes;
  25. INT32 start_tag;
  26. } AMREnc_Stru;
  27. static AMREnc_Stru* AMR_EncStru_Init()
  28. {
  29. AMREnc_Stru *AMREncStru;
  30. AMREncStru = ( AMREnc_Stru * )new AMREnc_Stru;
  31. if ( AMREncStru == NULL )
  32. {
  33. return NULL;
  34. }
  35. AMREncStru->bytesLeft = 0;
  36. AMREncStru->outOfData = 0;
  37.     AMREncStru->eofReached = 0;
  38. AMREncStru->nFrames = 0;
  39. AMREncStru->readBuf = NULL;
  40. AMREncStru->readPtr = NULL;
  41. AMREncStru->outBuf = NULL;
  42. AMREncStru->outBufSize = 0;
  43. AMREncStru->framerate = 50;
  44. AMREncStru->usedBytes = 0;
  45. AMREncStru->BytesFilled = 0;
  46. AMREncStru->start_tag = 1;
  47. AMREncStru->encInterface = (AMR_Encode_State*)Encoder_Interface_init(0);
  48. if ( AMREncStru->encInterface == NULL )
  49. {
  50. delete AMREncStru;
  51. AMREncStru = NULL;
  52. return NULL;
  53. }
  54. // AMREncStru->outBufSize = SPCH_BUF_SIZE * OUTFRAMES;
  55. // AMREncStru->outBuf = (UINT8 *)malloc( AMREncStru->outBufSize );
  56. // if ( AMREncStru->outBuf == NULL )
  57. // {
  58. // Encoder_Interface_exit(AMREncStru->encInterface);
  59. // AMREncStru->encInterface = NULL;
  60. // delete AMREncStru;
  61. // AMREncStru = NULL;
  62. // }
  63. return AMREncStru;
  64. }
  65. static void AMR_EncStru_Clos(AMREnc_Stru* AMREncStru)
  66. {
  67. if ( AMREncStru->encInterface )
  68. {
  69. Encoder_Interface_exit(AMREncStru->encInterface);
  70. }
  71. if ( AMREncStru->outBuf )
  72. {
  73. free(AMREncStru->outBuf);
  74. AMREncStru->outBuf = NULL;
  75. }
  76. delete AMREncStru;
  77. AMREncStru = NULL;
  78. return;
  79. }
  80. static INT32 AMR_EncStru_Enc( AMREnc_Stru *AMREncStru )
  81. {
  82. INT32 nRead;
  83. INT32 BytesCounter;
  84. //  enum Mode dec_mode;
  85. AMR_Encode_State *encInterface = NULL;
  86. UINT8 *inbuf = NULL;
  87. UINT8 outbuf[FRAMMAXSIZ];
  88. if ( AMREncStru == NULL )
  89. {
  90. return -1;
  91. }
  92. nRead = SPCH_BUF_SIZE;
  93. AMREncStru->usedBytes = 0;
  94. encInterface = AMREncStru->encInterface;
  95. do 
  96. if ( AMREncStru->bytesLeft < 0 )
  97. {
  98. return -2;
  99. }
  100. else if ( 0 == AMREncStru->bytesLeft )
  101. {
  102. AMREncStru->outOfData = 1;
  103. memset(AMREncStru->outBuf + AMREncStru->BytesFilled, 0, AMREncStru->outBufSize - AMREncStru->BytesFilled);
  104. break;
  105. }
  106. inbuf = AMREncStru->readPtr;
  107. if ( nRead > AMREncStru->bytesLeft ) 
  108. {
  109. AMREncStru->outOfData = 1;
  110. memset(AMREncStru->outBuf + AMREncStru->BytesFilled, 0, AMREncStru->outBufSize - AMREncStru->BytesFilled);
  111. break;
  112. }
  113. BytesCounter = Encoder_Interface_Encode(encInterface, ENCMODE, (INT16*)inbuf, outbuf, 0);
  114. AMREncStru->readPtr += nRead;
  115. AMREncStru->bytesLeft -= nRead;
  116. memcpy(AMREncStru->outBuf + AMREncStru->BytesFilled, outbuf, BytesCounter);
  117. AMREncStru->nFrames++;
  118. AMREncStru->BytesFilled += BytesCounter;
  119. // if ( AMREncStru->BytesFilled == OUTFRAMES * SPCH_BUF_SIZE )
  120. // {
  121. // AMREncStru->usedBytes = AMREncStru->readPtr - AMREncStru->readBuf;
  122. // return 1;
  123. // }
  124. } while( !AMREncStru->outOfData );
  125. AMREncStru->usedBytes = AMREncStru->readPtr - AMREncStru->readBuf;
  126. return 2;
  127. }
  128. static INT32 amr_enc_init(CodecContext *Data)
  129. {
  130. AMREnc_Stru* AMREncStru;
  131. memset(Data, 0, sizeof( CodecContext ));
  132. Data->bits_per_sample = 16;
  133. Data->channels = 1;
  134. Data->codec_id = CODEC_ID_AMR;
  135. Data->codec_type = CODEC_TYPE_AUDIO;
  136. Data->sample_fmt = 0x01;
  137. Data->sample_rate = 8000;
  138. Data->magic_code = (('!'<<24) | ('R'<<16) | ('M'<<8) | 'A');
  139. AMREncStru = AMR_EncStru_Init();
  140. if ( NULL == AMREncStru )
  141. {
  142. return -1;
  143. }
  144. Data->priv_data = AMREncStru;
  145. return 0;
  146. }
  147. static INT32 amr_enc_close(CodecContext *Data)
  148. {
  149. AMREnc_Stru* AMREncStru;
  150. AMREncStru = (AMREnc_Stru*)Data->priv_data;
  151. if ( AMREncStru )
  152. {
  153. AMR_EncStru_Clos(AMREncStru);
  154. }
  155. Data->priv_data = NULL;
  156. return 0;
  157. }
  158. static INT32 amr_enc_encode(CodecContext *Data, void** outdata, INT32* outdata_size, UINT8* inbuf, INT32* inbuf_size)
  159. {
  160. INT32 iJudg;
  161. AMREnc_Stru* AMREncStru;
  162. UINT8* pTemp;
  163. if (NULL != *outdata) 
  164. {
  165. free(*outdata);
  166. *outdata = NULL;
  167. }
  168. AMREncStru = ( AMREnc_Stru* )Data->priv_data;
  169. if ( NULL == AMREncStru )
  170. {
  171. return -1;
  172. }
  173. pTemp = (UINT8 *)malloc(*inbuf_size + AMREncStru->bytesLeft);
  174. if ( NULL == pTemp )
  175. {
  176. return -1;
  177. }
  178. memcpy(pTemp, AMREncStru->readPtr, AMREncStru->bytesLeft);
  179. memcpy(pTemp + AMREncStru->bytesLeft, inbuf, *inbuf_size);
  180. AMREncStru->readBuf = pTemp;
  181. AMREncStru->readPtr = AMREncStru->readBuf;
  182. AMREncStru->bytesLeft += *inbuf_size;
  183. AMREncStru->BytesFilled = 0;
  184. AMREncStru->outOfData = 0;
  185. AMREncStru->outBufSize = ((AMREncStru->bytesLeft) / SPCH_BUF_SIZE + 1) * FRAMMAXSIZ;   //根据inbufsize决定最大outbufsize
  186. AMREncStru->outBuf = (UINT8 *)malloc( AMREncStru->outBufSize );
  187. if ( AMREncStru->outBuf == NULL )
  188. {
  189. return -1;
  190. }
  191. iJudg = AMR_EncStru_Enc(AMREncStru);
  192. if ( iJudg < 0 )
  193. {
  194. return -2;
  195. }
  196. *outdata = AMREncStru->outBuf;
  197. // memcpy(outdata, AMREncStru->outBuf, AMREncStru->BytesFilled);
  198. *outdata_size = AMREncStru->BytesFilled;
  199. return AMREncStru->usedBytes;
  200. }
  201. static CodecInterfaceType amr_codec = 
  202. {
  203. ( CHAR* )"AMR",
  204. CODEC_TYPE_AUDIO,
  205. CODEC_ID_AMR,
  206. sizeof( AMREnc_Stru ),
  207. amr_enc_init,
  208. amr_enc_close,
  209. NULL,
  210. amr_enc_encode,
  211. NULL,
  212. NULL,
  213. };
  214. CodecInterfaceType* Get_AMR_EncInterface(void)
  215. {
  216. CodecInterfaceType* pInterface;
  217. pInterface = (CodecInterfaceType*)malloc(sizeof(CodecInterfaceType));
  218. if (NULL == pInterface)
  219. {
  220. return NULL;
  221. }
  222. memcpy(pInterface, &amr_codec, sizeof(CodecInterfaceType));
  223. return pInterface;
  224. }