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

📄 shapeenhencode.cpp

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

	   if(!b_except)
	   {
		/*-- check for P2/P3 pixel decoding --*/
		for(j2=1,k=mbsize_ext; j2<mbsize; j2+=2, k+=(mbsize_ext<<1) )
		{
		   for(i2=0; i2<mbsize; i2++)
		   {
			prev= curr_bab_data[k-mbsize_ext+i2];
			curr= curr_bab_data[k+i2]; 
			next= curr_bab_data[k+mbsize_ext+i2];
 
		        if((prev==next) && (curr!=prev)) 
			{
			   b_except = 1; 	/*101 case */
			   break;
			}
		    }
		    if(b_except) break;
		}
	   }
	} else {
	   b_except = 1;
	} 

	if(b_except)	bab_type = 1; /* full_coded */
	else		bab_type = 0; /* xor_coded (Modified SISC) */
	
	if (scan_order == 1) free(curr_bab_data_tr); // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
        /* 0: XOR_coded, 1: Full_coded, 2:XOR+P0  */
	return bab_type;
}

/***********************************************************CommentBegin******
 *
 * -- ShapeEnhContentEncode -- Encodes a binary alpha block using SI.
 *
 * Author :		
 *	Dae-Sung Cho (Samsung AIT)
 *
 * Created :		
 *	09-Feb-98
 * 
 * Arguments: 	
 *
 *
 * Return values :	
 *
 * Side effects :	
 *	-
 *
 * Description :	A binary alpha block will be coded using bac.
 *			These bits are added to the <shape_stream>. 
 *
 * See also :
 *
 ***********************************************************CommentEnd********/

Int	CVTCEncoder::
ShapeEnhContentEncode(UChar *bordered_lower_bab, 
		      UChar *bordered_half_bab, 
		      UChar *bordered_curr_bab, 
			Int bab_type, 
			Int scan_order, // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT) 
			Int mbsize,
				FILTER *filter,
			BSS *bitstream,	
			ArCoder *ar_coder)
{
	if (bab_type==0) 		/* Interleaved Scan-Line (ISL) coding */
	{  
	      ExclusiveORencoding (bordered_lower_bab,
				   bordered_half_bab,
				   bordered_curr_bab,
				   mbsize,
				   scan_order, // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT) 
				   bitstream,
				   ar_coder);

	} else if(bab_type ==1)		/* Raster Scan-Line (RSL) coding */
	{	

	  FullEncoding (bordered_lower_bab,
			    bordered_half_bab,
			    bordered_curr_bab,
				mbsize,
			        filter,
				bitstream,
				ar_coder);
	} else 
	{
	      fprintf(stderr,"BAB type[%d] ERROR in Enhancement layer coding!\n", bab_type);
	}

        return 0;
}
	     
