idwt_aux.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:32k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: idwt_aux.cpp,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. #ifndef _DWT_DBL_
  55. #define _DWT_INT_
  56. #include <stdio.h>
  57. #include <stdlib.h>
  58. #include <string.h>
  59. #include <math.h>
  60. #include <memory.h>
  61. #include "basic.hpp"
  62. #include "dwt.h"
  63. #endif
  64. #undef DWTDATA1
  65. #undef DWTDATA
  66. #ifdef _DWT_INT_
  67. #define DWTDATA1 Int
  68. #define DWTDATA Int
  69. #else
  70. #define DWTDATA1 double
  71. #define DWTDATA double
  72. #endif
  73. /* Function:    iDWTInt() or iDWTDbl()
  74.    Description: Integer or Double Inverse DWT for MPEG-4 Still Texture Coding 
  75.    Input:
  76.    InCoeff -- Input Wavelet Coefficients at CurLevel decomposition
  77.    InMask -- Input  Mask for InCoeff, if ==1, data inside object, 
  78.               otherwise outside.
  79.    Width  -- Width of Original Image (must be multiples of 2^nLevels);
  80.    Height -- Height of Original Image (must be multiples of 2^nLevels);
  81.    CurLevel -- Currect Decomposition Level of the input wavelet coefficients;
  82.    DstLevel -- Destined decomposition level that the wavelet coefficient is 
  83.                synthesized to. DstLevel always less than or equal to CurLevel;
  84.    OutDataType -- OutData Type: 0 - BYTE; 1 -- SHORT
  85.    Filter     -- Filter Used.
  86.    UpdateInput -- Update the level of decomposition to DstLevel  
  87.                   for InCoeff and/or InMask or Not.
  88.                   0 = No  Update; 1 = Update InCoeff; 2: Update InCoeff and InMask;
  89.    FullSizeOut -- 0 = Output image size equals to Width/2^DstLevel x Height/2^DstLevel;
  90.                   1 = Output Image size equals to Width x Height; 
  91.   ( Highpass band filled with zero after DstLevel)
  92.    Output:
  93.  
  94.    OutData -- Output Image data of Width x Height or Width/2^DstLevel x Height/2^DstLevel
  95.               size depending on FullSizeOut, data type decided by OutDataType;
  96.    OutMask    -- Output mask corresponding to OutData
  97.    Return: DWT_OK if successful.  
  98. */
  99. #ifdef _DWT_INT_  // hjlee 0901
  100. Int VTCIDWT:: iDWTInt(DATA *InCoeff, UChar *InMask, Int Width, Int Height, Int CurLevel,
  101.  Int DstLevel, Int OutDataType, FILTER **Filter,  Void *OutData, 
  102.  UChar *OutMask, Int UpdateInput, Int FullSizeOut)
  103. #else
  104. Int VTCIDWT:: iDWTDbl(DATA *InCoeff, UChar *InMask, Int Width, Int Height, Int CurLevel,
  105.  Int DstLevel, Int OutDataType, FILTER **Filter,  Void *OutData, 
  106.  UChar *OutMask, Int UpdateInput, Int FullSizeOut)
  107. #endif
  108. {
  109.   Int nBits, MaxCoeff, MinCoeff;
  110.   Int i,level, k;
  111.   DWTDATA1 *tempCoeff; /* Int for Int, double for Dbl */
  112.   Int ret;
  113.   DWTDATA1 *a;
  114.   Int *b;
  115.   UChar *c;
  116.   UShort *s;
  117.   UChar *d,*e, *tempMask;
  118.   /* Check filter class first */
  119.   for(level=CurLevel;level>DstLevel; level--) {
  120.     if(Filter[level-1]->DWT_Class != DWT_ODD_SYMMETRIC && Filter[level-1]->DWT_Class != DWT_EVEN_SYMMETRIC ) {
  121.       return(DWT_FILTER_UNSUPPORTED);
  122.     }
  123.   /* check filter Type */
  124. #ifdef _DWT_INT_
  125.   if(Filter[level-1]->DWT_Type!=DWT_INT_TYPE) return(DWT_INTERNAL_ERROR);
  126. #else
  127.   if(Filter[level-1]->DWT_Type!=DWT_DBL_TYPE) return(DWT_INTERNAL_ERROR);
  128. #endif
  129.   }
  130.   /* Check output coefficient buffer capacity */
  131.   nBits = sizeof(Int)*8;
  132.   MaxCoeff = (1<<(nBits-1))-1;
  133.   MinCoeff = -(1<<(nBits-1));
  134.   /* Limit nLevels as: 0 - 15*/
  135.   if(DstLevel < 0 || CurLevel >=16 || DstLevel >=16 || DstLevel > CurLevel) 
  136.     return(DWT_INVALID_LEVELS);
  137.   /* Check Width and Height, must be multiples of 2^CurLevel */
  138.   if((Width &( (1<<CurLevel)-1))!=0) return(DWT_INVALID_WIDTH);
  139.   if((Height &( (1<<CurLevel)-1))!=0) return(DWT_INVALID_HEIGHT);
  140.   /* copy mask */
  141.   tempMask = (UChar *)malloc(sizeof(UChar)*Width*Height);
  142.   if(tempMask==NULL) return(DWT_MEMORY_FAILED);
  143.   memcpy(tempMask, InMask, sizeof(UChar)*Width*Height);
  144.   
  145.   /* allocate temp  buffer */
  146.   tempCoeff = (DWTDATA1 *) malloc(sizeof(DWTDATA1)*Width*Height);
  147.   if(tempCoeff == NULL) {
  148.     free(tempMask);
  149.     return(DWT_MEMORY_FAILED);
  150.   }
  151.   memset(tempCoeff, (UChar)0, Width*Height*sizeof(DWTDATA1));
  152.   /* copy CurLevel decomposition results to temp buffer */
  153.   for(k=0;k<Width*(Height>>(DstLevel));k+=Width) {
  154.     for(a=tempCoeff+k, b=InCoeff+k;a<tempCoeff+k+(Width>>(DstLevel));a++, b++) {
  155.       *a = (DWTDATA1) *b;
  156.     }
  157.   }
  158.   /* Perform the  iDWT */
  159.   for(level=CurLevel;level>DstLevel;level--) {
  160.     /* Synthesize one level */
  161. #ifdef _DWT_INT_
  162.     ret=SynthesizeOneLevelInt(tempCoeff, tempMask, Width, Height, 
  163.       level, Filter[level-1], MaxCoeff, MinCoeff, DWT_NONZERO_HIGH);
  164. #else
  165.     ret=SynthesizeOneLevelDbl(tempCoeff, tempMask, Width, Height, 
  166.       level, Filter[level-1], DWT_NONZERO_HIGH);
  167. #endif      
  168.     if(ret!=DWT_OK) {
  169.       free(tempCoeff);
  170.       free(tempMask);
  171.       return(ret);
  172.     }
  173.   }
  174.   /* check to see if required to update InCoeff and/or InMask */
  175.   if(UpdateInput>0) {
  176.     /* update InCoeff */
  177.     for(k=0;k<Width*(Height>>DstLevel); k+=Width) {
  178.       for(b=InCoeff+k,a=tempCoeff+k;b<InCoeff+k+(Width>>DstLevel);b++,a++) {
  179. #ifdef _DWT_INT_
  180. *b = (Int) *a;
  181. #else
  182. Int iTmp;
  183. iTmp = (Int)floor(*a+0.5); /* rounding */
  184. if(iTmp> MaxCoeff || iTmp< MinCoeff) {
  185.   free(tempCoeff);
  186.   free(tempMask);
  187.   return(DWT_COEFF_OVERFLOW);
  188. }
  189. else
  190.   *b = (Int) iTmp;
  191. #endif
  192.       }
  193.     }
  194.   }
  195.   if(UpdateInput>1) {
  196.     /* Update InMask */
  197.     for(k=0;k<Width*(Height>>DstLevel); k+=Width) {
  198.       for(d=InMask+k,e=tempMask+k;d<InMask+k+(Width>>DstLevel);d++,e++) {
  199. *d = *e;
  200.       }
  201.     }
  202.   }
  203.   
  204.   if(FullSizeOut) {
  205.     /* Perform the rest of iDWT till fullsize */
  206.     for(level=DstLevel;level>0;level--) {
  207.       /* Synthesize one level */
  208. #ifdef _DWT_INT_
  209.       ret=SynthesizeOneLevelInt(tempCoeff, tempMask, Width, Height, 
  210. level, Filter[level-1], MaxCoeff, MinCoeff, DWT_ZERO_HIGH);
  211. #else
  212.       ret=SynthesizeOneLevelDbl(tempCoeff, tempMask, Width, Height, 
  213. level, Filter[level-1], DWT_ZERO_HIGH);
  214. #endif
  215.       if(ret!=DWT_OK) {
  216. free(tempCoeff);
  217. free(tempMask);
  218. return(ret);
  219.       }
  220.     } 
  221.   }
  222.   
  223.   /* copy the output to OutData and OutMask */
  224.   if(FullSizeOut) level=0;
  225.   else level=DstLevel;
  226.   
  227.   for(i=0,k=0;k<Width*(Height >> level);k+=Width,i+=(Width>>level)) {
  228.     
  229.     if(OutDataType==0) { /* Unsigned CHAR */
  230.       c = (UChar *)OutData; c+=i;
  231.       for(a=tempCoeff+k;a<tempCoeff+k+(Width>>level);c++,a++) {
  232. Int iTmp;
  233. #ifdef _DWT_INT_
  234. iTmp = (Int) *a;
  235. iTmp = level>0?((iTmp+(1<<(level-1))) >> level):iTmp; /* scale and round */
  236. #else
  237. iTmp = (Int)floor(*a/(1<<level)+0.5); /*scale down by 2^level and  rounding */
  238. #endif
  239. iTmp = (iTmp >0) ? ((iTmp > 255)?255:iTmp): 0; /* clipping */
  240. *c = (UChar) iTmp;
  241.       }
  242.     }
  243.     else { /* UShort */
  244.       s = (UShort *)OutData; s+=i;
  245.       for(a=tempCoeff+k;a<tempCoeff+k+(Width>>level);s++,a++) {
  246. Int iTmp;
  247. #ifdef _DWT_INT_
  248. iTmp = (Int)*a;
  249. iTmp = level>0?((iTmp+(1<<(level-1))) >> level):iTmp; /* scale and round */
  250. #else
  251. iTmp = (Int)floor(*a/(1<<level)+0.5); /*scale down by 2^level and  rounding */
  252. #endif
  253. iTmp = (iTmp >0) ? ((iTmp > 65535)?65535:iTmp): 0; /* clipping */
  254. *s = (UShort) iTmp;
  255.       }
  256.     }
  257.     d = OutMask + i;
  258.     for(e=tempMask+k;e<tempMask+k+(Width>>level);e++,d++)  *d=*e;
  259.   }
  260.   free(tempCoeff);
  261.   free(tempMask);
  262.   return(DWT_OK);
  263. }
  264. #ifdef _DWT_INT_
  265. /* Function:   SynthesizeOneLevelInt() 
  266.    Description: Integer Synthesize one level of wavelet coefficients
  267.    Input:
  268.    Width  -- Width of Image; 
  269.    Height -- Height of Image;
  270.    level -- current  level
  271.    Filter     -- Filter Used.
  272.    MaxCoeff, MinCoeff -- bounds of the output data;
  273.    ZeroHigh -- 1 Highpass bands are all zeros;
  274.    Input/Output:
  275.    OutCoeff   -- Ouput wavelet coefficients
  276.    OutMask    -- Output mask corresponding to wavelet coefficients
  277.    Return: DWT_OK if successful.
  278. */
  279. Int VTCIDWT::SynthesizeOneLevelInt(Int *OutCoeff, UChar *OutMask, Int Width,
  280. Int Height, Int level, FILTER *Filter,
  281. Int MaxCoeff, Int MinCoeff, Int ZeroHigh)
  282. {
  283.   Int *InBuf, *OutBuf ;
  284.   UChar *InMaskBuf, *OutMaskBuf;
  285.   Int width = Width>>(level-1);
  286.   Int height = Height>>(level-1);
  287.   Int MaxLength = (width > height)?width:height;
  288.   Int i,k,ret;
  289.   Int *a;
  290.   UChar *c,*d;
  291.   Int *e;
  292.   /* double check filter type */
  293.   if(Filter->DWT_Type != DWT_INT_TYPE) return(DWT_INTERNAL_ERROR);
  294.   /* allocate line buffers */
  295.   InBuf = (Int *) malloc(sizeof(Int)*MaxLength);
  296.   InMaskBuf = (UChar *) malloc(sizeof(UChar)*MaxLength);
  297.   OutBuf = (Int *) malloc(sizeof(Int)*MaxLength);
  298.   OutMaskBuf = (UChar *) malloc(sizeof(UChar)*MaxLength);
  299.   if(InBuf==NULL || InMaskBuf ==NULL || OutBuf == NULL || OutMaskBuf==NULL) 
  300.     return(DWT_MEMORY_FAILED);
  301.   /* vertical synthesis first */
  302.   for(i=0;i<width;i++) {
  303.     /* get a column of coefficients and mask*/
  304.     for(a=InBuf, e=OutCoeff+i, c= InMaskBuf, d= OutMask+i;
  305. a<InBuf+height; a++, c++, e+=Width, d+=Width) {
  306.       *a=(Int) *e;
  307.       *c = *d;
  308.     }
  309.     /* perform inverse vertical SA-DWT */
  310.     ret=iSADWT1dInt(InBuf, InMaskBuf, OutBuf, OutMaskBuf, height, Filter, 
  311.     DWT_VERTICAL,  ((i>=(width>>1) && ZeroHigh == DWT_ZERO_HIGH)?DWT_ALL_ZERO:ZeroHigh));
  312.     if(ret!=DWT_OK) {
  313.       free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf);
  314.       return(ret);
  315.     }
  316.     /* put the transformed column back */
  317.     for(a=OutBuf, e=OutCoeff+i, c= OutMaskBuf, d= OutMask+i;
  318. a<OutBuf+height; a++, c++, e+=Width, d+=Width) {
  319.       /* Scale and Leave 3 extra bits for precision reason */
  320.       *a = ROUNDDIV(*a <<3, Filter->Scale); 
  321.       if(*a > MaxCoeff || *a < MinCoeff) {
  322. free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf);
  323. return(DWT_COEFF_OVERFLOW);
  324.       }
  325.       *e= (Int) *a;
  326.       *d = *c;
  327.     }
  328.   }    
  329.   /* then horizontal synthesis */
  330.   for(i=0,k=0;i<height;i++,k+=Width) {
  331.     /* get a line of coefficients */
  332.     for(a=InBuf, e=OutCoeff+k;a<InBuf+width;a++,e++) {
  333.       *a = (Int) *e;
  334.     }
  335.     /* get a line of mask */
  336.     memcpy(InMaskBuf, OutMask+k, sizeof(UChar)*width);
  337.     /* Perform horizontal inverse SA-DWT */
  338.     ret=iSADWT1dInt(InBuf, InMaskBuf, OutBuf, OutMaskBuf, width, Filter, 
  339.    DWT_HORIZONTAL, ZeroHigh);
  340.     if(ret!=DWT_OK) {
  341.       free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf);
  342.       return(ret);
  343.     }
  344.     /* put the transformed line back */
  345.     for(a=OutBuf,e=OutCoeff+k;a<OutBuf+width;a++,e++) {
  346.       /*Scale and leave the sqrt(2)*sqrt(2) factor in the scale */
  347.       *a = ROUNDDIV(*a , Filter->Scale<<2);
  348.       if(*a > MaxCoeff || *a < MinCoeff) {
  349. free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf);
  350. return(DWT_COEFF_OVERFLOW);
  351.       }
  352.       *e = (Int) *a;
  353.     }
  354.     memcpy(OutMask+k, OutMaskBuf, sizeof(UChar)*width);
  355.   }
  356.   free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf);
  357.   return(DWT_OK);
  358. }
  359. #else
  360. /* Function:   SynthesizeOneLevelDbl()
  361.    Description: Synthesize one level of wavelet coefficients
  362.    Input:
  363.    Width  -- Width of Image; 
  364.    Height -- Height of Image;
  365.    level -- current  level
  366.    Filter     -- Filter Used.
  367.    MaxCoeff, MinCoeff -- bounds of the output data;
  368.    ZeroHigh -- Highpass bands are all zeros 
  369.    Input/Output:
  370.    OutCoeff   -- Ouput wavelet coefficients
  371.    OutMask    -- Output mask corresponding to wavelet coefficients
  372.    Return: DWT_OK if successful.
  373. */
  374.  Int VTCIDWT:: SynthesizeOneLevelDbl(double *OutCoeff, UChar *OutMask, Int Width,
  375. Int Height, Int level, FILTER *Filter, Int ZeroHigh)
  376. {
  377.   double *InBuf, *OutBuf ;
  378.   UChar *InMaskBuf, *OutMaskBuf;
  379.   Int width = Width>>(level-1);
  380.   Int height = Height>>(level-1);
  381.   Int MaxLength = (width > height)?width:height;
  382.   Int i,k,ret;
  383.   double *a;
  384.   UChar *c,*d;
  385.   double *e;
  386.   /* double check filter type */
  387.   if(Filter->DWT_Type != DWT_DBL_TYPE) return(DWT_INTERNAL_ERROR);
  388.   /* allocate line buffers */
  389.   InBuf = (double *) malloc(sizeof(double)*MaxLength);
  390.   InMaskBuf = (UChar *) malloc(sizeof(UChar)*MaxLength);
  391.   OutBuf = (double *) malloc(sizeof(double)*MaxLength);
  392.   OutMaskBuf = (UChar *) malloc(sizeof(UChar)*MaxLength);
  393.   if(InBuf==NULL || InMaskBuf ==NULL || OutBuf == NULL || OutMaskBuf==NULL) 
  394.     return(DWT_MEMORY_FAILED);
  395.     
  396.   /* vertical synthesis first */
  397.   for(i=0;i<width;i++) {
  398.     /* get a column of coefficients and mask */
  399.     for(a=InBuf, e=OutCoeff+i, c= InMaskBuf, d= OutMask+i;
  400. a<InBuf+height; a++, c++, e+=Width, d+=Width) {
  401.       *a = *e;
  402.       *c = *d;
  403.     }
  404.     /* perform vertical inverse SA-DWT */
  405.     ret=iSADWT1dDbl(InBuf, InMaskBuf, OutBuf, OutMaskBuf, height, Filter, 
  406.     DWT_VERTICAL, ((i>=(width>>1) && ZeroHigh==DWT_ZERO_HIGH)?DWT_ALL_ZERO:ZeroHigh));
  407.     if(ret!=DWT_OK) {
  408.       free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf);
  409.       return(ret);
  410.     }
  411.     /* put the transformed column back */
  412.     for(a=OutBuf, e=OutCoeff+i, c= OutMaskBuf, d= OutMask+i;
  413. a<OutBuf+height; a++, c++, e+=Width, d+=Width) {
  414.       *e = *a;
  415.       *d = *c;
  416.     }
  417.   }
  418.   /* horizontal decomposition first*/
  419.   for(i=0,k=0;i<height;i++,k+=Width) {
  420.     /* get a line of coefficients */
  421.     for(a=InBuf, e=OutCoeff+k;a<InBuf+width;a++,e++) {
  422.       *a =  *e;
  423.     }
  424.     /* get a line of mask */
  425.     memcpy(InMaskBuf, OutMask+k, sizeof(UChar)*width);
  426.     /* Perform horizontal inverse SA-DWT */
  427.     ret=iSADWT1dDbl(InBuf, InMaskBuf, OutBuf, OutMaskBuf, width, Filter, 
  428.     DWT_HORIZONTAL, ZeroHigh);
  429.     if(ret!=DWT_OK) {
  430.       free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf);
  431.       return(ret);
  432.     }
  433.     /* put the transformed line back */
  434.     for(a=OutBuf,e=OutCoeff+k;a<OutBuf+width;a++,e++) {
  435.       *e =  *a;
  436.     }
  437.     memcpy(OutMask+k, OutMaskBuf, sizeof(UChar)*width);
  438.   }
  439.   free(InBuf);free(OutBuf);free(InMaskBuf);free(OutMaskBuf);
  440.   return(DWT_OK);
  441. }
  442. #endif
  443. /* Function: iSADWT1dInt() or iSADWT1dDbl()
  444.    Description:  inverse 1-d SA-DWT
  445.    Input:
  446.    InBuf -- Input 1d data buffer
  447.    InMaskBuf -- Input 1d mask buffer
  448.    Length -- length of the input data
  449.    Filter -- filter used
  450.    Direction -- vertical or horizontal synthesis (used for inversible 
  451.    mask synthsis)
  452.    ZeroHigh -- DWT_ZERO_HIGH indicates the Highpass bands are all zeros
  453.                DWT_ALL_ZERO indicates all the coefficients are zeros
  454.        DWT_NONZERO_HIGH indicates not all Highpass bands are zeros
  455.    Output:
  456.    
  457.    OutBuf -- Synthesized 1d Data
  458.    OutMask -- Mask for the synthesized 1d Data
  459.    Return: return DWT_OK if successful
  460.   
  461. */
  462. #ifdef _DWT_INT_
  463.  Int VTCIDWT:: iSADWT1dInt(Int *InBuf, UChar *InMaskBuf, Int *OutBuf, 
  464.        UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  465. Int Direction, Int ZeroHigh)
  466. {
  467.   switch(Filter->DWT_Class){
  468.   case DWT_ODD_SYMMETRIC:
  469.     return(iSADWT1dOddSymInt(InBuf, InMaskBuf, OutBuf, OutMaskBuf, 
  470.     Length, Filter, Direction, ZeroHigh));
  471.   case DWT_EVEN_SYMMETRIC:
  472.     return(iSADWT1dEvenSymInt(InBuf, InMaskBuf, OutBuf, OutMaskBuf, 
  473.      Length, Filter, Direction, ZeroHigh));
  474.     /*  case ORTHOGONAL:
  475. return(iSADWT1dOrthInt(InBuf, InMaskBuf, OutBuf, OutMaskBuf, 
  476.   Length, Filter, Direction, ZeroHigh)); */
  477.   default:
  478.     return(DWT_FILTER_UNSUPPORTED);
  479.   }
  480. }
  481. #else
  482.  Int VTCIDWT:: iSADWT1dDbl(double *InBuf, UChar *InMaskBuf, double *OutBuf, 
  483. UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  484. Int Direction, Int ZeroHigh)
  485. {
  486.   switch(Filter->DWT_Class){
  487.   case DWT_ODD_SYMMETRIC:
  488.     return(iSADWT1dOddSymDbl(InBuf, InMaskBuf, OutBuf, OutMaskBuf, 
  489.     Length, Filter, Direction, ZeroHigh));
  490.   case DWT_EVEN_SYMMETRIC:
  491.     return(iSADWT1dEvenSymDbl(InBuf, InMaskBuf, OutBuf, OutMaskBuf, 
  492.      Length, Filter, Direction, ZeroHigh));
  493.     /*  case ORTHOGONAL:
  494. return(iSADWT1dOrthDbl(InBuf, InMaskBuf, OutBuf, OutMaskBuf, 
  495.   Length, Filter, Direction, ZeroHigh)); */
  496.   default:
  497.     return(DWT_FILTER_UNSUPPORTED);
  498.   }
  499. }
  500. #endif
  501. /* Function: iSADWT1dOddSymInt() or iSADWT1dOddSymDbl()
  502.    Description: 1D  iSA-DWT using Odd Symmetric Filter
  503.    Input:
  504.    InBuf -- Input 1d data buffer
  505.    InMaskBuf -- Input 1d mask buffer
  506.    Length -- length of the input data
  507.    Filter -- filter used
  508.    Direction -- vertical or horizontal synthesis (used for inversible 
  509.    mask synthesis)
  510.    ZeroHigh -- DWT_ZERO_HIGH indicates the Highpass bands are all zeros
  511.                ALL_ZERO indicates all the coefficients are zeros
  512.        DWT_NONZERO_HIGH indicates not all Highpass bands are zeros
  513.    Output:
  514.    
  515.    OutBuf -- Synthesized 1d Data
  516.    OutMask -- Synthesized 1d Mask
  517.    Return: return DWT_OK if successful
  518. */
  519. #ifdef _DWT_INT_
  520.  Int VTCIDWT:: iSADWT1dOddSymInt(DWTDATA *InBuf, UChar *InMaskBuf, DWTDATA *OutBuf, 
  521.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  522.     Int Direction, Int ZeroHigh)
  523. #else
  524.  Int VTCIDWT:: iSADWT1dOddSymDbl(DWTDATA *InBuf, UChar *InMaskBuf, DWTDATA *OutBuf, 
  525.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  526.     Int Direction, Int ZeroHigh)
  527. #endif
  528. {
  529.   Int i;
  530.   Int SegLength = 0;
  531.   Int odd;
  532.   Int start, end;
  533.   UChar *a, *b, *c;
  534.   Int ret;
  535.   /* static Int count=0; */
  536.   /* double check filter class and type */
  537.   if(Filter->DWT_Class != DWT_ODD_SYMMETRIC) return(DWT_INTERNAL_ERROR);
  538. #ifdef _DWT_INT_
  539.   if(Filter->DWT_Type != DWT_INT_TYPE) return(DWT_INTERNAL_ERROR);
  540. #else
  541.   if(Filter->DWT_Type != DWT_DBL_TYPE) return(DWT_INTERNAL_ERROR);
  542. #endif
  543.   /* double check if Length is even */
  544.   if(Length & 1) return(DWT_INTERNAL_ERROR);
  545.   /* synthesize mask first */
  546.   for(a=OutMaskBuf, b = InMaskBuf, c= InMaskBuf+(Length>>1); a<OutMaskBuf+Length;b++,c++) {
  547.     if(Direction == DWT_VERTICAL) {
  548.       if(*c == DWT_OUT2) { 
  549. *a++=DWT_OUT0;
  550. *a++=DWT_IN;
  551.       }
  552.       else if(*c == DWT_OUT3) {
  553. *a++=DWT_OUT1;
  554. *a++=DWT_IN;
  555.       }
  556.       else {
  557. *a++=*b;
  558. *a++=*c;
  559.       }
  560.     }
  561.     else {
  562.       if(*c == DWT_OUT1) { 
  563. *a++=DWT_OUT0;
  564. *a++=DWT_IN;
  565.       }
  566.       else {
  567. *a++ = *b;
  568. *a++ = *c;
  569.       }
  570.     }
  571.   }
  572.   /* initial OutBuf to zeros */
  573.   memset(OutBuf, (UChar)0, sizeof(DWTDATA)*Length);
  574.   if(ZeroHigh == DWT_ALL_ZERO) return(DWT_OK);
  575.   
  576.   i = 0;
  577.   a = OutMaskBuf;
  578.   while(i<Length) {
  579.     /* search for a segment */
  580.     while(i<Length && (a[i])!=DWT_IN) i++;
  581.     start = i;
  582.     if(i >= Length) break;
  583.     while(i<Length && (a[i])==DWT_IN) i++;
  584.     end = i;
  585.     SegLength = end-start;
  586.     odd = start%2;
  587.     if(SegLength==1) { /* special case for single poInt */
  588. #ifdef _DWT_INT_
  589.       ret=SynthesizeSegmentOddSymInt(OutBuf+start, InBuf+(start>>1), 
  590.      InBuf+(Length>>1)+(start>>1), odd, 
  591.      SegLength, Filter, ZeroHigh);
  592. #else
  593.       ret=SynthesizeSegmentOddSymDbl(OutBuf+start, InBuf+(start>>1), 
  594.      InBuf+(Length>>1)+(start>>1), odd, 
  595.      SegLength, Filter,ZeroHigh);
  596. #endif
  597.       if(ret!=DWT_OK) return(ret);
  598.     }
  599.     else {
  600. #ifdef _DWT_INT_
  601.       ret=SynthesizeSegmentOddSymInt(OutBuf+start, InBuf+((start+1)>>1), 
  602.      InBuf+(Length>>1)+(start>>1), odd, 
  603.      SegLength, Filter,ZeroHigh);
  604.       
  605. #else
  606.       ret=SynthesizeSegmentOddSymDbl(OutBuf+start, InBuf+((start+1)>>1), 
  607.      InBuf+(Length>>1)+(start>>1), odd, 
  608.      SegLength, Filter,ZeroHigh);
  609. #endif
  610.       if(ret!=DWT_OK) return(ret);
  611.     }
  612.   }
  613.   return(DWT_OK);
  614. }
  615. /* 
  616.    Function:  SynthesizeSegmentOddSymInt() or  SynthesizeSegmentOddSymDbl()
  617.    Description: SA-Synthesize a 1D segment based on its InitPos and Length using
  618.                 Odd-Symmetric Filters
  619.    Input:
  620.    InL -- Input lowpass data;
  621.    InH -- Input highpass data;
  622.    PosFlag -- Start position of this segment (ODD or EVEN);
  623.    Length -- Length of this Segment;
  624.    Filter -- Filter used;
  625.    ZeroHigh -- Highpass band is zero or not.
  626.    Output:
  627.    Out -- Output synthesized data segment;
  628.    Return: Return DWT_OK if Successful
  629. */
  630. #ifdef _DWT_INT_
  631.  Int VTCIDWT::  SynthesizeSegmentOddSymInt(DWTDATA *Out, DWTDATA *InL, DWTDATA *InH, 
  632.      Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh)
  633. #else
  634.  Int VTCIDWT::  SynthesizeSegmentOddSymDbl(DWTDATA *Out, DWTDATA *InL, DWTDATA *InH, 
  635.      Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh)
  636. #endif
  637. {
  638. #ifdef _DWT_INT_
  639.   Short *LPCoeff = (Short *)Filter->LPCoeff, *HPCoeff = (Short *)Filter->HPCoeff; 
  640.   Short *fi;
  641. #else
  642.   double *LPCoeff =(double *) Filter->LPCoeff, *HPCoeff =(double *) Filter->HPCoeff; 
  643.   double *fi; 
  644. #endif
  645.   Int ltaps = Filter->LPLength, htaps = Filter->HPLength; /* filter lengths*/
  646.   Int loffset = ltaps/2, hoffset = htaps/2;  /* Filter offset */
  647.   Int border = (ltaps>htaps)?ltaps:htaps; /*the larger of ltaps and htaps */
  648.   Int m, n;
  649.   DWTDATA *f,*pixel, *pixel1, val, *buf, *a, *tmp_out;
  650.   Int r = Length-1;
  651.   if(Length == 1) {
  652.     PosFlag = 0;
  653. ZeroHigh = DWT_ZERO_HIGH; // hjlee 0928
  654.   }
  655.   /* allocate proper buffer */
  656.   buf = (DWTDATA *) malloc((Length+2*border)*sizeof(DWTDATA));
  657.   if(buf==NULL)  return(DWT_MEMORY_FAILED);
  658.   
  659.   for(m=0;m<Length;m++) Out[m]= (DWTDATA) 0;
  660.   for(m=0;m<Length+2*border;m++) buf[m]= (DWTDATA) 0;
  661.   /*  fill in the low pass coefficients by upsampling by 2*/
  662.   a = buf+border;
  663.   for(m=PosFlag; m< Length; m+=2) {
  664.     a[m] = InL[m>>1];
  665.   }
  666.   /* symmetric extension */
  667.   for (m=1 ; m<=border; m++) {
  668.     a[-m] =   a[m];  /* to allow Shorter seg */
  669.     a[r+m] =  a[r-m]; 
  670.   }
  671.   a = buf + border;
  672.   f = buf + border + Length;
  673.   tmp_out = Out;
  674.   for (; a<f; a ++) {
  675.     /* filter the pixel with lowpass filter */
  676.     for( fi=LPCoeff, pixel=a-loffset, pixel1=pixel+ltaps-1, val=0, n=0; 
  677.  n<(ltaps >>1); 
  678.  n++, fi++, pixel++, pixel1--) {
  679.       val += ( *fi * (*pixel + *pixel1));
  680.     }
  681.     val += ( *fi * *pixel);
  682.     *tmp_out++ = val;
  683.   }
  684.   /* if Highpass are zeros, skip */
  685.   if(ZeroHigh== DWT_NONZERO_HIGH) {
  686.     for(m=0;m<Length+2*border;m++) buf[m]= (DWTDATA) 0;
  687.     a = buf+border;
  688.     for(m=1-PosFlag;m< Length; m+=2) {
  689.       a[m] = InH[m>>1];
  690.     }
  691.     /* symmetric extension */
  692.     for (m=1 ; m<=border; m++) {
  693.       a[-m] =   a[m];  /* to allow Shorter seg */
  694.       a[r+m] =  a[r-m]; 
  695.     } 
  696.     a = buf + border;
  697.     tmp_out = Out;
  698.     for (; a<f; a ++){
  699.       /* filter the pixel with highpass filter */
  700.       for(fi=HPCoeff, pixel=a-hoffset, pixel1=pixel+htaps-1, val=0, n=0; 
  701.   n<(htaps>>1); n++, fi++, pixel++, pixel1--) {
  702. val += ( *fi *  (*pixel + *pixel1));
  703.       }
  704.       val += ( *fi *  *pixel);
  705.       *tmp_out++ += val;
  706.     }
  707.   }
  708.   free(buf);
  709.   return(DWT_OK);
  710. }
  711. #ifdef _DWT_INT_
  712.  Int VTCIDWT:: iSADWT1dEvenSymInt(DWTDATA *InBuf, UChar *InMaskBuf, DWTDATA *OutBuf, 
  713.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  714.     Int Direction, Int ZeroHigh)
  715. #else
  716.  Int VTCIDWT:: iSADWT1dEvenSymDbl(DWTDATA *InBuf, UChar *InMaskBuf, DWTDATA *OutBuf, 
  717.     UChar *OutMaskBuf, Int Length, FILTER *Filter, 
  718.     Int Direction, Int ZeroHigh)
  719. #endif
  720. {
  721.   Int i;
  722.   Int SegLength = 0;
  723.   Int odd;
  724.   Int start, end;
  725.   UChar *a, *b, *c;
  726.   Int ret;
  727.   /* double check filter class and type */
  728.   if(Filter->DWT_Class != DWT_EVEN_SYMMETRIC) return(DWT_INTERNAL_ERROR);
  729. #ifdef _DWT_INT_
  730.   if(Filter->DWT_Type != DWT_INT_TYPE) return(DWT_INTERNAL_ERROR);
  731. #else
  732.   if(Filter->DWT_Type != DWT_DBL_TYPE) return(DWT_INTERNAL_ERROR);
  733. #endif
  734.   /* double check if Length is even */
  735.   if(Length & 1) return(DWT_INTERNAL_ERROR);
  736.   /* synthesize mask first */
  737.   for(a=OutMaskBuf, b = InMaskBuf, c= InMaskBuf+(Length>>1); a<OutMaskBuf+Length;b++,c++) {
  738.     if(Direction == DWT_VERTICAL) {
  739.       if(*c == DWT_OUT2) { 
  740. *a++=DWT_OUT0;
  741. *a++=DWT_IN;
  742.       }
  743.       else if(*c == DWT_OUT3) {
  744. *a++=DWT_OUT1;
  745. *a++=DWT_IN;
  746.       }
  747.       else {
  748. *a++=*b;
  749. *a++=*c;
  750.       }
  751.     }
  752.     else {
  753.       if(*c == DWT_OUT1) { 
  754. *a++=DWT_OUT0;
  755. *a++=DWT_IN;
  756.       }
  757.       else {
  758. *a++ = *b;
  759. *a++ = *c;
  760.       }
  761.     }
  762.   }
  763.   /* initial OutBuf to zeros */
  764.   memset(OutBuf, (UChar)0, sizeof(DWTDATA)*Length);
  765.   if(ZeroHigh == DWT_ALL_ZERO) return(DWT_OK);
  766.   
  767.   i = 0;
  768.   a = OutMaskBuf;
  769.   while(i<Length) {
  770.     /* search for a segment */
  771.     while(i<Length && (a[i])!=DWT_IN) i++;
  772.     start = i;
  773.     if(i >= Length) break;
  774.     while(i<Length && (a[i])==DWT_IN) i++;
  775.     end = i;
  776.     SegLength = end-start;
  777.     odd = start%2;
  778.     if(SegLength==1) { /* special case for single poInt */
  779. #ifdef _DWT_INT_
  780.       ret=SynthesizeSegmentEvenSymInt(OutBuf+start, InBuf+(start>>1), 
  781.      InBuf+(Length>>1)+(start>>1), odd, 
  782.      SegLength, Filter, ZeroHigh);
  783. #else
  784.       ret=SynthesizeSegmentEvenSymDbl(OutBuf+start, InBuf+(start>>1), 
  785.      InBuf+(Length>>1)+(start>>1), odd, 
  786.      SegLength, Filter,ZeroHigh);
  787. #endif
  788.       if(ret!=DWT_OK) return(ret);
  789.     }
  790.     else {
  791. #ifdef _DWT_INT_
  792.       ret=SynthesizeSegmentEvenSymInt(OutBuf+start, InBuf+(start>>1), 
  793.      InBuf+(Length>>1)+((start+1)>>1), odd, 
  794.      SegLength, Filter,ZeroHigh);
  795.       
  796. #else
  797.       ret=SynthesizeSegmentEvenSymDbl(OutBuf+start, InBuf+(start>>1), 
  798.      InBuf+(Length>>1)+((start+1)>>1), odd, 
  799.      SegLength, Filter,ZeroHigh);
  800. #endif
  801.       if(ret!=DWT_OK) return(ret);
  802.     }
  803.   }
  804.   return(DWT_OK);
  805. }
  806. /* 
  807.    Function:  SynthesizeSegmentEvenSymInt() or  SynthesizeSegmentEvenSymDbl()
  808.    Description: SA-Synthesize a 1D segment based on its InitPos and Length using
  809.                 Even-Symmetric Filters
  810.    Input:
  811.    InL -- Input lowpass data;
  812.    InH -- Input highpass data;
  813.    PosFlag -- Start position of this segment (ODD or EVEN);
  814.    Length -- Length of this Segment;
  815.    Filter -- Filter used;
  816.    ZeroHigh -- Highpass band is zero or not.
  817.    Output:
  818.    Out -- Output synthesized data segment;
  819.    Return: Return DWT_OK if Successful
  820. */
  821. #ifdef _DWT_INT_
  822.  Int VTCIDWT:: SynthesizeSegmentEvenSymInt(DWTDATA *Out, DWTDATA *InL, DWTDATA *InH, 
  823.      Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh)
  824. #else
  825.  Int VTCIDWT:: SynthesizeSegmentEvenSymDbl(DWTDATA *Out, DWTDATA *InL, DWTDATA *InH, 
  826.      Int PosFlag, Int Length, FILTER *Filter, Int ZeroHigh)
  827. #endif
  828. {
  829. #ifdef _DWT_INT_
  830.   Short *LPCoeff = (Short *)Filter->LPCoeff, *HPCoeff = (Short *)Filter->HPCoeff; 
  831.   Short *fi;
  832. #else
  833.   double *LPCoeff = (double *) Filter->LPCoeff, *HPCoeff = (double *)Filter->HPCoeff; 
  834.   double *fi;
  835. #endif
  836.   Int ltaps = Filter->LPLength, htaps = Filter->HPLength; /* filter lengths*/
  837.   Int loffset = ltaps/2, hoffset = htaps/2;  /* Filter offset */
  838.   Int border = (ltaps>htaps)?ltaps:htaps; /*the larger of ltaps and htaps */
  839.   Int m, n;
  840.   DWTDATA *f,*pixel, *pixel1, val, *buf, *a, *tmp_out;
  841.   Int r = Length-1;
  842.   
  843.   if(Length == 1) {
  844.    /*  *Out = *InL  * Filter->Scale; */
  845.     PosFlag = 0;
  846. ZeroHigh = DWT_ZERO_HIGH; // hjlee 0928
  847.     /* return(DWT_OK); */
  848.   }
  849.   /* allocate proper buffer */
  850.   buf = (DWTDATA *) malloc((Length+2*border+1)*sizeof(DWTDATA));
  851.   if(buf==NULL)  return(DWT_MEMORY_FAILED);
  852.   
  853.   for(m=0;m<Length;m++) Out[m]= (DWTDATA) 0;
  854.   for(m=0;m<Length+2*border+1;m++) buf[m]= (DWTDATA) 0;
  855.   /*  fill in the low pass coefficients by upsampling by 2*/
  856.   a = buf+border+1;
  857.   
  858.   for(m=-PosFlag; m< Length; m+=2) {
  859.     a[m] = InL[(m+1)>>1];
  860.   }
  861.   
  862.   /* symmetric extension */
  863.   for (m=1 ; m<=border; m++) {
  864.     a[-m-1] =   a[m-1];  /* to allow Shorter seg */ /*symmetric poInt a[-1] */
  865.     a[r+m] =  a[r-m]; /*symmetric poInt a[r] */
  866.   }
  867.   f = buf + border + 1 + Length;
  868.   tmp_out = Out;
  869.   for (; a<f; a ++) {
  870.     /* filter the pixel with lowpass filter */
  871.     for( fi=LPCoeff, pixel=a-loffset, pixel1=pixel+ltaps-1, val=0, n=0; 
  872.  n<(ltaps>>1); n++, fi++, pixel++, pixel1--)
  873.       val += ( *fi * (*pixel + *pixel1));
  874.     *tmp_out++ = val;
  875.   }
  876.   /* if Highpass are zeros, skip */
  877.   if(ZeroHigh== DWT_NONZERO_HIGH) {
  878.     for(m=0;m<Length+2*border+1;m++) buf[m]= (DWTDATA) 0;
  879.     a = buf+border+1;
  880.     for(m=PosFlag;m< Length; m+=2) {
  881.       a[m] = InH[m>>1];
  882.     }
  883.     /* anti-symmetric extension */
  884.     for (m=1 ; m<=border; m++) {
  885.       a[-m-1] =   -a[m-1];  /* to allow Shorter seg */ /*symmetric poInt a[-1] */
  886.       a[r+m] =  -a[r-m];  /*symmetric poInt a[r] */
  887.     } 
  888.     tmp_out = Out;
  889.     for (; a<f; a ++){
  890.       /* filter the pixel with highpass filter */
  891.       for(fi=HPCoeff, pixel=a-hoffset, pixel1 = pixel+ htaps-1, val=0, n=0; 
  892.   n<(htaps>>1); n++, fi++, pixel++, pixel1--) {
  893. val += ( *fi *  (*pixel - *pixel1));
  894.       }
  895.       *tmp_out++ += val;
  896.     }
  897.   }
  898.   free(buf);
  899.   return(DWT_OK);
  900. }
  901. #ifdef _DWT_INT_
  902. #undef _DWT_INT_
  903. #define _DWT_DBL_
  904. #include "idwt_aux.cpp"
  905. #endif