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

流媒体/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 standard> conforming products. 
  20. This copyright notice must be included in all copies or derivative works. 
  21. Copyright (c) 1996, 1997.
  22. Module Name:
  23. grayf.hpp
  24. Abstract:
  25. Float image class for gray (one-plane) pictures 
  26. Revision History:
  27. Nov. 27, 1997 :added Spatial tool 
  28. by Takefumi Nagumo(nagumo@av.crl.sony.co.jp),SONY corporation
  29. *************************************************************************/
  30. #ifndef __GRAYC_HPP_ 
  31. #define __GRAYC_HPP_
  32. //#define __NBIT_ // NBIT: remove this line and recompile when code 8-bit data
  33. #ifdef __NBIT_ // NBIT: only set when bits per pixel bigger than 8
  34. typedef unsigned short PixelC;
  35. #else
  36. typedef unsigned char PixelC;
  37. #endif
  38. #ifndef MAX_NUM_CONTOUR
  39. #define MAX_NUM_CONTOUR 200
  40. #endif
  41. Class CVideoObjectPlane;
  42. Class CU8Image
  43. {
  44. public:
  45. // Constructors
  46. ~CU8Image ();
  47. CU8Image (const CU8Image& uci, const CRct& r = CRct ()); // crop from a floatimage
  48. CU8Image (const CVideoObjectPlane& vop, RGBA comp, const CRct& r = CRct ());
  49. CU8Image (const CRct& r, PixelC px); // floatimage with same pixel value everywhere
  50. CU8Image (const CRct& r); // floatimage with same pixel value everywhere
  51. CU8Image (const CPolygonI& plg, const CRct& rct); // fill in the polygon (interior boundary)
  52. CU8Image (
  53. const Char* pchFileName, // MPEG4 file format
  54. UInt ifr, // frame number
  55. const CRct& rct, // final rect 
  56. UInt nszHeader = 0 // number of header to be skipped
  57. );
  58. CU8Image (const Char* vdlFileName); // read from a VM file.
  59. // Attributes
  60. Bool valid () const {return this != 0;}
  61. const CRct& where () const {return m_rc;}
  62. CRct boundingBox (const PixelC pxlcOutsideColor = (PixelC) transpValue) const;
  63. PixelC pixel (CoordI x, CoordI y) const {return m_ppxlc [m_rc.offset (x, y)];}
  64. PixelC pixel (const CSite& st) const {return pixel (st.x, st.y);}
  65. const PixelC* pixels () const {return m_ppxlc;} // return pointer
  66. const PixelC* pixels (CoordI x, CoordI y) const {return m_ppxlc + m_rc.offset (x, y);}
  67. const PixelC* pixels (const CSite& st) const {return pixels (st.x, st.y);}
  68. // Resultants
  69. own CU8Image* decimate (UInt rateX, UInt rateY) const; // decimate the vframe by rateX and rateY.
  70. own CU8Image* decimateBinaryShape (UInt rateX, UInt rateY) const; // decimate by rateX and rateY in a conservative way
  71. own CU8Image* zoomup (UInt rateX, UInt rateY) const;
  72. own CU8Image* expand (UInt rateX, UInt rateY) const;  // expand by putting zeros in between
  73. own CU8Image* biInterpolate () const; // bilinearly interpolate 
  74. own CU8Image* downsampleForSpatialScalability () const;
  75. own CU8Image* CU8Image::upsampleForSpatialScalability ( Int iVerticalSamplingFactorM,
  76. Int iVerticalSamplingFactorN,
  77. Int iHorizontalSamplingFactorM,
  78. Int iHorizontalSamplingFactorN,
  79. Int iType,
  80. Int iExpandYRefFrame
  81. ) const;
  82. own CU8Image* biInterpolate (UInt accuracy) const; // bilinearly interpolate using 2/4/8/16 quantization
  83. own CU8Image* transpose () const; // transpose the floatimge
  84. own CU8Image* complement () const; // complement a binarized uci
  85. own CU8Image* warp (const CAffine2D& aff) const; // affine warp
  86. own CU8Image* warp (const CPerspective2D& persp) const; // perspective warp
  87. own CU8Image* warp (const CPerspective2D& persp, const CRct& rctWarp) const; // perspective warp to rctWarp
  88. own CU8Image* warp (const CPerspective2D& persp, const CRct& rctWarp, const UInt accuracy) const; // perspective warp to rctWarp
  89. own CU8Image* smooth (UInt window) const; // smooth a binarized uci of window
  90. PixelC pixel (CoordD x, CoordD y) const; // bi-linear interpolation
  91. PixelC pixel (CoordI x, CoordI y, UInt accuracy) const; // bi-linear interpolation using 2/4/8/16 quantization
  92. PixelC pixel (const CSiteD& std) const {return pixel (std.x, std.y);} // bi-linear interpolation
  93. PixelC pixel (const CSite& std, UInt accuracy) const {return pixel (std.x, std.y, accuracy);} // bi-linear interpolation
  94. U8 mean () const; // mean
  95. U8 mean (const CU8Image* pfiMsk) const; // mean
  96. Int sumDeviation () const; // sum of first-order deviation
  97. Int sumDeviation (const CU8Image* puciMsk) const; // sum of first-order deviation
  98. UInt sumAbs (const CRct& rct = CRct ()) const; // sum of absolute value
  99. Bool allValue (PixelC ucVl, const CRct& rct = CRct ()) const; // whether all pixels have value of vl
  100. Bool biLevel (const CRct& rct = CRct ()) const; // whether it is a binary image
  101. Bool atLeastOneValue (PixelC ucVl, const CRct& rct = CRct ()) const; // whether at least one pixel has value of vl
  102. CRct whereVisible () const; // the tightest bounding box of non-transparent pixels
  103. UInt numPixelsNotValued (PixelC ucVl, const CRct& rct = CRct ()) const; // number of pixels not valued vl in region rct
  104. Double mse (const CU8Image& uciCompare) const;
  105. Double mse (const CU8Image& uciCompare, const CU8Image& uciMsk) const;
  106. Double snr (const CU8Image& uciCompare) const;
  107. Double snr (const CU8Image& uciCompare, const CU8Image& uciMsk) const;
  108. Void vdlDump (const Char* fileName = "tmp.vdl", const CRct& rct = CRct ()) const;
  109. Void dump (FILE* pf, const CRct& rct = CRct (), Int iScale = 255) const;
  110. Void dumpWithMask (FILE* pf, const CU8Image *puciMask, const CRct& rct = CRct (), Int iScale = 255) const;
  111. Void txtDump (const Char* fileName = "tmp.txt") const;
  112. Void txtDump (FILE *) const;
  113. Void txtDumpMask (FILE *) const;
  114. own CU8Image* extendPadLeft ();  // for block padding
  115. own CU8Image* extendPadRight ();  // for block padding
  116. own CU8Image* extendPadTop ();  // for block padding
  117. own CU8Image* extendPadDown ();  // for block padding
  118. // Overloaded operators
  119. own CU8Image* operator * (const CTransform& tf) const;
  120. own CU8Image* operator * (const CAffine2D& aff) const {return warp (aff);} // affine warp
  121. own CU8Image* operator * (const CPerspective2D& persp) const {return warp (persp);} // perspective warp
  122. Bool operator == (const CU8Image& uci) const;
  123. // Operations
  124. Void where (const CRct& r); // crop based on r
  125. Void pixel (CoordI x, CoordI y, PixelC p) {m_ppxlc [m_rc.offset (x, y)] = p;} // set a pixel
  126. Void pixel (const CSite& st, PixelC p) {pixel (st.x, st.y, p);} //  set a pixel
  127. Void setRect (const CRct& rct); // set the rect
  128. Void shift (Int nX, Int nY) {m_rc.shift (nX, nY);} // shift CRct by nX and nY
  129. Void zeroPad (const CU8Image* pucimsk); // zero padding
  130. Void LPEPad (const CU8Image* pucimsk); // Low Pass Extrapolation Padding
  131. Void simplifiedRepeatPad (const CU8Image*); // simplified repetitive padding
  132. Void modifiedSimplifiedRepeatPad (const CU8Image*);
  133. Void originalRepeatPad (const CU8Image*);
  134. Void modifiedVMRepeatPad(const CU8Image *puciMask);
  135. Void repeatPad (const CU8Image* pucimsk); // repetitive padding
  136. Void sHorRepeatPad (const CU8Image* pucimsk); // simplified horizontal repetitive padding
  137. Void sVerRepeatPad (const CU8Image* pucimsk); // simplified vertical repetitive padding
  138. Void mrepeatPad (const CU8Image* pucimsk); // modified repetitive padding
  139. Void blockPad (const CU8Image* puciOrigMask, const UInt uintBlockSize); // block padding
  140. Void averagePad (const CU8Image* puciOrigMask); // averaging padding
  141. Void repeatPadNew (const CU8Image* pucimsk); // repetitive padding
  142. Void threshold (PixelC ucThresh);    // cut < thresh to be zero
  143. Void binarize (PixelC ucThresh); // binarize it
  144. /* NBIT: change U8 to PixelC
  145. Void checkRange (U8 ucMin, U8 ucMax); 
  146. */
  147. Void checkRange (PixelC ucMin, PixelC ucMax); 
  148. Void overlay (const CU8Image& uci); // overlay uci on top of *this
  149. Void overlay (const CU8Image& uci, const CRct& rctSrc); // overlay part (according to rctSrc) of uci on top of this
  150. Void CU8Image_xor (const CU8Image& uci); // xor two binarized uci
  151. Void CU8Image_or (const CU8Image& uci); // or of two binarized uci
  152. Void CU8Image_and (const CU8Image& uci); // or of two binarized uci
  153. Void maskOut (const CU8Image& uci); // mask out uci
  154. Void mutiplyAlpha (const CU8Image& uci); //multiply by alpha channel
  155. Void cropOnAlpha (); //  crop the image based on non-transparent value
  156. Void operator = (const CU8Image& uci);
  157. Void decimateBinaryShapeFrom (const CU8Image& uciSrc); // decimate by rateX and rateY in a conservative way
  158. ///////////////// implementation /////////////////
  159. protected:
  160. PixelC* m_ppxlc;
  161. CRct m_rc;
  162. Void allocate (const CRct& r, PixelC pxlc);
  163. Void allocate (const CRct& r);
  164. Void copyConstruct (const CU8Image& uci, const CRct& rct);
  165. Void swap (CU8Image& uci);
  166. Void fillColumnDownward (
  167. const PixelC*& pxlOrigMask, 
  168. const PixelC*& ppxlOrigData, 
  169. PixelC*& ppxlFillMask, 
  170. PixelC*& ppxlFillData
  171. ) const;
  172. Void fillColumnUpward (
  173. const PixelC*& ppxlOrigMask, 
  174. const PixelC*& ppxlOrigData, 
  175. PixelC*& ppxlFillMask, 
  176. PixelC*& ppxlMaskData
  177. ) const;
  178. Void fillRowRightward (
  179. const PixelC*& ppxlOrigMask, 
  180. const PixelC*& ppxlOrigData, 
  181. PixelC*& ppxlFillMask, 
  182. PixelC*& ppxlFillData
  183. ) const;
  184. Void fillRowLeftward (
  185. const PixelC*& ppxlOrigMask, 
  186. const PixelC*& ppxlOrigData, 
  187. PixelC*& ppxlFillMask, 
  188. PixelC*& ppxlFillData
  189. ) const;
  190. Void fillCorners (CRct& nBlkRct);
  191. Void fillHoles (const CU8Image *puciFillMask);
  192. own CU8Image* smooth_ (UInt window) const; // smooth a binarized uci of window
  193. // for block padding
  194. Void dilation4 (CU8Image* pMask);
  195. Void dilation8 (CU8Image* pMask);
  196. };
  197. #endif //_GRAYF_HPP_  
  198.