Void CVTCEncoder::
ExclusiveORencoding (UChar *bordered_lower_bab,
		     UChar *bordered_half_bab,
		     UChar *bordered_curr_bab,
		     Int mbsize,
			 Int scan_order, // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT) 
		     BSS *bitstream, 
		     ArCoder *ar_coder)
{
	Int             i2,j2,k,curr,prev,next;
	Int				i,j;	// SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT) 
	Int             mborder = MBORDER;
	Int             mbsize_ext = mbsize+(mborder<<1);
	Int             border = BORDER;
	Int             bsize = mbsize >> 1;
	Int             bsize_ext = bsize+(border<<1);
	Int             context, prob=0;
	Int		start_bit, end_bit, bitnum=0;
	UChar           *lower_bab_data,
                        *curr_bab_data;
	UChar			*curr_bab_data_tr;	// SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT) 

        lower_bab_data = bordered_lower_bab + border * bsize_ext + border;
		// SAIT_PDAM: BEGIN - ADDED by D.-S.Cho (Samsung AIT) 
		if (scan_order == 1) {
			curr_bab_data_tr = (UChar *)calloc(mbsize_ext*mbsize_ext, sizeof(UChar));
			for(j=0; j<mbsize_ext; j++)
				for(i=0; i<mbsize_ext; i++)
					curr_bab_data_tr[j*mbsize_ext+i]=bordered_curr_bab[i*mbsize_ext+j];
			curr_bab_data = curr_bab_data_tr + mborder * mbsize_ext + mborder;
		} else
		// SAIT_PDAM: END - ADDED by D.-S.Cho (Samsung AIT) 
        curr_bab_data= bordered_curr_bab + mborder * mbsize_ext + mborder;

	start_bit = bitstream->cnt;


	/*-- P1 pixels encoding --*/
	// SAIT_PDAM BEGIN - MODIFIED by D.-S.Cho (Samsung AIT) 
	//for(j2=k=0; j2<mbsize; j2+=2, k+=(mbsize_ext<<1) )
    //    {
	//   for(i2=1; i2<mbsize; i2+=2)
	//   {
	   for(i2=1; i2<mbsize; i2+=2)
	   {
	for(j2=k=0; j2<mbsize; j2+=2, k+=(mbsize_ext<<1) )
        {
	// SAIT_PDAM END - MODIFIED by D.-S.Cho (Samsung AIT) 
		curr= curr_bab_data[k+i2];
		prev= curr_bab_data[k+i2-1];
		next= curr_bab_data[k+i2+1];
                       
		if(prev!=next) 
		{
		   context = GetContextEnhBAB_XOR(curr_bab_data,
					i2, 
					j2, 
					mbsize_ext, 
					0); /* pixel type : 0-P1, 1-P2/P3 */

		   prob=scalable_xor_prob_1[context];
		   ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);

		} 
		else 
		{
		   if(prev!=curr)
		   {
			fprintf(stderr, "Error: BAB coding mode mismatch in XOR coding : P1!\n");
			fprintf(stderr, "Error: P1[%d,%d,%d]!\n",prev,curr,next);
			fprintf(stderr,"1, j2=%d i2=%d prev=%d curr=%d next=%d context=%d bits=%d\n", 
				j2, i2, prev, curr, next, context, bitstream->cnt);
			exit(0);
		   }
		}
	   }
	}

	/*-- P2/P3 pixel coding --*/
        for(j2=1,k=mbsize_ext; j2<mbsize; j2+=2, k+=(mbsize_ext<<1) )
        {
	   for(i2=0; i2<mbsize; i2++)
	   {
		curr= curr_bab_data[k+i2];
		prev= curr_bab_data[k-mbsize_ext+i2];	
		next= curr_bab_data[k+mbsize_ext+i2];	

		if(prev!=next) 
		{
		   context = GetContextEnhBAB_XOR(curr_bab_data,
					i2, 
					j2, 
					mbsize_ext, 
					1);	/* pixel type : 0-P1, 1-P2/P3 */

		   prob=scalable_xor_prob_23[context];
		   ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
		} 
		else 
		{
		   if(prev!=curr)
		   {
			fprintf(stderr, "Error: BAB coding mode mismatch in XOR coding : P2, P3!\n");
			exit(0);
		   }
		}
	   }
	}

	if(scan_order==1) free(curr_bab_data_tr); // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT) 
	end_bit = bitstream->cnt;
	bitnum = end_bit - start_bit;

}

