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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: wavelet.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. /****************************************************************************/
  55. /*     Texas Instruments Predictive Embedded Zerotree (PEZW) Image Codec    */
  56. /*     Copyright 1996, 1997, 1998 Texas Instruments            */
  57. /****************************************************************************/
  58. #include <stdio.h>
  59. #include <math.h>
  60. #include "dataStruct.hpp"
  61. #include "globals.hpp"
  62. #include "dwt.h"
  63. #include "default.h"
  64. #include "download_filter.h"
  65. #include "wvtfilter.h"
  66. // #include "main.h"
  67. //#include "ShapeCodec.h"
  68. /*-----------------------------------------------------------------------*/
  69. /********************************************************************/
  70. /* Select a wavelet filter banks from the ones defined in default.h */
  71. /* There are currently 10 filter banks available                    */
  72. /********************************************************************/
  73. Void CVTCCommon::choose_wavelet_filter(FILTER **anafilter,FILTER **synfilter,
  74.    Int type)
  75. {
  76.   switch(type){
  77.     case 0:  /* default Int filter, odd symmetric */
  78.       *anafilter=&DefaultAnalysisFilterInt;
  79.       *synfilter=&DefaultSynthesisFilterInt;
  80.       return;
  81.     case 1: /* default double filter, odd symmetric */
  82.       *anafilter=&DefaultAnalysisFilterDbl;
  83.       *synfilter=&DefaultSynthesisFilterDbl;
  84.       return;
  85.     case 2:  
  86.       *anafilter=&DefaultEvenAnalysisFilterInt;
  87.       *synfilter=&DefaultEvenSynthesisFilterInt;
  88.       return;
  89.     case 3:
  90.       *anafilter=&DefaultEvenAnalysisFilterDbl;
  91.       *synfilter=&DefaultEvenSynthesisFilterDbl;
  92.       return;
  93.      case 4:
  94.       *anafilter=&HaarAna;
  95.       *synfilter=&HaarSyn;
  96.       return;
  97.     case 5:
  98.       *anafilter=&qmf9Ana;
  99.       *synfilter=&qmf9Syn;
  100.       return;
  101.     case 6:
  102.       *anafilter=&qmf9aAna;
  103.       *synfilter=&qmf9aSyn;
  104.       return;
  105.     case 7:
  106.       *anafilter=&fpr53Ana;
  107.       *synfilter=&fpr53Syn;
  108.       return;
  109.     case 8:
  110.       *anafilter=&fpr53aAna;
  111.       *synfilter=&fpr53aSyn;
  112.       return;
  113.     case 9:
  114.       *anafilter=&asd93Ana;
  115.       *synfilter=&asd93Syn;
  116.       return;
  117.     case 10:
  118.       *anafilter=&wav97Ana;
  119.       *synfilter=&wav97Syn;
  120.       return;
  121.     default:
  122.       errorHandler("Filter type %d is not available.",type);
  123.   }
  124. }
  125. /*-----------------------------------------------------------------------*/
  126. Void CVTCEncoder::perform_DWT(FILTER **wvtfilter)
  127. {
  128.   //  Int wordsize = (mzte_codec.m_iBitDepth>8)?2:1;
  129.   Int col,j,k,x,y;
  130.   UChar *inimage[3];
  131.   UChar *inmask[3], *outmask[3];
  132.   Int *outcoeff[3];
  133.   Int Nx[3], Ny[3];
  134.   Int width[3], height[3];
  135.   Int useInt=1, usemask=0;
  136.   Int nLevels[3], ret;
  137.   /* for 4:2:0 YUV image only */
  138.   Nx[0] = Ny[0]=2;
  139.   for(col=1; col<mzte_codec.m_iColors; col++) Nx[col]=Ny[col]=1;
  140.   nLevels[0] = mzte_codec.m_iWvtDecmpLev ;
  141.   nLevels[1] = nLevels[2] = nLevels[0]-1;
  142.   width[0] = mzte_codec.m_iWidth;
  143.   width[1] = width[2] = (width[0] >> 1);
  144.   height[0] = mzte_codec.m_iHeight;
  145.   height[1] = height[2] = (height[0] >> 1);
  146.   useInt  = 1;
  147.   usemask = mzte_codec.m_iAlphaChannel;
  148.   
  149.   Nx[0] = Ny[0]= 2;
  150.   for(col=1;col<3;col++)
  151.     Nx[col]=Ny[col]=1;
  152.   
  153.   for (col=0; col<mzte_codec.m_iColors; col++) {
  154.     inimage[col] = (UChar *)mzte_codec.m_Image[col].data;
  155.     inmask[col] = mzte_codec.m_Image[col].mask;
  156.     
  157.     if ((outcoeff[col] = 
  158.       (Int *)malloc(sizeof(Int)*width[col]*height[col]))==NULL)
  159.       errorHandler("Memory error: outcoeffn");
  160.     if ((outmask[col] = 
  161.       (UChar *)malloc(sizeof(Char)*width[col]*height[col]))==NULL)
  162.       errorHandler("Memory error: outmaskn");
  163.     ret = do_DWT(inimage[col], inmask[col], width[col], height[col], 
  164.    nLevels[col], 0, &(wvtfilter[col==0?0:1]), 
  165.    outcoeff[col], outmask[col]);
  166.   
  167.     if (ret!=DWT_OK) 
  168.       errorHandler("DWT Error Code %dn", ret);
  169.     
  170.     mzte_codec.m_iMean[col] = RemoveDCMean(outcoeff[col], outmask[col], 
  171. width[col], height[col], nLevels[col]);
  172.     
  173.     for (j=0; j<width[col]*height[col]; j++)
  174.       if (outmask[col][j] != DWT_IN)
  175. outcoeff[col][j]=0;
  176.     
  177.     for (k=0, y = 0; y < height[col]; ++y)
  178.       for (x = 0; x < width[col]; ++x,++k) {
  179. COEFF_ORGVAL(x,y,col) = outcoeff[col][k];
  180. COEFF_MASK(x,y,col) = outmask[col][k];
  181.       }
  182.   }
  183.   
  184.   for (col=0; col<mzte_codec.m_iColors; col++) {
  185.     if (outmask[col]) free(outmask[col]);
  186.     if (outcoeff[col]) free(outcoeff[col]);
  187.   }
  188. }
  189. /*------------------------------------------------*/
  190. // hjlee 0901
  191. Void CVTCDecoder::perform_IDWT(FILTER **wvtfilter, Char *recImgFile)
  192. {
  193.   Int j,k,x,y,col;
  194.   UChar *outimage[3];
  195.   UChar *inmask[3], *outmask[3];
  196.   Int *incoeff[3];
  197.   Int Mean[3];
  198.   Int Nx[3], Ny[3];
  199.   Int Width[3], Height[3];
  200.   Int useInt=1, usemask=0;
  201.   Int nLevels[3], ret, MinLevel = 0;
  202.   Int fullsize = 0;
  203.  
  204.   fullsize = FULLSIZE;
  205.   Width[0] = mzte_codec.m_iWidth;
  206.   Width[1] = Width[2] = (Width[0]+1)>>1;
  207.   Height[0] = mzte_codec.m_iHeight;
  208.   Height[1] = Height[2] = (Height[0]+1)>>1;
  209.   nLevels[0] = mzte_codec.m_iWvtDecmpLev ;
  210.   nLevels[1] = nLevels[2] = nLevels[0]-1;
  211.   Mean[0] = mzte_codec.m_iMean[0];
  212.   Mean[1] = mzte_codec.m_iMean[1];
  213.   Mean[2] = mzte_codec.m_iMean[2];
  214.   useInt  = 1;
  215.   usemask = mzte_codec.m_iAlphaChannel;
  216.   Nx[0] = Ny[0]= 2;
  217.   for(col=1;col<mzte_codec.m_iColors;col++)
  218.     Nx[col]=Ny[col]=1;
  219.   for (col=0; col<mzte_codec.m_iColors; col++) {
  220.     if ((inmask[col]=(UChar *)malloc(sizeof(UChar)*
  221.      Width[col]*Height[col]))==NULL)
  222. errorHandler("Memory Failedn");
  223.     
  224.     if ((incoeff[col] = (Int *)malloc(sizeof(Int)*
  225.   Width[col]*Height[col]))==NULL)
  226. errorHandler("Memory Failedn");
  227.     
  228.     /* copy dequantized coefficients to incoeff */
  229.     for (k=0, y=0; y<Height[col]; y++) 
  230.       for (x=0; x<Width[col]; x++,k++) {
  231. incoeff[col][k] = COEFF_RECVAL(x,y,col);
  232. inmask[col][k]  = COEFF_MASK(x,y,col);
  233.       }
  234.     for (j=0; j<Width[col]*Height[col];j++) 
  235.       if (inmask[col][j]!=DWT_IN) 
  236. incoeff[col][j]=0;
  237.     
  238.     AddDCMean(incoeff[col], inmask[col], 
  239.       Width[col], Height[col], 
  240.       nLevels[col], Mean[col]);
  241.     
  242.     
  243.     if ((outmask[col]  = (UChar *)malloc(sizeof(UChar)*
  244.     Width[col]*Height[col]))==NULL)
  245.       errorHandler("Memory Failedn");
  246.     if ((outimage[col] = (UChar *)malloc(sizeof(UChar)*
  247.     Width[col]*Height[col]))==NULL)
  248.       errorHandler("Memory Failedn");
  249.     if(mzte_codec.m_iQuantType==2) {
  250.       Int target_spatial_levels;
  251.       target_spatial_levels=MIN(mzte_codec.m_iSpatialLev,
  252.                             mzte_codec.m_iTargetSpatialLev);
  253.       MinLevel =  mzte_codec.m_iWvtDecmpLev -1- 
  254.         mzte_codec.m_lastWvtDecompInSpaLayer[target_spatial_levels-1][0];
  255.     }
  256.     else {
  257.       MinLevel = mzte_codec.m_iSpatialLev -
  258.         mzte_codec.m_iTargetSpatialLev;
  259.     }
  260.     
  261. if (MinLevel < 0) MinLevel = 0;
  262.     
  263.     ret = do_iDWT(incoeff[col], inmask[col], Width[col], Height[col], 
  264.   nLevels[col], MinLevel, 0 /* byte */, 
  265.   &(wvtfilter[col==0?0:1]), outimage[col], outmask[col], 0,  fullsize );
  266.     if (ret!=DWT_OK) 
  267.       errorHandler("DWT Error Code %dn", ret);
  268.     free(incoeff[col]);
  269.     free(inmask[col]);
  270.   }  /* col */
  271.   
  272.   
  273.   write_image(recImgFile, mzte_codec.m_iColors,
  274.       mzte_codec.m_iWidth, mzte_codec.m_iHeight,
  275.       mzte_codec.m_iRealWidth, mzte_codec.m_iRealHeight,
  276.       mzte_codec.m_iOriginX, mzte_codec.m_iOriginY,
  277.       outimage,outmask,
  278.       usemask,  fullsize, MinLevel);
  279.   for(col=0; col< mzte_codec.m_iColors; col++) {
  280.     free(outmask[col]);
  281.     free(outimage[col]);
  282.   }
  283. }