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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: dwt.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. /* Forward DWT for MPEG-4 Still Texture Coding 
  55. Original Coded by Shipeng Li, Sarnoff Corporation, Jan. 1998*/
  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. /* Function:    DWT()
  64.    Description: Forward DWT for MPEG-4 Still Texture Coding 
  65.    Input:
  66.    InData -- Input Image data of Width x Height size, data type decided by
  67.              InDataType;
  68.    InMask -- Input Object Mask for InData, if ==1, data inside object, 
  69.              otherwise outside.
  70.    Width  -- Width of Image (must be multiples of 2^nLevels);
  71.    Height -- Height of Image (must be multiples of 2^nLevels);
  72.    nLevels -- number of decomposition level,0 being original image;
  73.    InDataType -- 0 - BYTE; 1 -- SHORT
  74.    Filter     -- Filter Used.
  75.    Output:
  76.    OutCoeff   -- Ouput wavelet coefficients
  77.    OutMask    -- Output mask corresponding to wavelet coefficients
  78.    Return: DWT_OK if success.  
  79. */
  80. Int VTCDWT:: do_DWT(Void *InData, UChar *InMask, Int Width, Int Height, Int nLevels,
  81.  Int InDataType, FILTER **Filter,  DATA *OutCoeff, UChar *OutMask)
  82. {
  83.   Int nBits, MaxCoeff, MinCoeff;
  84.   Int level;
  85.   double *tempCoeff;
  86.   Int ret;
  87.   double *a;
  88.   Int *b;
  89.   UChar *c;
  90.   UShort *s;
  91.    /* Check filter class first */
  92.   for(level=0;level<nLevels;level++) {
  93.     if(Filter[level]->DWT_Class != DWT_ODD_SYMMETRIC && Filter[level]->DWT_Class != DWT_EVEN_SYMMETRIC ) {
  94.       return(DWT_FILTER_UNSUPPORTED);
  95.     }
  96.   }
  97.   /* Check output coefficient buffer capacity */
  98.   nBits = sizeof(Int)*8;
  99.   MaxCoeff = (1<<(nBits-1))-1;
  100.   MinCoeff = -(1<<(nBits-1));
  101.   /* Limit nLevels as: 0 - 15*/
  102.   if(nLevels < 0 || nLevels >=16) return(DWT_INVALID_LEVELS);
  103.   /* Check Width and Height, must be multiples of 2^nLevels */
  104.   if((Width &( (1<<nLevels)-1))!=0) return(DWT_INVALID_WIDTH);
  105.   if((Height &( (1<<nLevels)-1))!=0) return(DWT_INVALID_HEIGHT);
  106.   /* Zero Level of Decomposition */
  107.   /* copy coefficients */
  108.   if(InDataType==0) { /* BYTE */
  109.     for(b=OutCoeff,c=(UChar*)InData;b<OutCoeff+Width*Height;b++,c++) {
  110.      *b =(Int) *c;
  111.     }
  112.   }
  113.   else {
  114.     for(b=OutCoeff,s=(UShort*)InData;b<OutCoeff+Width*Height;b++,s++) {
  115.       *b = (Int) *s;
  116.     }
  117.   }
  118.   /* copy mask */
  119.   memcpy(OutMask, InMask, sizeof(UChar)*Width*Height);
  120.   
  121.   /* Double precision calculation if required */
  122.   if(nLevels>0 && Filter[0]->DWT_Type==DWT_DBL_TYPE) {
  123.     /* allocate temp double buffer */
  124.     tempCoeff = (double *) malloc(sizeof(double)*Width*Height);
  125.     if(tempCoeff == NULL) return(DWT_MEMORY_FAILED);
  126.     /* copy zero level decomposition results to temp buffer */
  127.     for(a=tempCoeff, b=OutCoeff;a<tempCoeff+Width*Height;a++, b++) {
  128.       *a = (double) *b;
  129.     }
  130.     /* Perform the double DWT */
  131.     for(level=1;level<=nLevels;level++) {
  132.       /* Decompose one level */
  133.       ret=DecomposeOneLevelDbl(tempCoeff, OutMask, Width, Height, 
  134.        level, Filter[level-1]);
  135.       if(ret!=DWT_OK) {
  136. free(tempCoeff);
  137. return(ret);
  138.       }
  139.     }
  140.     /* copy the double coefficients back to OutCoeff */
  141.     for(b=OutCoeff,a=tempCoeff;b<OutCoeff+Width*Height;b++,a++) {
  142.       Int iTmp;
  143.       iTmp = (Int)floor(*a+0.5); /* rounding */
  144.       if(iTmp> MaxCoeff || iTmp< MinCoeff) {
  145. /* fprIntf(stderr,"iTmp=%d %fn",iTmp, *a); */
  146. free(tempCoeff);
  147. return(DWT_COEFF_OVERFLOW);
  148.       }
  149.       else
  150. *b = (Int) iTmp;
  151.     }
  152.     free(tempCoeff);
  153.   }
  154.   else if(Filter[0]->DWT_Type==DWT_INT_TYPE) {
  155.     /* Perform the Int DWT */
  156.     for(level=1;level<=nLevels;level++) {
  157.       ret=DecomposeOneLevelInt(OutCoeff, OutMask, Width, Height, 
  158.        level, Filter[level-1], MaxCoeff, MinCoeff);
  159.       if(ret!=DWT_OK) return(ret);
  160.     }
  161.   }
  162.   
  163.   return(DWT_OK);
  164. }
  165. /* Function: RemoveDCMean 
  166.    Description: Remove the Mean of DC coefficients
  167.    Input:
  168.    
  169.    Mask -- Mask for the transformed coeffs
  170.    Width -- Width of the original image
  171.    Height -- Height of the original image
  172.    nLevels -- levels of DWT decomposition performed
  173.    Input/Output:
  174.    Coeff -- DWT coefficients after nLevels of decomposition
  175.    
  176.    Return: Mean of the DC coefficients */
  177. Int VTCDWT:: RemoveDCMean(Int *Coeff, UChar *Mask, Int Width, Int Height, Int nLevels)
  178. {
  179.   Int DCMean=0;
  180.   Int width = (Width >> nLevels), height = (Height >> nLevels);
  181.   Int k;
  182.   Int *a;
  183.   UChar *c;
  184.   Int Count=0;
  185.   for(k=0; k<Width*height; k+=Width) {
  186.     for(a=Coeff+k,c=Mask+k; a < Coeff+k+width; a++,c++) {
  187.       if(*c == DWT_IN) {
  188. Count++;
  189. DCMean += (Int) *a;
  190. /* prIntf("%dn", *a); */
  191.       }
  192.     }
  193.   }
  194.   if(Count!=0) DCMean = (Int)((Float)DCMean/((Float)(Count<<nLevels))+0.5);
  195.   else DCMean = 0;
  196.   DCMean = DCMean<<nLevels;
  197.   for(k=0; k<Width*height; k+=Width) {
  198.     for(a=Coeff+k,c=Mask+k; a < Coeff+k+width; a++,c++)  {
  199.       if(*c == DWT_IN) *a-=DCMean;
  200.     }
  201.   }
  202.   return(DCMean>>nLevels);
  203. }