/* Modified by shson */
Void CVTCEncoder::
FullEncoding (UChar *bordered_lower_bab,
	      UChar *bordered_half_bab,
	      UChar *bordered_curr_bab,
	      Int mbsize,
				FILTER *filter,
			BSS *bitstream, 
			ArCoder *ar_coder)
{
	Int		i,j,i2,j2,k,l,curr;

	Int		mborder = MBORDER;
	Int		mbsize_ext = mbsize+(mborder<<1);
	Int		border = BORDER;
	Int		bsize = mbsize >> 1;
	Int		bsize_ext = bsize+(border<<1);
//	Int		not_coded, low_value;
	Int		context, prob=0;
	Int		start_bit, end_bit, bitnum=0;

	UChar		*lower_bab_data,
	  *half_bab_data,			
	  *curr_bab_data;

	lower_bab_data = bordered_lower_bab + border * bsize_ext + border;
	half_bab_data= bordered_half_bab + mborder * bsize_ext + border;
	curr_bab_data= bordered_curr_bab + mborder * mbsize_ext + mborder;

	start_bit = bitstream->cnt;
	/* vertical pass first for half-higher layer encoding*/

	for(j2=k=0; j2<mbsize; j2+=2, k+=2*bsize_ext)
	{
	   for(i=0; i<bsize; i++)
	   {
	     j = j2>>1;
	     l = j*bsize_ext;

	     /* T1 */
	     curr = half_bab_data[k+i];
	     context =  (half_bab_data[k-bsize_ext+i]<<7) /* T9*/
	       | ( half_bab_data[k-bsize_ext+i+1] <<6) /* T8 */
	       | (half_bab_data[k+bsize_ext+i-1] <<5) /* T7 */
	       | (half_bab_data[k+i-1] <<4) /* T6 */
	       | (lower_bab_data[l+i] <<3) /* T5 */
	       | (lower_bab_data[l+i+1] <<2) /* T4 */
	       | (lower_bab_data[l+bsize_ext+i] <<1) /* T3 */
	       | (lower_bab_data[l+bsize_ext+i+1]); /* T2 */

	     if(filter->DWT_Class==DWT_ODD_SYMMETRIC){
	       prob=prob_odd0[context];
	     } else if(filter->DWT_Class==DWT_EVEN_SYMMETRIC) {
	       prob=prob_even0[context];
	     } else {
	       fprintf(stderr,"Error: filter type in FullEncoding() !\n");
	       exit(0);
	     }
	     ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);

	       /* T0 */
	     curr = half_bab_data[k+bsize_ext+i];
	     context =  (half_bab_data[k+i]<<7) /* T1*/
	       | ( lower_bab_data[l+bsize_ext+i-1] <<6) /* T10 */
	       | (half_bab_data[k+bsize_ext+i-1] <<5) /* T7 */
	       | (half_bab_data[k+i-1] <<4) /* T6 */
	       | (lower_bab_data[l+i] <<3) /* T5 */
	       | (lower_bab_data[l+i+1] <<2) /* T4 */
	       | (lower_bab_data[l+bsize_ext+i] <<1) /* T3 */
	       | (lower_bab_data[l+bsize_ext+i+1]); /* T2 */

	     if(filter->DWT_Class==DWT_ODD_SYMMETRIC){
	       prob=prob_odd1[context];
	     } else if(filter->DWT_Class==DWT_EVEN_SYMMETRIC) {
	       prob=prob_even1[context];
	     } else {
	       fprintf(stderr,"Error: filter type in FullEncoding() !\n");
	       exit(0);
	     }
	     ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
	   }
	}

	/* horizontal */
	for(i2=0; i2<mbsize; i2+=2)
	  {
	    for(j=k=0; j<mbsize; j++, k+=mbsize_ext)
	      {
	   
		i = i2>>1;
		l = j*bsize_ext;
		/* T1 */
		curr = curr_bab_data[k+i2];
		context =  (curr_bab_data[k+i2-1]<<7) /* T9*/
		  | ( curr_bab_data[k+mbsize_ext+i2-1] <<6) /* T8 */
		  | (curr_bab_data[k-mbsize_ext+i2+1] <<5) /* T7 */
		  | (curr_bab_data[k-mbsize_ext+i2] <<4) /* T6 */
		  | (half_bab_data[l+i] <<3) /* T5 */
		  | (half_bab_data[l+bsize_ext+i] <<2) /* T4 */
		  | (half_bab_data[l+i+1] <<1) /* T3 */
		  | (half_bab_data[l+bsize_ext+i+1]); /* T2 */

		if(filter->DWT_Class==DWT_ODD_SYMMETRIC){
		  prob=prob_odd0[context];
		} else if(filter->DWT_Class==DWT_EVEN_SYMMETRIC) {
		  prob=prob_even0[context];
		} else {
		  fprintf(stderr,"Error: filter type in FullEncoding() !\n");
		  exit(0);
		}
		ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
		/* T0 */
		curr = curr_bab_data[k+i2+1];
		context =  (curr_bab_data[k+i2]<<7) /* T1*/
		  | ( half_bab_data[l-bsize_ext+i+1] <<6) /* T10 */
		  | (curr_bab_data[k-mbsize_ext+i2+1] <<5) /* T7 */
		  | (curr_bab_data[k-mbsize_ext+i2] <<4) /* T6 */
		  | (half_bab_data[l+i] <<3) /* T5 */
		  | (half_bab_data[l+bsize_ext+i] <<2) /* T4 */
		  | (half_bab_data[l+i+1] <<1) /* T3 */
		  | (half_bab_data[l+bsize_ext+i+1]); /* T2 */

		if(filter->DWT_Class==DWT_ODD_SYMMETRIC){
		  prob=prob_odd1[context];
		} else if(filter->DWT_Class==DWT_EVEN_SYMMETRIC) {
		  prob=prob_even1[context];
		} else {
		  fprintf(stderr,"Error: filter type in FullEncoding() !\n");
		  exit(0);
		}
		ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
	      }
	  }

	end_bit = bitstream->cnt;
	bitnum = end_bit - start_bit;

}

/*********************************************************************************
 *
 *      Bitstream Manipulation  
 *
*********************************************************************************/
/* Merge Shape Bitstream into main bit stream */
Void CVTCEncoder::
MergeEnhShapeBitstream()
{
  if(ShapeBitstream==NULL) {
    fprintf(stderr,"EnhShapeBitStream Not Available\n");
    exit(1);
  }
  InitBitstream(0,ShapeBitstream);
  BitStreamMerge(ShapeBitstreamLength, ShapeBitstream);
 
  free(ShapeBitstream->bs);
  free(ShapeBitstream);
  ShapeBitstream = NULL;
}
 

⌨️ 快捷键说明

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