adpcm.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:11k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: adpcm.c 565 2006-01-12 14:11:44Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common/common.h"
  24. #include "adpcm.h"
  25. #include "g726/g72x.h"
  26. typedef struct state 
  27. {
  28.     int Predictor;
  29.     int StepIndex;
  30.     int Step;
  31.     int Sample1;
  32.     int Sample2;
  33.     int CoEff1;
  34.     int CoEff2;
  35.     int IDelta;
  36. } state;
  37. typedef struct adpcm
  38. {
  39. codec Codec;
  40. buffer Data;
  41. int Channel; //IMA_QT
  42. int16_t* Buffer;
  43. state State[2];
  44. g726_state G726[2];
  45. } adpcm;
  46. static const int IndexTable[16] = 
  47. {
  48.     -1, -1, -1, -1, 2, 4, 6, 8,
  49.     -1, -1, -1, -1, 2, 4, 6, 8,
  50. };
  51. static const int StepTable[89] = 
  52. {
  53.     7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
  54.     19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
  55.     50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
  56.     130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
  57.     337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
  58.     876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
  59.     2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
  60.     5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
  61.     15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
  62. };
  63. // AdaptationTable[], AdaptCoeff1[], and AdaptCoeff2[] are from libsndfile
  64. static const int AdaptationTable[] = 
  65. {
  66. 230, 230, 230, 230, 307, 409, 512, 614,
  67. 768, 614, 512, 409, 307, 230, 230, 230
  68. };
  69. static const int AdaptCoeff1[] = 
  70. {
  71. 256, 512, 0, 192, 240, 460, 392
  72. };
  73. static const int AdaptCoeff2[] = 
  74. {
  75. 0, -256, 0, 64, 0, -208, -232
  76. };
  77. static _INLINE int IMA_Calc(state* s, int v)
  78. {
  79.     int StepIndex;
  80.     int Predictor;
  81.     int Diff,Step;
  82.     Step = StepTable[s->StepIndex];
  83.     StepIndex = s->StepIndex + IndexTable[v];
  84.     if (StepIndex < 0) 
  85. StepIndex = 0;
  86.     else if (StepIndex > 88) 
  87. StepIndex = 88;
  88.     Diff = ((2 * (v & 7) + 1) * Step) >> 3;
  89.     Predictor = s->Predictor;
  90.     if (v & 8) 
  91. Predictor -= Diff;
  92.     else 
  93. Predictor += Diff;
  94. if (Predictor > 32767) 
  95. Predictor = 32767;
  96. else if (Predictor < -32768) 
  97. Predictor = -32768;
  98.     s->Predictor = Predictor;
  99.     s->StepIndex = StepIndex;
  100.     return Predictor;
  101. }
  102. static _INLINE int MS_Calc(state* s, int v)
  103. {
  104.     int Predictor;
  105.     Predictor = ((s->Sample1 * s->CoEff1) + (s->Sample2 * s->CoEff2)) >> 8;
  106.     Predictor += ((v & 0x08) ? v-0x10:v) * s->IDelta;
  107. if (Predictor > 32767) 
  108. Predictor = 32767;
  109. else if (Predictor < -32768) 
  110. Predictor = -32768;
  111.     s->Sample2 = s->Sample1;
  112.     s->Sample1 = Predictor;
  113.     s->IDelta = (AdaptationTable[v] * s->IDelta) >> 8;
  114.     if (s->IDelta < 16) 
  115. s->IDelta = 16;
  116.     return Predictor;
  117. }
  118. static int Process(adpcm* p, const packet* Packet, const flowstate* State)
  119. {
  120. int i;
  121. int Predictor;
  122. const uint8_t* In;
  123. const uint8_t* InEnd;
  124. int16_t* Out = p->Buffer;
  125. if (Packet)
  126. {
  127. if (Packet->RefTime >= 0)
  128. p->Codec.Packet.RefTime = Packet->RefTime;
  129. BufferPack(&p->Data,0);
  130. BufferWrite(&p->Data,Packet->Data[0],Packet->Length,1024);
  131. }
  132. else
  133. p->Codec.Packet.RefTime = TIME_UNKNOWN;
  134. if (!BufferRead(&p->Data,&In,p->Codec.In.Format.Format.Audio.BlockAlign))
  135. return ERR_NEED_MORE_DATA;
  136. InEnd = In + p->Codec.In.Format.Format.Audio.BlockAlign;
  137. switch (p->Codec.Node.Class)
  138. {
  139. case ADPCM_G726_ID:
  140. {
  141. g726_state *g1,*g2;
  142. g1 = g2 = &p->G726[0];
  143. if (p->Codec.In.Format.Format.Audio.Channels==2)
  144. ++g2;
  145. switch (p->Codec.In.Format.Format.Audio.Bits)
  146. {
  147. case 2:
  148. for (;In<InEnd;++In,Out+=4)
  149. {
  150. Out[0] = (int16_t)g726_16_decoder(In[0] >> 6,g1);
  151. Out[1] = (int16_t)g726_16_decoder(In[0] >> 4,g2);
  152. Out[2] = (int16_t)g726_16_decoder(In[0] >> 2,g1);
  153. Out[3] = (int16_t)g726_16_decoder(In[0],g2);
  154. }
  155. break;
  156. case 3:
  157. InEnd -= 2;
  158. for (;In<InEnd;In+=3,Out+=8)
  159. {
  160. Out[0] = (int16_t)g726_24_decoder(In[0] >> 5,g1);
  161. Out[1] = (int16_t)g726_24_decoder(In[0] >> 2,g2);
  162. Out[2] = (int16_t)g726_24_decoder((In[0] << 1) | (In[1] >> 7),g1);
  163. Out[3] = (int16_t)g726_24_decoder(In[1] >> 4,g2);
  164. Out[4] = (int16_t)g726_24_decoder(In[1] >> 1,g1);
  165. Out[5] = (int16_t)g726_24_decoder((In[1] << 2) | (In[2] >> 6),g2);
  166. Out[6] = (int16_t)g726_24_decoder(In[2] >> 3,g1);
  167. Out[7] = (int16_t)g726_24_decoder(In[2] >> 0,g2);
  168. }
  169. break;
  170. case 4:
  171. for (;In<InEnd;++In,Out+=2)
  172. {
  173. Out[0] = (int16_t)g726_32_decoder(In[0] >> 4,g1);
  174. Out[1] = (int16_t)g726_32_decoder(In[0],g2);
  175. }
  176. break;
  177. case 5:
  178. InEnd -= 4;
  179. for (;In<InEnd;In+=5,Out+=8)
  180. {
  181. Out[0] = (int16_t)g726_40_decoder(In[0] >> 3,g1);
  182. Out[1] = (int16_t)g726_40_decoder((In[0] << 2) | (In[1] >> 6),g2);
  183. Out[2] = (int16_t)g726_40_decoder(In[1] >> 1,g1);
  184. Out[3] = (int16_t)g726_40_decoder((In[1] << 4) | (In[2] >> 4),g2);
  185. Out[4] = (int16_t)g726_40_decoder((In[2] << 1) | (In[3] >> 7),g1);
  186. Out[5] = (int16_t)g726_40_decoder(In[3] >> 2,g2);
  187. Out[6] = (int16_t)g726_40_decoder((In[3] << 3) | (In[4] >> 5),g1);
  188. Out[7] = (int16_t)g726_40_decoder(In[4] >> 0,g2);
  189. }
  190. break;
  191. }
  192. break;
  193. }
  194. case ADPCM_IMA_QT_ID:
  195. {
  196. int No,Ch;
  197. Ch = p->Codec.In.Format.Format.Audio.Channels;
  198. for (No=0;No<Ch;++No)
  199. {
  200. state *s;
  201. s = &p->State[0];
  202. s->Predictor = (int16_t)((In[1] & 0x80) | (In[0] << 8));
  203. s->StepIndex = In[1] & 0x7F;
  204. if (s->StepIndex > 88) 
  205. s->StepIndex = 88;
  206. In+=2;
  207. InEnd=In+32;
  208. Out = p->Buffer+No;
  209. for (;In<InEnd;++In)
  210. {
  211. *Out = (int16_t)IMA_Calc(s, In[0] & 0x0F);
  212. Out+=Ch;
  213. *Out = (int16_t)IMA_Calc(s, In[0] >> 4);
  214. Out+=Ch;
  215. }
  216. }
  217. Out = p->Buffer+Ch*64;
  218. break;
  219. }
  220. case ADPCM_IMA_ID:
  221. {
  222. state *s1,*s2;
  223. s1 = &p->State[0];
  224. s1->Predictor = (int16_t)(In[0] | (In[1] << 8));
  225. In+=2;
  226. s1->StepIndex = *In++;
  227. if (s1->StepIndex > 88) 
  228. s1->StepIndex = 88;
  229. ++In;
  230. if (p->Codec.In.Format.Format.Audio.Channels == 2)
  231. {
  232. s2 = &p->State[1];
  233. s2->Predictor = (int16_t)(In[0] | (In[1] << 8));
  234. In+=2;
  235. s2->StepIndex = *In++;
  236. if (s2->StepIndex > 88) 
  237. s2->StepIndex = 88;
  238. ++In;
  239. for (i=4;In<InEnd;++In,Out+=4)
  240. {
  241. Out[0] = (int16_t)IMA_Calc(s1, In[0] & 0x0F);
  242. Out[1] = (int16_t)IMA_Calc(s2, In[4] & 0x0F);
  243. Out[2] = (int16_t)IMA_Calc(s1, In[0] >> 4);
  244. Out[3] = (int16_t)IMA_Calc(s2, In[4] >> 4);
  245. if (--i==0)
  246. {
  247. i=4;
  248. In+=4;
  249. }
  250. }
  251. }
  252. else
  253. {
  254. for (;In<InEnd;++In,Out+=2)
  255. {
  256. Out[0] = (int16_t)IMA_Calc(s1, In[0] & 0x0F);
  257. Out[1] = (int16_t)IMA_Calc(s1, In[0] >> 4);
  258. }
  259. }
  260. break;
  261. }
  262. case ADPCM_MS_ID:
  263. {
  264. state *s1,*s2;
  265. s1 = &p->State[0];
  266. s2 = p->Codec.In.Format.Format.Audio.Channels==2 ? &p->State[1] : s1;
  267. Predictor = *In++;
  268. if (Predictor > 7)
  269. Predictor = 7;
  270. s1->CoEff1 = AdaptCoeff1[Predictor];
  271. s1->CoEff2 = AdaptCoeff2[Predictor];
  272. if (s2 != s1)
  273. {
  274. Predictor = *In++;
  275. if (Predictor > 7)
  276. Predictor = 7;
  277. s2->CoEff1 = AdaptCoeff1[Predictor];
  278. s2->CoEff2 = AdaptCoeff2[Predictor];
  279. }
  280. s1->IDelta = (int16_t)(In[0] | (In[1] << 8));
  281. In+=2;
  282. if (s2 != s1)
  283. {
  284. s2->IDelta = (int16_t)(In[0] | (In[1] << 8));
  285. In+=2;
  286. }
  287. s1->Sample1 = (int16_t)(In[0] | (In[1] << 8));
  288. In+=2;
  289. if (s2 != s1)
  290. {
  291. s2->Sample1 = (int16_t)(In[0] | (In[1] << 8));
  292. In+=2;
  293. }
  294. s1->Sample2 = (int16_t)(In[0] | (In[1] << 8));
  295. In+=2;
  296. if (s2 != s1)
  297. {
  298. s2->Sample2 = (int16_t)(In[0] | (In[1] << 8));
  299. In+=2;
  300. }
  301. *Out++ = (int16_t)s1->Sample1;
  302. if (s2 != s1) *Out++ = (int16_t)s2->Sample1;
  303. *Out++ = (int16_t)s1->Sample2;
  304. if (s2 != s1) *Out++ = (int16_t)s2->Sample2;
  305. for (;In<InEnd;++In,Out+=2)
  306. {
  307. Out[0] = (int16_t)MS_Calc(s1, In[0] >> 4);
  308. Out[1] = (int16_t)MS_Calc(s2, In[0] & 0x0F);
  309. }
  310. break;
  311. }
  312. }
  313. p->Codec.Packet.Length = (uint8_t*)Out - (uint8_t*)p->Buffer;
  314. return ERR_NONE;
  315. }
  316. static int UpdateInput(adpcm* p)
  317. {
  318. BufferClear(&p->Data);
  319. free(p->Buffer);
  320. p->Buffer = NULL;
  321. if (p->Codec.In.Format.Type == PACKET_AUDIO)
  322. {
  323. PacketFormatPCM(&p->Codec.Out.Format,&p->Codec.In.Format,16);
  324. if (!p->Codec.In.Format.Format.Audio.BlockAlign)
  325. p->Codec.In.Format.Format.Audio.BlockAlign = 1024;
  326. if (p->Codec.Node.Class == ADPCM_IMA_QT_ID)
  327. p->Codec.In.Format.Format.Audio.BlockAlign = (32+2)*p->Codec.In.Format.Format.Audio.Channels;
  328. if (p->Codec.Node.Class == ADPCM_G726_ID)
  329. {
  330. p->Codec.In.Format.Format.Audio.BlockAlign = 120;
  331. g726_init_state(&p->G726[0]);
  332. g726_init_state(&p->G726[1]);
  333. }
  334. p->Buffer = (int16_t*) malloc(sizeof(int16_t)*4*p->Codec.In.Format.Format.Audio.BlockAlign);
  335. if (!p->Buffer)
  336. return ERR_OUT_OF_MEMORY;
  337. p->Codec.Packet.Data[0] = p->Buffer;
  338. }
  339. return ERR_NONE;
  340. }
  341. static int Flush(adpcm* p)
  342. {
  343. if (p->Codec.Node.Class == ADPCM_G726_ID)
  344. {
  345. g726_init_state(&p->G726[0]);
  346. g726_init_state(&p->G726[1]);
  347. }
  348. BufferDrop(&p->Data);
  349. p->Channel = 0;
  350. return ERR_NONE;
  351. }
  352. static int Create(adpcm* p)
  353. {
  354. p->Codec.Process = (packetprocess)Process;
  355. p->Codec.UpdateInput = (nodefunc)UpdateInput;
  356. p->Codec.Flush = (nodefunc)Flush;
  357. return ERR_NONE;
  358. }
  359. static const nodedef ADPCM =
  360. {
  361. sizeof(adpcm)|CF_ABSTRACT,
  362. ADPCM_CLASS,
  363. CODEC_CLASS,
  364. PRI_DEFAULT,
  365. (nodecreate)Create,
  366. NULL,
  367. };
  368. static const nodedef ADPCM_MS =
  369. {
  370. 0, //parent size
  371. ADPCM_MS_ID,
  372. ADPCM_CLASS,
  373. PRI_DEFAULT,
  374. NULL,
  375. NULL,
  376. };
  377. static const nodedef ADPCM_IMA =
  378. {
  379. 0, //parent size
  380. ADPCM_IMA_ID,
  381. ADPCM_CLASS,
  382. PRI_DEFAULT,
  383. NULL,
  384. NULL,
  385. };
  386. static const nodedef ADPCM_IMA_QT =
  387. {
  388. 0, //parent size
  389. ADPCM_IMA_QT_ID,
  390. ADPCM_CLASS,
  391. PRI_DEFAULT,
  392. NULL,
  393. NULL,
  394. };
  395. static const nodedef ADPCM_G726 =
  396. {
  397. 0, //parent size
  398. ADPCM_G726_ID,
  399. ADPCM_CLASS,
  400. PRI_DEFAULT,
  401. NULL,
  402. NULL,
  403. };
  404. void ADPCM_Init()
  405. {
  406. NodeRegisterClass(&ADPCM);
  407. NodeRegisterClass(&ADPCM_MS);
  408. NodeRegisterClass(&ADPCM_IMA);
  409. NodeRegisterClass(&ADPCM_IMA_QT);
  410. NodeRegisterClass(&ADPCM_G726);
  411. }
  412. void ADPCM_Done()
  413. {
  414. NodeUnRegisterClass(ADPCM_MS_ID);
  415. NodeUnRegisterClass(ADPCM_IMA_ID);
  416. NodeUnRegisterClass(ADPCM_IMA_QT_ID);
  417. NodeUnRegisterClass(ADPCM_G726_ID);
  418. NodeUnRegisterClass(ADPCM_CLASS);
  419. }