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

📄 ztscan_dec.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	  break;	case S_ZTR_D:	  czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_ZTR_D]);	  coeffinfo[h][w].type=zt_type=czt_type;	  break;	case S_IZ:	  czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_IZ]);	  coeffinfo[h][w].type=zt_type = czt_type ? VAL : IZ;	  break;	case S_LINIT: 	  czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LINIT]);	  coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR;	  break;	case S_LZTR:	  czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LZTR]);	  coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR;	  break;	case S_LZTR_D:	  czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LZTR_D]);	  coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR;	  break;	default:	  errorHandler("Invalid state (%d) in multi-quant encoding.", 		       coeffinfo[h][w].state);      }#ifdef _SHAPE_    }    else /* treat out-node as isolated zero for decoding purpose */    {      switch(coeffinfo[h][w].state)      {      case S_INIT:      case S_ZTR:      case S_ZTR_D:      case S_IZ:	zt_type = coeffinfo[h][w].type = IZ;	break;      case S_LINIT:       case S_LZTR:      case S_LZTR_D:	zt_type = coeffinfo[h][w].type = ZTR;	break;      default:	errorHandler("Invalid state (%d) in multi-quant encoding.", 		     coeffinfo[h][w].state);      }    }#endif  }  /*~~~~~~~~~~~~~~~~ mark ztr_d and encode magnitudes ~~~~~~~~~~~~~~~~~*/  switch(zt_type)  {    case ZTR:#ifdef _SHAPE_      if(coeffinfo[h][w].mask!=1)	return;#endif    case ZTR_D:      mark_ZTR_D(h,w);    case IZ:      coeffinfo[h][w].quantized_value=0;      return;    case VZTR:      mark_ZTR_D(h,w);    case VAL:#ifdef _SHAPE_      if(coeffinfo[h][w].mask==1) #endif	mag_sign_decode_MQ(h,w);      break;    default:      errorHandler("Invalid type in multi quant decoding.");       }}/**********************************************************************//***************       MQ TREE         ********************************//**********************************************************************//********************************************************  Function Name  -------------  static Void cachb_decode_MQ_tree()  Arguments  ---------  None.  Description  -----------  Decode AC information for one color component.   Multiple quant, treewise scan.  Functions Called  ----------------  clear_ZTR_D();  decode_pixel_MQ_tree()  Return Value  ------------  None.********************************************************/ Void CVTCDecoder::cachb_decode_MQ_tree(){  Int h,w, dc_h, dc_w;       /* clear the ZTR_D type from the previous pass */  for (color=0; color<NCOL; ++color)  {          coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;    height=mzte_codec.m_SPlayer[color].height;    width=mzte_codec.m_SPlayer[color].width;    clear_ZTR_D(coeffinfo, width, height);  }       for (color=0; color<NCOL; ++color)    probModelInitMQ(color);  /* ac_h, ac_w init */  dc_h=mzte_codec.m_iDCHeight;  dc_w=mzte_codec.m_iDCWidth;  for (h=0; h<dc_h; ++h)    for (w=0; w<dc_w; ++w)    {      for (color=0; color<NCOL; ++color)      {      	SNR_IMAGE *snr_image;	int tw,sw,sh,n;  // 1124		snr_image=&(mzte_codec.m_SPlayer[color].SNRlayer.snr_image);		coeffinfo=mzte_codec.m_SPlayer[color].coeffinfo;	height=mzte_codec.m_SPlayer[color].height;	width=mzte_codec.m_SPlayer[color].width;      	setProbModelsMQ(color);		/* LH */	n = 0;	for (tw=mzte_codec.m_iDCWidth; tw < width; tw<<=1)	{	  sh = h << n;	  sw = (w+dc_w) << n;	  decodeMQBlocks(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;	  decodeMQBlocks(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;	  decodeMQBlocks(sh,sw,n);	  n++;	}#if 0	decode_pixel_MQ_tree(h,w+dc_w);      /* LH */	decode_pixel_MQ_tree(h+dc_h,w);      /* HL */	decode_pixel_MQ_tree(h+dc_h,w+dc_w); /* HH */#endif      }    }  for (color=0; color<NCOL; ++color)    probModelFreeMQ(color);}#if 0/********************************************************  Function Name  -------------  static Void decode_pixel_MQ_tree(Int h,Int w)  Arguments  ---------  Int h,Int w - position of a pixel in height and width    Description  -----------  Decoding the type and/or value of a coefficient, a  recursive function, multi quant mode.  Functions Called  ----------------  mzte_ac_decode_symbol()  mark_ZTR_D()  mag_sign_decode_MQ()  Return Value  ------------  None.********************************************************/ Void CVTCDecoder::decode_pixel_MQ_tree(Int h0,Int w0){  Int zt_type, h, w, k;  Int dcc[4]; /* Don't Code Children */  Int nSib; /* number siblings */  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);    /* decode zero tree symbol */      if (IS_RESID(w,h,color))    {      zt_type=VAL;    }    else    {      Int czt_type; /* what to put on bitstream */      Int l;      l=xy2wvtDecompLev(w,h);        zt_type = coeffinfo[h][w].type;#ifdef _SHAPE_      if(coeffinfo[h][w].mask==1) /* skip out-node */        {#endif	switch(coeffinfo[h][w].state)	{	  case S_INIT:	    czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_INIT]);	    coeffinfo[h][w].type=zt_type=czt_type;	    break;	  case S_ZTR:	    czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_ZTR]);	    coeffinfo[h][w].type=zt_type=czt_type;	    break;	  case S_ZTR_D:	    czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_ZTR_D]);	    coeffinfo[h][w].type=zt_type=czt_type;	    break;	  case S_IZ:	    czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_IZ]);	    coeffinfo[h][w].type=zt_type = czt_type ? VAL : IZ;	    break;	  case S_LINIT: 	    czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LINIT]);	    coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR;	    break;	  case S_LZTR:	  czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LZTR]);	  coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR;	  break;	  case S_LZTR_D:	    czt_type=mzte_ac_decode_symbol(&acd,acm_type[l][CONTEXT_LZTR_D]);	    coeffinfo[h][w].type=zt_type = czt_type ? VZTR : ZTR;	    break;	default:	  errorHandler("Invalid state (%d) in multi-quant encoding.", 		       coeffinfo[h][w].state);	}#ifdef _SHAPE_      }      else /* treat out-node as isolated zero for decoding purpose */      {	switch(coeffinfo[h][w].state)	  {	  case S_INIT:	  case S_ZTR:	  case S_ZTR_D:	  case S_IZ:	    zt_type = coeffinfo[h][w].type = IZ;	    break;	  case S_LINIT: 	  case S_LZTR:	  case S_LZTR_D:	    zt_type = coeffinfo[h][w].type = ZTR;	    break;	  default:	    errorHandler("Invalid state (%d) in multi-quant encoding.", 			 coeffinfo[h][w].state);	  }      }#endif          }    /* mark ztr_d and decode magnitudes */    switch(zt_type)    {      case ZTR:#ifdef _SHAPE_	if(coeffinfo[h][w].mask==1) { #endif	  dcc[k]=1;	  mark_ZTR_D(h,w); /* here it's just to zero out descendents */#ifdef _SHAPE_	}	else {	  dcc[k]=0;	}#endif	coeffinfo[h][w].quantized_value=0;	break;      case IZ:	dcc[k]=0;	coeffinfo[h][w].quantized_value=0;	break;      case VZTR:	dcc[k]=1;	mark_ZTR_D(h,w); /*  here it's just to zero out descendents */#ifdef _SHAPE_	if(coeffinfo[h][w].mask==1) #endif	mag_sign_decode_MQ(h,w);	break;      case VAL:	dcc[k]=0;#ifdef _SHAPE_	if(coeffinfo[h][w].mask==1) #endif	  mag_sign_decode_MQ(h,w);	break;      default:	errorHandler("Invalid type in multi quant decoding.");         }  }  /********************* 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;	decode_pixel_MQ_tree(i,j);      }    }  }}#endif/********************************************************  Function Name  -------------  static Void mark_ZTR_D(Int h,Int w)  Arguments  ---------  Int h,Int w - position of a pixel    Description  -----------  Mark the coefficient at (h,w) and its descendents as  zerotree descendents.   Functions Called  ----------------  mark_ZTR_D()  Return Value  ------------  None.********************************************************/ Void CVTCDecoder::mark_ZTR_D(Int h,Int w){  Int i,j;  i=h<<1; j=w<<1;  if(i<height && j<width)  {    coeffinfo[i][j].quantized_value     = 0;    coeffinfo[i+1][j].quantized_value   = 0;    coeffinfo[i][j+1].quantized_value   = 0;    coeffinfo[i+1][j+1].quantized_value = 0;        coeffinfo[i][j].type     = ZTR_D;     coeffinfo[i+1][j].type   = ZTR_D;     coeffinfo[i][j+1].type   = ZTR_D;     coeffinfo[i+1][j+1].type = ZTR_D;         mark_ZTR_D(i,j);    mark_ZTR_D(i+1,j);    mark_ZTR_D(i,j+1);    mark_ZTR_D(i+1,j+1);  }}/********************************************************  Function Name  -------------  static Void  mag_sign_decode_MQ(Int h,Int w)  Arguments  ---------  Int h,Int w - position of a pixel  Description  -----------  Decode the value of a coefficient.  Functions Called  ----------------  mzte_ac_decode_symbol()  Return Value  ------------  None.********************************************************/ // hjlee 0901 Void CVTCDecoder::mag_sign_decode_MQ(Int h,Int w){  Int val,v_sign;  Int l;  if(coeffinfo[h][w].skip)  {    coeffinfo[h][w].quantized_value=0;    return;  }      l=xy2wvtDecompLev(w,h);  if (IS_RESID(w,h,color))  {    val=bitplane_res_decode(l,WVTDECOMP_RES_NUMBITPLANES(color));    coeffinfo[h][w].quantized_value=val;  }  else  {    val=bitplane_decode(l,WVTDECOMP_NUMBITPLANES(color,l))+1;    v_sign=mzte_ac_decode_symbol(&acd,acm_sign[l]);    coeffinfo[h][w].quantized_value=(v_sign==0) ? val : -val;  }}/*************************************************************  Function Name  -------------  Void decodeSQBlocks()  Arguments  ---------  Int y, Int x  - Coordinate of upper left hand corner of block.  Int n - Number of 4 blocks in a side of the total block. 0 means do only    pixel at (x,y).  Void (*pixelFunc)(Int, Int) - Function to call for pixel locations.    Description  -----------  Call function pixelFunc(y,x) for all pixels (x,y) in block in band scan  manner.  Functions Called  ----------------  decodeBlocks recursively.  Return Value  ------------  None.*************************************************************/Void CVTCDecoder::decodeSQBlocks(Int y, Int x, Int n){  /* Call the encoding function for the 4 block pixels */  if (n == 0)  {    /* For checking scan-order : use 16x16 mono image       for comparison with Figure 7-38 scan order table in        document.    static Int i=4;    noteStat("%d: y=%d, x=%d\n",i++, y,x);    */    decode_pixel_SQ(y,x);  }  else  {    Int k;    --n;    k = 1<<n;    decodeSQBlocks(y,x,n);    x += k;    decodeSQBlocks(y,x,n);    x -= k;    y += k;    decodeSQBlocks(y,x,n);    x += k;    decodeSQBlocks(y,x,n);  }}/*************************************************************  Function Name  -------------  Void decodeSQBlocks()  Arguments  ---------  Int y, Int x  - Coordinate of upper left hand corner of block.  Int n - Number of 4 blocks in a side of the total block. 0 means do only    pixel at (x,y).  Void (*pixelFunc)(Int, Int) - Function to call for pixel locations.    Description  -----------  Call function pixelFunc(y,x) for all pixels (x,y) in block in band scan  manner.  Functions Called  ----------------  decodeBlocks recursively.  Return Value  ------------  None.*************************************************************/Void CVTCDecoder::decodeMQBlocks(Int y, Int x, Int n){  /* Call the encoding function for the 4 block pixels */  if (n == 0)  {    /* For checking scan-order : use 16x16 mono image       for comparison with Figure 7-38 scan order table in        document.    static Int i=4;    noteStat("%d: y=%d, x=%d\n",i++, y,x);    */    decode_pixel_MQ(y,x);  }  else  {    Int k;    --n;    k = 1<<n;    decodeMQBlocks(y,x,n);    x += k;    decodeMQBlocks(y,x,n);    x -= k;    y += k;    decodeMQBlocks(y,x,n);    x += k;    decodeMQBlocks(y,x,n);  }}

⌨️ 快捷键说明

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