tools.h
上传用户: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: tools.h 607 2006-01-22 20:58:29Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #ifndef __TOOLS_H
  24. #define __TOOLS_H
  25. #define ALIGN64(x) (((x) + 63) & ~63)
  26. #define ALIGN16(x) (((x) + 15) & ~15)
  27. #define ALIGN8(x) (((x) + 7) & ~7)
  28. #define ALIGN4(x) (((x) + 3) & ~3)
  29. #define GET_R(x)   ((uint8_t)(((x) >> 0) & 255))
  30. #define GET_G(x)   ((uint8_t)(((x) >> 8) & 255))
  31. #define GET_B(x)   ((uint8_t)(((x) >> 16) & 255))
  32. //some helper functions
  33. static INLINE bool_t EqInt(const int* a, const int* b) { return *a == *b; }
  34. static INLINE bool_t EqBool(const bool_t* a, const bool_t* b) { return *a == *b; }
  35. static INLINE bool_t EqPtr(void** a, void** b) { return *a == *b; }
  36. DLL void* Alloc16(size_t); //aligned to 16 bytes
  37. DLL void Free16(void*);
  38. DLL bool_t EqPoint(const point* a, const point* b);
  39. DLL bool_t EqRect(const rect* a, const rect* b);
  40. DLL bool_t EqPixel(const pixel* a, const pixel* b);
  41. DLL bool_t EqVideo(const video* a, const video* b);
  42. DLL bool_t EqFrac(const fraction* a, const fraction* b);
  43. DLL bool_t EqAudio(const audio* a, const audio* b);
  44. DLL bool_t EqSubtitle(const subtitle* a, const subtitle* b);
  45. DLL bool_t EqBlitFX(const blitfx* a, const blitfx* b);
  46. DLL void Simplify(fraction*, int MaxNum, int MaxDen);
  47. DLL void SwapPChar(tchar_t**, tchar_t**);
  48. DLL void SwapPByte(uint8_t**, uint8_t**);
  49. DLL void SwapInt(int*, int*);
  50. DLL void SwapLong(long*, long*);
  51. DLL void SwapBool(bool_t*, bool_t*);
  52. DLL void SwapPoint(point*);
  53. DLL void SwapRect(rect*);
  54. DLL void VirtToPhy(const rect* Virtual, rect* Physical, const video*);
  55. DLL void PhyToVirt(const rect* Physical, rect* Virtual, const video*);
  56. DLL void ClipRectPhy(rect* Physical, const video*);
  57. DLL bool_t Compressed(const pixel*);
  58. DLL bool_t AnyYUV(const pixel*);
  59. DLL bool_t PlanarYUV(const pixel*, int* UVX2, int* UVY2,int* UVStride2);
  60. DLL bool_t PlanarYUV444(const pixel*);
  61. DLL bool_t PlanarYUV422(const pixel*);
  62. DLL bool_t PlanarYUV410(const pixel*);
  63. DLL bool_t PlanarYUV420(const pixel*);
  64. DLL bool_t PackedYUV(const pixel*);
  65. DLL uint32_t DefFourCC(const pixel*);
  66. DLL void FillInfo(pixel*);
  67. DLL int GetImageSize(const video*);
  68. DLL int GetBPP(const pixel*);
  69. DLL int BitMaskSize(uint32_t Mask);
  70. DLL int BitMaskPos(uint32_t Mask);
  71. DLL uint32_t RGBToFormat(rgbval_t RGB, const pixel*);
  72. DLL int CombineDir(int SrcDir,int FXDir,int DstDir);
  73. DLL void FillColor(uint8_t* Dst,int DstPitch,int x,int y,int Width,int Height,int BPP,int Value);
  74. DLL int AnyAlign(rect* DstRect, rect* SrcRect, const blitfx* FX, 
  75.  int DstAlignSize, int DstAlignPos, 
  76.  int MinScale, int MaxScale);
  77. DLL int SurfaceAlloc(planes, const video*);
  78. DLL void SurfaceFree(planes);
  79. DLL int SurfaceCopy(const video* SrcFormat, const video* DstFormat, 
  80. const planes Src, planes Dst, const blitfx* FX);
  81. DLL int SurfaceRotate(const video* SrcFormat, const video* DstFormat, 
  82.   const planes Src, planes Dst, int Dir);
  83. DLL int DefaultAspect(int,int);
  84. DLL void DefaultPitch(video*);
  85. DLL void DefaultRGB(pixel*, int BitCount, 
  86.                      int RBits, int GBits, int BBits,
  87.                      int RGaps, int GGaps, int BGaps);
  88. DLL void BuildChapter(tchar_t* s,int slen,int No,int64_t Time,int Rate);
  89. // variable names: Result, Data, Size
  90. #define GETVALUE(Value,Type)
  91. {
  92. assert(Size == sizeof(Type));
  93. *(Type*)Data = Value;
  94. Result = ERR_NONE;
  95. }
  96. #define GETVALUECOND(Value,Type,Cond)
  97. {
  98. assert(Size == sizeof(Type));
  99. if (Cond)
  100. {
  101. *(Type*)Data = Value;
  102. Result = ERR_NONE;
  103. }
  104. }
  105. #define GETSTRING(Text)
  106. {
  107. tcscpy_s((tchar_t*)Data,Size/sizeof(tchar_t),Text);
  108. Result = ERR_NONE;
  109. }
  110. #define SETVALUE(Value,Type,Update)
  111. {
  112. assert(Size == sizeof(Type));
  113. Value = *(Type*)Data;
  114. Result = Update;
  115. }
  116. #define SETVALUENULL(Value,Type,Update,Null)
  117. {
  118. if (Data)
  119. {
  120. assert(Size == sizeof(Type));
  121. Value = *(Type*)Data;
  122. }
  123. else
  124. Null;
  125. Result = Update;
  126. }
  127. #define SETVALUECOND(Value,Type,Update,Cond)
  128. {
  129. assert(Size == sizeof(Type));
  130. if (Cond)
  131. {
  132. Value = *(Type*)Data;
  133. Result = Update;
  134. }
  135. }
  136. #define SETVALUECMP(Value,Type,Update,EqFunc)
  137. {
  138. assert(Size == sizeof(Type));
  139. Result = ERR_NONE;
  140. if (!EqFunc(&Value,(Type*)Data))
  141. {
  142. Value = *(Type*)Data;
  143. Result = Update;
  144. }
  145. }
  146. #define SETSTRING(Text)
  147. {
  148. tcscpy_s(Text,TSIZEOF(Text),(tchar_t*)Data);
  149. Result = ERR_NONE;
  150. }
  151. #define SETPACKETFORMAT(Value,Type,Update)
  152. {
  153. assert(Size == sizeof(Type) || !Data);
  154. Result = PacketFormatCopy(&Value,(Type*)Data);
  155. if (Result == ERR_NONE)
  156. Result = Update;
  157. }
  158. #define SETPACKETFORMATCMP(Value,Type,Update)
  159. {
  160. assert(Size == sizeof(Type) || !Data);
  161. Result = ERR_NONE;
  162. if (!EqPacketFormat(&Value,(Type*)Data))
  163. {
  164. Result = PacketFormatCopy(&Value,(Type*)Data);
  165. if (Result == ERR_NONE)
  166. Result = Update;
  167. }
  168. }
  169. DLL void SplitURL(const tchar_t* URL, tchar_t* Mime, int MimeLen, tchar_t* Dir, int DirLen, tchar_t* Name, int NameLen, tchar_t* Ext, int ExtLen);
  170. DLL bool_t SetFileExt(tchar_t* URL, int URLLen, const tchar_t* Ext);
  171. DLL int CheckExts(const tchar_t* URL, const tchar_t* Exts);
  172. DLL bool_t CheckContentType(const tchar_t* s, const tchar_t* List);
  173. DLL void AbsPath(tchar_t* Abs, int AbsLen, const tchar_t* Any, const tchar_t* Base);
  174. DLL void RelPath(tchar_t* Rel, int RelLen, const tchar_t* Any, const tchar_t* Base);
  175. DLL bool_t UpperPath(tchar_t* Path, tchar_t* Last, int LastLen);
  176. DLL bool_t UniqueExts(const int* Begin,const int* Pos);
  177. DLL void GetAsciiToken(tchar_t* Out,size_t OutLen,const char* In,size_t InLen);
  178. #define SWAP32(a) ((((uint32_t)(a) >> 24) & 0x000000FF) | (((uint32_t)(a) >> 8)  & 0x0000FF00)|
  179.                   (((uint32_t)(a) << 8)  & 0x00FF0000) | (((uint32_t)(a) << 24) & 0xFF000000))
  180. #define SWAP16(a) ((uint16_t)((((uint32_t)(a) >> 8) & 0xFF) | (((uint32_t)(a) << 8) & 0xFF00)))
  181. #define SWAP64(a) (((uint64_t)SWAP32(a) << 32) | SWAP32((uint64_t)(a)>>32))
  182. #define RSHIFT_ROUND(v,n) (((v)+(1<<(n-1)))>>(n))
  183. #ifdef IS_BIG_ENDIAN
  184. #define INT64BE(a) (a)
  185. #define INT64LE(a) SWAP64(a)
  186. #define INT32BE(a) (a)
  187. #define INT32LE(a) SWAP32(a)
  188. #define INT16BE(a) (a)
  189. #define INT16LE(a) SWAP16(a)
  190. #else
  191. #define INT64LE(a) (a)
  192. #define INT64BE(a) SWAP64(a)
  193. #define INT32LE(a) (a)
  194. #define INT32BE(a) SWAP32(a)
  195. #define INT16LE(a) (a)
  196. #define INT16BE(a) SWAP16(a)
  197. #endif
  198. #if defined(CONFIG_UNALIGNED_ACCESS)
  199. #define LOAD16LE(ptr) INT16LE(*(uint16_t*)(ptr))
  200. #define LOAD16BE(ptr) INT16BE(*(uint16_t*)(ptr))
  201. #define LOAD32LE(ptr) INT32LE(*(uint32_t*)(ptr))
  202. #define LOAD32BE(ptr) INT32BE(*(uint32_t*)(ptr))
  203. #define LOAD64LE(ptr) INT64LE(*(uint64_t*)(ptr))
  204. #define LOAD64BE(ptr) INT64BE(*(uint64_t*)(ptr))
  205. #else
  206. #define LOAD8(ptr,ofs) (((uint8_t*)(ptr))[ofs])
  207. #define LOAD16LE(ptr) ((uint16_t)((LOAD8(ptr,1)<<8)|LOAD8(ptr,0)))
  208. #define LOAD16BE(ptr) ((uint16_t)((LOAD8(ptr,0)<<8)|LOAD8(ptr,1)))
  209. #define LOAD32LE(ptr) ((LOAD8(ptr,3)<<24)|(LOAD8(ptr,2)<<16)|(LOAD8(ptr,1)<<8)|LOAD8(ptr,0))
  210. #define LOAD32BE(ptr) ((LOAD8(ptr,0)<<24)|(LOAD8(ptr,1)<<16)|(LOAD8(ptr,2)<<8)|LOAD8(ptr,3))
  211. #define LOAD64LE(ptr) (((uint64_t)(LOAD8(ptr,0))    )|((uint64_t)(LOAD8(ptr,1))<< 8)|((uint64_t)(LOAD8(ptr,2))<<16)|((uint64_t)(LOAD8(ptr,3))<<24)| 
  212.  ((uint64_t)(LOAD8(ptr,4))<<32)|((uint64_t)(LOAD8(ptr,5))<<40)|((uint64_t)(LOAD8(ptr,6))<<48)|((uint64_t)(LOAD8(ptr,0))<<56)|)
  213. #define LOAD64BE(ptr) (((uint64_t)(LOAD8(ptr,0))<<56)|((uint64_t)(LOAD8(ptr,1))<<48)|((uint64_t)(LOAD8(ptr,2))<<40)|((uint64_t)(LOAD8(ptr,3))<<32)| 
  214.  ((uint64_t)(LOAD8(ptr,4))<<24)|((uint64_t)(LOAD8(ptr,5))<<16)|((uint64_t)(LOAD8(ptr,6))<< 8)|((uint64_t)(LOAD8(ptr,0))    )|)
  215. #endif
  216. #ifdef IS_BIG_ENDIAN
  217. #define LOAD16(ptr) LOAD16BE(ptr)
  218. #define LOAD32(ptr) LOAD32BE(ptr)
  219. #define LOAD64(ptr) LOAD64BE(ptr)
  220. #define LOAD16SW(ptr) LOAD16LE(ptr)
  221. #define LOAD32SW(ptr) LOAD32LE(ptr)
  222. #define LOAD64SW(ptr) LOAD64LE(ptr)
  223. #else
  224. #define LOAD16(ptr) LOAD16LE(ptr)
  225. #define LOAD32(ptr) LOAD32LE(ptr)
  226. #define LOAD64(ptr) LOAD64LE(ptr)
  227. #define LOAD16SW(ptr) LOAD16BE(ptr)
  228. #define LOAD32SW(ptr) LOAD32BE(ptr)
  229. #define LOAD64SW(ptr) LOAD64BE(ptr)
  230. #endif
  231. // a=(a+c+1)/2
  232. // b=(b+d+1)/2
  233. #define AVG32R(a,b,c,d) 
  234. c^=a; 
  235. d^=b; 
  236. a|=c; 
  237. b|=d; 
  238. c &= 0xFEFEFEFE; 
  239. d &= 0xFEFEFEFE; 
  240. a-=c>>1; 
  241. b-=d>>1; 
  242. // a=(a+c)/2
  243. // b=(b+d)/2
  244. #ifdef ARM
  245. #define AVG32NR(a,b,c,d) 
  246. c^=a; 
  247. d^=b; 
  248. a &= ~c; 
  249. b &= ~d; 
  250. c &= 0xFEFEFEFE; 
  251. d &= 0xFEFEFEFE; 
  252. a+=c>>1; 
  253. b+=d>>1; 
  254. #else
  255. #define AVG32NR(a,b,c,d) 
  256. c^=a; 
  257. d^=b; 
  258. a|=c; 
  259. b|=d; 
  260. a-=c & 0x01010101; 
  261. b-=d & 0x01010101; 
  262. c &= 0xFEFEFEFE; 
  263. d &= 0xFEFEFEFE; 
  264. a-=c>>1; 
  265. b-=d>>1; 
  266. #endif
  267. static INLINE int _log2(uint32_t data)
  268. {
  269. int i;
  270. if (!data) ++data;
  271. for (i=0;data;++i)
  272. data >>= 1;
  273.     return i;
  274. }
  275. DLL int ScaleRound(int v,int Num,int Den);
  276. static INLINE int Scale(int v,int Num,int Den)
  277. {
  278. if (Den) 
  279. return (int)((int64_t)v * Num / Den);
  280. return 0;
  281. }
  282. static INLINE int Scale64(int v,int64_t Num,int64_t Den)
  283. {
  284. if (Den) 
  285. return (int)((int64_t)v * Num / Den);
  286. return 0;
  287. }
  288. #define OFS(name,item) ((int)&(((name*)NULL)->item))
  289. #define WMVF_ID FOURCC('W','M','V','F')
  290. #define WMAF_ID FOURCC('W','M','A','F')
  291. extern DLL const nodedef WMVF;
  292. extern DLL const nodedef WMAF;
  293. #endif