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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: ztscan_enc.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. /*  Filename: ztscan_enc.c                                  */
  56. /*  Author: Bing-Bing Chai                                  */
  57. /*  Date: Dec. 4, 1997                                      */
  58. /*                                                          */
  59. /*  Descriptions:                                           */
  60. /*    This file contains the routines that performs         */
  61. /*    zero tree scanning and entropy encoding.              */
  62. /*                                                          */
  63. /************************************************************/
  64. #define DEFINE_ZTSCAN_GLOBALS 1
  65. #include <stdio.h>
  66. #include <stdlib.h>
  67. #ifndef WIN32
  68. #include <unistd.h>
  69. #endif
  70. #include <ctype.h>
  71. #include <string.h>
  72. #include <math.h>
  73. #include "basic.hpp"
  74. #include "startcode.hpp"
  75. #include "dataStruct.hpp"
  76. #include "states.hpp"
  77. #include "globals.hpp"
  78. #include "errorHandler.hpp"
  79. #include "ac.hpp"
  80. #include "bitpack.hpp"
  81. #include "msg.hpp"
  82. #include "ztscan_common.hpp"
  83. #include "ztscanUtil.hpp"
  84. /* local global variables */
  85. static ac_encoder ace;
  86. static int bit_stream_length;
  87. static SInt **dc_coeff;
  88. /* added by Z. Wu @ OKI for SA-prediction */
  89. static Char **dc_mask;
  90. /******************************************************************/
  91. /****************************  DC  ********************************/
  92. /******************************************************************/
  93. /*******************************************************/
  94. /**************  Forward DC Prediction  ****************/
  95. /*******************************************************/
  96. /********************************************************
  97.   Function Name
  98.   -------------
  99.   static DATA DC_pred_pix(Int i, Int j)
  100.   Arguments
  101.   ---------
  102.   Int i, Int j: Index of wavelet coefficient (row, col)
  103.   
  104.   Description
  105.   -----------
  106.   DPCM prediction for a DC coefficient, refer to syntax
  107.   for algorithm. 
  108.   Functions Called
  109.   ----------------
  110.   None.
  111.   Return Value
  112.   ------------
  113.     prediction for coeffinfo[i][j].quantized_value
  114. ********************************************************/ 
  115. SInt CVTCEncoder::DC_pred_pix(Int i, Int j)
  116. {
  117.   /*  modified by Z. Wu @ OKI */
  118.   Int pred_i, pred_j, pred_d;
  119.   if ( i==0 || dc_mask[i-1][j] == 0 ) 
  120.     pred_i = 0;
  121.   else
  122.     pred_i = dc_coeff[i-1][j];
  123.   if ( j==0 || dc_mask[i][j-1] == 0 ) 
  124.     pred_j = 0;
  125.   else 
  126.     pred_j = dc_coeff[i][j-1];
  127.   if ( i==0 || j== 0 || dc_mask[i-1][j-1] == 0 )
  128.     pred_d = 0;
  129.   else
  130.     pred_d = dc_coeff[i-1][j-1];
  131.   
  132.   if ( abs(pred_d-pred_j) < abs(pred_d-pred_i))
  133.     return(pred_i);
  134.   else
  135.     return(pred_j);
  136. }
  137. /*****************************************************
  138.   Function Name
  139.   -------------
  140.   Void DC_predict()
  141.   Arguments
  142.   ---------
  143.   None
  144.   
  145.   Description
  146.   -----------
  147.   control program for DC prediction
  148.   Functions Called
  149.   ----------------
  150.   DC_pred_pix(i,j).
  151.   Return Value
  152.   ------------
  153.   none
  154. ******************************************************/
  155. Void CVTCEncoder::DC_predict(Int color)
  156. {
  157.   Int i,j,dc_h,dc_w,offset_dc,max_dc;
  158.   dc_h=mzte_codec.m_iDCHeight;
  159.   dc_w=mzte_codec.m_iDCWidth;
  160.   dc_coeff=(SInt **)calloc(dc_h,sizeof(SInt *));
  161.   for(i=0;i<dc_h;i++)
  162.     dc_coeff[i]=(SInt *)calloc(dc_w,sizeof(SInt));
  163.   dc_mask=(Char **)calloc(dc_h,sizeof(Char *));
  164.   for(i=0;i<dc_h;i++)
  165.     dc_mask[i]=(Char *)calloc(dc_w,sizeof(Char));
  166.   coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  167.   for(i=0;i<dc_h;i++)
  168.     for(j=0;j<dc_w;j++) {
  169.       dc_coeff[i][j]=coeffinfo[i][j].quantized_value;
  170.       dc_mask [i][j]=coeffinfo[i][j].mask;
  171.     }
  172.   /* prediction */    
  173.   offset_dc=0;
  174.   for(i=0;i<dc_h;i++)
  175.     for(j=0;j<dc_w;j++){
  176.       if ( dc_mask[i][j] != 0 ) {
  177. if(offset_dc>(coeffinfo[i][j].quantized_value-=DC_pred_pix(i,j)))
  178.   offset_dc=coeffinfo[i][j].quantized_value;
  179.       }
  180.     }
  181.   if(offset_dc>0)
  182.     offset_dc=0;
  183.   /* adjust coeff's by offset_dc */
  184.   max_dc=0;
  185.   for(i=0;i<dc_h;i++)
  186.     for(j=0;j<dc_w;j++){
  187.       if ( dc_mask[i][j] != 0 ) {
  188. coeffinfo[i][j].quantized_value -=offset_dc;
  189. /* find max_dc */
  190. if (max_dc<coeffinfo[i][j].quantized_value)
  191.   max_dc=coeffinfo[i][j].quantized_value;
  192.       }
  193.     }
  194.     
  195.   mzte_codec.m_iOffsetDC=offset_dc;
  196.   mzte_codec.m_iMaxDC=max_dc;  /* hjlee */
  197.   noteDebug("DC pred: offset=%d, max_dc=%d",
  198.     mzte_codec.m_iOffsetDC,mzte_codec.m_iMaxDC);  
  199.   for(i=0;i<dc_h;i++) {
  200.     free(dc_coeff[i]);
  201.     free(dc_mask[i]);
  202.   }
  203.   free(dc_coeff);
  204.   free(dc_mask);
  205. }
  206. /********************************************************
  207.   Function Name
  208.   -------------
  209.   Void wavelet_dc_encode(Int c)
  210.   Arguments
  211.   ---------
  212.   Int c - color component.
  213.   
  214.   Description
  215.   -----------
  216.   Control program for encode DC information for one 
  217.   color component.
  218.   Functions Called
  219.   ----------------
  220.   None.
  221.   DC_predict()
  222.   put_param()
  223.   cacll_encode()
  224.   
  225.   Return Value
  226.   ------------
  227.   None.
  228. ********************************************************/ 
  229. Void CVTCEncoder::wavelet_dc_encode(Int c)
  230. {
  231.   noteDetail("Encoding DC (wavelet_dc_encode)....");
  232.   color=c;
  233.   emit_bits((UShort)mzte_codec.m_iMean[color], 8);
  234.   put_param((UShort)mzte_codec.m_iQDC[color], 7);
  235.   /* emit_bits(mzte_codec.Qdc[color], 8); */
  236.   DC_predict(color);
  237.   put_param(-mzte_codec.m_iOffsetDC,7);
  238.   put_param(mzte_codec.m_iMaxDC,7); /* hjlee */
  239.   /* put_param(mzte_codec.m_iMaxDC+mzte_codec.m_iOffsetDC,7); */ /* hjlee */
  240.   
  241.   cacll_encode();
  242.   noteDetail("Completed encoding DC.");
  243. }
  244. /********************************************************
  245.   Function Name
  246.   -------------
  247.   static Void cacll_encode()
  248.   Arguments
  249.   ---------
  250.   None.
  251.   
  252.   Description
  253.   -----------
  254.   Encode DC information for one color component.
  255.   Functions Called
  256.   ----------------
  257.   mzte_ac_encoder_init()
  258.   mzte_ac_model_init()
  259.   mzte_ac_encode_symbol()
  260.   mzte_ac_model_done()
  261.   mzte_ac_encoder_done()
  262.   Return Value
  263.   ------------
  264.   None.
  265. ********************************************************/ 
  266. Void CVTCEncoder::cacll_encode()
  267. {
  268.   Int dc_h, dc_w,i,j;
  269. Int numBP, bp; // 1124
  270.   dc_w=mzte_codec.m_iDCWidth;
  271.   dc_h=mzte_codec.m_iDCHeight;
  272.   // 1124
  273.   /* init arithmetic coder */
  274.   numBP = ceilLog2(mzte_codec.m_iMaxDC + 1);
  275.   mzte_ac_encoder_init(&ace);
  276.   if ((acm_bpdc=(ac_model *)calloc(numBP,sizeof(ac_model)))==NULL)
  277.     errorHandler("Can't allocate memory for prob model.");
  278.   
  279.   for (i=0; i<numBP; i++) {
  280.     acm_bpdc[i].Max_frequency = Bitplane_Max_frequency;
  281.     mzte_ac_model_init(&(acm_bpdc[i]),2,NULL,ADAPT,1);
  282.   }
  283.   coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  284.   for (bp=numBP-1; bp>=0; bp--) {
  285.     for(i=0;i<dc_h;i++)
  286.       for(j=0;j<dc_w;j++){
  287. if( coeffinfo[i][j].mask == 1) 
  288.   mzte_ac_encode_symbol(&ace, &(acm_bpdc[bp]),
  289. ((coeffinfo[i][j].quantized_value)>>bp)&1);
  290.       }
  291.   }
  292.   /* close arithmetic coder */
  293.   for (i=0; i<numBP; i++) 
  294.     mzte_ac_model_done(&(acm_bpdc[i]));
  295.   free(acm_bpdc);
  296.   
  297. #if 0 // 1124
  298.   /* init arithmetic coder */
  299.   mzte_ac_encoder_init(&ace);
  300.   if ((acm_vz=(ac_model *)calloc(1,sizeof(ac_model)))==NULL)
  301.     errorHandler("Can't allocate memory for prob model.");
  302.   acm_vz->Max_frequency = DEFAULT_MAX_FREQ; // hjlee 0928
  303.   mzte_ac_model_init(acm_vz,mzte_codec.m_iMaxDC+1,NULL,ADAPT,1);
  304.   coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  305.   for(i=0;i<dc_h;i++)
  306.     for(j=0;j<dc_w;j++){
  307.       if( coeffinfo[i][j].mask == 1) 
  308. mzte_ac_encode_symbol(&ace,acm_vz,coeffinfo[i][j].quantized_value);
  309.     }
  310.   /* close arithmetic coder */
  311.   mzte_ac_model_done(acm_vz);
  312.   free(acm_vz);
  313. #endif
  314.   bit_stream_length=mzte_ac_encoder_done(&ace);
  315.   
  316. }
  317. /*********************************************************************/
  318. /*****************************  AC  **********************************/
  319. /*********************  Single and Multi Quant  **********************/
  320. /*********************************************************************/
  321. Void CVTCEncoder::bitplane_encode(Int val,Int l,Int max_bplane)
  322. {
  323.   register int i,k=0;
  324.   for(i=max_bplane-1;i>=0;i--,k++)
  325.     mzte_ac_encode_symbol(&ace,&acm_bpmag[l][k],(val>>i)&1);
  326. }
  327. /*********************************************************************/
  328. /*****************************  AC  **********************************/
  329. /*************************  Single quant  ****************************/
  330. /*********************************************************************/
  331. /*******************************************************
  332.   The following single quant routines are for band by
  333.   band scan order.
  334. *******************************************************/
  335. /********************************************************
  336.   Function Name
  337.   -------------
  338.   Void wavelet_higher_bands_encode_SQ_band(Int col)
  339.   Arguments
  340.   ---------
  341.   None.
  342.   Description
  343.   -----------
  344.   Control program for encoding AC information for one 
  345.   color component. Single quant mode.
  346.   Functions Called
  347.   ----------------
  348.   cachb_encode_SQ_band()
  349.   mzte_ac_encoder_init()
  350.   mzte_ac_model_init()
  351.   mzte_ac_model_done()
  352.   mzte_ac_encoder_done()
  353.   Return Value
  354.   ------------
  355.   None.
  356. ********************************************************/ 
  357. Void CVTCEncoder::wavelet_higher_bands_encode_SQ_band(Int col)
  358. {
  359.   SNR_IMAGE *snr_image;
  360.     
  361.   noteDetail("Encoding AC (wavelet_higher_bands_encode_SQ)....");
  362.   color=col;
  363.   snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image);
  364.   
  365.   /* init arithmetic coder */
  366.   mzte_ac_encoder_init(&ace);
  367.   probModelInitSQ(color);  // hjlee 0901
  368.   cachb_encode_SQ_band(snr_image);
  369.   
  370.   probModelFreeSQ(color);  // hjlee 0901
  371.   
  372.   bit_stream_length=mzte_ac_encoder_done(&ace);
  373.   noteDetail("Completed encoding AC.");
  374. }
  375. /********************************************************
  376.   Function Name
  377.   -------------
  378.   static Void cachb_encode_SQ_band()
  379.   Arguments
  380.   ---------
  381.   None.
  382.   Description
  383.   -----------
  384.   Encode AC information for single quant mode, tree-depth scan.
  385.   Functions Called
  386.   ----------------
  387.   codeBlocks();
  388.   encode_pixel_SQ()
  389.   Return Value
  390.   ------------
  391.   None.
  392. ********************************************************/ 
  393. Void CVTCEncoder::cachb_encode_SQ_band(SNR_IMAGE *snr_image)
  394. {
  395.   Int h,w,ac_h,ac_w,ac_h2,ac_w2;
  396.   Int n; /* layer index - for codeBlocks function */
  397.   Int k; /* block jump for the layer */  // hjlee 0928
  398.   /* ac_h, ac_w init */
  399.   ac_h2=mzte_codec.m_SPlayer[color].height;
  400.   ac_w2=mzte_codec.m_SPlayer[color].width;
  401.   ac_h=ac_h2>>1;
  402.   ac_w=ac_w2>>1;
  403.   height=mzte_codec.m_Image[color].height;
  404.   width=mzte_codec.m_Image[color].width;
  405.   /* Get layer index - for codeBlocks function */  // hjlee 0928
  406.   n = -1;
  407.   for (w=mzte_codec.m_iDCWidth; w < ac_w2; w<<=1)
  408.     n++;
  409.   setProbModelsSQ(color); // hjlee 0901
  410.   coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  411.   /* scan each coefficients in the spatial layer */  
  412.   k = 1<<n;  // hjlee 0928
  413.   for(h=0;h<ac_h;h+=k)
  414.     for(w=ac_w;w<ac_w2;w+=k)
  415.     {
  416.       /* LH */
  417.       encodeSQBlocks(h,w,n);
  418.       /* HL */
  419.       h += ac_h;
  420.       w -= ac_w;
  421.       encodeSQBlocks(h,w,n);
  422.       /* HH */
  423.       w += ac_w;
  424.       encodeSQBlocks(h,w,n);
  425.       /* Set h back to where it started. w is already there */
  426.       h -= ac_h;
  427.     }
  428. }
  429. #if 0
  430. /********************************************************
  431.   Function Name
  432.   -------------
  433.   static Void encode_pixel_SQ_band(Int h,Int w)
  434.   Arguments
  435.   ---------
  436.   Int h,Int w - position of a pixel in height and width
  437.   
  438.   Description
  439.   -----------
  440.   Encoding the type and/or value of a coefficient, a
  441.   recursive function.
  442.   Functions Called
  443.   ----------------
  444.   mag_sign_encode_SQ()
  445.   mzte_ac_encode_symbol()
  446.   Return Value
  447.   ------------
  448.   None.
  449. ********************************************************/ 
  450. Void CVTCEncoder::encode_pixel_SQ_band(Int h,Int w)
  451. {
  452.   UChar zt_type;
  453.   Int l;
  454.   if(coeffinfo[h][w].type == ZTR_D)
  455.     return;
  456.   l=xy2wvtDecompLev(w,h);
  457.   /* code leave coefficients, value only, no type */
  458.   if(IS_STATE_LEAF(coeffinfo[h][w].state)){
  459. #ifdef _SHAPE_ /* skip out-node */
  460.     if(coeffinfo[h][w].mask == 1) {
  461. #endif
  462.    
  463.       /* Map type to leaf code word ZTR->0, VZTR->1 */
  464.       zt_type = (coeffinfo[h][w].type!=ZTR);
  465.       mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LINIT],zt_type);
  466.       if (coeffinfo[h][w].type==VZTR)
  467. mag_sign_encode_SQ(h,w);
  468. #ifdef _SHAPE_
  469.     }
  470. #endif
  471.     return;
  472.   }
  473.  
  474.   /* code zerotree symbol */
  475. #ifdef _SHAPE_ /* skip out-node */
  476.   if(coeffinfo[h][w].mask == 1) 
  477. #endif
  478.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_INIT],
  479.   zt_type=coeffinfo[h][w].type);
  480. #ifdef _SHAPE_
  481.   else
  482.     zt_type=coeffinfo[h][w].type;
  483. #endif
  484.   /* code magnitude and sign */
  485.   /* For Arbitrary-Shape, out-node will always has zero coefficient,
  486.      so only IZ or ZTR may be the zt_type -- SL*/
  487.   switch(zt_type){
  488.     case IZ : 
  489.       break; /* will code the four children */
  490.     case VZTR:
  491.       mag_sign_encode_SQ(h,w);
  492.     case ZTR:
  493. #ifdef _SHAPE_
  494.       if(coeffinfo[h][w].mask == 1) /* TBE for four children of out-node */ 
  495. #endif
  496. mark_ZTR_D(h,w);  /* necessary, for bandwise scan */
  497.       break;
  498.     case VAL:
  499.       mag_sign_encode_SQ(h,w);
  500.       break;
  501.     default: 
  502.       errorHandler("invalid zerotree symbol in single quant encode");
  503.   }
  504. }
  505. #endif // 1124
  506.      
  507. /*******************************************************
  508.   The following single quant routines are for tree
  509.   depth scan order.
  510. *******************************************************/
  511. /********************************************************
  512.   Function Name
  513.   -------------
  514.   Void wavelet_higher_bands_encode_SQ_tree()
  515.   Arguments
  516.   ---------
  517.   None.
  518.   Description
  519.   -----------
  520.   Control program for encoding AC information for one 
  521.   color component. Single quant mode.
  522.   Functions Called
  523.   ----------------
  524.   cachb_encode_SQ_tree()
  525.   mzte_ac_encoder_init()
  526.   mzte_ac_model_init()
  527.   mzte_ac_model_done()
  528.   mzte_ac_encoder_done()
  529.   Return Value
  530.   ------------
  531.   None.
  532. ********************************************************/ 
  533. Void CVTCEncoder::wavelet_higher_bands_encode_SQ_tree() // hjlee 0928
  534. {
  535.   noteDetail("Encoding AC (wavelet_higher_bands_encode_SQ)....");
  536.   /* init arithmetic coder */
  537.   mzte_ac_encoder_init(&ace);
  538.   // hjlee 0901
  539.   for (color=0; color<mzte_codec.m_iColors; color++) 
  540.     probModelInitSQ(color);
  541.   
  542.   cachb_encode_SQ_tree(); // hjlee 0928
  543.   
  544.   // hjlee 0901
  545.   for (color=0; color<mzte_codec.m_iColors; color++) 
  546.     /* close arithmetic coder */
  547.     probModelFreeSQ(color);
  548.   bit_stream_length=mzte_ac_encoder_done(&ace);
  549.   noteDetail("Completed encoding AC.");
  550. }
  551. /********************************************************
  552.   Function Name
  553.   -------------
  554.   static Void cachb_encode_SQ_tree()
  555.   Arguments
  556.   ---------
  557.   None.
  558.   Description
  559.   -----------
  560.   Encode AC information for single quant mode, tree-depth scan.
  561.   Functions Called
  562.   ----------------
  563.   encode_pixel_SQ_tree()
  564.   Return Value
  565.   ------------
  566.   None.
  567. ********************************************************/ 
  568. Void CVTCEncoder::cachb_encode_SQ_tree()
  569. {
  570.   Int h,w,dc_h,dc_w,dc_h2,dc_w2;
  571.   dc_h=mzte_codec.m_iDCHeight;
  572.   dc_w=mzte_codec.m_iDCWidth;
  573.   dc_h2=dc_h<<1;
  574.   dc_w2=dc_w<<1;
  575.   for(h=0;h<dc_h;h++)
  576.     for(w=0;w<dc_w;w++)  // 1124
  577.       for (color=0; color<mzte_codec.m_iColors; color++) 
  578.       {  
  579. SNR_IMAGE *snr_image;
  580. Int tw,sw,sh,n; // 1124
  581. snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image);
  582. height=mzte_codec.m_Image[color].height;
  583. width=mzte_codec.m_Image[color].width;
  584. setProbModelsSQ(color);  // hjlee 0901
  585. coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  586. /* LH */
  587. n = 0;
  588. for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
  589. {
  590.   sh = h << n;
  591.   sw = (w+dc_w) << n;
  592.   encodeSQBlocks(sh,sw,n);
  593.   n++;
  594. }
  595. /* HL */
  596. n = 0;
  597. for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
  598. {
  599.   sh = (h+dc_h) << n;
  600.   sw = w << n;
  601.   encodeSQBlocks(sh,sw,n);
  602.   n++;
  603. }
  604. /* HH */
  605. n = 0;
  606. for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
  607. {
  608.   sh = (h+dc_h) << n;
  609.   sw = (w+dc_w) << n;
  610.   encodeSQBlocks(sh,sw,n);
  611.   n++;
  612. }
  613. #if 0
  614. encode_pixel_SQ_tree(h,w);           /* LH */
  615. encode_pixel_SQ_tree(h+dc_h,w-dc_w); /* HL */
  616. encode_pixel_SQ_tree(h+dc_h,w);      /* HH */
  617. #endif
  618.       }
  619. }
  620. /********************************************************
  621.   Function Name
  622.   -------------
  623.   static Void encode_pixel_SQ_tree(Int h,Int w)
  624.   Arguments
  625.   ---------
  626.   Int h,Int w - position of a pixel in height and width
  627.   
  628.   Description
  629.   -----------
  630.   Encoding the type and/or value of a coefficient, a
  631.   recursive function.
  632.   Functions Called
  633.   ----------------
  634.   mag_sign_encode_SQ()
  635.   mzte_ac_encode_symbol()
  636.   encode_pixel_SQ_tree()
  637.   Return Value
  638.   ------------
  639.   None.
  640. ********************************************************/ 
  641. Void CVTCEncoder::encode_pixel_SQ(Int h,Int w)
  642. {
  643.   UChar zt_type;
  644.   Int l;
  645.   if(coeffinfo[h][w].type == ZTR_D)
  646.     return;
  647.   l=xy2wvtDecompLev(w,h);
  648.   /* code leave coefficients, value only, no type */
  649.   if(IS_STATE_LEAF(coeffinfo[h][w].state)){
  650.  
  651.       /* Map type to leaf code word ZTR->0, VZTR->1 */
  652.       zt_type = (coeffinfo[h][w].type!=ZTR);
  653.       mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LINIT],zt_type);
  654.       if (coeffinfo[h][w].type==VZTR)
  655. mag_sign_encode_SQ(h,w);
  656.     return;
  657.   }
  658.  
  659.   /* code zerotree symbol */
  660.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_INIT],
  661.   zt_type=coeffinfo[h][w].type);
  662.   /* code magnitude and sign */
  663.   /* For Arbitrary-Shape, out-node will always has zero coefficient,
  664.      so only IZ or ZTR may be the zt_type -- SL*/
  665.   switch(zt_type){
  666.     case IZ : 
  667.       break; /* will code the four children */
  668.     case VZTR:
  669.       mag_sign_encode_SQ(h,w);
  670.     case ZTR:
  671. mark_ZTR_D(h,w);  /* necessary, for bandwise scan */
  672.       break;
  673.     case VAL:
  674.       mag_sign_encode_SQ(h,w);
  675.       break;
  676.     default: 
  677.       errorHandler("invalid zerotree symbol in single quant encode");
  678.   }
  679. }
  680. #if 0
  681. Void CVTCEncoder::encode_pixel_SQ_tree(Int h0,Int w0)
  682. {
  683.   UChar zt_type;
  684.   Int h, w, k;
  685.   Int dcc[4]; /* Don't Code Children */
  686.   Int nSib; /* number siblings */
  687.   Int l;
  688.   l=xy2wvtDecompLev(w0,h0);
  689.   nSib = (h0<(mzte_codec.m_iDCHeight<<1) && w0<(mzte_codec.m_iDCWidth<<1)) ? 1 : 4;
  690.   /********************* CODE SIBLINGS *****************************/
  691.   for (k=0; k<nSib; ++k)
  692.   {
  693.     h = h0 + (k/2);
  694.     w = w0 + (k%2);
  695.     /* code leave coefficients, value only, no type */
  696.     if(IS_STATE_LEAF(coeffinfo[h][w].state))
  697.     {
  698. #ifdef _SHAPE_ /* skip out-node */
  699.       if(coeffinfo[h][w].mask == 1) 
  700.       {
  701. #endif
  702. /* Map type to leaf code word ZTR->0, VZTR->1 */
  703. zt_type = (coeffinfo[h][w].type!=ZTR);
  704. mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LINIT],zt_type);
  705. if (coeffinfo[h][w].type==VZTR)
  706.   mag_sign_encode_SQ(h,w);
  707. #ifdef _SHAPE_
  708.       }
  709. #endif
  710.       
  711.       continue;
  712.     }
  713.     
  714.     /* code zerotree symbol */
  715. #ifdef _SHAPE_ /* skip out-node */
  716.     if(coeffinfo[h][w].mask == 1) 
  717. #endif
  718.       mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_INIT],
  719.     zt_type=coeffinfo[h][w].type);
  720. #ifdef _SHAPE_
  721.     else
  722.       zt_type=coeffinfo[h][w].type;
  723. #endif
  724.     /* code magnitude and sign */
  725.     /* For Arbitrary-Shape, out-node will always has zero coefficient,
  726.        so only IZ or ZTR may be the zt_type -- SL*/
  727.     
  728.     switch(zt_type){
  729.       case IZ : 
  730. dcc[k]=0;
  731. break; /* will code the four children */
  732.       case VZTR:
  733. mag_sign_encode_SQ(h,w);
  734.       case ZTR:
  735. dcc[k]=1;
  736. #ifdef _SHAPE_
  737. if(coeffinfo[h][w].mask != 1) { /* TBE for four children of out-node */
  738.   dcc[k] = 0;
  739. }
  740. #endif
  741. break;
  742.       case VAL:
  743. dcc[k]=0;
  744. mag_sign_encode_SQ(h,w);
  745. break;
  746.       default: 
  747. errorHandler("invalid zerotree symbol in single quant encode");
  748.     }
  749.   }
  750.   /********************* CODE CHILDREN *****************************/
  751.   if (!IS_STATE_LEAF(coeffinfo[h0][w0].state) )
  752.   {
  753.     Int i, j;
  754.     for (k=0; k<nSib; ++k)
  755.     {
  756.       if (dcc[k]==0)
  757.       {
  758. h = h0 + (k/2);
  759. w = w0 + (k%2);  
  760. /* scan children */
  761. i=h<<1; j=w<<1;
  762. encode_pixel_SQ_tree(i,j);
  763.       }
  764.     }
  765.   }
  766. }
  767. #endif
  768.      
  769. /********************************************************
  770.   Function Name
  771.   -------------
  772.   static Void  mag_sign_encode_SQ(Int h,Int w)
  773.   Arguments
  774.   ---------
  775.   Int h,Int w - position of a pixel
  776.   Description
  777.   -----------
  778.   Encode the value of a coefficient.
  779.   Functions Called
  780.   ----------------
  781.   mzte_ac_encode_symbol()
  782.   Return Value
  783.   ------------
  784.   None.
  785. ********************************************************/ 
  786. Void CVTCEncoder::mag_sign_encode_SQ(Int h,Int w)
  787. {
  788.   Int val,v_sign;
  789.   Int l;
  790.   if((val=coeffinfo[h][w].quantized_value)>0)
  791.     v_sign=0;
  792.   else
  793.   {
  794.     val=-val;
  795.     v_sign=1;
  796.   }
  797.     
  798.   l=xy2wvtDecompLev(w,h);
  799.   bitplane_encode(val-1,l,WVTDECOMP_NUMBITPLANES(color,l));
  800.   mzte_ac_encode_symbol(&ace,acm_sign[l],v_sign);
  801. }
  802. /*********************************************************************/
  803. /******************************  AC  *********************************/
  804. /**************************  Multi quant  ****************************/
  805. /*********************************************************************/
  806. Void CVTCEncoder::bitplane_res_encode(Int val,Int l,Int max_bplane)
  807. {
  808.   register int i,k=0;
  809.   for(i=max_bplane-1;i>=0;i--,k++)
  810.     mzte_ac_encode_symbol(&ace,&acm_bpres[l][k],(val>>i)&1);
  811. }
  812. /*********************************************************************/
  813. /******************************  AC  *********************************/
  814. /**************************  Multi quant  ****************************/
  815. /*********************************************************************/
  816. /********************************************************
  817.   Function Name
  818.   -------------
  819.   Void wavelet_higher_bands_encode_MQ(Int scanDirection)
  820.   Arguments
  821.   ---------
  822.   Int scanDirection - 0 <=> tree, 1 <=> band
  823.   Description
  824.   -----------
  825.   Control program for encoding AC information for one 
  826.   color component. Multi quant mode.
  827.   Functions Called
  828.   ----------------
  829.   cachb_encode_MQ_band()
  830.   mzte_ac_encoder_init()
  831.   mzte_ac_model_init()
  832.   mzte_ac_model_done()
  833.   mzte_ac_encoder_done()
  834.   initContext_ * ()
  835.   freeContext_ * ()
  836.   Return Value
  837.   ------------
  838.   None.
  839. ********************************************************/ 
  840. Void CVTCEncoder::wavelet_higher_bands_encode_MQ(Int scanDirection)
  841. {
  842.   noteDetail("Encoding AC (wavelet_higher_bands_encode_MQ)....");
  843.   /* init arithmetic coder */
  844.   mzte_ac_encoder_init(&ace);
  845.   if (scanDirection==0)
  846.     cachb_encode_MQ_tree();
  847.   else
  848.     cachb_encode_MQ_band();
  849.   /* close arithmetic coder */
  850.   bit_stream_length=mzte_ac_encoder_done(&ace);
  851. }
  852. /********************************************************
  853.   Function Name
  854.   -------------
  855.   static Void mark_ZTR_D(Int h,Int w)
  856.   Arguments
  857.   ---------
  858.   Int h,Int w - position of a pixel
  859.   
  860.   Description
  861.   -----------
  862.   Mark the coefficient at (h,w) and its descendents as
  863.   zerotree descendents. 
  864.   Functions Called
  865.   ----------------
  866.   mark_ZTR_D()
  867.   Return Value
  868.   ------------
  869.   None.
  870. ********************************************************/ 
  871. Void CVTCEncoder::mark_ZTR_D(Int h,Int w)
  872. {
  873.   Int i,j;
  874.   i=h<<1; j=w<<1;
  875.   if(i<height && j<width){
  876.     coeffinfo[i][j].type     = ZTR_D;
  877.     coeffinfo[i+1][j].type   = ZTR_D; 
  878.     coeffinfo[i][j+1].type   = ZTR_D; 
  879.     coeffinfo[i+1][j+1].type = ZTR_D; 
  880.     mark_ZTR_D(i,j);
  881.     mark_ZTR_D(i+1,j);
  882.     mark_ZTR_D(i,j+1);
  883.     mark_ZTR_D(i+1,j+1);
  884.   }
  885. }
  886. /**********************************************************************/
  887. /***************       MQ BAND         ********************************/
  888. /**********************************************************************/
  889. /********************************************************
  890.   Function Name
  891.   -------------
  892.   static Void cachb_encode_MQ_band()
  893.   Arguments
  894.   ---------
  895.   None.
  896.   Description
  897.   -----------
  898.   Encode AC information for all color components for spatial level. 
  899.   Multiple quant, bandwise scan.
  900.   Functions Called
  901.   ----------------
  902.   clear_ZTR_D();
  903.   codeBlocks();
  904.   encode_pixel_MQ()
  905.   Return Value
  906.   ------------
  907.   None.
  908. ********************************************************/ 
  909. Void CVTCEncoder::cachb_encode_MQ_band()
  910. {
  911.   Int h,w;
  912.   Int ac_h,ac_w,ac_h2,ac_w2;
  913.   Int acH,acW,acH2,acW2;
  914.   Int layer, nCol;
  915.   Int n; /* layer index - for codeBlocks function */
  916.   Int k; /* block jump for the layer */
  917.      
  918.   /* clear the ZTR_D type from the previous pass */
  919.   for (color=0; color<NCOL; ++color)
  920.   {      
  921.     coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  922.     height=mzte_codec.m_SPlayer[color].height;
  923.     width=mzte_codec.m_SPlayer[color].width;
  924.     clear_ZTR_D(coeffinfo, width, height);
  925.   }
  926.   for (color=0; color<NCOL; ++color)
  927.     probModelInitMQ(color); // hjlee 0901
  928.   acH=mzte_codec.m_iDCHeight;
  929.   acW=mzte_codec.m_iDCWidth;
  930.   acH2=acH<<1;
  931.   acW2=acW<<1;
  932.   /* scan each coefficients in the spatial layer */
  933.   /* assume luma dimensions are >= chroma dimensions */
  934.   layer=0;
  935.   while(acH2<=mzte_codec.m_SPlayer[0].height 
  936. && acW2<=mzte_codec.m_SPlayer[0].width)
  937.   {
  938.     nCol = (layer==0) ? 1 : NCOL;
  939.     for (color=0; color < nCol; ++color)
  940.     {      
  941.       SNR_IMAGE *snr_image;
  942.       noteProgress("  Coding Layer %d, Color %d", layer - (color!=0), color);
  943.       ac_h2=acH2;
  944.       ac_w2=acW2;
  945.       ac_h=acH;
  946.       ac_w=acW;
  947.       if (color)
  948.       {
  949. ac_h2>>=1;
  950. ac_w2>>=1;
  951. ac_h>>=1;
  952. ac_w>>=1;
  953.       }
  954.     
  955.       snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image);
  956.       coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  957.       height=mzte_codec.m_SPlayer[color].height;
  958.       width=mzte_codec.m_SPlayer[color].width;
  959.       setProbModelsMQ(color);      
  960.   
  961.       /* Go through bands */
  962.       n = layer - (color>0);
  963.       k = 1<<n;
  964.       for(h=0;h<ac_h;h+=k)
  965. for(w=ac_w;w<ac_w2;w+=k)
  966. {
  967.   /* LH */
  968.   encodeMQBlocks(h,w,n);
  969.   
  970.   /* HL */
  971.   h += ac_h;
  972.   w -= ac_w;
  973.   encodeMQBlocks(h,w,n);
  974.   
  975.   /* HH */
  976.   w += ac_w;
  977.   encodeMQBlocks(h,w,n);
  978.   
  979.   /* Set h back to where it started. w is already there */
  980.   h -= ac_h;
  981. }
  982.     }
  983.     /* update ranges */
  984.     acH=acH2;
  985.     acW=acW2;
  986.     acW2<<=1;
  987.     acH2<<=1;
  988.     ++layer;
  989.   }
  990.   for (color=0; color<NCOL; ++color)
  991.     probModelFreeMQ(color);
  992. }
  993. /********************************************************
  994.   Function Name
  995.   -------------
  996.   static Void encode_pixel_MQ_band(Int h,Int w)
  997.   Arguments
  998.   ---------
  999.   Int h,Int w - position of a pixel in height and width
  1000.   
  1001.   Description
  1002.   -----------
  1003.   Encoding the type and/or value of a coefficient, a
  1004.   recursive function, multi quant mode.
  1005.   Functions Called
  1006.   ----------------
  1007.   mzte_ac_encode_symbol()
  1008.   mark_ZTR_D()
  1009.   mag_sign_encode_MQ()
  1010.  
  1011.   Return Value
  1012.   ------------
  1013.   None.
  1014. ********************************************************/ 
  1015. Void CVTCEncoder::encode_pixel_MQ(Int h,Int w)
  1016. {
  1017.   Int zt_type;
  1018.   /*~~~~~~~~~~~~~~~~~ zerotree descendent or skip  ~~~~~~~~~~~~~~~~~~~*/
  1019.   if(coeffinfo[h][w].type==ZTR_D)
  1020.     return;
  1021.   /*~~~~~~~~~~~~~~ encode zero tree symbol ~~~~~~~~~~~~~~~~~~*/
  1022.   if (IS_RESID(w,h,color))
  1023.   {
  1024.     zt_type = VAL;
  1025.   }
  1026.   else
  1027.   {
  1028.     Int czt_type; /* what to put on bitstream */
  1029.     Int l;
  1030.     l=xy2wvtDecompLev(w,h);  
  1031.     zt_type = coeffinfo[h][w].type;
  1032. #ifdef _SHAPE_
  1033.     if(coeffinfo[h][w].mask==1) /* skip out-node */  
  1034. #endif
  1035.       switch(coeffinfo[h][w].state)
  1036.       {
  1037. case S_INIT:
  1038.   czt_type=zt_type;
  1039.   mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_INIT],czt_type);
  1040.   break;
  1041. case S_ZTR:
  1042.   czt_type=zt_type;
  1043.   mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_ZTR],czt_type);
  1044.   break;
  1045. case S_ZTR_D:
  1046.   czt_type=zt_type;
  1047.   mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_ZTR_D],czt_type);
  1048.   break;
  1049. case S_IZ:
  1050.   czt_type = (zt_type!=IZ);
  1051.   mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_IZ],czt_type);
  1052.   break;
  1053. case S_LINIT: 
  1054.   czt_type = (zt_type!=ZTR);
  1055.   mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LINIT],czt_type);
  1056.   break;
  1057. case S_LZTR:
  1058.   czt_type = (zt_type!=ZTR);
  1059.   mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LZTR],czt_type);
  1060.   break;
  1061. case S_LZTR_D:
  1062.   czt_type = (zt_type!=ZTR);
  1063.   mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LZTR_D],czt_type);
  1064.   break;
  1065. default:
  1066.   errorHandler("Invalid state (%d) in multi-quant encoding.", 
  1067.        coeffinfo[h][w].state);
  1068.       }
  1069.   }
  1070.   /*~~~~~~~~~~~~~~~~ mark ztr_d and encode magnitudes ~~~~~~~~~~~~~~~~~*/
  1071.   switch(zt_type)
  1072.   {
  1073.     case ZTR:
  1074.     case ZTR_D:
  1075. #ifdef _SHAPE_
  1076.       if(coeffinfo[h][w].mask==1) /* mark ZTR-D for in-node root */
  1077. #endif
  1078. mark_ZTR_D(h,w);
  1079.     case IZ:
  1080.       return;
  1081.     case VZTR:
  1082.       mark_ZTR_D(h,w);
  1083.     case VAL:
  1084. #ifdef _SHAPE_
  1085.       if(coeffinfo[h][w].mask==1) /* only code for in-node*/
  1086. #endif
  1087. mag_sign_encode_MQ(h,w);
  1088.       break;
  1089.     default:
  1090.       errorHandler("Invalid type (%d) in multi-quant encoding.", zt_type);     
  1091.   }
  1092. }
  1093. /**********************************************************************/
  1094. /***************       MQ TREE         ********************************/
  1095. /**********************************************************************/
  1096. /********************************************************
  1097.   Function Name
  1098.   -------------
  1099.   static Void cachb_encode_MQ_tree()
  1100.   Arguments
  1101.   ---------
  1102.   None.
  1103.   Description
  1104.   -----------
  1105.   Encode AC information for all color components for spatial level. 
  1106.   Multiple quant, bandwise scan.
  1107.   Functions Called
  1108.   ----------------
  1109.   clear_ZTR_D();
  1110.   encode_pixel_MQ_tree()
  1111.   Return Value
  1112.   ------------
  1113.   None.
  1114. ********************************************************/ 
  1115. // hjlee 0901
  1116. Void CVTCEncoder::cachb_encode_MQ_tree()
  1117. {
  1118.   Int h,w, dc_h, dc_w;
  1119.   /* clear the ZTR_D type from the previous pass */
  1120.   for (color=0; color<NCOL; ++color)
  1121.   {      
  1122.     coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  1123.     height=mzte_codec.m_SPlayer[color].height;
  1124.     width=mzte_codec.m_SPlayer[color].width;
  1125.     clear_ZTR_D(coeffinfo, width, height);
  1126.   }
  1127.   for (color=0; color<NCOL; ++color)
  1128.     probModelInitMQ(color);
  1129.   /* ac_h, ac_w init */
  1130.   dc_h=mzte_codec.m_iDCHeight;
  1131.   dc_w=mzte_codec.m_iDCWidth;
  1132.   for (h=0; h<dc_h; ++h)
  1133.     for (w=0; w<dc_w; ++w)
  1134.     {
  1135.       for (color=0; color<NCOL; ++color)
  1136.       {      
  1137. SNR_IMAGE *snr_image;
  1138. Int tw,sw,sh,n; // 1124
  1139. snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image);
  1140. coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
  1141. height=mzte_codec.m_SPlayer[color].height;
  1142. width=mzte_codec.m_SPlayer[color].width;
  1143.       
  1144. setProbModelsMQ(color);
  1145. /* LH */
  1146. n = 0;
  1147. for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
  1148. {
  1149.   sh = h << n;
  1150.   sw = (w+dc_w) << n;
  1151.   encodeMQBlocks(sh,sw,n);
  1152.   n++;
  1153. }
  1154. /* HL */
  1155. n = 0;
  1156. for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
  1157. {
  1158.   sh = (h+dc_h) << n;
  1159.   sw = w << n;
  1160.   encodeMQBlocks(sh,sw,n);
  1161.   n++;
  1162. }
  1163. /* HH */
  1164. n = 0;
  1165. for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
  1166. {
  1167.   sh = (h+dc_h) << n;
  1168.   sw = (w+dc_w) << n;
  1169.   encodeMQBlocks(sh,sw,n);
  1170.   n++;
  1171. }
  1172. #if 0
  1173. encode_pixel_MQ_tree(h,w+dc_w);           /* LH */
  1174. encode_pixel_MQ_tree(h+dc_h,w);           /* HL */
  1175. encode_pixel_MQ_tree(h+dc_h,w+dc_w);      /* HH */
  1176. #endif
  1177.       }
  1178.     }
  1179.   for (color=0; color<NCOL; ++color)
  1180.     probModelFreeMQ(color);
  1181. }
  1182. #if 0
  1183. /********************************************************
  1184.   Function Name
  1185.   -------------
  1186.   static Void encode_pixel_MQ_tree(Int h,Int w)
  1187.   Arguments
  1188.   ---------
  1189.   Int h,Int w - position of a pixel in height and width
  1190.   
  1191.   Description
  1192.   -----------
  1193.   Encoding the type and/or value of a coefficient, a
  1194.   recursive function, multi quant mode.
  1195.   Functions Called
  1196.   ----------------
  1197.   mzte_ac_encode_symbol()
  1198.   mark_ZTR_D()
  1199.   mag_sign_encode_MQ()
  1200.  
  1201.   Return Value
  1202.   ------------
  1203.   None.
  1204. ********************************************************/ 
  1205. // hjlee 0901
  1206. Void CVTCEncoder::encode_pixel_MQ_tree(Int h0,Int w0)
  1207. {
  1208.   Int zt_type, h, w, k;
  1209.   Int dcc[4]; /* Don't Code Children */
  1210.   Int nSib; /* number siblings */
  1211.   nSib = (h0<(mzte_codec.m_iDCHeight<<1) && w0<(mzte_codec.m_iDCWidth<<1)) ? 1 : 4;
  1212.   /********************* CODE SIBLINGS *****************************/
  1213.   for (k=0; k<nSib; ++k)
  1214.   {
  1215.     h = h0 + (k/2);
  1216.     w = w0 + (k%2);
  1217.     /* encode zero tree symbol */  
  1218.     if (IS_RESID(w,h,color))
  1219.     {
  1220.       zt_type = VAL;
  1221.     }
  1222.     else
  1223.     {
  1224.       Int czt_type; /* what to put on bitstream */
  1225.       Int l;
  1226.       l=xy2wvtDecompLev(w,h);  
  1227.       zt_type = coeffinfo[h][w].type;
  1228. #ifdef _SHAPE_
  1229.       if(coeffinfo[h][w].mask==1) /* skip out-node */  
  1230. #endif      
  1231. switch(coeffinfo[h][w].state)
  1232. {
  1233.   case S_INIT:
  1234.     czt_type=zt_type;
  1235.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_INIT],czt_type);
  1236.     break;
  1237.   case S_ZTR:
  1238.     czt_type=zt_type;
  1239.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_ZTR],czt_type);
  1240.     break;
  1241.   case S_ZTR_D:
  1242.     czt_type=zt_type;
  1243.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_ZTR_D],czt_type);
  1244.     break;
  1245.   case S_IZ:
  1246.     czt_type = (zt_type!=IZ);
  1247.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_IZ],czt_type);
  1248.     break;
  1249.   case S_LINIT: 
  1250.     czt_type = (zt_type!=ZTR);
  1251.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LINIT],czt_type);
  1252.     break;
  1253.   case S_LZTR:
  1254.     czt_type = (zt_type!=ZTR);
  1255.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LZTR],czt_type);
  1256.     break;
  1257.   case S_LZTR_D:
  1258.     czt_type = (zt_type!=ZTR);
  1259.     mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LZTR_D],czt_type);
  1260.     break;
  1261.   default:
  1262.     errorHandler("Invalid state (%d) in multi-quant encoding.", 
  1263.  coeffinfo[h][w].state);
  1264. }
  1265.     }
  1266.     
  1267.     /* mark ztr_d and encode magnitudes */
  1268.     switch(zt_type)
  1269.     {
  1270.       case ZTR:
  1271. #ifdef _SHAPE_
  1272. if(coeffinfo[h][w].mask==1) {
  1273. #endif
  1274.   dcc[k]=1;
  1275.   mark_ZTR_D(h,w);
  1276. #ifdef _SHAPE_
  1277. }
  1278. else
  1279.   dcc[k]=0;
  1280. #endif
  1281. break;
  1282.       case IZ:
  1283. dcc[k]=0;
  1284. break;
  1285.       case VZTR:
  1286. dcc[k]=1;
  1287. mark_ZTR_D(h,w);
  1288. #ifdef _SHAPE_
  1289. if(coeffinfo[h][w].mask==1) /* only code for in-node */
  1290. #endif
  1291.   mag_sign_encode_MQ(h,w);
  1292. break;
  1293.       case VAL:
  1294. dcc[k]=0;
  1295. #ifdef _SHAPE_
  1296. if(coeffinfo[h][w].mask==1) /* only code for in-node*/
  1297. #endif
  1298.   mag_sign_encode_MQ(h,w);
  1299. break;
  1300.       default:
  1301. errorHandler("Invalid type in multi quant decoding.");     
  1302.     }
  1303.   }
  1304.   /********************* CODE CHILDREN *****************************/
  1305.   if (!IS_STATE_LEAF(coeffinfo[h0][w0].state))
  1306.   {
  1307.     Int i, j;
  1308.     for (k=0; k<nSib; ++k)
  1309.     {
  1310.       if (dcc[k]==0)
  1311.       {
  1312. h = h0 + (k/2);
  1313. w = w0 + (k%2);  
  1314. /* scan children */
  1315. i=h<<1; j=w<<1;
  1316. encode_pixel_MQ_tree(i,j);
  1317.       }
  1318.     }
  1319.   }
  1320. }
  1321. #endif
  1322. /********************************************************
  1323.   Function Name
  1324.   -------------
  1325.   static Void  mag_sign_encode_MQ(Int h,Int w)
  1326.   Arguments
  1327.   ---------
  1328.   Int h,Int w - position of a pixel
  1329.   Description
  1330.   -----------
  1331.   Encode the value of a coefficient.
  1332.   Functions Called
  1333.   ----------------
  1334.   mzte_ac_encode_symbol()
  1335.   Return Value
  1336.   ------------
  1337.   None.
  1338. ********************************************************/ 
  1339. Void CVTCEncoder::mag_sign_encode_MQ(Int h,Int w)
  1340. {
  1341.   Int val,v_sign;
  1342.   Int l;
  1343.   if(coeffinfo[h][w].skip)
  1344.     return;
  1345.     
  1346.   l=xy2wvtDecompLev(w,h);  
  1347.   if((val=coeffinfo[h][w].quantized_value)>=0)
  1348.     v_sign=0;
  1349.   else
  1350.   {
  1351.     val=-val;
  1352.     v_sign=1;
  1353.   }
  1354.   
  1355.   /* code magnitude */
  1356.   if (IS_RESID(w,h,color))
  1357.   {
  1358.     bitplane_res_encode(val,l,WVTDECOMP_RES_NUMBITPLANES(color));
  1359.   }
  1360.   else
  1361.   {
  1362.     bitplane_encode(val-1,l,WVTDECOMP_NUMBITPLANES(color,l));
  1363.     mzte_ac_encode_symbol(&ace,acm_sign[l],v_sign);
  1364.   }
  1365. }
  1366. /*************************************************************
  1367.   Function Name
  1368.   -------------
  1369.   Void encodeBlocks()
  1370.   Arguments
  1371.   ---------
  1372.   Int y, Int x  - Coordinate of upper left hand corner of block.
  1373.   Int n - Number of 4 blocks in a side of the total block. 0 means do only 
  1374.    pixel at (x,y).
  1375.   Void (*pixelFunc)(Int, Int) - Function to call for pixel locations.
  1376.   
  1377.   Description
  1378.   -----------
  1379.   Call function pixelFunc(y,x) for all pixels (x,y) in block in band scan
  1380.   manner.
  1381.   Functions Called
  1382.   ----------------
  1383.   encodeBlocks recursively.
  1384.   Return Value
  1385.   ------------
  1386.   None.
  1387. *************************************************************/
  1388. Void CVTCEncoder::encodeSQBlocks(Int y, Int x, Int n)
  1389. {
  1390.   /* Call the encoding function for the 4 block pixels */
  1391.   if (n == 0)
  1392.   {
  1393.     /* For checking scan-order : use 16x16 mono image
  1394.        for comparison with Figure 7-38 scan order table in 
  1395.        document.
  1396.     static Int i=4;
  1397.     noteStat("%d: y=%d, x=%dn",i++, y,x);
  1398.     */
  1399.     encode_pixel_SQ(y,x);
  1400.   }
  1401.   else
  1402.   {
  1403.     Int k;
  1404.     --n;
  1405.     k = 1<<n;
  1406.     encodeSQBlocks(y,x,n);
  1407.     x += k;
  1408.     encodeSQBlocks(y,x,n);
  1409.     x -= k;
  1410.     y += k;
  1411.     encodeSQBlocks(y,x,n);
  1412.     x += k;
  1413.     encodeSQBlocks(y,x,n);
  1414.   }
  1415. }
  1416. /*************************************************************
  1417.   Function Name
  1418.   -------------
  1419.   Void encodeBlocks()
  1420.   Arguments
  1421.   ---------
  1422.   Int y, Int x  - Coordinate of upper left hand corner of block.
  1423.   Int n - Number of 4 blocks in a side of the total block. 0 means do only 
  1424.    pixel at (x,y).
  1425.   Void (*pixelFunc)(Int, Int) - Function to call for pixel locations.
  1426.   
  1427.   Description
  1428.   -----------
  1429.   Call function pixelFunc(y,x) for all pixels (x,y) in block in band scan
  1430.   manner.
  1431.   Functions Called
  1432.   ----------------
  1433.   encodeBlocks recursively.
  1434.   Return Value
  1435.   ------------
  1436.   None.
  1437. *************************************************************/
  1438. Void CVTCEncoder::encodeMQBlocks(Int y, Int x, Int n)
  1439. {
  1440.   /* Call the encoding function for the 4 block pixels */
  1441.   if (n == 0)
  1442.   {
  1443.     /* For checking scan-order : use 16x16 mono image
  1444.        for comparison with Figure 7-38 scan order table in 
  1445.        document.
  1446.     static Int i=4;
  1447.     noteStat("%d: y=%d, x=%dn",i++, y,x);
  1448.     */
  1449.     encode_pixel_MQ(y,x);
  1450.   }
  1451.   else
  1452.   {
  1453.     Int k;
  1454.     --n;
  1455.     k = 1<<n;
  1456.     encodeMQBlocks(y,x,n);
  1457.     x += k;
  1458.     encodeMQBlocks(y,x,n);
  1459.     x -= k;
  1460.     y += k;
  1461.     encodeMQBlocks(y,x,n);
  1462.     x += k;
  1463.     encodeMQBlocks(y,x,n);
  1464.   }
  1465. }