basic.hpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:14k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation
  4. Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation
  5. Bruce Lin (blin@microsoft.com), Microsoft Corporation
  6. Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation
  7. (date: March, 1996)
  8. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  9. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  10. as specified by the MPEG-4 Video. 
  11. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  12. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  13. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  14. The original developer of this software module and his/her company, 
  15. the subsequent editors and their companies, 
  16. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  17. Copyright is not released for non MPEG-4 Video conforming products. 
  18. Microsoft retains full right to use the code for his/her own purpose, 
  19. assign or donate the code to a third party and to inhibit third parties from using the code for non MPEG-4 Video conforming products. 
  20. This copyright notice must be included in all copies or derivative works. 
  21. Copyright (c) 1996, 1997.
  22. Module Name:
  23. basic.hpp
  24. Abstract:
  25.     Basic types:
  26. Data, CSite, CVector2D, CVector3D, CRct, CPixel, CMotionVector, CMatrix3x3D
  27. Revision History:
  28. *************************************************************************/
  29. #ifndef __BASIC_HPP_ 
  30. #define __BASIC_HPP_
  31. #include "assert.h"
  32. #include "string.h"
  33. #ifdef __MAKE_DLL_
  34. #define API __declspec (dllexport)
  35. #define Class        class API
  36. #else
  37. #define API
  38. #define Class class
  39. #endif // __MAKE_DLL_
  40. #ifdef __MFC_
  41. #include <afx.h>
  42. #include <afxtempl.h>
  43. #include <windowsx.h>
  44. #endif // __MFC_
  45. #define own // used as "reserved word" to indicate ownership or transfer to distinguish from const
  46. #define TRUE 1
  47. #define FALSE 0
  48. #ifndef NULL
  49. #define NULL 0
  50. #endif
  51. #define transpValue 0
  52. #define opaqueValue 255
  53. #define transpValueF 0.0F
  54. #define opaqueValueF 255.0F
  55. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  56. #define BBM             TRUE
  57. #define BBS             FALSE
  58. // End of Hyundai(1998-5-9)*/
  59. #ifdef MPEG4_TRANSPARENT
  60. #undef MPEG4_TRANSPARENT
  61. #endif
  62. #ifdef MPEG4_OPAQUE
  63. #undef MPEG4_OPAQUE
  64. #endif
  65. #define MPEG4_TRANSPARENT 0
  66. #define MPEG4_OPAQUE 255
  67. #define transpPixel CPixel(0,0,0,0)
  68. #define opaquePixel CPixel(255,255,255,255)
  69. #ifndef max
  70. #define max(a,b) (((a) > (b)) ? (a) : (b))
  71. #endif
  72. #ifndef min
  73. #define min(a, b)  (((a) < (b)) ? (a) : (b))
  74. #endif
  75. #define signOf(x) (((x) > 0) ? 1 : 0)
  76. #define invSignOf(x) ((x) > 0 ? 0 : 1) // see p.22/H.263
  77. #define sign(x) ((x) > 0 ? 1 : -1) // see p.22/H.263
  78. #define rounded(x) ((x) > 0 ? x + 0.5 : x - 0.5)
  79. /////////////////////////////////////////////
  80. // 
  81. //      Forward declarations for classes
  82. // 
  83. /////////////////////////////////////////////
  84. Class CSite;
  85. Class CVector2D;
  86. Class CRct;
  87. Class CPixel; // 32 bit pixel, various interpretations depending on PixelType
  88. Class CMotionVector;
  89. /////////////////////////////////////////////
  90. // 
  91. //  Typedefs for basic types
  92. // 
  93. /////////////////////////////////////////////
  94. #define Sizeof(x) ((unsigned long) sizeof (x))
  95. #if 1 // in case future compilers redefine longs and shorts
  96. typedef unsigned long U32; 
  97. typedef int I32; 
  98. typedef unsigned short U16; 
  99. typedef short I16; 
  100. ///// WAVELET VTC: begin ///////////////////////////////
  101. typedef unsigned short UShort;  // hjlee
  102. typedef short Short;   // hjlee
  103. ///// WAVELET VTC: end ///////////////////////////////
  104. #endif // in case future compilers redefine longs and shorts 
  105. typedef unsigned UInt; 
  106. typedef double Double; 
  107. #ifdef __DOUBLE_PRECISION_
  108. typedef double Float; 
  109. #else
  110. typedef float Float; 
  111. #endif // __DOUBLE_PRECISION_
  112. typedef float Float32; 
  113. typedef float F32; 
  114. typedef unsigned char U8; 
  115. typedef signed char I8; 
  116. ///// WAVELET VTC: begin ///////////////////////////////
  117. typedef unsigned char UChar;  // hjlee
  118. ///// WAVELET VTC: end ///////////////////////////////
  119. typedef long Long; 
  120. typedef unsigned long ULong; 
  121. typedef int Int; 
  122. typedef void Void; 
  123. typedef int Bool; 
  124. typedef long CoordI; 
  125. typedef double CoordD; 
  126. typedef char Byte; 
  127. typedef char Char; 
  128. typedef enum {red, green, blue, alpha} RGBA; // define pixel component
  129. typedef enum {zero, repeat} PadMethod; // define padding technique
  130. typedef enum {Q_H263, Q_MPEG} Quantizer; 
  131. typedef enum {IVOP, PVOP, BVOP, SPRITE, UNKNOWNVOPTYPE} VOPpredType;
  132. typedef enum {B_FORWARD, B_BACKWARD} ShapeBPredDir;
  133. typedef enum BlockNum {
  134. ALL_Y_BLOCKS = 0,
  135. Y_BLOCK1 = 1, 
  136. Y_BLOCK2 = 2, 
  137. Y_BLOCK3 = 3, 
  138. Y_BLOCK4 = 4, 
  139. U_BLOCK = 5, 
  140. V_BLOCK = 6,
  141. A_BLOCK1 = 7, 
  142. A_BLOCK2 = 8, 
  143. A_BLOCK3 = 9, 
  144. A_BLOCK4 = 10, 
  145. ALL_A_BLOCKS = 11
  146. } BlockNum;
  147. typedef enum PlaneType {Y_PLANE, U_PLANE, V_PLANE, A_PLANE, BY_PLANE, BUV_PLANE} PlaneType;
  148. typedef enum AlphaUsage {RECTANGLE, ONE_BIT, EIGHT_BIT} AlphaUsage;
  149. typedef enum ChromType {FOUR_FOUR_FOUR, FOUR_TWO_TWO, FOUR_TWO_ZERO} ChromType;
  150. typedef enum EntropyCodeType {huffman, arithmetic} EntropyCodeType;
  151. typedef enum TransparentStatus {ALL, PARTIAL, NONE} TransparentStatus;
  152. typedef enum {STOP, PIECE, UPDATE, PAUSE, NEXT} SptXmitMode;
  153. typedef enum {BASIC_SPRITE, LOW_LATENCY, PIECE_OBJECT, 
  154. PIECE_UPDATE} SptMode; // basic sprite, and low-latency (object only, update only, intermingled) 
  155. typedef Int Time;
  156. /////////////////////////////////////////////
  157. // 
  158. //  Space
  159. // 
  160. /////////////////////////////////////////////
  161. Class CSite
  162. {
  163. public:  
  164. CoordI x; 
  165. CoordI y; 
  166. // Constructors
  167. CSite () {}
  168. CSite (const CSite& s) {x = s.x; y = s.y;}
  169. CSite (CoordI xx, CoordI yy) {x = xx; y = yy;}
  170. // Properties
  171. CoordI xCoord () const {return x;}
  172. CoordI yCoord () const {return y;}
  173. // Operators
  174. Void set (CoordI xx, CoordI yy) {x = xx; y = yy;}
  175. CSite operator + (const CSite& st) const; // Coornidate-wise +
  176. CSite operator - (const CSite& st) const; // Coornidate-wise -
  177. CSite operator * (const CSite& st) const; // Coornidate-wise *
  178. CSite operator * (Int scale) const; // Coornidate-wise scaling
  179. CSite operator / (const CSite& st) const; // Coornidate-wise /
  180. CSite operator / (Int scale) const; // Coornidate-wise scaling
  181. CSite operator % (const CSite& st) const; // Coornidate-wise %
  182. Void operator = (const CSite& st);
  183. // Synonyms
  184. Bool operator == (const CSite& s) const {return x == s.x && y == s.y;}
  185. Bool operator != (const CSite& s) const {return x != s.x || y != s.y;}
  186. }; 
  187. typedef CSite CVector;
  188. Class CVector2D
  189. {
  190. public:  
  191. CoordD x; 
  192. CoordD y; 
  193. // Constructors
  194. CVector2D () {}
  195. CVector2D (CoordD xx, CoordD yy) {x = xx; y = yy;}
  196. // Operators
  197. Void set (CoordD xx, CoordD yy) {x = xx; y = yy;}
  198. Void operator = (const CVector2D& v) {x = v.x; y = v.y;}
  199. // Resultants
  200. CoordD squared () const {return x * x + y * y;}
  201. CVector2D operator + (const CVector2D& v) const 
  202. {return CVector2D (x + v.x, y + v.y);} 
  203. CVector2D operator - (const CVector2D& v) const 
  204. {return CVector2D (x - v.x, y - v.y);} 
  205. Double operator * (const CVector2D& v) const // inner product
  206. {return x * v.x + y * v.y;} 
  207. CVector2D operator * (Double alpha) const // times scalar
  208. {return CVector2D (x * alpha, y * alpha);} 
  209. CVector2D operator / (Double alpha) const // times scalar
  210. {return (alpha == 0) ? *this : CVector2D (x / alpha, y / alpha);} 
  211. Bool operator == (const CVector2D& v) const
  212. {return (x == v.x && y == v.y);}
  213. Bool operator != (const CVector2D& v) const
  214. {return (x != v.x || y != v.y);}
  215. CVector2D rot90 () const // rotation 90 degrees
  216. {return CVector2D (-y, x);} 
  217. CVector2D rot270 () const // rotation 270 degrees
  218. {return CVector2D (y, -x);} 
  219. ///////////////// implementation /////////////////
  220. protected:  
  221. };
  222. typedef CVector2D CSiteD;
  223. Class CRct
  224. {
  225. public:  
  226. CoordI left, top, right, bottom;
  227. Int width; // width is needed almost for every Rect.  So have a member to avoid extra computations.
  228. // Constructors
  229. CRct () 
  230. {invalidate ();}
  231. CRct (const CRct& r) 
  232. {left = r.left; top = r.top; right = r.right; bottom = r.bottom; width = r.width;}
  233. CRct (const CSite& s) // one-point CRct
  234. {left = s.x; top = s.y; right = s.x + 1; bottom = s.y + 1; width = 1;}
  235. CRct (CoordI l, CoordI t, CoordI r, CoordI b)
  236. {left = l; top = t; right = r; bottom = b; width = right - left;}
  237. CRct (CoordI x, CoordI y)
  238. {left = x; top = y; right = x + 1; bottom= y + 1; width = 1;}
  239. CRct (const CSite& st1, const CSite& st2);
  240. CRct (Int radius)
  241. {left = -radius; top = -radius; right = radius + 1; bottom = radius + 1; width = 2 * radius + 1;}
  242. CRct (CoordI x, CoordI y, Int radius)
  243. {left = x - radius; top = y - radius; right= x + radius + 1; bottom = y + radius + 1; width = 2 * radius + 1;}
  244. CRct (const CSite& st, Int radiusX, Int radiusY); // centered at st, expanded by radiusX and radiusY in each direction
  245. CRct ( // a Rect that includes all four sites
  246. const CSiteD& stdLeftTop,
  247. const CSiteD& stdRightTop,
  248. const CSiteD& stdLeftBottom,
  249. const CSiteD& stdRightBottom
  250. );
  251. // Attributes 
  252. Bool valid () const // check whether the CRct is valid
  253. {return left < right && top < bottom;} 
  254. Bool empty () const 
  255. {return left >= right || top >= bottom;} 
  256. // CoordI width () const 
  257. // {return !valid () ? 0 : (right - left);}
  258. CoordI height () const 
  259. {return !valid () ? 0 : (bottom - top);} 
  260. UInt area () const 
  261. {return (UInt) width * height ();} 
  262. CSite center () const 
  263. {return CSite ((left + right) >> 1, (top + bottom) >> 1);}
  264. UInt offset (CoordI x, CoordI y) const // index into linear array
  265. {return !valid () ? 0 : (UInt) width * (y - top) + (x - left);} 
  266. Bool includes (const CSite& s) const
  267. {return includes (s.x, s.y);}
  268. Bool includes (CoordI x, CoordI y) const 
  269. {return x >= left && x < right && y >= top && y < bottom;}
  270. Bool includes (const CRct& rc) const
  271. {
  272. return 
  273. includes(rc.left, rc.top) && 
  274. includes(rc.left, rc.bottom - 1) &&
  275. includes(rc.right - 1, rc.top) && 
  276. includes(rc.right - 1, rc.bottom - 1);
  277. }
  278. // Operations
  279. Void invalidate () 
  280. {left = top = 0; right = bottom = -1;} 
  281. Void expand (CoordI dl, CoordI dt, CoordI dr, CoordI db)
  282. {left -= dl; top -= dt; right += dr; bottom += db; width += dr + dl;}
  283. Void expand (Int expandSize) // same expansion size for all four directions
  284. {expand (expandSize, expandSize, expandSize, expandSize);}
  285. Void shift (CoordI dx, CoordI dy)               
  286. {left += dx; top += dy; right += dx; bottom += dy;}
  287. Void transpose (); // transpose the width and height, left-top corner remains the same
  288. Void rightRotate (); // Rotate the CRct by 90 degrees, center remains the same
  289. Void clip (const CRct& rc); // intersect
  290. Void include (const CRct& rc); // union
  291. Void include (const CSite& s);
  292. Void include (CoordI x, CoordI y) {include (CSite (x, y));}
  293. CRct downSampleBy2 () const;
  294. CRct upSampleBy2 () const;
  295. // Operators
  296. Void operator = (const CRct& rc);
  297. Bool operator == (const CRct& rc) const; 
  298. Bool operator != (const CRct& rc) const {return !(operator == (rc));}
  299. Bool operator <= (const CRct& rc) const;
  300. Bool operator >= (const CRct& rc) const;
  301. // Resultants
  302. CRct operator / (Int scale) const; 
  303. // divide the width and height by scale
  304. // round if the original size cannot be divided by scale
  305. CRct operator * (Int scale) const; 
  306. // scale the width and height by scale
  307. }; 
  308. /////////////////////////////////////////////
  309. // 
  310. //  Pixels
  311. // 
  312. /////////////////////////////////////////////
  313. Class CPixel // 32 bit pixel, various interpretations depending on PixelType
  314. {
  315. public:  
  316. union 
  317. {
  318. U32 bits; 
  319. struct rgb 
  320. {
  321. U8 r:8, g:8, b:8, a:8; 
  322. } rgb; 
  323. struct yuv
  324. {
  325. U8 y:8, u:8, v:8, a:8; 
  326. } yuv; 
  327. struct xy 
  328. {
  329. I32 x :16, y :16; 
  330. } xy;
  331. U8 color[4];
  332. } pxlU; 
  333. CPixel () {} // uninitialized
  334. CPixel (const U32 u) {pxlU.bits = u;} // copy a long
  335. CPixel (U8 r, U8 g, U8 b, U8 a)
  336. {pxlU.bits = (U32) ((((((U32) r) | (((U32) g) << 8)) | (((U32) b) << 16)) | (((U32) a) << 24)));}
  337. operator U32 () {return pxlU.bits;}
  338. CPixel operator & (U32 u) {return CPixel (pxlU.bits & u);}
  339. CPixel operator & (Int u) {return CPixel (pxlU.bits & u);}
  340. CPixel operator & (CPixel p) {return CPixel (pxlU.bits & p.pxlU.bits);}
  341. CPixel operator | (CPixel p) {return CPixel (pxlU.bits | p.pxlU.bits);}
  342. CPixel operator ~ () {return CPixel (~pxlU.bits);}
  343. }; 
  344. typedef CPixel* PixelPtr; 
  345. /////////////////////////////////////////////
  346. // 
  347. //  Motion Vectors
  348. // 
  349. /////////////////////////////////////////////
  350. Class CMotionVector
  351. {
  352. public:
  353. CVector m_vctTrueHalfPel;
  354. Int iMVX; // x direction motion
  355. Int iMVY; // y direction motion
  356. Int iHalfX; // x direction half pixel. 3 values: -1, 0, 1
  357. Int iHalfY; // x direction half pixel. 3 values: -1, 0, 1
  358. // Constructor
  359. CMotionVector (const CVector& vctHalfPel);
  360. CMotionVector (Int ix, Int iy, Int iHx = 0, Int iHy = 0) {iMVX = ix; iMVY = iy; iHalfX = iHx; iHalfY = iHy; computeTrueMV ();}
  361. CMotionVector () {setToZero ();}
  362. // Attributes
  363. const CVector& trueMVHalfPel () const {return m_vctTrueHalfPel;}
  364. Bool isZero () const;
  365. // Operations
  366. Void operator = (const CMotionVector& mv);
  367. Void operator = (const CVector& vctHalfPel);
  368. Void setToZero ();
  369. Void computeTrueMV (); // compute trueMV (CVector) from MV (CMotionVector)
  370. Void computeMV (); // compute MV (CMotionVector) from trueMV (CVector)
  371. // Resultants
  372. CMotionVector operator + (const CMotionVector& mv) const;
  373. CMotionVector operator - (const CMotionVector& mv) const;
  374. };
  375. #endif // __BASIC_HPP_