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

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: faad.c 598 2006-01-18 21:27:40Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common/common.h"
  24. #include "faad.h"
  25. #include "faad2/include/neaacdec.h"
  26. #if SAFETAIL < 12
  27. #error Minimum 12 bytes tail needed in buffer
  28. #endif
  29. #define STACK_SIZE 0x20000
  30. #define MAX_CHANNELS 6 
  31. #define BUFFER_NEEDED (FAAD_MIN_STREAMSIZE * MAX_CHANNELS)
  32. #define HEADER_NEEDED 16384
  33. typedef struct faad
  34. {
  35. codec Codec;
  36. buffer Buffer;
  37. NeAACDecHandle Decoder;
  38. bool_t ErrorMessage;
  39. bool_t Inited;
  40. bool_t PacketBased;
  41. tick_t NextRefTime;
  42. int FormatSet;
  43. char* Stack;
  44. } faad;
  45. static int UpdateInput( faad* p )
  46. {
  47. if (p->Decoder)
  48. {
  49.     NeAACDecClose(p->Decoder);
  50. p->Decoder = NULL;
  51. }
  52. #ifdef SWAPSP2
  53. if (p->Stack)
  54. {
  55. int i;
  56. for (i=0;i<STACK_SIZE;++i)
  57. if (p->Stack[i] != 0x11)
  58. {
  59. DebugMessage("Stack usage: %d",STACK_SIZE-i);
  60. ThreadSleep(300);
  61. break;
  62. }
  63. }
  64. free(p->Stack);
  65. p->Stack = NULL;
  66. #endif
  67. p->Inited = 0;
  68. p->ErrorMessage = 0;
  69. BufferClear(&p->Buffer);
  70. if (p->Codec.In.Format.Type == PACKET_AUDIO)
  71. {
  72.     NeAACDecConfigurationPtr Config;
  73. p->Decoder = NeAACDecOpen();
  74. Config = NeAACDecGetCurrentConfiguration(p->Decoder);
  75. Config->defObjectType = LC;
  76. Config->outputFormat = FAAD_FMT_INTERNAL;
  77. Config->downMatrix = 1; // force downmix to stereo
  78. NeAACDecSetConfiguration(p->Decoder, Config);
  79. if (p->Codec.In.Format.ExtraLength)
  80. {
  81. unsigned long SampleRate;
  82. uint8_t Channels;
  83.     if (NeAACDecInit2(p->Decoder, p->Codec.In.Format.Extra, p->Codec.In.Format.ExtraLength, 
  84. &SampleRate, &Channels) < 0)
  85. {
  86. ShowError(p->Codec.Node.Class,AACFULL_ID,FAAD_NOT_SUPPORTED);
  87. NeAACDecClose(p->Decoder);
  88. p->Decoder = NULL;
  89. return ERR_NOT_SUPPORTED;
  90. }
  91. p->Codec.In.Format.Format.Audio.SampleRate = SampleRate;
  92. p->Codec.In.Format.Format.Audio.Channels = Channels;
  93. p->Inited = 1;
  94. }
  95. PacketFormatPCM(&p->Codec.Out.Format,&p->Codec.In.Format,30);
  96. p->Codec.Out.Format.Format.Audio.Flags = PCM_PLANES;
  97. p->PacketBased = (p->Codec.In.Format.Format.Audio.Flags & PCM_PACKET_BASED) != 0;
  98. p->FormatSet = 0;
  99. #ifdef SWAPSP2
  100. p->Stack = malloc(STACK_SIZE);
  101. if (!p->Stack)
  102. return ERR_OUT_OF_MEMORY;
  103. memset(p->Stack,0x11,STACK_SIZE);
  104. #endif
  105. }
  106.  
  107. return ERR_NONE;
  108. }
  109. static NOINLINE int Process2( faad* p, const packet* Packet, const flowstate* State )
  110. {
  111. bool_t Eof = !Packet && State;
  112. if (Packet)
  113. {
  114. // set new reftime
  115. if (Packet->RefTime >= 0)
  116. {
  117. if (p->PacketBased)
  118. {
  119. p->Codec.Packet.RefTime = p->NextRefTime;
  120. p->NextRefTime = Packet->RefTime;
  121. }
  122. else
  123. {
  124. p->Codec.Packet.RefTime = Packet->RefTime;
  125. if (p->Codec.In.Format.ByteRate>0)
  126. {
  127. p->Codec.Packet.RefTime -= Scale(p->Buffer.WritePos - p->Buffer.ReadPos,TICKSPERSEC,p->Codec.In.Format.ByteRate);
  128. if (p->Codec.Packet.RefTime<0)
  129. p->Codec.Packet.RefTime=0;
  130. }
  131. }
  132. }
  133. // add new packet to buffer
  134. BufferPack(&p->Buffer,0);
  135. BufferWrite(&p->Buffer,Packet->Data[0],Packet->Length,2048);
  136. if (!p->Inited)
  137. {
  138. unsigned long SampleRate;
  139. uint8_t Channels;
  140. int Readed;
  141. uint8_t* Buffer = p->Buffer.Data + p->Buffer.ReadPos;
  142. int Length = p->Buffer.WritePos - p->Buffer.ReadPos;
  143. if (!Eof && !p->PacketBased && Length < HEADER_NEEDED)
  144. return ERR_NEED_MORE_DATA;
  145. if (memcmp(Buffer, "ADIF", 4) == 0) 
  146. {
  147. int BitRate;
  148. if (Buffer[4] & 0x80) // copyright_id present?
  149. Buffer += 9;
  150. BitRate = (((int)Buffer[4] & 0x0F) << 19) |
  151.   ((int)Buffer[5] << 11) |
  152.   ((int)Buffer[6] << 3) |
  153.   ((int)Buffer[7] & 0xE0);
  154. p->Codec.In.Format.ByteRate = BitRate/8;
  155. }
  156. else
  157. {
  158. int Trash = 0;
  159. for (Trash=0;Trash<Length-16;++Trash)
  160. if (Buffer[Trash] == 0xFF && (Buffer[Trash+1] & 0xF6)==0xF0)
  161. break;
  162. if (Trash<Length-16)
  163. {
  164. static const int SampleRates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0};
  165. int Samples = 0;
  166. int Bytes = 0;
  167. Buffer += Trash;
  168. Length -= Trash;
  169. SampleRate = SampleRates[(Buffer[2] & 0x3C) >> 2];
  170. // check for SBR profile, double samples ???
  171. while (Length > 7)
  172. {
  173. int n;
  174. if (Buffer[0] != 0xFF || (Buffer[1] & 0xF6)!=0xF0)
  175. break;
  176. n = (((int)Buffer[3] & 3) << 11) | (((int)Buffer[4]) << 3) | (Buffer[5] >> 5);
  177. Bytes += n;
  178. Samples += 1024; 
  179. Length -= n;
  180. Buffer += n;
  181. }
  182. p->Codec.In.Format.ByteRate = Scale(Bytes,SampleRate,Samples);
  183. if (Length < 256 || Samples >= 32*1024) // successfull
  184. p->Buffer.ReadPos += Trash;
  185.   }
  186. }
  187. Readed = NeAACDecInit(p->Decoder, p->Buffer.Data + p->Buffer.ReadPos,
  188. p->Buffer.WritePos - p->Buffer.ReadPos, &SampleRate, &Channels);
  189. if (Readed < 0)
  190. {
  191. if (!p->ErrorMessage)
  192. {
  193. ShowError(p->Codec.Node.Class,AACFULL_ID,FAAD_NOT_SUPPORTED);
  194. p->ErrorMessage = 1;
  195. }
  196. BufferDrop(&p->Buffer);
  197. return ERR_NOT_SUPPORTED;
  198. }
  199. p->Inited = 1;
  200. p->Buffer.ReadPos += Readed;
  201. }
  202. }
  203. else
  204. if (p->Inited)
  205. p->Codec.Packet.RefTime = TIME_UNKNOWN;
  206. while ((p->PacketBased && Packet) || Eof || p->Buffer.WritePos >= p->Buffer.ReadPos+BUFFER_NEEDED)
  207. {
  208.     NeAACDecFrameInfo FrameInfo;
  209.     void* Buffer[16];
  210. int Size = p->Buffer.WritePos-p->Buffer.ReadPos;
  211. if (Size <= 0)
  212. break;
  213.         NeAACDecDecode2(p->Decoder, &FrameInfo,p->Buffer.Data+p->Buffer.ReadPos,Size,Buffer,MAX_INT);
  214. if (p->PacketBased)
  215. p->Buffer.ReadPos = p->Buffer.WritePos;
  216. else
  217. p->Buffer.ReadPos += FrameInfo.bytesconsumed;
  218.         if (!FrameInfo.error && FrameInfo.samples>0)
  219. {
  220. if (p->Codec.Out.Format.Format.Audio.SampleRate != (int)FrameInfo.samplerate ||
  221. p->Codec.Out.Format.Format.Audio.Channels != (int)FrameInfo.channels)
  222. {
  223. if (p->FormatSet && (p->Codec.Out.Format.Format.Audio.Channels!=1 || FrameInfo.channels!=2)) // allow PS mono->stereo
  224. {
  225. p->FormatSet--;
  226. break; // probably a bad frame, drop it
  227. }
  228. p->Codec.In.Format.Format.Audio.SampleRate = 
  229. p->Codec.Out.Format.Format.Audio.SampleRate = FrameInfo.samplerate;
  230. p->Codec.In.Format.Format.Audio.Channels = 
  231. p->Codec.Out.Format.Format.Audio.Channels = FrameInfo.channels;
  232. ConnectionUpdate(&p->Codec.Node,CODEC_OUTPUT,p->Codec.Out.Pin.Node,p->Codec.Out.Pin.No);
  233. }
  234. p->FormatSet = 16; // reset countdown
  235. p->Codec.Packet.Length = FrameInfo.samples * sizeof(int32_t);
  236. p->Codec.Packet.Data[0] = Buffer[0];
  237. p->Codec.Packet.Data[1] = Buffer[1];
  238. return ERR_NONE;
  239. }
  240. if (FrameInfo.error==28)
  241. {
  242. BufferDrop(&p->Buffer);
  243. return ERR_OUT_OF_MEMORY;
  244. }
  245. if (p->PacketBased)
  246. break;
  247. if (!FrameInfo.bytesconsumed)
  248. p->Buffer.ReadPos++;
  249. }
  250. return ERR_NEED_MORE_DATA;
  251. }
  252. static int Process( faad* p, const packet* Packet, const flowstate* State )
  253. {
  254. int Result;
  255. #ifdef SWAPSP2
  256. void* Old = SwapSP(p->Stack+STACK_SIZE);
  257. #endif
  258. Result = Process2(p,Packet,State);
  259. #ifdef SWAPSP2
  260. SwapSP(Old);
  261. #endif
  262. return Result;
  263. }
  264. extern void *faad_malloc(size_t size);
  265. uint8_t safestack(uint8_t (*decode)(NeAACDecHandle hDecoder, void *ics),NeAACDecHandle hDecoder, void *ics, void** stack)
  266. {
  267. uint8_t ret;
  268. #ifdef SWAPSP
  269. void* old;
  270. if (!*stack)
  271. {
  272. *stack = faad_malloc(STACK_SIZE);
  273. if (!*stack)
  274. return 1;
  275. }
  276. old = SwapSP(*stack+STACK_SIZE);
  277. #endif
  278. ret = decode(hDecoder,ics);
  279. #ifdef SWAPSP
  280. SwapSP(old);
  281. #endif
  282. return ret;
  283. }
  284. static int Flush(faad* p)
  285. {
  286. p->NextRefTime = TIME_UNKNOWN;
  287. BufferDrop(&p->Buffer);
  288. if (p->Decoder)
  289. NeAACDecPostSeekReset(p->Decoder,0);
  290. return ERR_NONE;
  291. }
  292. static int Create(faad* p)
  293. {
  294. p->Codec.Process = (packetprocess)Process;
  295. p->Codec.UpdateInput = (nodefunc)UpdateInput;
  296. p->Codec.Flush = (nodefunc)Flush;
  297. return ERR_NONE;
  298. }
  299. static const nodedef FAAD = 
  300. {
  301. sizeof(faad),
  302. #ifdef AACFULL_EXPORTS
  303. AACFULL_ID,
  304. CODEC_CLASS,
  305. PRI_DEFAULT+256,
  306. #else
  307. FAAD_ID,
  308. CODEC_CLASS,
  309. PRI_DEFAULT,
  310. #endif
  311. (nodecreate)Create,
  312. };
  313. static const nodedef AAC = 
  314. {
  315. 0, //parent size
  316. AAC_ID,
  317. RAWAUDIO_CLASS,
  318. #ifdef AACFULL_EXPORTS
  319. PRI_DEFAULT-4,
  320. #else
  321. PRI_DEFAULT-5,
  322. #endif
  323. };
  324. void FAAD_Init()
  325. {
  326. NodeRegisterClass(&FAAD);
  327. NodeRegisterClass(&AAC);
  328. }
  329. void FAAD_Done()
  330. {
  331. NodeUnRegisterClass(FAAD.Class);
  332. NodeUnRegisterClass(AAC_ID);
  333. }
  334. #ifdef __SYMBIAN32__
  335. uint32_t random_int2(void)
  336. {
  337.     return rand()|(rand()<<16);
  338. }
  339. #endif