⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ztscan_enc.cpp

📁 《Visual C++小波变换技术与工程实践》靳济芳编著的光盘程序。
💻 CPP
📖 第 1 页 / 共 4 页
字号:

  Arguments
  ---------
  None.

  Description
  -----------
  Encode AC information for single quant mode, tree-depth scan.

  Functions Called
  ----------------
  codeBlocks();
  encode_pixel_SQ()

  Return Value
  ------------
  None.

********************************************************/ 
Void CVTCEncoder::cachb_encode_SQ_band(SNR_IMAGE *snr_image)
{
  Int h,w,ac_h,ac_w,ac_h2,ac_w2;
  Int n; /* layer index - for codeBlocks function */
  Int k; /* block jump for the layer */  // hjlee 0928

  /* ac_h, ac_w init */
  ac_h2=mzte_codec.m_SPlayer[color].height;
  ac_w2=mzte_codec.m_SPlayer[color].width;
  ac_h=ac_h2>>1;
  ac_w=ac_w2>>1;

  height=mzte_codec.m_Image[color].height;
  width=mzte_codec.m_Image[color].width;

  /* Get layer index - for codeBlocks function */  // hjlee 0928
  n = -1;
  for (w=mzte_codec.m_iDCWidth; w < ac_w2; w<<=1)
    n++;

  setProbModelsSQ(color); // hjlee 0901

  coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
	
  /* scan each coefficients in the spatial layer */  
  k = 1<<n;  // hjlee 0928

//Modified by Sarnoff for error resilience, 3/5/99
 if(mzte_codec.m_usErrResiDisable){ //no error resilience case
  for(h=0;h<ac_h;h+=k)
    for(w=ac_w;w<ac_w2;w+=k)
    {
      /* LH */
      encodeSQBlocks(h,w,n);

      /* HL */
      h += ac_h;
      w -= ac_w;
      encodeSQBlocks(h,w,n);

      /* HH */
      w += ac_w;
      encodeSQBlocks(h,w,n);

      /* Set h back to where it started. w is already there */
      h -= ac_h;
    }
 }
 else{ //error resilience case 
  for(h=0;h<ac_h;h+=k)
  {
    for(w=ac_w;w<ac_w2;w+=k)
    {
      /* LH */
      encodeSQBlocks_ErrResi(h,w,n,color);
	  if (n>0 && n<5)
		  check_segment_size(color);

      /* HL */
      h += ac_h;
      w -= ac_w;
      encodeSQBlocks_ErrResi(h,w,n,color);
	  if (n>0 && n<5)
		  check_segment_size(color);

      /* HH */
      w += ac_w;
      encodeSQBlocks_ErrResi(h,w,n,color);
	  if (n>0 && n<5)
		  check_segment_size(color);

      /* Set h back to where it started. w is already there */
      h -= ac_h;
    }
	/* new texture unit */
	check_end_of_packet(color);
  }
 }
//End modified by Sarnoff for error resilience, 3/5/99
}

     
/*******************************************************
  The following single quant routines are for tree
  depth scan order.
*******************************************************/
/********************************************************
  Function Name
  -------------
  Void wavelet_higher_bands_encode_SQ_tree()

  Arguments
  ---------
  None.

  Description
  -----------
  Control program for encoding AC information for one 
  color component. Single quant mode.

  Functions Called
  ----------------
  cachb_encode_SQ_tree()
  mzte_ac_encoder_init()
  mzte_ac_model_init()
  mzte_ac_model_done()
  mzte_ac_encoder_done()

  Return Value
  ------------
  None.

********************************************************/ 
Void CVTCEncoder::wavelet_higher_bands_encode_SQ_tree() // hjlee 0928
{
  noteDetail("Encoding AC (wavelet_higher_bands_encode_SQ)....");

//Modified by Sarnoff for error resilience, 3/5/99
 if(mzte_codec.m_usErrResiDisable){ //no error resilience case
  /* init arithmetic coder */
  mzte_ac_encoder_init(&ace);

  // hjlee 0901
  for (color=0; color<mzte_codec.m_iColors; color++) 
    probModelInitSQ(color);
  
  cachb_encode_SQ_tree(); // hjlee 0928
  
  // hjlee 0901
  for (color=0; color<mzte_codec.m_iColors; color++) 
    /* close arithmetic coder */
    probModelFreeSQ(color);

  bit_stream_length=mzte_ac_encoder_done(&ace);
 }
 else{ //error resilience
  init_arith_encoder_model(-1);

  cachb_encode_SQ_tree(); // hjlee 0928
  
  if (packet_size+ace.bitCount>0){
	  TU_last--;
	  close_arith_encoder_model(-1,1); // write packet header
  }
 }
//End modified by Sarnoff for error resilience, 3/5/99

  noteDetail("Completed encoding AC.");
}


