dwt.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: dwt.h,v 1.2 2001/04/19 18:32:09 wmay Exp $ */
  2. /****************************************************************************/
  3. /*   MPEG4 Visual Texture Coding (VTC) Mode Software                        */
  4. /*                                                                          */
  5. /*   This software was jointly developed by the following participants:     */
  6. /*                                                                          */
  7. /*   Single-quant,  multi-quant and flow control                            */
  8. /*   are provided by  Sarnoff Corporation                                   */
  9. /*     Iraj Sodagar   (iraj@sarnoff.com)                                    */
  10. /*     Hung-Ju Lee    (hjlee@sarnoff.com)                                   */
  11. /*     Paul Hatrack   (hatrack@sarnoff.com)                                 */
  12. /*     Shipeng Li     (shipeng@sarnoff.com)                                 */
  13. /*     Bing-Bing Chai (bchai@sarnoff.com)                                   */
  14. /*     B.S. Srinivas  (bsrinivas@sarnoff.com)                               */
  15. /*                                                                          */
  16. /*   Bi-level is provided by Texas Instruments                              */
  17. /*     Jie Liang      (liang@ti.com)                                        */
  18. /*                                                                          */
  19. /*   Shape Coding is provided by  OKI Electric Industry Co., Ltd.           */
  20. /*     Zhixiong Wu    (sgo@hlabs.oki.co.jp)                                 */
  21. /*     Yoshihiro Ueda (yueda@hlabs.oki.co.jp)                               */
  22. /*     Toshifumi Kanamaru (kanamaru@hlabs.oki.co.jp)                        */
  23. /*                                                                          */
  24. /*   OKI, Sharp, Sarnoff, TI and Microsoft contributed to bitstream         */
  25. /*   exchange and bug fixing.                                               */
  26. /*                                                                          */
  27. /*                                                                          */
  28. /* In the course of development of the MPEG-4 standard, this software       */
  29. /* module is an implementation of a part of one or more MPEG-4 tools as     */
  30. /* specified by the MPEG-4 standard.                                        */
  31. /*                                                                          */
  32. /* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use     */
  33. /* of the MPEG-4 standard free license to use this  software module or      */
  34. /* modifications thereof for hardware or software products claiming         */
  35. /* conformance to the MPEG-4 standard.                                      */
  36. /*                                                                          */
  37. /* Those intending to use this software module in hardware or software      */
  38. /* products are advised that use may infringe existing  patents. The        */
  39. /* original developers of this software module and their companies, the     */
  40. /* subsequent editors and their companies, and ISO/IEC have no liability    */
  41. /* and ISO/IEC have no liability for use of this software module or         */
  42. /* modification thereof in an implementation.                               */
  43. /*                                                                          */
  44. /* Permission is granted to MPEG members to use, copy, modify,              */
  45. /* and distribute the software modules ( or portions thereof )              */
  46. /* for standardization activity within ISO/IEC JTC1/SC29/WG11.              */
  47. /*                                                                          */
  48. /* Copyright 1995, 1996, 1997, 1998 ISO/IEC                                 */
  49. /****************************************************************************/
  50. /************************************************************/
  51. /*     Sarnoff Very Low Bit Rate Still Image Coder          */
  52. /*     Copyright 1995, 1996, 1997, 1998 Sarnoff Corporation */
  53. /************************************************************/
  54. /* DWT and inverse DWT header file 
  55.    Created by Shipeng Li, Sarnoff Corporation, Jan. 1998
  56.    Copyright (c) Sarnoff Corporation
  57. */
  58. #ifndef _DWT_H_
  59. #define _DWT_H_
  60. #define UChar UChar
  61. // hjlee 0901
  62. #ifdef DATA
  63. #undef DATA
  64. #endif
  65. #define DATA Int  
  66.  
  67. #ifdef INT
  68. #undef INT
  69. #endif
  70. #define INT Int
  71. #define ROUNDDIV(x, y) ((x)>0?(Int)(((Int)(x)+((y)>>1))/(y)):(Int)(((Int)(x)-((y)>>1)) /(y)))
  72. enum {  /* DWT or IDWT return values */
  73.   DWT_OK,
  74.   DWT_FILTER_UNSUPPORTED,
  75.   DWT_MEMORY_FAILED,
  76.   DWT_COEFF_OVERFLOW,
  77.   DWT_INVALID_LEVELS,
  78.   DWT_INVALID_WIDTH,
  79.   DWT_INVALID_HEIGHT,
  80.   DWT_INTERNAL_ERROR,
  81.   DWT_NOVALID_PIXEL
  82. };
  83. #ifdef RECTANGULAR
  84. #undef RECTANGULAR
  85. #endif
  86. #define RECTANGULAR -1
  87. /* Image data type */
  88. enum { 
  89.   DWT_UCHAR_ENUM,
  90.   DWT_USHORT_ENUM
  91. };
  92. enum { /* filter class */
  93.   DWT_ODD_SYMMETRIC,
  94.   DWT_EVEN_SYMMETRIC,
  95.   DWT_ORTHORGONAL
  96. };
  97. enum {
  98.   DWT_EVEN,
  99.   DWT_ODD
  100. };
  101. enum {
  102.   DWT_HORIZONTAL,
  103.   DWT_VERTICAL
  104. };
  105. enum {
  106.   DWT_NONZERO_HIGH,
  107.   DWT_ZERO_HIGH,
  108.   DWT_ALL_ZERO
  109. };
  110. #define  DWT_OUT0 0
  111. #define  DWT_IN   1
  112. #define  DWT_OUT1 2
  113. #define  DWT_OUT2 3
  114. #define  DWT_OUT3 4
  115. enum { /* filter type */
  116.   DWT_INT_TYPE,
  117.   DWT_DBL_TYPE
  118. };
  119. typedef struct {
  120.   Int DWT_Class; 
  121.   /* 0: Odd Symmetric 1: Even Symmetric 2: Orthogonal (not supported)
  122.    Note: This is not defined by MPEG4-CD syntax but should be, since different 
  123.    wavelets corresponds to different extension. 
  124.    Ref. "Shape Adpative Discrete Wavelet Transform for Arbitrarily-Shaped 
  125.    Visual Object Coding" S. Li and W. Li (submitted to IEEE T-CSVT) 
  126.    */
  127.   Int DWT_Type;
  128.   /* 0: Short Coeff; 1: Double Coeff */
  129.   Int HPLength;
  130.   Int LPLength;
  131.   Void *HPCoeff;
  132.   Void *LPCoeff;
  133.   Int Scale;
  134. } FILTER;
  135. #ifdef __cplusplus
  136. #define DWT_S VTCDWT::
  137. #define IDWT_S VTCIDWT::
  138. #define DWTMASK_S VTCDWTMASK::
  139. #define IMAGEBOX_S VTCIMAGEBOX::
  140. class VTCDWT {
  141. public:
  142.   /* Wavelet Decomposition function used by encoder */
  143.   // hjlee 0901
  144.   INT do_DWT(Void *InData, UChar *InMask, Int Width, Int Height, Int nLevels,
  145.  Int InDataType, FILTER **Filter,  DATA *OutCoeff, UChar *OutMask);
  146.  
  147.  /* Remove DC Mean */
  148.   INT RemoveDCMean(Int *Coeff, UChar *Mask, INT Width, INT Height, INT nLevels);
  149. private:
  150. Int DecomposeOneLevelDbl(double *OutCoeff, UChar *OutMask, Int Width,
  151.  Int Height, Int level, FILTER *Filter);
  152. Int DecomposeOneLevelInt(Int *OutCoeff, UChar *OutMask, Int Width,
  153.  Int Height, Int level, FILTER *Filter,
  154.  Int MaxCoeff, Int MinCoeff);
  155. Int SADWT1dInt(Int *InBuf, UChar *InMaskBuf, Int *OutBuf, 
  156.       UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  157.       Int Direction);
  158. Int SADWT1dOddSymInt(Int *InBuf, UChar *InMaskBuf, Int *OutBuf, 
  159.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  160.     Int Direction);
  161. Int DecomposeSegmentOddSymInt(Int *In, Int *OutL, Int *OutH, 
  162.      Int PosFlag, Int Length, FILTER *Filter);
  163. Int SADWT1dEvenSymInt(Int *InBuf, UChar *InMaskBuf, Int *OutBuf, 
  164.      UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  165.      Int Direction);
  166. Int DecomposeSegmentEvenSymInt(Int *In, Int *OutL, Int *OutH, 
  167.       Int PosFlag, Int Length, FILTER *Filter);
  168. Int SADWT1dDbl(double *InBuf, UChar *InMaskBuf, double *OutBuf, 
  169.       UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  170.       Int Direction);
  171. Int SADWT1dOddSymDbl(double *InBuf, UChar *InMaskBuf, double *OutBuf, 
  172.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  173.     Int Direction);
  174. Int DecomposeSegmentOddSymDbl(double *In, double *OutL, double *OutH, 
  175.      Int PosFlag, Int Length, FILTER *Filter);
  176. Int SADWT1dEvenSymDbl(double *InBuf, UChar *InMaskBuf, double *OutBuf, 
  177.      UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  178.      Int Direction);
  179. Int DecomposeSegmentEvenSymDbl(double *In, double *OutL, double *OutH, 
  180.       Int PosFlag, Int Length, FILTER *Filter);
  181. };
  182. class VTCIDWT {
  183. public:
  184. /* Wavelet Synthesis function used by decoder */
  185. // hjlee 0901
  186. INT do_iDWT(DATA *InCoeff, UChar *InMask, Int Width, Int Height, Int CurLevel,
  187.  Int DstLevel, Int OutDataType, FILTER **Filter,  Void *OutData, 
  188.  UChar *OutMask, Int UpdateInput, Int FullSizeOut);
  189.  /* Addback DC Mean */
  190. Void AddDCMean(Int *Coeff, UChar *Mask, INT Width, 
  191.        INT Height, INT nLevels, INT DCMean);
  192. private:
  193. //hjlee 0901
  194.   Int iDWTInt(Int *InCoeff, UChar *InMask, Int Width, Int Height, Int CurLevel,
  195.  Int DstLevel, Int OutDataType, FILTER **Filter,  Void *OutData, 
  196.  UChar *OutMask, Int UpdateInput, Int FullSizeOut);
  197.   Int iDWTDbl(Int *InCoeff, UChar *InMask, Int Width, Int Height, Int CurLevel,
  198.     Int DstLevel, Int OutDataType, FILTER **Filter,  Void *OutData, 
  199.  UChar *OutMask, Int UpdateInput, Int FullSizeOut);
  200.  Int SynthesizeOneLevelInt(Int *OutCoeff, UChar *OutMask, Int Width,
  201. Int Height, Int level, FILTER *Filter,
  202. Int MaxCoeff, Int MinCoeff, Int ZeroHigh);
  203.  Int iSADWT1dInt(Int *InBuf, UChar *InMaskBuf, Int *OutBuf, 
  204.        UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  205.        Int Direction, Int ZeroHigh);
  206.  Int iSADWT1dOddSymInt(Int *InBuf, UChar *InMaskBuf, Int *OutBuf, 
  207.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  208.     Int Direction, Int ZeroHigh);
  209.  Int SynthesizeSegmentOddSymInt(Int *Out, Int *InL, Int *InH, 
  210.      Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh);
  211.  Int iSADWT1dEvenSymInt(Int *InBuf, UChar *InMaskBuf, Int *OutBuf, 
  212.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  213.     Int Direction, Int ZeroHigh);
  214.  Int SynthesizeSegmentEvenSymInt(Int *Out, Int *InL, Int *InH, 
  215.        Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh);
  216.  Int SynthesizeOneLevelDbl(double *OutCoeff, UChar *OutMask, Int Width,
  217. Int Height, Int level, FILTER *Filter, Int ZeroHigh);
  218.  Int iSADWT1dDbl(double *InBuf, UChar *InMaskBuf, double *OutBuf, 
  219.        UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  220.        Int Direction, Int ZeroHigh);
  221.  Int iSADWT1dOddSymDbl(double *InBuf, UChar *InMaskBuf, double *OutBuf, 
  222.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  223.     Int Direction, Int ZeroHigh);
  224.  Int SynthesizeSegmentOddSymDbl(double *Out, double *InL, double *InH, 
  225.       Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh);
  226.  Int iSADWT1dEvenSymDbl(double *InBuf, UChar *InMaskBuf, double *OutBuf, 
  227.       UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  228.       Int Direction, Int ZeroHigh);
  229.  Int SynthesizeSegmentEvenSymDbl(double *Out, double *InL, double *InH, 
  230.      Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh);
  231. };
  232. class VTCDWTMASK {
  233. public:
  234. /* Mask Decomposition function used by Decoder */
  235. Int do_DWTMask(UChar *InMask, UChar *OutMask, Int Width, Int Height, Int nLevels,
  236.     FILTER **Filter);  // hjlee 0901
  237. private:
  238.   Int DecomposeMaskOneLevel(UChar *OutMask, Int Wdith,
  239. Int Height, Int level, FILTER *Filter);
  240.  Int SADWTMask1d(UChar *InMaskBuf, UChar *OutMaskBuf, Int Length, 
  241. FILTER *Filter, Int Direction);
  242.  Int SADWTMask1dOddSym( UChar *InMaskBuf, UChar *OutMaskBuf, 
  243.       Int Length, FILTER *Filter, Int Direction);
  244.  Int SADWTMask1dEvenSym( UChar *InMaskBuf,  UChar *OutMaskBuf, 
  245.        Int Length, FILTER *Filter, Int Direction);
  246. };
  247. class VTCIMAGEBOX {
  248. public:
  249. // hjlee 0901
  250. Int GetBox(Void *InImage, Void **OutImage, 
  251.    Int RealWidth, Int RealHeight, 
  252.    Int VirtualWidth, Int VirtualHeight, 
  253.    Int OriginX, Int OriginY, Int DataType);
  254.    
  255. INT GetMaskBox(UChar *InMask,  UChar **OutMask, 
  256.        INT RealWidth, INT RealHeight, 
  257.        INT Nx, INT Ny,
  258.        INT *VirtualWidth, INT *VirtualHeight, 
  259.        INT *OriginX, INT *OriginY,  INT Shape, INT nLevels);
  260. INT PutBox(Void *InImage, UChar *InMask, Void *OutImage, UChar *OutMask, 
  261.    INT RealWidth, INT RealHeight, 
  262.    INT VirtualWidth, INT VirtualHeight, 
  263.    INT OriginX, INT OriginY, INT DataType, INT Shape);
  264. // hjlee 0901
  265. Void  SubsampleMask(UChar *InMask, UChar **OutMask, 
  266.     Int Width, Int Height,
  267.     FILTER *filter);
  268. INT ExtendMaskBox(UChar *InMask,  UChar **OutMask, 
  269.   INT InWidth, INT InHeight, 
  270.   INT Nx, INT Ny,
  271.   INT *OutWidth, INT *OutHeight, 
  272.   INT nLevels);
  273. private:
  274. Int LCM(Int x, Int y);
  275. Int GCD(Int x, Int y);
  276. };
  277. #endif /* __cplusplus  */ 
  278. #endif /*_DWT_H_ */