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

📄 text_code.c

📁 <VC++视频音频开发>一书的光盘资料。
💻 C
📖 第 1 页 / 共 2 页
字号:
	free(DC_store);
	free ((Char*)qcoeff);
}
Void Bits_CountMB_combined(Int DQUANT, Int Mode, Int COD, Int ACpred_flag,
Int CBP, Int vop_type,
Bits* bits, Image *mottext_bitstream,Int *MB_transp_pattern)
{
	Int   cbpy ,cbpc, length;
	Int   MBtype=-1;
	if ( Mode == MODE_INTRA ) MBtype = 3;
	if ( Mode == MODE_INTER ) MBtype = 0;
	if ( Mode == MODE_INTRA_Q) MBtype = 4;
	if ( Mode == MODE_INTER_Q) MBtype = 1;
	if ( Mode == MODE_INTER4V) MBtype = 2;
	
	if ( Mode == MODE_GMC) MBtype = 0;
	if ( Mode == MODE_GMC_Q) MBtype = 1;
	
	#ifdef D_TRACE
	fprintf(ftrace, "DQUANT : %d\tMODE : %d\tVop Type : %d\n", DQUANT, Mode, vop_type);
	fprintf(ftrace, "COD : %d\tCBP : %d\tAC Pred Flag : %d\n\n", COD, CBP, ACpred_flag);
	#endif
	cbpc = CBP & 3;
	cbpy = CBP>>2;
	
	if (vop_type != PCT_INTRA )
	{
		if (COD)
		{
			printf("COD = 1 in Bits_CountMB_combined \n");
			printf("This function should not be used if COD is '1' \n");
			exit(1);
		}
												  
		BitstreamPutBits(mottext_bitstream, (long)(COD), 1L);
		bits->COD++;
	}
	
	if (vop_type == PCT_INTRA)
		length = PutMCBPC_Intra (cbpc, MBtype, mottext_bitstream);
	else
		length = PutMCBPC_Inter (cbpc, MBtype, mottext_bitstream);
	bits->MCBPC += length;
	
	
	if (((Mode == MODE_INTER) || (Mode == MODE_INTER_Q) || (Mode == MODE_GMC) || (Mode == MODE_GMC_Q))  && (vop_type == PCT_SPRITE))
		
	{
		if ((Mode == MODE_INTER) || (Mode == MODE_INTER_Q))
			BitstreamPutBits(mottext_bitstream, (long) 0, 1L);
		
		if ((Mode == MODE_GMC) || (Mode == MODE_GMC_Q))
			
			BitstreamPutBits(mottext_bitstream, (long) 1, 1L);
		bits->MCBPC += 1;
	}
	
	
	if ((Mode == MODE_INTRA || Mode==MODE_INTRA_Q) && ACpred_flag != -1)
	{
		BitstreamPutBits(mottext_bitstream, (long)ACpred_flag, 1L);
		bits->ACpred_flag += 1;
	}
	
	length = PutCBPY (cbpy, (Char)(Mode==MODE_INTRA||Mode==MODE_INTRA_Q),NULL,mottext_bitstream);
	bits->CBPY += length;
	
	
	if ((Mode == MODE_INTER_Q) || (Mode == MODE_INTRA_Q)|| (Mode == MODE_GMC_Q))
		
	{
		switch (DQUANT)
		{
			case -1:
				BitstreamPutBits(mottext_bitstream, 0L, 2L);
				break;
			case -2:
				BitstreamPutBits(mottext_bitstream, 1L, 2L);
				break;
			case 1:
				BitstreamPutBits(mottext_bitstream, 2L, 2L);
				break;
			case 2:
				BitstreamPutBits(mottext_bitstream, 3L, 2L);
				break;
			default:
				fprintf(stderr,"Invalid DQUANT\n");
				exit(1);
		}
		bits->DQUANT += 2;
	}
}
Int doDCACpred(Int *qcoeff, Int *CBP, Int ncoeffs, Int x_pos, Int y_pos,
Int ***DC_store, Int QP, Int MB_width,
Int direction[], Int mid_grey )
{
	Int i, m;
	Int block_A, block_B, block_C;
	Int Xpos[6] = {-1, 0, -1, 0, -1, -1};
	Int Ypos[6] = {-1, -1, 0, 0, -1, -1};
	Int Xtab[6] = {1, 0, 3, 2, 4, 5};
	Int Ytab[6] = {2, 3, 0, 1, 4, 5};
	Int Ztab[6] = {3, 2, 1, 0, 4, 5};
	Int grad_hor, grad_ver, DC_pred;
	Int pred_A[15], pred_C[15];
	Int S = 0, S1, S2;
	Int diff;
	Int pcoeff[384];
	Int ACpred_flag=-1;
	
	for (i = 0; i < (6*ncoeffs); i++)
	{
		pcoeff[i] = qcoeff[i];
	}
	for (i = 0; i < 6; i++)
	{
		if ((x_pos == 0) && y_pos == 0)			  
		{
			block_A = (i == 1 || i == 3) ? DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0] : mid_grey*8;
			block_B = (i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
			block_C = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0] : mid_grey*8;
		}
		else if (x_pos == 0)					  
		{
			block_A = (i == 1 || i == 3) ? DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0] : mid_grey*8;
			block_B = (i == 1 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
			block_C = DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0];
		}
		else if (y_pos == 0)					  
		{
			block_A = DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0];
			block_B = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
			block_C = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0] : mid_grey*8;
		}
		else
		{
			block_A = DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0];
			block_B = (DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])]
				[Ztab[i]][0]);
			block_C = DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0];
		}
		grad_hor = block_B - block_C;
		grad_ver = block_A - block_B;
		if ((ABS(grad_ver)) < (ABS(grad_hor)))
		{
			DC_pred = block_C;
			direction[i] = 2;
		}
		else
		{
			DC_pred = block_A;
			direction[i] = 1;
		}
		pcoeff[i*ncoeffs] = qcoeff[i*ncoeffs] - (DC_pred+cal_dc_scaler(QP,(i<4)?1:2)/2)/cal_dc_scaler(QP,(i<4)?1:2);
		
		if ((x_pos == 0) && y_pos == 0)			  
		{
			if (i == 1 || i == 3)
				for (m = 0; m < 15; m++)
					pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
			else
				nullfill(pred_A,mid_grey);
			if (i == 2 || i == 3)
				for (m = 0; m < 15; m++)
					pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
			else
				nullfill(pred_C,mid_grey);
		}
		else if (x_pos == 0)					  
		{
			if (i == 1 || i == 3)
				for (m = 0; m < 15; m++)
					pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
			else
				nullfill(pred_A,mid_grey);
			for (m = 0; m < 15; m++)
				pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
		}
		else if (y_pos == 0)					  
		{
			for (m = 0; m < 15; m++)
				pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
			if (i == 2 || i == 3)
				for (m = 0; m < 15; m++)
					pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
			else
				nullfill(pred_C,mid_grey);
		}
		else
		{
			for (m = 0; m < 15; m++)
			{
				pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
				pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
			}
		}
		#if 1									  
		S1 = 0;
		S2 = 0;
		
		if (direction[i] == 1)					  
		{
			for (m = 0; m < 7; m++)
			{
				S1 += ABS(qcoeff[i*ncoeffs+(m+1)*8]);
				diff = pcoeff[i*ncoeffs+(m+1)*8]
					= qcoeff[i*ncoeffs+(m+1)*8] - pred_A[m+8];
				S2 += ABS(diff);
			}
		}
		else									  
		{
			for (m = 1; m < 8; m++)
			{
				S1 += ABS(qcoeff[i*ncoeffs+m]);
				diff = pcoeff[i*ncoeffs+m]
					= qcoeff[i*ncoeffs+m] - pred_C[m];
				S2 += ABS(diff);
			}
		}
		S += (S1 - S2);
		#endif
	}
	
	if (S >=0)
	{
		for (i=0;i<ncoeffs*6; i++)
			
			
			if ((i%64)&&(abs(pcoeff[i])>2047))
		{
			printf("predicted AC out of range");
			S=-1;break;
		}
	}
	if (S >= 0)									  
	{
		ACpred_flag = 1;
		for (i = 0; i < ncoeffs*6; i++)
		{
			qcoeff[i] = pcoeff[i];
		}
		
		*CBP = FindCBP(qcoeff, MODE_INTRA, 64);
	}
	else										  
	{
		ACpred_flag = 0;
		for (i = 0; i < 6; i++)
		{
			qcoeff[i*ncoeffs] = pcoeff[i*ncoeffs];
			direction[i] = 0;
		}
	}
	return ACpred_flag;							  
}
Void nullfill(Int pred[], Int mid_grey)
{
	Int i;
	pred[0] = mid_grey*8;
	for (i = 1; i < 15; i++)
	{
		pred[i] = 0;
	}
}
Int Idir_c(Int val, Int QP)
{
	if (val<0) return (val-QP/2)/QP;
	else return (val+QP/2)/QP;
}
Int IntraDCSwitch_Decision(Int Mode,Int intra_dc_vlc_thr,Int Qp)
{
	Int switched =0;
	if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
	{
		if (intra_dc_vlc_thr==0)
			switched=0;
		else if (intra_dc_vlc_thr==7)
			switched=1;
		else if (Qp>=intra_dc_vlc_thr*2+11)
			switched=1;
	}
	return switched;
}
Int cal_dc_scaler (Int QP, Int type)
{
	Int dc_scaler;
	if (type == 1)
	{
		if (QP > 0 && QP < 5) dc_scaler = 8;
		else if (QP > 4 && QP < 9) dc_scaler = 2 * QP;
		else if (QP > 8 && QP < 25) dc_scaler = QP + 8;
		else dc_scaler = 2 * QP - 16;
	}
	else
	{
		if (QP > 0 && QP < 5) dc_scaler = 8;
		else if (QP > 4 && QP < 25) dc_scaler = (QP + 13) / 2;
		else dc_scaler = QP - 6;
	}
	return dc_scaler;
}
Int
FindCBP (Int* qcoeff, Int Mode, Int ncoeffs)
{
	Int i,j;
	Int CBP = 0;
	Int intra = (Mode == MODE_INTRA || Mode == MODE_INTRA_Q);
	
	for (i = 0; i < 6; i++)
	{
		for (j = i*ncoeffs + intra; j < (i+1)*ncoeffs; j++)
		{
			if (qcoeff[j])
			{
				if (i == 0) {CBP |= 32;}
				else if (i == 1) {CBP |= 16;}
				else if (i == 2) {CBP |= 8;}
				else if (i == 3) {CBP |= 4;}
				else if (i == 4) {CBP |= 2;}
				else if (i == 5) {CBP |= 1;}
				else
				{
					fprintf (stderr, "Error in CBP assignment\n");
					exit(-1);
				}
				break;
			}
		}
	}
	return CBP;
}

⌨️ 快捷键说明

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