/********************************************************
  Function Name
  -------------
  static Void cachb_encode_SQ_tree()

  Arguments
  ---------
  None.

  Description
  -----------
  Encode AC information for single quant mode, tree-depth scan.

  Functions Called
  ----------------
  encode_pixel_SQ_tree()

  Return Value
  ------------
  None.

********************************************************/ 
Void CVTCEncoder::cachb_encode_SQ_tree()
{
  Int h,w,dc_h,dc_w,dc_h2,dc_w2;

  dc_h=mzte_codec.m_iDCHeight;
  dc_w=mzte_codec.m_iDCWidth;
  dc_h2=dc_h<<1;
  dc_w2=dc_w<<1;

//Modified by Sarnoff for error resilience, 3/5/99
 if(mzte_codec.m_usErrResiDisable){ //no error resi case
  for(h=0;h<dc_h;h++)
    for(w=0;w<dc_w;w++)  // 1124
      for (color=0; color<mzte_codec.m_iColors; color++) 
      {  	
	SNR_IMAGE *snr_image;
	Int tw,sw,sh,n; // 1124
	
	snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image);
	
	height=mzte_codec.m_Image[color].height;
	width=mzte_codec.m_Image[color].width;
	
	setProbModelsSQ(color);  // hjlee 0901

	coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;
	
	/* LH */
	n = 0;
	for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
	{
	  sh = h << n;
	  sw = (w+dc_w) << n;
	  encodeSQBlocks(sh,sw,n);
	  n++;
	}
	/* HL */
	n = 0;
	for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
	{
	  sh = (h+dc_h) << n;
	  sw = w << n;
	  encodeSQBlocks(sh,sw,n);
	  n++;
	}
	/* HH */
	n = 0;
	for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
	{
	  sh = (h+dc_h) << n;
	  sw = (w+dc_w) << n;
	  encodeSQBlocks(sh,sw,n);
	  n++;
	}
      }
 }
 else{ //error resilience
  for(h=0;h<dc_h;h++)
    for(w=0;w<dc_w;w++)  // 1124
      for (color=0; color<mzte_codec.m_iColors; color++) 
      {  	
		SNR_IMAGE *snr_image;
		Int tw,sw,sh,n; // 1124
	
		snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image);
	
		height=mzte_codec.m_Image[color].height;
		width=mzte_codec.m_Image[color].width;
	
		setProbModelsSQ(color);  // hjlee 0901

		coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;

		/* LH */
		n = 0;
		for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
		{
		  sh = h << n;
		  sw = (w+dc_w) << n;
		  encodeSQBlocks_ErrResi(sh,sw,n,color);
		  if (n>0 && n<5)
			  check_segment_size(color);
		  n++;
		}
		check_end_of_packet(-1);

		/* HL */
		n = 0;
		for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
		{
		  sh = (h+dc_h) << n;
		  sw = w << n;
		  encodeSQBlocks_ErrResi(sh,sw,n,color);
		  if (n>0 && n<5)
			  check_segment_size(color);
		  n++;
		}
		if(TU_last==91)
			printf("Debug.\n");
		check_end_of_packet(-1);
		
		/* HH */
		n = 0;
		for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)
		{
		  sh = (h+dc_h) << n;	
		  sw = (w+dc_w) << n;
		  encodeSQBlocks_ErrResi(sh,sw,n,color);
		  if (n>0 && n<5)
			  check_segment_size(color);
		  n++;
		}
		check_end_of_packet(-1);
	  }
 }
//End modified by Sarnoff for error resilience, 3/5/99

}


/********************************************************
  Function Name
  -------------
  static Void encode_pixel_SQ_tree(Int h,Int w)

  Arguments
  ---------
  Int h,Int w - position of a pixel in height and width
  
  Description
  -----------
  Encoding the type and/or value of a coefficient, a
  recursive function.

  Functions Called
  ----------------
  mag_sign_encode_SQ()
  mzte_ac_encode_symbol()
  encode_pixel_SQ_tree()

  Return Value
  ------------
  None.

********************************************************/ 

