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

Windows CE

开发平台:

Visual C++

  1. /*************************************************************************/
  2. /*                                                                       */
  3. /* Copyright (c) 2000-2004 Linuos Design                                 */
  4. /*                                     领驰设计中心  版权所有 2000-2004  */
  5. /*                                                                       */
  6. /* PROPRIETARY RIGHTS of Linuos Design  are involved in the subject      */
  7. /* matter of this material.  All manufacturing, reproduction, use, and   */
  8. /* sales rights pertaining to this subject matter are governed by the    */
  9. /* license agreement.  The recipient of this software implicitly accepts */ 
  10. /* the terms of the license.                                             */
  11. /* 本软件文档资料是领驰设计中心的资产,任何人士阅读和使用本资料必须获得   */
  12. /* 相应的书面授权,承担保密责任和接受相应的法律约束.                      */
  13. /*                                                                       */
  14. /*************************************************************************/
  15. /*
  16. * ===================================================================
  17. *  TS 26.104
  18. *  REL-5 V5.4.0 2004-03
  19. *  REL-6 V6.1.0 2004-03
  20. *  3GPP AMR Floating-point Speech Codec
  21. * ===================================================================
  22. *
  23. */
  24. /*
  25. * interf_enc.c
  26. *
  27. *
  28. * Project:
  29. *    AMR Floating-Point Codec
  30. *
  31. * Contains:
  32. *    This module contains all the functions needed encoding 160
  33. *    16-bit speech samples to AMR encoder parameters.
  34. *
  35. */
  36. /*
  37. * include files
  38. */
  39. //#include <stdlib.h>
  40. //#include <stdio.h>
  41. //#include <memory.h>
  42. #include "stdafx.h"
  43. //#include "interf_enc.h"
  44. //#include "sp_enc.h"
  45. //#include "interf_rom.h"
  46. //
  47. /*
  48. * EncoderMMS
  49. *
  50. *
  51. * Parameters:
  52. *    mode                 I: AMR mode
  53. *    param                I: Encoder output parameters
  54. *    stream               O: packed speech frame
  55. *    frame_type           I: frame type (DTX)
  56. *    speech_mode          I: speech mode (DTX)
  57. *
  58. * Function:
  59. *    Pack encoder output parameters to octet structure according
  60. *    importance table and AMR file storage format according to
  61. *    RFC 3267.
  62. * Returns:
  63. *    number of octets
  64. */
  65. static INT32 EncoderMMS( enum Mode mode, INT16 *param, UINT8 *stream, 
  66.    enum TXFrameType frame_type, enum Mode speech_mode )
  67. {
  68. INT32 j = 0, k;
  69. INT16 *mask;
  70. memset(stream, 0, block_size[mode]);
  71. *stream = toc_byte[mode];
  72. stream++;
  73. if ( mode == 15 ) 
  74. {
  75. return 1;
  76. }
  77. else if ( mode == MRDTX )
  78. {
  79. mask = order_MRDTX;
  80. for ( j = 1; j < 36; j++ )
  81. {
  82. if ( param[ * mask] & *( mask + 1 ) )
  83. *stream += 0x01;
  84. mask += 2;
  85. if ( j % 8 )
  86. *stream <<= 1;
  87. else
  88. stream++;
  89. }
  90. /* add SID type information */
  91. if ( frame_type == TX_SID_UPDATE )
  92. *stream += 0x01;
  93. *stream <<= 3;
  94. /* speech mode indication */
  95. *stream += ( UINT8 )(speech_mode & 0x0007);
  96. *stream <<= 1;
  97. /* don't shift at the end of the function */
  98. return 6;
  99. }
  100. else if ( mode == MR475 ) 
  101. {
  102. mask = order_MR475;
  103. for ( j = 1; j < 96; j++ ) 
  104. {
  105. if ( param[ * mask] & *( mask + 1 ) )
  106. *stream += 0x01;
  107. mask += 2;
  108. if ( j % 8 )
  109. *stream <<= 1;
  110. else
  111. stream++;
  112. }
  113. }
  114. else if ( mode == MR515 ) 
  115. {
  116. mask = order_MR515;
  117. for ( j = 1; j < 104; j++ ) 
  118. {
  119. if ( param[ * mask] & *( mask + 1 ) )
  120. *stream += 0x01;
  121. mask += 2;
  122. if ( j % 8 )
  123. *stream <<= 1;
  124. else
  125. stream++;
  126. }
  127. }
  128. else if ( mode == MR59 ) 
  129. {
  130. mask = order_MR59;
  131. for ( j = 1; j < 119; j++ ) 
  132. {
  133. if ( param[ * mask] & *( mask + 1 ) )
  134. *stream += 0x01;
  135. mask += 2;
  136. if ( j % 8 )
  137. *stream <<= 1;
  138. else
  139. stream++;
  140. }
  141. }
  142. else if ( mode == MR67 ) 
  143. {
  144. mask = order_MR67;
  145. for ( j = 1; j < 135; j++ )
  146. {
  147. if ( param[ * mask] & *( mask + 1 ) )
  148. *stream += 0x01;
  149. mask += 2;
  150. if ( j % 8 )
  151. *stream <<= 1;
  152. else
  153. stream++;
  154. }
  155. }
  156. else if ( mode == MR74 ) 
  157. {
  158. mask = order_MR74;
  159. for ( j = 1; j < 149; j++ )
  160. {
  161. if ( param[ * mask] & *( mask + 1 ) )
  162. *stream += 0x01;
  163. mask += 2;
  164. if ( j % 8 )
  165. *stream <<= 1;
  166. else
  167. stream++;
  168. }
  169. }
  170. else if ( mode == MR795 )
  171. {
  172. mask = order_MR795;
  173. for ( j = 1; j < 160; j++ ) 
  174. {
  175. if ( param[ * mask] & *( mask + 1 ) )
  176. *stream += 0x01;
  177. mask += 2;
  178. if ( j % 8 )
  179. *stream <<= 1;
  180. else
  181. stream++;
  182. }
  183. }
  184. else if ( mode == MR102 ) 
  185. {
  186. mask = order_MR102;
  187. for ( j = 1; j < 205; j++ )
  188. {
  189. if ( param[ * mask] & *( mask + 1 ) )
  190. *stream += 0x01;
  191. mask += 2;
  192. if ( j % 8 )
  193. *stream <<= 1;
  194. else
  195. stream++;
  196. }
  197. }
  198. else if ( mode == MR122 )
  199. {
  200. mask = order_MR122;
  201. for ( j = 1; j < 245; j++ ) 
  202. {
  203. if ( param[ * mask] & *( mask + 1 ) )
  204. *stream += 0x01;
  205. mask += 2;
  206. if ( j % 8 )
  207. *stream <<= 1;
  208. else
  209. stream++;
  210. }
  211. }
  212. /* shift remaining bits */
  213. k = j % 8;
  214. if ( k )
  215. {
  216. *stream <<= ( 8 - k );
  217. }
  218. return( (INT32)block_size[mode] );
  219. }
  220. /*
  221. * Sid_Sync_reset
  222. *
  223. *
  224. * Parameters:
  225. *    st                O: state structure
  226. *
  227. * Function:
  228. *    Initializes state memory
  229. *
  230. * Returns:
  231. *    void
  232. */
  233. static void Sid_Sync_reset( AMR_Encode_State *st )
  234. {
  235. st->sid_update_counter = 3;
  236. st->sid_handover_debt = 0;
  237. st->prev_ft = TX_SPEECH_GOOD;
  238. }
  239. /*
  240. * Encoder_Interface_Encode
  241. *
  242. *
  243. * Parameters:
  244. *    st                I: pointer to state structure
  245. *    mode              I: Speech Mode
  246. *    speech            I: Input speech
  247. *    serial            O: Output octet structure 3GPP or
  248. *                         ETSI serial stream
  249. *    force_speech      I: Force speech in DTX
  250. *
  251. * Function:
  252. *    Encoding and packing one frame of speech
  253. *
  254. * Returns:
  255. *    number of octets
  256. */
  257. INT32 Encoder_Interface_Encode( void *st, enum Mode mode, INT16 *speech, UINT8 *serial, INT32 force_speech)
  258. /*
  259. #ifndef ETSI
  260. UINT8 *serial,
  261.   #else
  262.   INT16 *serial,
  263.   #endif
  264.   
  265. INT32 force_speech )
  266. */
  267. {
  268. INT16 prm[PRMNO_MR122];   /* speech parameters, max size */
  269. const INT16 *homing;   /* pointer to homing frame */
  270. INT16 homing_size;   /* frame size for homing frame */
  271. AMR_Encode_State * s;
  272. enum TXFrameType txFrameType;   /* frame type */
  273. INT32 i, noHoming = 0;
  274. /*
  275.     * used encoder mode,
  276.     * if used_mode == -1, force VAD on
  277.     */
  278. enum Mode used_mode = (Mode)-force_speech;
  279. s = ( AMR_Encode_State * )st;
  280.     /*
  281. * Checks if all samples of the input frame matches the encoder
  282. * homing frame pattern, which is 0x0008 for all samples.
  283. */
  284. for ( i = 0; i < 160; i++ ) 
  285. {
  286. noHoming = speech[i] ^ 0x0008;
  287. if ( noHoming )
  288. break;
  289. }
  290. if (noHoming)
  291. {
  292. Speech_Encode_Frame( s->encoderState, mode, speech, prm, &used_mode );
  293. }
  294. else
  295. {
  296. switch ( mode )
  297. {
  298. case MR122:
  299.             homing = dhf_MR122;
  300.             homing_size = 18;
  301.             break;
  302. case MR102:
  303.             homing = dhf_MR102;
  304.             homing_size = 12;
  305.             break;
  306. case MR795:
  307.             homing = dhf_MR795;
  308.             homing_size = 8;
  309.             break;
  310. case MR74:
  311.             homing = dhf_MR74;
  312.             homing_size = 7;
  313.             break;
  314. case MR67:
  315.             homing = dhf_MR67;
  316.             homing_size = 7;
  317.             break;
  318. case MR59:
  319.             homing = dhf_MR59;
  320.             homing_size = 7;
  321.             break;
  322. case MR515:
  323.             homing = dhf_MR515;
  324.             homing_size = 7;
  325.             break;
  326. case MR475:
  327.             homing = dhf_MR475;
  328.             homing_size = 7;
  329.             break;
  330. default:
  331.             homing = NULL;
  332.             homing_size = 0;
  333.             break;
  334. }
  335. for( i = 0; i < homing_size; i++)
  336. {
  337. prm[i] = homing[i];
  338. }
  339. /* rest of the parameters are zero */
  340. memset(&prm[homing_size], 0, (PRMNO_MR122 - homing_size) << 1);
  341. used_mode = mode;
  342. }
  343. if ( used_mode == MRDTX ) 
  344. {
  345. s->sid_update_counter--;
  346. if ( s->prev_ft == TX_SPEECH_GOOD ) 
  347. {
  348. txFrameType = TX_SID_FIRST;
  349. s->sid_update_counter = 3;
  350. }
  351. else 
  352. {
  353. /* TX_SID_UPDATE or TX_NO_DATA */
  354. if ( ( s->sid_handover_debt > 0 ) && ( s->sid_update_counter > 2 ) ) 
  355. {
  356. /*
  357. * ensure extra updates are properly delayed after
  358. * a possible SID_FIRST
  359. */
  360. txFrameType = TX_SID_UPDATE;
  361. s->sid_handover_debt--;
  362. }
  363. else 
  364. {
  365. if ( s->sid_update_counter == 0 ) 
  366. {
  367. txFrameType = TX_SID_UPDATE;
  368. s->sid_update_counter = 8;
  369. }
  370. else
  371. {
  372. txFrameType = TX_NO_DATA;
  373. used_mode = (Mode)15;
  374. }
  375. }
  376. }
  377. }
  378. else 
  379. {
  380. s->sid_update_counter = 8;
  381. txFrameType = TX_SPEECH_GOOD;
  382. }
  383. s->prev_ft = txFrameType;
  384. if ( noHoming == 0 )
  385. {
  386. Speech_Encode_Frame_reset( s->encoderState, s->dtx );
  387. Sid_Sync_reset( s );
  388. }
  389. /*
  390. #ifndef ETSI
  391. #ifdef IF2
  392. return Encoder3GPP( used_mode, prm, serial, txFrameType, mode );
  393.   #else
  394. */
  395. return EncoderMMS( used_mode, prm, serial, txFrameType, mode );
  396. /*
  397. #endif
  398. #else
  399.   Prm2Bits( used_mode, prm, &serial[1] );
  400.   serial[0] = ( INT16 )txFrameType;
  401.   serial[245] = ( INT16 )mode;
  402.   return 500;
  403.   #endif
  404. */
  405. }
  406. /*
  407. * Encoder_Interface_init
  408. *
  409. *
  410. * Parameters:
  411. *    dtx               I: DTX flag
  412. *
  413. * Function:
  414. *    Allocates state memory and initializes state memory
  415. *
  416. * Returns:
  417. *    pointer to encoder interface structure
  418. */
  419. void * Encoder_Interface_init( INT32 dtx )
  420. {
  421. AMR_Encode_State * s = NULL;
  422. /* allocate memory */
  423. s = ( AMR_Encode_State * ) new AMR_Encode_State;
  424. if ( s == NULL )
  425. {
  426. return NULL;
  427. }
  428. s->encoderState = Speech_Encode_Frame_init( dtx );
  429. Sid_Sync_reset( s );
  430. s->dtx = dtx;
  431. return s;
  432. }
  433. /*
  434. * DecoderInterfaceExit
  435. *
  436. *
  437. * Parameters:
  438. *    state             I: state structure
  439. *
  440. * Function:
  441. *    The memory used for state memory is freed
  442. *
  443. * Returns:
  444. *    Void
  445. */
  446. void Encoder_Interface_exit( void *state )
  447. {
  448. AMR_Encode_State * s;
  449. s = ( AMR_Encode_State * )state;
  450. /* mcFree memory */
  451. // Speech_Encode_Frame_exit( &s->encoderState );
  452. delete s->encoderState;
  453. delete s;
  454. state = NULL;
  455. }