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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /****************************************************************************/
  2. /*   MPEG4 Visual Texture Coding (VTC) Mode Software                        */
  3. /*                                                                          */
  4. /*   This software was jointly developed by the following participants:     */
  5. /*                                                                          */
  6. /*   Single-quant,  multi-quant and flow control                            */
  7. /*   are provided by  Sarnoff Corporation                                   */
  8. /*     Iraj Sodagar   (iraj@sarnoff.com)                                    */
  9. /*     Hung-Ju Lee    (hjlee@sarnoff.com)                                   */
  10. /*     Paul Hatrack   (hatrack@sarnoff.com)                                 */
  11. /*     Shipeng Li     (shipeng@sarnoff.com)                                 */
  12. /*     Bing-Bing Chai (bchai@sarnoff.com)                                   */
  13. /*     B.S. Srinivas  (bsrinivas@sarnoff.com)                               */
  14. /*                                                                          */
  15. /*   Bi-level is provided by Texas Instruments                              */
  16. /*     Jie Liang      (liang@ti.com)                                        */
  17. /*                                                                          */
  18. /*   Shape Coding is provided by  OKI Electric Industry Co., Ltd.           */
  19. /*     Zhixiong Wu    (sgo@hlabs.oki.co.jp)                                 */
  20. /*     Yoshihiro Ueda (yueda@hlabs.oki.co.jp)                               */
  21. /*     Toshifumi Kanamaru (kanamaru@hlabs.oki.co.jp)                        */
  22. /*                                                                          */
  23. /*   OKI, Sharp, Sarnoff, TI and Microsoft contributed to bitstream         */
  24. /*   exchange and bug fixing.                                               */
  25. /*                                                                          */
  26. /*                                                                          */
  27. /* In the course of development of the MPEG-4 standard, this software       */
  28. /* module is an implementation of a part of one or more MPEG-4 tools as     */
  29. /* specified by the MPEG-4 standard.                                        */
  30. /*                                                                          */
  31. /* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use     */
  32. /* of the MPEG-4 standard free license to use this  software module or      */
  33. /* modifications thereof for hardware or software products claiming         */
  34. /* conformance to the MPEG-4 standard.                                      */
  35. /*                                                                          */
  36. /* Those intending to use this software module in hardware or software      */
  37. /* products are advised that use may infringe existing  patents. The        */
  38. /* original developers of this software module and their companies, the     */
  39. /* subsequent editors and their companies, and ISO/IEC have no liability    */
  40. /* and ISO/IEC have no liability for use of this software module or         */
  41. /* modification thereof in an implementation.                               */
  42. /*                                                                          */
  43. /* Permission is granted to MPEG members to use, copy, modify,              */
  44. /* and distribute the software modules ( or portions thereof )              */
  45. /* for standardization activity within ISO/IEC JTC1/SC29/WG11.              */
  46. /*                                                                          */
  47. /* Copyright 1995, 1996, 1997, 1998 ISO/IEC                                 */
  48. /****************************************************************************/
  49. /************************************************************/
  50. /*     Sarnoff Very Low Bit Rate Still Image Coder          */
  51. /*     Copyright 1995, 1996, 1997, 1998 Sarnoff Corporation */
  52. /************************************************************/
  53. #include <stdlib.h>
  54. #include <stdio.h>
  55. #include <math.h>
  56. #define DEFINE_GLOBALS
  57. #include "basic.hpp"
  58. #include "dataStruct.hpp"
  59. #include "startcode.hpp"
  60. #include "bitpack.hpp"
  61. #include "msg.hpp"
  62. #include "globals.hpp"
  63. #include "states.hpp" // hjlee 0901
  64. CVTCEncoder::CVTCEncoder()
  65. {
  66. m_cImagePath = new Char[80];
  67. m_cSegImagePath = new Char[80];
  68. m_cOutBitsFile = new Char[80];
  69. mzte_codec.m_cBitFile = new Char[80];
  70. }
  71. CVTCEncoder::~CVTCEncoder()
  72. {
  73. delete m_cImagePath;
  74. delete m_cSegImagePath;
  75. delete m_cOutBitsFile;
  76. delete mzte_codec.m_cBitFile;
  77. }
  78. //CVTCEncoder::CVTCEncoder(
  79. Void CVTCEncoder::init(
  80. Char* cImagePath,
  81.     UInt uiAlphaChannel,
  82. Char* cSegImagePath,
  83. UInt uiAlphaTh,
  84. UInt uiChangeCRDisable,
  85. Char* cOutBitsFile,
  86. UInt uiColors,
  87. UInt uiFrmWidth,
  88. UInt uiFrmHeight,
  89. UInt uiWvtType,
  90. UInt uiWvtDownload,  // hjlee 0901
  91. UInt uiWvtDecmpLev,
  92. UInt uiWvtUniform, // hjlee 0901
  93. Int* iWvtFilters,  // hjlee 0901
  94. UInt uiQuantType,
  95. UInt uiScanDirection,
  96. Bool bStartCodeEnable,
  97. UInt uiTargetSpatialLev,
  98. UInt uiTargetSNRLev,
  99. UInt uiQdcY,
  100. UInt uiQdcUV,
  101. UInt uiSpatialLev ,
  102. UInt defaultSpatialScale, // hjlee 0901
  103. Int  *lastWvtDecompInSpaLayer, // hjlee 0901
  104. SNR_PARAM** Qinfo 
  105. )
  106. {
  107. // input/output
  108. strcpy(m_cImagePath,cImagePath);
  109. strcpy(m_cSegImagePath,cSegImagePath);
  110. strcpy(m_cOutBitsFile,cOutBitsFile);
  111. strcpy(mzte_codec.m_cBitFile,cOutBitsFile);
  112. mzte_codec.m_iAlphaChannel = (int)uiAlphaChannel;
  113. mzte_codec.m_iAlphaTh = (int)uiAlphaTh;
  114. mzte_codec.m_iChangeCRDisable = (int)uiChangeCRDisable;
  115. mzte_codec.m_iBitDepth = 8;
  116. mzte_codec.m_iColorFormat = 0;
  117. mzte_codec.m_iColors = (int)uiColors;
  118. mzte_codec.m_iWidth = (int)uiFrmWidth;
  119. mzte_codec.m_iHeight = (int)uiFrmHeight;
  120. mzte_codec.m_iWvtType = (int)uiWvtType;
  121. mzte_codec.m_iWvtDecmpLev = (int)uiWvtDecmpLev;
  122. mzte_codec.m_iQuantType = (int)uiQuantType;
  123. mzte_codec.m_iScanDirection = (int)uiScanDirection;
  124. mzte_codec.m_bStartCodeEnable = bStartCodeEnable;
  125. mzte_codec.m_iSpatialLev = (int)uiSpatialLev;
  126. mzte_codec.m_iTargetSpatialLev = (int)uiTargetSpatialLev;
  127. mzte_codec.m_iTargetSNRLev = (int)uiTargetSNRLev;
  128. mzte_codec.m_iWvtDownload = (int)uiWvtDownload; // hjlee 0901
  129. mzte_codec.m_iWvtUniform = (int)uiWvtUniform;// hjlee 0901
  130. mzte_codec.m_WvtFilters = (int *)iWvtFilters; // hjlee 0901
  131. mzte_codec.m_defaultSpatialScale = (int)defaultSpatialScale; // hjlee 0901
  132. if (uiQuantType == 2) {
  133. if (uiSpatialLev != uiWvtDecmpLev) {
  134.   /* read in usedefault */
  135.   mzte_codec.m_defaultSpatialScale=(int)defaultSpatialScale;
  136.   if (defaultSpatialScale==0) {
  137. int spa_lev;
  138. /* read in spatial layer info */
  139. for (spa_lev=0; spa_lev<(int)uiSpatialLev-1; ++spa_lev)   
  140.   mzte_codec.m_lastWvtDecompInSpaLayer[spa_lev][0]
  141. = lastWvtDecompInSpaLayer[spa_lev];
  142.   }
  143. }
  144. }
  145. for (int i=0; i<(int)uiColors; i++)
  146. mzte_codec.m_Qinfo[i] = Qinfo[i];
  147. mzte_codec.m_iQDC[0] = (int)uiQdcY;
  148. mzte_codec.m_iQDC[1] = mzte_codec.m_iQDC[2] = (int)uiQdcUV;
  149. mzte_codec.m_iDCWidth = GetDCWidth();
  150. mzte_codec.m_iDCHeight = GetDCHeight();
  151.   
  152. mzte_codec.m_iSingleBitFile = 1;
  153. // mzte_codec.m_cBitFile = NULL;
  154. mzte_codec.m_cBitFileAC = NULL;
  155. // check parameter
  156. if (mzte_codec.m_iQuantType==1 && mzte_codec.m_iScanDirection==0)
  157. mzte_codec.m_bStartCodeEnable = 0;
  158. }
  159. /*******************************************************/
  160. /*  Flush buffer and close file. Only and must be used */
  161. /*   by encoder to close bitstream file                */
  162. /*******************************************************/
  163. Void CVTCEncoder::flush_buffer_file()
  164. {
  165.   flush_bits();
  166.   flush_bytes();
  167. }
  168. Void CVTCEncoder::close_buffer_file(FILE *fp)
  169. {
  170.   flush_buffer_file();
  171.   fclose(fp);
  172. }
  173. //Void CVTCEncoder::header_Enc(FILTER *wvtfilter)  // hjlee 0901
  174. Void CVTCEncoder::header_Enc(FILTER **wvtfilter) // hjlee 0901
  175. {
  176.   Int  texture_object_id=0;
  177.   Int  texture_object_layer_shape=mzte_codec.m_iAlphaChannel;
  178.   Int  wavelet_stuffing = 0x0f;
  179. //  Int  wavelet_upload;
  180.   Int  wavelet_uniform;  // hjlee 0901
  181.   Int i; // hjlee 0901
  182.   /*------- Write header info to bitstream file -------*/
  183.   emit_bits((UShort)(STILL_TEXTURE_OBJECT_START_CODE>>16), 16);
  184.   emit_bits((UShort)STILL_TEXTURE_OBJECT_START_CODE, 16);
  185.   emit_bits((UShort)texture_object_id, 16);
  186.   emit_bits((UShort)MARKER_BIT, 1);
  187.   emit_bits((UShort)(mzte_codec.m_iWvtType==0?0:1), 1); // hjlee 0901
  188.   emit_bits((UShort)mzte_codec.m_iWvtDownload, 1); // hjlee 0901
  189.   emit_bits((UShort)mzte_codec.m_iWvtDecmpLev, 4); // hjlee 0901
  190.   emit_bits((UShort)mzte_codec.m_iScanDirection,1);
  191.   emit_bits((UShort)mzte_codec.m_bStartCodeEnable, 1);
  192.   emit_bits((UShort)texture_object_layer_shape, 2);
  193.   emit_bits((UShort)mzte_codec.m_iQuantType, 2);
  194.   /* hjlee 0901 */
  195.   if (mzte_codec.m_iQuantType==2) {
  196.     Int i;
  197.     emit_bits((UShort)mzte_codec.m_iSpatialLev, 4); 
  198.     /* Calc number decomp layers for all spatial layers */
  199.     if (mzte_codec.m_iSpatialLev == 1)
  200.     {
  201.       mzte_codec.m_lastWvtDecompInSpaLayer[0][0]=mzte_codec.m_iWvtDecmpLev-1;
  202.     }
  203.     else if (mzte_codec.m_iSpatialLev != mzte_codec.m_iWvtDecmpLev)
  204.     {
  205.       emit_bits((UShort)mzte_codec.m_defaultSpatialScale, 1);
  206.       if (mzte_codec.m_defaultSpatialScale==0)
  207.       {
  208.         /* For the 1st spatial_scalability_levels-1 layers the luma componant
  209.         of lastWvtDecompInSpaLayer should have been filled in from the 
  210.         parameter file. */
  211.      for (i=0; i<mzte_codec.m_iSpatialLev-1; ++i)
  212.          emit_bits((UShort)mzte_codec.m_lastWvtDecompInSpaLayer[i][0], 4);
  213.      mzte_codec.m_lastWvtDecompInSpaLayer[mzte_codec.m_iSpatialLev-1][0]
  214.          =mzte_codec.m_iWvtDecmpLev-1;
  215.       }
  216.       else
  217.       {
  218. Int sp0;
  219. sp0=mzte_codec.m_iWvtDecmpLev-mzte_codec.m_iSpatialLev;
  220. mzte_codec.m_lastWvtDecompInSpaLayer[0][0]=sp0;
  221.   
  222. for (i=1; i<mzte_codec.m_iSpatialLev; ++i)
  223.   mzte_codec.m_lastWvtDecompInSpaLayer[i][0]=sp0+i;
  224.       }
  225.     }
  226.     else
  227.     {
  228.       for (i=0; i<mzte_codec.m_iSpatialLev; ++i)
  229. mzte_codec.m_lastWvtDecompInSpaLayer[i][0]=i;
  230.     }
  231.     
  232.     /* Calculate for chroma (one less than luma) */
  233.     for (i=0; i<mzte_codec.m_iSpatialLev; ++i)
  234.       mzte_codec.m_lastWvtDecompInSpaLayer[i][1]
  235. =mzte_codec.m_lastWvtDecompInSpaLayer[i][2]
  236. =mzte_codec.m_lastWvtDecompInSpaLayer[i][0]-1;
  237.   }
  238.   if (mzte_codec.m_iWvtDownload == 1) {
  239. // hjlee 0901
  240.     wavelet_uniform = (mzte_codec.m_iWvtUniform!=0)?1:0;
  241.     emit_bits((UShort)wavelet_uniform, 1);
  242.     if(wavelet_uniform) {
  243.       upload_wavelet_filters(wvtfilter[0]);
  244.     }
  245.     else {
  246.       for(i=0;i<mzte_codec.m_iWvtDecmpLev;i++) 
  247.     upload_wavelet_filters(wvtfilter[i]);
  248. }
  249.   }  
  250.   emit_bits((UShort)wavelet_stuffing, 3);
  251.   if (texture_object_layer_shape == 0x00) {
  252.     emit_bits((UShort)mzte_codec.m_iRealWidth, 15);
  253.     emit_bits((UShort)MARKER_BIT, 1);
  254.     emit_bits((UShort)mzte_codec.m_iRealHeight, 15);
  255.     emit_bits((UShort)MARKER_BIT, 1);
  256.   }
  257.   else { /* Arbitrary shape info, SL */    
  258.     emit_bits((UShort)mzte_codec.m_iOriginX, 15);  /*horizontal_ref */    
  259.     emit_bits((UShort)MARKER_BIT, 1); /* marker_bit */   
  260.     emit_bits((UShort)mzte_codec.m_iOriginY, 15); /*vertical_ref */    
  261.     emit_bits((UShort)MARKER_BIT, 1);  /* marker_bit */    
  262.     emit_bits((UShort)mzte_codec.m_iWidth, 15);  /* object_width */    
  263.     emit_bits((UShort)MARKER_BIT, 1);   /* marker_bit */    
  264.     emit_bits((UShort)mzte_codec.m_iHeight, 15);  /* object_height */    
  265.     emit_bits((UShort)MARKER_BIT, 1);  /* marker_bit */
  266.     noteProgress("Merge Shape Bitstream ....");
  267.     // MergeShapeBitstream();
  268.   }
  269. }
  270. /**********************************************************/
  271. /* put  quant value and maximums on the bitstream */
  272. /* put  quant value and maximums on the bitstream */
  273. Void CVTCEncoder::Put_Quant_and_Max(SNR_IMAGE *snr_image, Int spaLayer, Int color)
  274. {
  275.     /* put  quant value and maximums on the bitstream */
  276.     put_param(snr_image->quant, 7);
  277. //    emit_bits((UShort)MARKER_BIT, 1);  // 1124
  278.     {
  279.       Int l;
  280.       for (l=0; l<=mzte_codec.m_lastWvtDecompInSpaLayer[spaLayer][color];++l)
  281.       {
  282. emit_bits((UShort)snr_image->wvtDecompNumBitPlanes[l],5);
  283. if (((l+1) % 4) == 0)
  284.   emit_bits((UShort)MARKER_BIT, 1);
  285.       }
  286.     }
  287. }
  288. // hjlee 0901
  289. Void CVTCEncoder::Put_Quant_and_Max_SQBB(SNR_IMAGE *snr_image, Int spaLayer,
  290.    Int color)
  291. {
  292.     /* put  quant value and maximums on the bitstream */
  293.   if ((color==0 && spaLayer==0) || (color>0 && spaLayer==1))
  294.     put_param(snr_image->quant, 7);
  295.   if (color==0)
  296.     emit_bits((UShort)snr_image->wvtDecompNumBitPlanes[spaLayer],5);
  297.   else if (spaLayer)
  298.     emit_bits((UShort)snr_image->wvtDecompNumBitPlanes[spaLayer-1],5);
  299. }
  300. /**********************************************************/
  301. Void CVTCEncoder::textureLayerDC_Enc()
  302. {
  303.   Int col, err;
  304.   noteProgress("Encoding DC coefficients....");
  305.   for (col=0; col<mzte_codec.m_iColors; col++) 
  306.   {
  307.     /* Set global color variable */
  308.     mzte_codec.m_iCurColor=col;
  309.     /* initialize DC coefficient info */
  310.     if ((err=ztqInitDC(0, col)))
  311.       errorHandler("ztqInitDC");
  312.     /* quantize DC coefficients */
  313.     if ((err=encQuantizeDC(col)))
  314.       errorHandler("encQuantizeDC");
  315.     /* losslessly encoding DC coefficients */
  316.     wavelet_dc_encode(col);
  317.     // writeStats();
  318.   }  
  319.   noteProgress("Completed encoding DC coefficients.");
  320. }
  321. /**********************************************************/
  322. Void CVTCEncoder::TextureSpatialLayerSQNSC_enc(Int spa_lev)
  323. {
  324.   Int col;
  325.   SNR_IMAGE *snr_image; // hjlee 0901
  326.   /* hjlee 0901 */
  327.   /* hjlee 0827 */
  328.     for (col=0; col<mzte_codec.m_iColors; col++) {
  329.       snr_image = &(mzte_codec.m_SPlayer[col].SNRlayer.snr_image);
  330.       Put_Quant_and_Max_SQBB(snr_image, spa_lev, col);
  331.     }
  332. for (col=0; col<mzte_codec.m_iColors; col++) {
  333.         noteProgress("Single-Quant Mode (Band by Band) - Spatial %d, SNR 0, "
  334.               "Color %d",spa_lev,col);
  335.         mzte_codec.m_iCurColor = col;
  336.     if (spa_lev !=0 || col ==0) {
  337.             wavelet_higher_bands_encode_SQ_band(col);
  338.     }
  339.     }
  340. Void CVTCEncoder::TextureSpatialLayerSQ_enc(Int spa_lev, FILE *bitfile)
  341. {
  342. Char fname[100]; // hjlee
  343.   /*------- AC: Open and initialize bitstream file -------*/
  344.   if (mzte_codec.m_iSingleBitFile==0)
  345.   {
  346.     sprintf(fname,mzte_codec.m_cBitFileAC,spa_lev,0);
  347.     if ((bitfile=fopen(fname,"wb"))==NULL)
  348.       errorHandler("Can't open file '%s' for writing.",fname);
  349.   }
  350.   
  351.   /* initialize the buffer */
  352.   init_bit_packing_fp(bitfile,1); 
  353.   /*------- AC: Write header info to bitstream file -------*/
  354.   emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE >> 16, 16);
  355.   emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE, 16);
  356.   emit_bits(spa_lev, 5);
  357.   TextureSpatialLayerSQNSC_enc(spa_lev);
  358.   
  359.   /*------- AC: Close bitstream file -------*/
  360.   if (mzte_codec.m_iSingleBitFile)
  361.     flush_buffer_file();
  362.   else
  363.     close_buffer_file(bitfile);
  364. }
  365. Void CVTCEncoder::textureLayerSQ_Enc(FILE *bitfile)
  366. {
  367.   Int col, err, spa_lev;
  368.   SNR_IMAGE *snr_image;
  369.     
  370.   noteProgress("Encoding AC coefficients - Single-Quant Mode....");
  371.   
  372.   /*------- AC: Set spatial and SNR levels to zero -------*/
  373.   mzte_codec.m_iCurSpatialLev = 0;
  374.   mzte_codec.m_iCurSNRLev = 0;
  375.     
  376. //  mzte_codec.m_iSpatialLev=1;  // hjlee 0901
  377.   setSpatialLayerDimsSQ(0);  // hjlee 0901
  378.   
  379.   for (col=0; col<mzte_codec.m_iColors; col++)
  380.   {     
  381.     snr_image=&(mzte_codec.m_SPlayer[col].SNRlayer.snr_image);
  382.     
  383.     /* Set global color variable */
  384.     mzte_codec.m_iCurColor = col;
  385.     snr_image->quant = mzte_codec.m_Qinfo[col][0].Quant[0];
  386.     
  387.     /* initialization of spatial dimensions for each color component */
  388.     setSpatialLevelAndDimensions(0, col);
  389.     
  390.     /* initialize AC coefficient info for each color component */
  391.     if ((err=ztqInitAC(0, col)))
  392.       errorHandler("ztqInitAC");
  393.     
  394.     /* quantize and mark zerotree structure for AC coefficients */
  395.     if ((err=encQuantizeAndMarkAC(col)))
  396.       errorHandler("encQuantizeAndMarkAC");
  397.   }
  398.   
  399.   /*------- AC: encode all color components -------*/
  400.   if (mzte_codec.m_iScanDirection==0) /* tree-depth scan */
  401.   {
  402.     /* put  quant value and maximums on the bitstream */
  403.     for(col=0;col<mzte_codec.m_iColors; col++){
  404.       snr_image=&(mzte_codec.m_SPlayer[col].SNRlayer.snr_image);
  405.       Put_Quant_and_Max(snr_image,0,col);  // hjlee 0901
  406.     }
  407.     
  408.     /* losslessly encoding AC coefficients */
  409.     wavelet_higher_bands_encode_SQ_tree();      
  410.   }
  411.   else  /* band by band scan */
  412.   {
  413.     setSpatialLayerDimsSQ(1);  // hjlee 0901
  414. /* Assumes all three color components have the same number of SNR 
  415.        levels */
  416.     for (col=0; col<mzte_codec.m_iColors; col++)
  417.       mzte_codec.m_SPlayer[col].SNR_scalability_levels = 1;
  418.     
  419.     /* Loop through spatial layers */
  420.     for (spa_lev=0; spa_lev<mzte_codec.m_iSpatialLev; 
  421.          spa_lev++)
  422.     {
  423.       mzte_codec.m_iCurSpatialLev=spa_lev;
  424.       for (col=0; col<mzte_codec.m_iColors; col++)
  425. setSpatialLevelAndDimensions(spa_lev,col);
  426.       /*----- AC: Set global spatial layer. -----*/
  427.       mzte_codec.m_iCurSpatialLev = spa_lev;
  428.       
  429.       /* Update spatial level coeff info if changing spatial levels.
  430.          Do this for all color components */
  431.       if (mzte_codec.m_bStartCodeEnable) {
  432. TextureSpatialLayerSQ_enc(spa_lev,bitfile);
  433.       }
  434.       else
  435. TextureSpatialLayerSQNSC_enc(spa_lev);
  436.     }
  437.   }
  438.   
  439.   /* store the max snr_lev and spa_lev so that the decoder can
  440.      decode the bitstream up to the max level. */ 
  441.   mzte_codec.m_iTargetSpatialLev = 1;
  442.   mzte_codec.m_iTargetSNRLev = 1;
  443.   
  444.   noteProgress("Completed encoding AC coefficients - Single-Quant Mode.");
  445. }
  446. /**********************************************************/
  447. Void CVTCEncoder::TextureSNRLayerMQ_encode(Int spa_lev, Int snr_lev, FILE *fp)
  448. {
  449.   SNR_IMAGE *snr_image;
  450.   Int col;
  451.   static Int texture_snr_layer_id=0;
  452.   if(mzte_codec.m_bStartCodeEnable){
  453.     noteProgress("Encoding Multi-Quant Mode Layer with SNR start code....");
  454.     /* header */  
  455.     emit_bits((UShort)texture_snr_layer_start_code>>16,16);
  456.     emit_bits((UShort)texture_snr_layer_start_code,16);
  457.     emit_bits((UShort)texture_snr_layer_id++,5);
  458.   }
  459.   else
  460.     noteProgress("Encoding Multi-Quant Mode Layer without SNR start code....");
  461.   noteProgress("Multi-Quant Mode - Spatial %d, SNR %d", spa_lev,snr_lev);
  462.   for(col=0;
  463.       col < NCOL;
  464.       col++)
  465.   {
  466.     noteDetail("width=%d  height=%d",mzte_codec.m_SPlayer[col].width,
  467.       mzte_codec.m_SPlayer[col].height);    
  468.     /* Set global color variable */
  469.     mzte_codec.m_iCurColor = col;
  470.     
  471.     /* Set quant value */
  472.     snr_image=&(mzte_codec.m_SPlayer[col].SNRlayer.snr_image);
  473.     snr_image->quant = mzte_codec.m_Qinfo[col][spa_lev].Quant[snr_lev];
  474.     noteDebug("AC quant=%d", 
  475.                mzte_codec.m_Qinfo[col][spa_lev].Quant[snr_lev]);
  476.         
  477.     /* initialization of spatial dimensions for each color component */
  478.     if (snr_lev==0) 
  479.       setSpatialLevelAndDimensions(spa_lev, col);
  480.     /* get maximum residual value - this one is derived from user Q inputs not 
  481.        actual values. Also assign skip modes. */
  482.     updateResidMaxAndAssignSkips(col);
  483.     noteDebug("resid_max=%dn",snr_image->residual_max);
  484.     /* quantize and mark zerotree structure for AC coefficients */
  485.     if (encQuantizeAndMarkAC(col))
  486.       errorHandler("encQuantizeAndMarkAC");
  487.      //   Put_Quant_and_Max(snr_image); // hjlee 0901
  488.     Put_Quant_and_Max(snr_image,spa_lev,col);  // hjlee 0901
  489.   }
  490.   wavelet_higher_bands_encode_MQ(mzte_codec.m_iScanDirection);    
  491.   for(col=0;
  492.       col < NCOL;
  493.       col++)
  494.   {
  495.     /* Set global color variable */
  496.     mzte_codec.m_iCurColor = col;
  497.     
  498.     /* Update states of AC coefficients */
  499.     if (encUpdateStateAC(mzte_codec.m_iCurColor))
  500.       errorHandler("encUpdateStateAC");
  501.   }
  502. }
  503.  
  504. Void CVTCEncoder::textureLayerMQ_Enc(FILE *bitfile)
  505. {
  506.   Int err, spa_lev, snr_lev=0, snr_scalability_levels;
  507. Char fname[100]; // hjlee
  508.   getSpatialLayerDims(); // hjlee 0901
  509.   // hjlee 0901
  510.     /*------- AC: Initialize QList Structure -------*/
  511.   if ((err=ztqQListInit()))
  512.     errorHandler("Allocating memory for QList information.");
  513.   
  514.   /* Initialize coeffs */
  515.   setSpatialLevelAndDimensions(0,0);
  516.   if ((err=ztqInitAC(0,0)))
  517.     errorHandler("ztqInitAC");
  518.   
  519.   if (mzte_codec.m_iColors > 1)
  520.   {
  521.     if (mzte_codec.m_lastWvtDecompInSpaLayer[0][1]<0)
  522.       setSpatialLevelAndDimensions(1,1);
  523.     else
  524.       setSpatialLevelAndDimensions(0,1);
  525.     if ((err=ztqInitAC(0,1)))
  526.       errorHandler("ztqInitAC");
  527.   }
  528.   if (mzte_codec.m_iColors > 2)
  529.   {
  530.     if (mzte_codec.m_lastWvtDecompInSpaLayer[0][2]<0)
  531.       setSpatialLevelAndDimensions(1,2);
  532.     else
  533.       setSpatialLevelAndDimensions(0,2);
  534.     if ((err=ztqInitAC(0,2)))
  535.       errorHandler("ztqInitAC");
  536.   }
  537.   /* Loop through spatial layers */
  538.   for (spa_lev=0; spa_lev<mzte_codec.m_iSpatialLev; 
  539.        spa_lev++)
  540.   {
  541.     /*----- AC: Set global spatial layer and SNR scalability level. -----*/
  542.     /* Assumes all three color components have the same number of SNR 
  543.        levels */
  544.     mzte_codec.m_iCurSpatialLev = spa_lev;
  545.     mzte_codec.m_SPlayer[0].SNR_scalability_levels = 
  546.       mzte_codec.m_Qinfo[0][spa_lev].SNR_scalability_levels;
  547.     snr_scalability_levels = mzte_codec.m_SPlayer[0].SNR_scalability_levels;
  548.     
  549.     /* Update spatial level coeff info if changing spatial levels.
  550.        Do this for all color components. */
  551.     if (spa_lev != 0)
  552.     {
  553.       for (mzte_codec.m_iCurColor = 0; mzte_codec.m_iCurColor<mzte_codec.m_iColors;
  554.    mzte_codec.m_iCurColor++) 
  555.       {
  556. setSpatialLevelAndDimensions(mzte_codec.m_iCurSpatialLev, 
  557.  mzte_codec.m_iCurColor);
  558. // hjlee 0901
  559. if (mzte_codec.m_lastWvtDecompInSpaLayer[spa_lev-1][mzte_codec.m_iCurColor]
  560. >=0)
  561.   spatialLayerChangeUpdate(mzte_codec.m_iCurColor);
  562.       }
  563.     }
  564.     
  565.     if (!mzte_codec.m_bStartCodeEnable)
  566.       /*------- AC: Write header info to bitstream file -------*/
  567.       emit_bits(snr_scalability_levels, 5);    
  568.     
  569.     /* Loop through SNR layers */      
  570.     for (snr_lev=0; snr_lev<snr_scalability_levels; snr_lev++) 
  571.     {
  572.       /*----- AC: Set global SNR layer -----*/
  573.       mzte_codec.m_iCurSNRLev = snr_lev;
  574.       
  575.       if (mzte_codec.m_bStartCodeEnable)
  576.       {
  577. /*------- AC: Open and initialize bitstream file -------*/
  578. if (mzte_codec.m_iSingleBitFile==0)
  579. {
  580.   sprintf(fname,mzte_codec.m_cBitFileAC,
  581.   mzte_codec.m_iCurSpatialLev, mzte_codec.m_iCurSNRLev);
  582.   if ((bitfile=fopen(fname,"wb"))==NULL)
  583.     errorHandler("Can't open file '%s' for writing.",fname);
  584. }
  585. /* initialize the buffer */
  586. init_bit_packing_fp(bitfile,1);
  587. if (snr_lev==0) {
  588.   /*------- AC: Write header info to bitstream file -------*/
  589.   emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE >> 16, 16);
  590.   emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE, 16);
  591.   emit_bits(spa_lev, 5);
  592.   emit_bits(snr_scalability_levels, 5);
  593.   flush_bits();     /* byte alignment before start code */
  594. }
  595.       }
  596.       
  597.       /*------- AC: Quantize and encode all color components -------*/
  598.       TextureSNRLayerMQ_encode(spa_lev, snr_lev, bitfile);
  599.       if (mzte_codec.m_bStartCodeEnable)
  600.       {
  601. if (mzte_codec.m_iSingleBitFile)
  602. flush_buffer_file();
  603. else
  604. close_buffer_file(bitfile);
  605.       }
  606.       
  607.       
  608.     } /* snr_lev */
  609.     
  610.   }  /* spa_lev */
  611.   
  612.   /* store the max snr_lev and spa_lev so that the decoder can
  613.      decode the bitstream up to the max level. */ 
  614.   mzte_codec.m_iTargetSpatialLev = spa_lev;
  615.   mzte_codec.m_iTargetSNRLev = snr_lev;
  616.   
  617.   /*------- AC: Free Qlist structure -------*/
  618.   ztqQListExit();
  619.   
  620. }
  621. /**********************************************************/
  622. Void CVTCEncoder::TextureObjectLayer_enc(FILTER **wvtfilter)
  623. //Void CVTCEncoder::TextureObjectLayer_enc(FILTER *wvtfilter)  // hjlee 0901
  624. {
  625.   FILE *bitfile;
  626.   /*------- DC: Open and initialize bitstream file -------*/
  627.   if ((bitfile=fopen(mzte_codec.m_cBitFile,"wb"))==NULL)
  628.     errorHandler("Can't open file '%s' for writing.",
  629. mzte_codec.m_cBitFile);
  630.   /* for PEZW, always enabled */
  631.   if (mzte_codec.m_iQuantType == BILEVEL_Q) 
  632.     mzte_codec.m_bStartCodeEnable = 1;
  633.   /* initialize variables */
  634.   init_bit_packing_fp(bitfile,1);
  635.   /* Write header info to bitstream */
  636.   header_Enc(wvtfilter);
  637.   /*------- DC: Quantize and encode all color components -------*/
  638.   textureLayerDC_Enc();
  639.   /*------- DC: Close bitstream file -------*/
  640.   /* hjlee 001 */
  641.   if (mzte_codec.m_bStartCodeEnable){
  642.      if(mzte_codec.m_iSingleBitFile) 
  643.         flush_buffer_file(); 
  644.      else  
  645.        close_buffer_file(bitfile); 
  646.   }
  647.   /*-------------------------------------------------*/
  648.   /*--------------------- AC ------------------------*/
  649.   /*-------------------------------------------------*/
  650.   /*------- AC: SINGLE-QUANT MODE -------*/
  651.   if (mzte_codec.m_iQuantType == SINGLE_Q)
  652.     textureLayerSQ_Enc(bitfile);
  653.   /*------- AC: MULTI-QUANT MODE -------*/
  654.   else if (mzte_codec.m_iQuantType == MULTIPLE_Q)
  655.     textureLayerMQ_Enc(bitfile);
  656.   else if (mzte_codec.m_iQuantType == BILEVEL_Q) {
  657.   textureLayerBQ_Enc(bitfile);
  658.   }
  659.   if (mzte_codec.m_iSingleBitFile){
  660.     if(!mzte_codec.m_bStartCodeEnable)
  661.       close_buffer_file(bitfile);
  662.     else
  663.       fclose(bitfile);
  664.   }
  665. }
  666. /**************************************************************/
  667. Void CVTCEncoder::encode()
  668. {
  669. FILTER **synfilter,**anafilter;  // hjlee 0901
  670. Int i; // hjlee 0901
  671. // allocate memory for source image
  672. mzte_codec.m_Image = new PICTURE[3];
  673. // hjlee 0901
  674.   anafilter = (FILTER **) malloc(sizeof(FILTER *)*mzte_codec.m_iWvtDecmpLev);
  675.   synfilter = (FILTER **) malloc(sizeof(FILTER *)*mzte_codec.m_iWvtDecmpLev);
  676.   if(anafilter == NULL || synfilter == NULL) 
  677. errorHandler("Error allocating memory for filtersn");
  678.   for(i=0;i<mzte_codec.m_iWvtDecmpLev; i++) {
  679. choose_wavelet_filter(&(anafilter[i]),
  680.   &(synfilter[mzte_codec.m_iWvtDecmpLev-1-i]),
  681.   mzte_codec.m_WvtFilters[mzte_codec.m_iWvtUniform?0:i]);
  682.   }
  683.   
  684.   // read source image
  685. read_image( m_cImagePath,
  686. mzte_codec.m_iWidth,
  687. mzte_codec.m_iHeight,
  688. mzte_codec.m_iColors,
  689. 8,
  690. mzte_codec.m_Image
  691. );
  692. if (mzte_codec.m_iAlphaChannel != 0) {  // arbitrary shape coding
  693. // allocate meory for segmentation
  694. mzte_codec.m_SegImage = new PICTURE[3];
  695. // read the segmentation map of the source image */
  696. mzte_codec.m_iAlphaChannel = read_segimage(m_cSegImagePath, 
  697.   mzte_codec.m_Image[0].width, 
  698.   mzte_codec.m_Image[0].height, 
  699.   mzte_codec.m_iColors, 
  700.   mzte_codec.m_Image); 
  701. }
  702. get_virtual_image(mzte_codec.m_Image,
  703. mzte_codec.m_iWvtDecmpLev,
  704. mzte_codec.m_iAlphaChannel,
  705. mzte_codec.m_iColors,
  706. mzte_codec.m_iAlphaTh,
  707. mzte_codec.m_iChangeCRDisable,
  708. anafilter[0]);
  709. int col;
  710. for (/*int*/ col=0; col<mzte_codec.m_iColors; col++) {
  711. mzte_codec.m_Image[col].height = mzte_codec.m_iHeight >> (Int)(col>0);
  712. mzte_codec.m_Image[col].width  = mzte_codec.m_iWidth >> (Int)(col>0);
  713. }
  714. mzte_codec.m_iAcmOrder = 0;
  715. mzte_codec.m_iAcmMaxFreqChg = 0;
  716. init_acm_maxf_enc();
  717. // fprintf(stdout,"init ac model!n");
  718. int height;
  719. int width;
  720. for (col=0; col<mzte_codec.m_iColors; col++) {
  721. height = mzte_codec.m_Image[col].height; 
  722. width  = mzte_codec.m_Image[col].width;
  723.     
  724. mzte_codec.m_SPlayer[col].coeffinfo = new COEFFINFO * [height];
  725. if (mzte_codec.m_SPlayer[col].coeffinfo == NULL)
  726. exit(fprintf(stderr,"Allocating memory for coefficient structure (I)."));
  727. mzte_codec.m_SPlayer[col].coeffinfo[0] = new COEFFINFO [height*width];
  728. if (mzte_codec.m_SPlayer[col].coeffinfo[0] == NULL)
  729. exit(fprintf(stderr,"Allocating memory for coefficient structure (II)."));
  730. int y;
  731. for (/* int*/ y = 1; y < height; ++y)
  732.   mzte_codec.m_SPlayer[col].coeffinfo[y] = 
  733. mzte_codec.m_SPlayer[col].coeffinfo[y-1]+width;
  734. for (y=0; y<height; y++)
  735. for (int x=0; x<width; x++) {
  736. mzte_codec.m_SPlayer[col].coeffinfo[y][x].skip =0;
  737. }
  738. }
  739. // fprintf(stdout,"Coeffinfo memory allocation done!n");
  740. /* DISCRETE WAVELET TRANSFORM */
  741. noteProgress("Wavelet Transform....");  
  742. //  choose_wavelet_filter(&anafilter, &synfilter, mzte_codec.m_iWvtType); // hjlee 0901
  743. perform_DWT(anafilter);
  744. noteProgress("Completed wavelet transform.");
  745. TextureObjectLayer_enc(synfilter); 
  746. /*----- free up coeff data structure -----*/
  747. noteDetail("Freeing up encoding data structures....");
  748. for (col=0; col<mzte_codec.m_iColors; col++) {
  749. if (mzte_codec.m_SPlayer[col].coeffinfo[0] != NULL)
  750. delete (mzte_codec.m_SPlayer[col].coeffinfo[0]);
  751. mzte_codec.m_SPlayer[col].coeffinfo[0] = NULL;
  752. if (mzte_codec.m_SPlayer[col].coeffinfo)
  753. delete (mzte_codec.m_SPlayer[col].coeffinfo);
  754. mzte_codec.m_SPlayer[col].coeffinfo = NULL;
  755. }
  756. noteDetail("Completed freeing up encoding data structures.");
  757. noteProgress("n----- Encoding Completed. -----n");
  758.   
  759. }