Void CVTCEncoder::encode_pixel_SQ(Int h,Int w)
{
  UChar zt_type;
  Int l;

  if(coeffinfo[h][w].type == ZTR_D)
    return;

  l=xy2wvtDecompLev(w,h);


  /* code leave coefficients, value only, no type */
  if(IS_STATE_LEAF(coeffinfo[h][w].state)){
 
      /* Map type to leaf code word ZTR->0, VZTR->1 */
      zt_type = (coeffinfo[h][w].type!=ZTR);
      mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LINIT],zt_type);
      if (coeffinfo[h][w].type==VZTR)


	mag_sign_encode_SQ(h,w);

    return;
  }
 
  /* code zerotree symbol */

    mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_INIT],
			  zt_type=coeffinfo[h][w].type);

  /* code magnitude and sign */
  /* For Arbitrary-Shape, out-node will always has zero coefficient,
     so only IZ or ZTR may be the zt_type -- SL*/

  switch(zt_type){
    case IZ : 
      break; /* will code the four children */
    case VZTR:
      mag_sign_encode_SQ(h,w);
    case ZTR:
	mark_ZTR_D(h,w);  /* necessary, for bandwise scan */
      break;
    case VAL:
      mag_sign_encode_SQ(h,w);
      break;
    default: 
      errorHandler("invalid zerotree symbol in single quant encode");
  }
}

#if 0
Void CVTCEncoder::encode_pixel_SQ_tree(Int h0,Int w0)
{
  UChar zt_type;
  Int h, w, k;
  Int dcc[4]; /* Don't Code Children */
  Int nSib; /* number siblings */
  Int l;

  l=xy2wvtDecompLev(w0,h0);

  nSib = (h0<(mzte_codec.m_iDCHeight<<1) && w0<(mzte_codec.m_iDCWidth<<1)) ? 1 : 4;

  /********************* CODE SIBLINGS *****************************/
  for (k=0; k<nSib; ++k)
  {
    h = h0 + (k/2);
    w = w0 + (k%2);

    /* code leave coefficients, value only, no type */
    if(IS_STATE_LEAF(coeffinfo[h][w].state))
    {
#ifdef _SHAPE_ /* skip out-node */
      if(coeffinfo[h][w].mask == 1) 
      {
#endif
	/* Map type to leaf code word ZTR->0, VZTR->1 */
	zt_type = (coeffinfo[h][w].type!=ZTR);
	mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_LINIT],zt_type);
	if (coeffinfo[h][w].type==VZTR)
	  mag_sign_encode_SQ(h,w);

#ifdef _SHAPE_
      }
#endif
      
      continue;
    }
    
    /* code zerotree symbol */
#ifdef _SHAPE_ /* skip out-node */
    if(coeffinfo[h][w].mask == 1) 
#endif

      mzte_ac_encode_symbol(&ace,acm_type[l][CONTEXT_INIT],
			    zt_type=coeffinfo[h][w].type);

#ifdef _SHAPE_
    else
      zt_type=coeffinfo[h][w].type;
#endif
    /* code magnitude and sign */
    /* For Arbitrary-Shape, out-node will always has zero coefficient,
       so only IZ or ZTR may be the zt_type -- SL*/
    
    switch(zt_type){
      case IZ : 
	dcc[k]=0;
	break; /* will code the four children */
      case VZTR:
	mag_sign_encode_SQ(h,w);
      case ZTR:
	dcc[k]=1;
#ifdef _SHAPE_
	if(coeffinfo[h][w].mask != 1) { /* TBE for four children of out-node */
	  dcc[k] = 0;
	}
#endif
	break;
      case VAL:
	dcc[k]=0;
	mag_sign_encode_SQ(h,w);
	break;
      default: 
	errorHandler("invalid zerotree symbol in single quant encode");
    }
  }

  /********************* CODE CHILDREN *****************************/
  if (!IS_STATE_LEAF(coeffinfo[h0][w0].state) )
  {
    Int i, j;

    for (k=0; k<nSib; ++k)
    {
      if (dcc[k]==0)
      {
	h = h0 + (k/2);
	w = w0 + (k%2);  

	/* scan children */
	i=h<<1; j=w<<1;
	encode_pixel_SQ_tree(i,j);
      }
    }
  }
}

#endif

     
/********************************************************
  Function Name
  -------------
  static Void  mag_sign_encode_SQ(Int h,Int w)

  Arguments
  ---------
  Int h,Int w - position of a pixel

  Description
  -----------
  Encode the value of a coefficient.

  Functions Called
  ----------------
  mzte_ac_encode_symbol()

  Return Value
  ------------
  None.

********************************************************/ 

Void CVTCEncoder::mag_sign_encode_SQ(Int h,Int w)
{
  Int val,v_sign;
  Int l;

  if((val=coeffinfo[h][w].quantized_value)>0)
    v_sign=0;
  else
  {
    val=-val;
    v_sign=1;
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -