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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /****************************************************************************/
  2. /*   MPEG4 Visual Texture Coding (VTC) Mode Software                        */
  3. /*                                                                          */
  4. /*   This software was jointly developed by the following participants:     */
  5. /*                                                                          */
  6. /*   Single-quant,  multi-quant and flow control                            */
  7. /*   are provided by  Sarnoff Corporation                                   */
  8. /*     Iraj Sodagar   (iraj@sarnoff.com)                                    */
  9. /*     Hung-Ju Lee    (hjlee@sarnoff.com)                                   */
  10. /*     Paul Hatrack   (hatrack@sarnoff.com)                                 */
  11. /*     Shipeng Li     (shipeng@sarnoff.com)                                 */
  12. /*     Bing-Bing Chai (bchai@sarnoff.com)                                   */
  13. /*     B.S. Srinivas  (bsrinivas@sarnoff.com)                               */
  14. /*                                                                          */
  15. /*   Bi-level is provided by Texas Instruments                              */
  16. /*     Jie Liang      (liang@ti.com)                                        */
  17. /*                                                                          */
  18. /*   Shape Coding is provided by  OKI Electric Industry Co., Ltd.           */
  19. /*     Zhixiong Wu    (sgo@hlabs.oki.co.jp)                                 */
  20. /*     Yoshihiro Ueda (yueda@hlabs.oki.co.jp)                               */
  21. /*     Toshifumi Kanamaru (kanamaru@hlabs.oki.co.jp)                        */
  22. /*                                                                          */
  23. /*   OKI, Sharp, Sarnoff, TI and Microsoft contributed to bitstream         */
  24. /*   exchange and bug fixing.                                               */
  25. /*                                                                          */
  26. /*                                                                          */
  27. /* In the course of development of the MPEG-4 standard, this software       */
  28. /* module is an implementation of a part of one or more MPEG-4 tools as     */
  29. /* specified by the MPEG-4 standard.                                        */
  30. /*                                                                          */
  31. /* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use     */
  32. /* of the MPEG-4 standard free license to use this  software module or      */
  33. /* modifications thereof for hardware or software products claiming         */
  34. /* conformance to the MPEG-4 standard.                                      */
  35. /*                                                                          */
  36. /* Those intending to use this software module in hardware or software      */
  37. /* products are advised that use may infringe existing  patents. The        */
  38. /* original developers of this software module and their companies, the     */
  39. /* subsequent editors and their companies, and ISO/IEC have no liability    */
  40. /* and ISO/IEC have no liability for use of this software module or         */
  41. /* modification thereof in an implementation.                               */
  42. /*                                                                          */
  43. /* Permission is granted to MPEG members to use, copy, modify,              */
  44. /* and distribute the software modules ( or portions thereof )              */
  45. /* for standardization activity within ISO/IEC JTC1/SC29/WG11.              */
  46. /*                                                                          */
  47. /* Copyright 1995, 1996, 1997, 1998 ISO/IEC                                 */
  48. /****************************************************************************/
  49. /****************************************************************************/
  50. /*     Texas Instruments Predictive Embedded Zerotree (PEZW) Image Codec    */
  51. /*    Developed by Jie Liang (liang@ti.com)                                */
  52. /*                         */ 
  53. /*     Copyright 1996, 1997, 1998 Texas Instruments                    */
  54. /****************************************************************************/
  55. /****************************************************************************
  56.    File name:         PEZW_utils.c
  57.    Author:            Jie Liang  (liang@ti.com)
  58.    Functions:         utility functions for PEZW coder such as bitstream 
  59.                       parsing and formating.
  60.    Revisions:         v1.0 (10/04/98)
  61. *****************************************************************************/
  62. #include <stdio.h>
  63. #include <stdlib.h>
  64. #include <math.h>
  65. #include <memory.h>
  66. #include "globals.hpp"
  67. #include "msg.hpp"
  68. #include "bitpack.hpp"
  69. #include "startcode.hpp"
  70. #include "wvtPEZW.hpp"
  71. #include "PEZW_zerotree.hpp"
  72. #include "PEZW_mpeg4.hpp"
  73. extern int PEZW_target_spatial_levels;
  74. #define    MAXSNRLAYERS  20
  75. /* this funciton is to create and initiate the data structure
  76.    used for bilevel image coding */
  77. PEZW_SPATIAL_LAYER * CVTCCommon::Init_PEZWdata (int color, int levels, int w, int h)
  78. {
  79.   PEZW_SPATIAL_LAYER *SPlayer;
  80.   int x,y;
  81.   int i;
  82.   /* generate the Spatial Layer Structure */
  83.   SPlayer = (PEZW_SPATIAL_LAYER *)calloc (levels, sizeof(PEZW_SPATIAL_LAYER));
  84.   for (i=0; i<levels; i++)
  85.      SPlayer[i].SNRlayer = (PEZW_SNR_LAYER *)calloc(MAXSNRLAYERS, sizeof(PEZW_SNR_LAYER));
  86.      
  87.   mzte_codec.m_iScanOrder = mzte_codec.m_iScanDirection;
  88.   /* the original wavelet coefficients are in 
  89.      SPlayer[0].SNRlayer[0].snr_image   */
  90.   SPlayer[0].SNRlayer[0].snr_image.height = h;
  91.   SPlayer[0].SNRlayer[0].snr_image.width = w;
  92.   if ((SPlayer[0].SNRlayer[0].snr_image.data = calloc(h*w, sizeof(WINT)))
  93.       == NULL){
  94.     printf ("Can not allocate memory in Init_PEZWdata()");
  95.     exit(-1);
  96.   }
  97.   /* copy the wavelet coefficients into SPlayer structure */
  98.   for (y=0;y<h;y++)
  99.     for (x=0;x<w;x++)
  100.       ((WINT *)(SPlayer[0].SNRlayer[0].snr_image.data))[y*w+x] = (WINT) 
  101.   (mzte_codec.m_SPlayer[color].coeffinfo[y][x].wvt_coeff);
  102.   return (SPlayer);  
  103. }
  104. /* put the restored wavelet coefficients back to the data structure */
  105. void CVTCCommon::restore_PEZWdata (PEZW_SPATIAL_LAYER **SPlayer)
  106. {
  107.   int x,y;
  108.   int col;
  109.   int h,w;
  110.   int dch, dcw;
  111.   int levels;
  112.   for(col=0;col<mzte_codec.m_iColors;col++){
  113.     h = SPlayer[col][0].SNRlayer[0].snr_image.height;
  114.     w = SPlayer[col][0].SNRlayer[0].snr_image.width;    
  115.     
  116.     if(col==0)
  117.       levels=mzte_codec.m_iWvtDecmpLev;
  118.     else
  119.       levels=mzte_codec.m_iWvtDecmpLev-1;
  120.     dch = h/(1<<levels);
  121.     dcw = w/(1<<levels);
  122.     /* copy the wavelet coefficients into data structure */
  123.     for (y=0;y<h;y++)
  124.       for (x=0;x<w;x++){
  125. if((x>=dcw) || (y>=dch))
  126.   mzte_codec.m_SPlayer[col].coeffinfo[y][x].rec_coeff = 
  127.     ((WINT *)(SPlayer[col][0].SNRlayer[0].snr_image.data))[y*w+x]; 
  128.       }
  129.   }
  130.   return;
  131. }
  132. /* this function pack the bitstream and write to file */
  133. void CVTCEncoder::PEZW_bitpack (PEZW_SPATIAL_LAYER **SPlayer)
  134. {
  135.   int levels = mzte_codec.m_iWvtDecmpLev;
  136.   int levels_UV;
  137.   int Quant[NCOLOR], q;
  138.   int texture_spatial_layer_id;
  139.   int lev;
  140.   int col;
  141.   int snr_scalability_levels=0;
  142.   int snr_lev;
  143.   int all_zero=0, all_non_zero=0;
  144.   int LH_zero=0, HL_zero=0, HH_zero=0;
  145.   int i,n;
  146.   unsigned char *data;
  147.   long len;
  148.   int spalev;
  149.   int snroffset;
  150.   int flag;
  151.   int Bit, bits_to_go;
  152.   levels_UV = levels-1;  /* this should depend on the color format 
  153.                 mzte_codec.color_format */
  154.   /* get quantization information */
  155.   for (col=0;col<mzte_codec.m_iColors; col++)
  156.     Quant[col] = mzte_codec.m_Qinfo[col]->Quant[0];
  157.   
  158.   /* output quant for each color component */
  159.   emit_bits_checksc_init();
  160.   for (col=0;col<mzte_codec.m_iColors; col++){
  161.       q = Quant[col];
  162.       flag=0;
  163.       for(i=3;i>=0;i--)
  164. {
  165.   q = Quant[col] & (0x7F << (i*7));
  166.   q >>= 7*i;
  167.   if (q>0) flag = 1;
  168.   if (flag){
  169.     if (i>0) 
  170.       emit_bits_checksc(128+q,8);
  171.     else
  172.       emit_bits_checksc(q,8);
  173.   }
  174. }
  175.   }
  176.   /* figure out snr scalability levels */
  177.   snr_scalability_levels = 0;
  178.   for(lev=0;lev<mzte_codec.m_iWvtDecmpLev;lev++){
  179.       if(snr_scalability_levels < SPlayer[0][lev].SNR_scalability_levels)
  180.         snr_scalability_levels = SPlayer[0][lev].SNR_scalability_levels;
  181.       if (lev>0){
  182.         for (col=1;col<mzte_codec.m_iColors; col++){
  183.             if (snr_scalability_levels < SPlayer[col][lev-1].SNR_scalability_levels)
  184.             snr_scalability_levels = SPlayer[col][lev-1].SNR_scalability_levels;
  185.         }
  186.       }
  187.     }
  188.   emit_bits_checksc (snr_scalability_levels,5);
  189.   /* for bileve mode, start code is always enabled */
  190.   if (!mzte_codec.m_bStartCodeEnable)
  191.       {
  192.         fprintf(stdout,"nFor bilevel mode, SNR_start_code must be enabled!n");
  193.         exit(-1);
  194.       }
  195.   /* formatting the AC band bitstream */
  196.   if(mzte_codec.m_iScanOrder==1){
  197.     for (lev=0;lev<levels;lev++){   /* spatial scalability level */
  198.       /*------- AC: Write header info to bitstream file -------*/
  199.  if (mzte_codec.m_bStartCodeEnable)
  200. {
  201.         flush_bits();
  202.             emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE >> 16, 16);
  203.             emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE, 16);
  204.             texture_spatial_layer_id = lev;
  205.             emit_bits(texture_spatial_layer_id, 5);
  206.      
  207.     for (snr_lev=0;snr_lev<snr_scalability_levels;snr_lev++){
  208.     /* output the SNR_START_CODE if enabled */
  209.     if (mzte_codec.m_bStartCodeEnable)
  210.     {
  211.         flush_bits();
  212.         emit_bits(texture_snr_layer_start_code >> 16, 16);
  213.         emit_bits(texture_snr_layer_start_code, 16);
  214.         emit_bits(snr_lev,5);
  215.     emit_bits_checksc_init();
  216.     }
  217.     for (col=0;col<mzte_codec.m_iColors; col++){ /* for each color compoent */
  218.   
  219.         if(col>0)  
  220.             spalev = lev-1;
  221.         else    
  222.             spalev = lev;
  223.   
  224.         if((lev==0)&&(col>0))
  225.         snroffset = snr_scalability_levels-SPlayer[col][lev].SNR_scalability_levels;
  226.         else
  227.         snroffset = snr_scalability_levels-SPlayer[col][spalev].SNR_scalability_levels;
  228.         /* output SNR_ALL_ZERO flag */
  229.             if (snr_lev < snroffset){
  230.                 all_non_zero=0;
  231.             all_zero = 1;
  232.             }
  233.             else{
  234.                 all_non_zero=1;
  235.             all_zero = 0;
  236.             }
  237.             /* send all zero and subband skipping info */
  238.             if(lev==0){
  239.         emit_bits_checksc (all_non_zero,1); 
  240.                 if(!all_non_zero){
  241.                     emit_bits_checksc (all_zero,1); 
  242.                     if(!all_zero){
  243.                         emit_bits_checksc (LH_zero,1); 
  244.                         emit_bits_checksc (HL_zero,1); 
  245.                         emit_bits_checksc (HH_zero,1); 
  246.                     }
  247.                 }
  248.             }
  249.         if((lev==0)&&(col>0))
  250.       continue;
  251.   
  252.         /* send the bitstream for this snr layer if not all_zero */
  253.         if (!all_zero){
  254.             data = (unsigned char *)SPlayer[col][spalev].SNRlayer[snr_lev-snroffset].snr_bitstream.data;
  255.             len = SPlayer[col][spalev].SNRlayer[snr_lev-snroffset].snr_bitstream.length;
  256.             bits_to_go = SPlayer[col][spalev].SNRlayer[snr_lev-snroffset].bits_to_go;
  257.     
  258.             /* output the bitstream */
  259.         /* the first bit of each bitplane is always 1
  260.                    to avoid start code emulation */
  261.         emit_bits_checksc(1,1);
  262.             for (n=0;n<len-1;n++){
  263.                 emit_bits_checksc (data[n],8);
  264.                 if (DEBUG_BS_DETAIL)
  265.                 fprintf(stdout,"%d ", data[n]);
  266.             }
  267.                 /* output bits in the last byte.
  268.                    if bits_to_go ==8, we output the whole byte.
  269.                    otherwise, we output only the bits that needed to be transmited. */
  270.         if(bits_to_go==8)
  271.         emit_bits_checksc (data[len-1],8);
  272.             else
  273.         emit_bits_checksc (data[len-1]>>bits_to_go,8-bits_to_go);
  274.   
  275.         /* if last bit is 1, output 1, otherwise, skip. */
  276.         if(bits_to_go==8)
  277.         bits_to_go = 0;
  278.         Bit = (data[len-1]>>bits_to_go)&0x01;
  279.         if(!Bit)
  280.         emit_bits_checksc(1,1);
  281.             if(DEBUG_BS)
  282.                 fprintf(stdout, "color %d spa_lev %d snr_lev %d: %ldn",
  283.                 col, spalev, snr_lev-snroffset, len);
  284.     
  285.         } /* end of !all_zero */
  286.       } /* end of color plane */      
  287.       } /* end of snr_scalability */
  288.     }  /* end of spatial scalability */
  289.   }
  290.   else  /* scan_order == 0 */
  291.   {    
  292.     /* package the bitstream */
  293.     for (snr_lev=0;snr_lev<snr_scalability_levels;snr_lev++)
  294.       {
  295.     /* output the SNR_START_CODE if enabled */
  296.     if (mzte_codec.m_bStartCodeEnable)
  297.     {
  298.         flush_bits();
  299.         emit_bits(texture_snr_layer_start_code >> 16, 16);
  300.         emit_bits(texture_snr_layer_start_code, 16);
  301.         emit_bits(snr_lev,5);
  302.     }
  303.     /* output the spatial levels */
  304.     for (lev=0;lev<levels;lev++){   /* spatial scalability level */
  305.     if (mzte_codec.m_bStartCodeEnable)
  306.         {
  307.             flush_bits();
  308.             emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE >> 16, 16);
  309.             emit_bits(TEXTURE_SPATIAL_LAYER_START_CODE, 16);
  310.             texture_spatial_layer_id = lev;
  311.             emit_bits(texture_spatial_layer_id, 5);
  312.       
  313.             emit_bits_checksc_init(); 
  314.         }
  315.         /* for each color compoent */
  316.         for (col=0;col<mzte_codec.m_iColors; col++){
  317.             if(col>0)  
  318.                 spalev = lev-1;
  319.              else
  320.                 spalev = lev;
  321.     
  322.         if((lev==0)&&(col>0))
  323.             snroffset = snr_scalability_levels-SPlayer[col][lev].SNR_scalability_levels;
  324.         else
  325.             snroffset = snr_scalability_levels-SPlayer[col][spalev].SNR_scalability_levels;
  326.     
  327.         /* output SNR_ALL_ZERO flag */
  328.             if (snr_lev < snroffset){
  329.                 all_non_zero=0;
  330.             all_zero = 1;
  331.             }
  332.             else{
  333.                 all_non_zero=1;
  334.             all_zero = 0;
  335.             }
  336.             /* send all zero and subband skipping info */
  337.             if(lev==0){
  338.          emit_bits_checksc (all_non_zero,1); 
  339.                  if(!all_non_zero){
  340.                     emit_bits_checksc (all_zero,1); 
  341.                     if(!all_zero){
  342.                         emit_bits_checksc (LH_zero,1); 
  343.                         emit_bits_checksc (HL_zero,1); 
  344.                         emit_bits_checksc (HH_zero,1); 
  345.                     }
  346.                 }
  347.             }
  348.     if((lev==0)&&(col>0))
  349.     continue;
  350.     
  351.         /* send the bitstream for this snr layer if not all_zero */
  352.         if (!all_zero){
  353.             data = (unsigned char *)SPlayer[col][spalev].SNRlayer[snr_lev-snroffset].snr_bitstream.data;
  354.             len = SPlayer[col][spalev].SNRlayer[snr_lev-snroffset].snr_bitstream.length;
  355.             bits_to_go = SPlayer[col][spalev].SNRlayer[snr_lev-snroffset].bits_to_go;
  356.             /* output the bitstream */
  357.         /* the first bit is 1 */
  358.             emit_bits_checksc(1,1);
  359.         /* output bitstream until second to last byte */
  360.             for (n=0;n<len-1;n++){
  361.         emit_bits_checksc (data[n],8);
  362.         if (DEBUG_BS_DETAIL)
  363.          fprintf(stdout,"%d ", data[n]);
  364.             }
  365.         if(bits_to_go==8)
  366.     emit_bits_checksc (data[len-1],8);
  367.             else
  368.     emit_bits_checksc (data[len-1]>>bits_to_go,8-bits_to_go);
  369.         /* if last bit is 1, output 1 */
  370.         if(bits_to_go==8)
  371.         bits_to_go = 0;
  372.         Bit = (data[len-1]>>bits_to_go)&0x01;
  373.             if(!Bit)
  374.     emit_bits_checksc(1,1);
  375.             if(DEBUG_BS)
  376.             fprintf(stdout, "color %d spa_lev %d snr_lev %d: %ldn",
  377.             col, spalev, snr_lev-snroffset, len);
  378.       
  379.     } /* end of !all_zero */
  380.   } /* end of color plane */     
  381. } /* end of spatial level */
  382.    }
  383.   }  /* end of else scan_order */
  384. }
  385. /* unpacke the bitstream into Spatial and SNR layer bitstreams 
  386.    SPlayer data structure will be created here  */
  387. void CVTCDecoder::PEZW_bit_unpack (PEZW_SPATIAL_LAYER **SPlayer)
  388. {
  389.    int splev, snrlev;
  390.    int spatial_id, snr_id;
  391.    int color;
  392.    int Quant[3]={0,0,0}, q;
  393.    int snr_scalability_levels;
  394.    int texture_spatial_layer_start_code;
  395.    int snr_layer_start_code;
  396.    unsigned char buffer[MAXSIZE];
  397.    long len;
  398.    int h,w;
  399.    int n;
  400.    int Snrlevels;
  401. //   int i, j;
  402.    /* initialize data structure */
  403.    h=mzte_codec.m_iHeight;
  404.    w=mzte_codec.m_iWidth;
  405.    for (color=0;color<mzte_codec.m_iColors;color++)
  406.      SPlayer[color] = (PEZW_SPATIAL_LAYER *)calloc (mzte_codec.m_iWvtDecmpLev,
  407.     sizeof(PEZW_SPATIAL_LAYER));
  408.    
  409.      
  410.    /* get the quantization step sizes */
  411.    get_X_bits_checksc_init();
  412.    for (color=0;color<mzte_codec.m_iColors;color++){
  413.    do {
  414.      q = get_X_bits_checksc(8);
  415.      Quant[color] <<= 7;
  416.      Quant[color] += q%128;
  417.    } while (q>=128);
  418. }
  419.    /* get the snr scalability levels 
  420.     this is the maximum level for all three color components,
  421.     it will be adjusted later on according to all_zero flag */
  422.    snr_scalability_levels = get_X_bits(5);
  423.    
  424.      
  425.    /* get the snr layer */
  426.    if (mzte_codec.m_bStartCodeEnable)
  427.  Snrlevels=snr_scalability_levels;
  428.    else
  429.  Snrlevels=1;
  430.        
  431.    for (color=0;color<mzte_codec.m_iColors;color++){
  432.  /* allocate SNR data structure */
  433.  for (splev=0;splev<mzte_codec.m_iWvtDecmpLev;splev++)
  434.    {
  435.      SPlayer[color][splev].SNR_scalability_levels = snr_scalability_levels;
  436.      
  437.      SPlayer[color][splev].SNRlayer = (PEZW_SNR_LAYER *)
  438.        calloc(snr_scalability_levels, sizeof(PEZW_SNR_LAYER));
  439.      SPlayer[color][splev].SNRlayer[0].Quant = Quant[color];
  440.      
  441.      if (color==0){
  442.        SPlayer[color][0].SNRlayer[0].snr_image.height = h;
  443.        SPlayer[color][0].SNRlayer[0].snr_image.width =  w;
  444.      }
  445.      else{
  446.        SPlayer[color][0].SNRlayer[0].snr_image.height = h/2;
  447.        SPlayer[color][0].SNRlayer[0].snr_image.width =  w/2;
  448.      }
  449.    }
  450.   } /* end of color */
  451.   /* for bileve mode, start code is always enabled */
  452.   if (!mzte_codec.m_bStartCodeEnable)
  453.       {
  454.         fprintf(stdout,"nFor bilevel mode, SNR_start_code must be enabled!n");
  455.         exit(-1);
  456.       }
  457.         
  458.   /* parse the bitstream */
  459.   if (mzte_codec.m_bStartCodeEnable){
  460.  /* align byte. Note the difference between
  461.       align_byte and align_byte1. */
  462.  align_byte();
  463.     if(mzte_codec.m_iScanOrder==1){
  464.      for (splev=0;splev<mzte_codec.m_iWvtDecmpLev;splev++)
  465.        {
  466.      /* check start code */
  467.     if (mzte_codec.m_bStartCodeEnable){
  468.      align_byte1();
  469.      texture_spatial_layer_start_code = get_X_bits(32);
  470.      if (texture_spatial_layer_start_code != 
  471.     TEXTURE_SPATIAL_LAYER_START_CODE)
  472.         printf("Wrong texture_spatial_layer_start_code.");
  473.      spatial_id = get_X_bits(5);
  474.       for (snrlev=0;snrlev<Snrlevels;snrlev++)
  475.     {
  476.     if (mzte_codec.m_bStartCodeEnable)
  477.      {
  478.        align_byte1();
  479.        snr_layer_start_code = get_X_bits(32);
  480.        if (snr_layer_start_code != texture_snr_layer_start_code)
  481.         printf("Wrong texture_snr_layer_start_code.");
  482.        snr_id = get_X_bits(5);
  483.    get_X_bits_checksc_init();
  484.      }
  485.    
  486.     len=0;
  487.       
  488.    /* first put all the data in SPlayer[0] */
  489.    /* the separation of the color components bitstreams will
  490.       be done by the decoding process */
  491.    
  492.    if ((splev==mzte_codec.m_iWvtDecmpLev-1)&&
  493.        (snrlev == Snrlevels-1))
  494.      len=get_allbits_checksc(buffer);
  495.    
  496.    else{
  497.      if ((!mzte_codec.m_bStartCodeEnable) /* only one bitstream */
  498.  || (snrlev==Snrlevels-1))
  499.        {
  500.  /* look for the next spatial layer start code */
  501.  while(1){
  502.    /* chekc for the next start code*/
  503.    if(!Is_startcode(TEXTURE_SPATIAL_LAYER_START_CODE)){
  504.      buffer[len] = get_X_bits_checksc(8);
  505.      len++;
  506.    }
  507.    else{
  508.      buffer[len++]=align_byte_checksc();
  509.      break; /* start code found */
  510.    }
  511.  } /* end of while */
  512.        }
  513.      else{
  514.        while(1){
  515.  /* chekc for the next start code*/
  516.  if(!Is_startcode(texture_snr_layer_start_code)){
  517.    buffer[len] = get_X_bits_checksc(8);
  518.    len++;
  519.  }
  520.  else{
  521.    buffer[len++]=align_byte_checksc();
  522.    break; /* start code found */
  523.  }
  524.        } /* end of while(1) */
  525.      } /* end of if(!mzte_...) */
  526.    } /* end of if(splev== ...) */
  527.    
  528.    SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.length = len;
  529.    SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data =
  530.      (char *)calloc(len+2,sizeof(char));
  531.    
  532.    memcpy(SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data,
  533.   buffer,len);
  534.    
  535.    if(DEBUG_BS_DETAIL)
  536.      for(n=0;n<len;n++)
  537.        fprintf(stdout,"%d ", 
  538.        ((unsigned char *)SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data)[n]);
  539.    
  540.    if (DEBUG_BS)
  541.      fprintf(stdout,"spa_lev %d snr_lev %d: %ldn", splev, snrlev, len);
  542.    
  543.     }  /* snr levels */       
  544.      }  /* spatial levels */
  545.    }
  546.    else /* scan_order == 0 */
  547.      { 
  548.        for (snrlev=0;snrlev<Snrlevels;snrlev++) 
  549.     {
  550.      /* check start code */      
  551.     if (mzte_codec.m_bStartCodeEnable){
  552.     align_byte1();
  553.     snr_layer_start_code = get_X_bits(32);
  554.     if (snr_layer_start_code != texture_snr_layer_start_code)
  555.  printf("Wrong texture_snr_layer_start_code.");
  556.     snr_id = get_X_bits(5);
  557. }
  558.    
  559.    for (splev=0;splev<mzte_codec.m_iWvtDecmpLev;splev++)
  560.      {
  561.        if (mzte_codec.m_bStartCodeEnable)
  562.     {
  563.      align_byte1();
  564.      texture_spatial_layer_start_code = get_X_bits(32);
  565.      if (texture_spatial_layer_start_code != 
  566.        TEXTURE_SPATIAL_LAYER_START_CODE)
  567.         printf("Wrong texture_spatial_layer_start_code.");
  568.      spatial_id = get_X_bits(5);
  569.      get_X_bits_checksc_init();
  570.     }
  571.         len=0;
  572.        
  573.        /* first put all the data in SPlayer[0] */
  574.        /* the separation of the color components bitstreams will
  575.       be done by the decoding process */
  576.        
  577.        if ((splev==mzte_codec.m_iWvtDecmpLev-1)&&
  578.         (snrlev == Snrlevels-1))
  579.             len=get_allbits_checksc(buffer);
  580.        else{
  581.         if ((!mzte_codec.m_bStartCodeEnable) /* only one bitstream */
  582.             || (splev==mzte_codec.m_iWvtDecmpLev-1))
  583.         {
  584.              /* look for the next spatial layer start code */
  585.              while(1){
  586.                 /* chekc for the next start code*/
  587.                 if(!Is_startcode(texture_snr_layer_start_code)){
  588.                 buffer[len] = get_X_bits_checksc(8);
  589.                 len++;
  590.                 }
  591.                 else{
  592.                 buffer[len++]=align_byte_checksc();
  593.                 break; /* start code found */
  594.                 }
  595.             } /* end of while */
  596.         }
  597.         else{
  598.             while(1){
  599.                 /* chekc for the next start code*/
  600.                 if(!Is_startcode(TEXTURE_SPATIAL_LAYER_START_CODE)){
  601.                     buffer[len] = get_X_bits_checksc(8);
  602.                     len++;
  603.                 }
  604.                 else{
  605.                     buffer[len++]=align_byte_checksc();
  606.                     break; /* start code found */
  607.                 }
  608.             } /* end of while(1) */
  609.         } /* end of if(!mzte_...) */
  610.        } /* end of if(splev== ...) */
  611.        
  612.        SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.length = len;
  613.        
  614.        SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data =
  615.         (char *)calloc(len+2,sizeof(char));
  616.        
  617.        memcpy(SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data,
  618.       buffer,len);
  619.        
  620.        if(DEBUG_BS_DETAIL)
  621.         for(n=0;n<len;n++)
  622.             fprintf(stdout,"%d ", 
  623.              ((unsigned char *)SPlayer[0][splev].SNRlayer[snrlev].snr_bitstream.data)[n]);
  624.        
  625.        if (DEBUG_BS)
  626.         fprintf(stdout,"spa_lev %d snr_lev %d: %ldn", splev, snrlev, len);
  627.      }  /* spatial levels */       
  628.  }  /* snr levels */
  629.     } /* end of else scan_order */
  630.    }
  631.    else { /* no start code enabled */
  632.         fprintf(stdout,"nFor bilevel mode, SNR_start_code must be enabled!n");
  633.         exit(-1);
  634. }
  635.     for(color=0;color<mzte_codec.m_iColors;color++) {
  636.        h = SPlayer[color][0].SNRlayer[0].snr_image.height;
  637.        w = SPlayer[color][0].SNRlayer[0].snr_image.width;    
  638.        
  639.        if ((SPlayer[color][0].SNRlayer[0].snr_image.data = calloc(h*w, sizeof(WINT)))
  640.       == NULL){
  641.         printf ("Can not allocate memory in Init_PEZWdata()");
  642.         exit(-1);
  643.         }
  644.     }
  645. }
  646. /* left shift a stream by N<8 bits */
  647. int CVTCCommon::lshift_by_NBit (unsigned char *data, int len, int N)
  648. {
  649.   int n;
  650.   char mask=0;
  651.   int output;
  652.   
  653.   if(len==0)
  654.     return 1;
  655.   
  656.   output = data[0]>>(8-N);
  657.   
  658.   for(n=0;n<N;n++)
  659.     mask = (mask<<1) | 0x01;
  660.   
  661.   for (n=0;n<len-1;n++)
  662.     data[n] = (data[n]<<N) | ((data[n+1]>>(8-N)) & mask);
  663.   
  664.   data[len-1] <<= N;
  665.   
  666.   return output;
  667. }
  668. /* free up memory at the encoder */
  669. void CVTCEncoder::PEZW_freeEnc (PEZW_SPATIAL_LAYER **SPlayer)
  670. {
  671.   int levels;
  672.   int col, l;
  673.   int snrlev;
  674.   
  675.   for (col=0; col<mzte_codec.m_iColors; col++)
  676.     {
  677.       /* free the image buffer */
  678.       free(SPlayer[col][0].SNRlayer[0].snr_image.data);
  679.       
  680.       /* free the mask buffer */
  681.       free(SPlayer[col]->SNRlayer[0].snr_image.mask);
  682.       
  683.       if (col ==0) 
  684. levels = mzte_codec.m_iWvtDecmpLev;
  685.       else
  686. levels = mzte_codec.m_iWvtDecmpLev-1;
  687.       
  688.       /* free the SNR layer */
  689.       for(l=0;l<levels;l++){
  690. for (snrlev=0;snrlev<SPlayer[col][l].SNR_scalability_levels;
  691.      snrlev++)
  692.   if(SPlayer[col][l].SNRlayer[snrlev].snr_bitstream.data!=NULL)
  693.     free(SPlayer[col][l].SNRlayer[snrlev].snr_bitstream.data);
  694. free(SPlayer[col][l].SNRlayer);
  695.       }
  696.       
  697.       /* free SPlayer */
  698.       free(SPlayer[col]);
  699.     }
  700.   
  701.   /* parameters for inverse wvt */
  702.   mzte_codec.m_iSpatialLev = mzte_codec.m_iTargetSpatialLev;
  703.   mzte_codec.m_iTargetSpatialLev = PEZW_target_spatial_levels;
  704. }
  705. void CVTCDecoder::PEZW_freeDec (PEZW_SPATIAL_LAYER **SPlayer)
  706. {
  707.   int levels;
  708.   int col, l;
  709.   int snrlev;
  710.   
  711.   for (col=0; col<mzte_codec.m_iColors; col++)
  712.     {
  713.       /* free the image buffer */
  714.       free(SPlayer[col][0].SNRlayer[0].snr_image.data);
  715.       
  716.       /* free the mask buffer */
  717.   free(SPlayer[col][0].SNRlayer[0].snr_image.mask );
  718.   
  719.   if (col ==0) 
  720.     levels = mzte_codec.m_iWvtDecmpLev;
  721.   else
  722.     levels = mzte_codec.m_iWvtDecmpLev-1;
  723.       
  724.   /* free the SNR layer */
  725.   for(l=0;l<levels;l++){
  726.     if (!mzte_codec.m_bStartCodeEnable)
  727.       free(SPlayer[col][l].SNRlayer[0].snr_bitstream.data);
  728.     else {
  729.       if (col==0){
  730. for (snrlev=0;snrlev<SPlayer[col][l].SNR_scalability_levels;
  731.      snrlev++)
  732.   if(SPlayer[col][l].SNRlayer[snrlev].snr_bitstream.data!=NULL)
  733.     free(SPlayer[col][l].SNRlayer[snrlev].snr_bitstream.data);
  734.       }
  735.     }
  736.   }
  737.     }
  738.   
  739.   
  740.   /* free SNRlayer */
  741.   levels = mzte_codec.m_iWvtDecmpLev;
  742.   for (col=0; col<mzte_codec.m_iColors; col++)
  743.     for(l=0;l<levels;l++)
  744.       free(SPlayer[col][l].SNRlayer);
  745.   
  746.   /* free SPlayer */
  747.   for (col=0; col<mzte_codec.m_iColors; col++)
  748.     free(SPlayer[col]);
  749.   /* parameters for inverse wvt */
  750.   if(PEZW_target_spatial_levels>mzte_codec.m_iWvtDecmpLev)
  751.     PEZW_target_spatial_levels=mzte_codec.m_iWvtDecmpLev;
  752.   mzte_codec.m_iSpatialLev = PEZW_target_spatial_levels;
  753.   mzte_codec.m_iTargetSpatialLev = PEZW_target_spatial_levels;
  754. }