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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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