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

📄 shape.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					type_id_mis[match_cnt][0]=type_id;					type_id_mis[match_cnt][1]=2+current;					type_id_mis[match_cnt][2]=i;					type_id_mis[match_cnt][3]=j;                                					xor_cnt++;					match_cnt++;				}				sample_cnt++;				if(skip_bottom == v_scan_freq)		skip_upper = v_scan_freq;				else								skip_upper = v_scan_freq*2;			}		}		num_loop_hor--;	}	*no_mismatch=mismatch_cnt;	*no_match=match_cnt;	*no_xor=xor_cnt;}Void CVideoObject::HorizontalScanning(Int *no_mismatch, Int *no_match, Int *no_xor, Int type_id_mis[256][4], Int num_loop_hor, Int num_loop_ver, Bool residual_scanning_hor, Bool residual_scanning_ver, Bool* HorSamplingChk, Bool* VerSamplingChk){	const PixelC* ppxlcSrcRow  = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;	Int i,j,prev,next,current;	Int skip_ver=0, skip_upper=0, skip_bottom=0;    Int start_v=0,start_h=0;    Int type_id=0, mismatch_cnt=0, match_cnt=0, sample_cnt=0, xor_cnt=0;	Int width = 20, height = 20; 	Int h_scan_freq=1, v_scan_freq=2;	const PixelC* smb_data = ppxlcSrcRow;	i=0;		while (*(VerSamplingChk+i) == 1)	i++;	while(*(VerSamplingChk+i) == 0)		i++;	int tmp = i;	if ( residual_scanning_ver) {		start_h = 0;		start_v = 0;		v_scan_freq=1<<num_loop_ver; 		h_scan_freq=1;		skip_ver = v_scan_freq;		if( tmp-(1<<num_loop_ver) >= 0 ) 				start_v = tmp-(1<<num_loop_ver);		else if( tmp+(1<<num_loop_ver) <= MB_SIZE-1 ) 	start_v = tmp+(1<<(num_loop_ver)) ;			else											printf("Out of Sampling Ratio\n");		for(i=start_v;i<(height-4);i+=v_scan_freq){			if( *(VerSamplingChk+i) == 1) continue;			for(j=start_h;j<(width-4);j+=h_scan_freq){				current=(*(smb_data+i*width+j) == MPEG4_OPAQUE);				if(i-v_scan_freq < -2)	prev=(*(smb_data+(-2)*width+j) == MPEG4_OPAQUE);				else 					prev=(*(smb_data+(i-v_scan_freq)*width+j) == MPEG4_OPAQUE);				if(i+v_scan_freq > 17)	next=(*(smb_data+(17)*width+j) == MPEG4_OPAQUE);				else					next=(*(smb_data+(i+v_scan_freq)*width+j) == MPEG4_OPAQUE);				if ( i+skip_ver >15)	skip_bottom = MB_SIZE+1-i;				else					skip_bottom = skip_ver;				if ( i-skip_ver <0)		skip_upper = i+2;				else					skip_upper = skip_ver;				type_id = contextSIHorizontal(smb_data+i*width+j,skip_upper, skip_bottom);				if(prev==next){					type_id_mis[match_cnt][0]=type_id;					type_id_mis[match_cnt][1]=current;					type_id_mis[match_cnt][2]=i;					type_id_mis[match_cnt][3]=j;					if(prev!=current) mismatch_cnt++;					match_cnt++;				}				if(prev!=next){					type_id_mis[match_cnt][0]=type_id;					type_id_mis[match_cnt][1]=2+current;					type_id_mis[match_cnt][2]=i;					type_id_mis[match_cnt][3]=j;					xor_cnt++;					match_cnt++;				}				sample_cnt++;			}		}	}	i=0;		while (*(VerSamplingChk+i) == 1)	i++;	while(*(VerSamplingChk+i) == 0)		i++;	if(i>start_v && residual_scanning_ver) tmp = start_v;	else tmp = i;	while (num_loop_ver > 0) {		start_h = 0;		start_v = 0;		v_scan_freq=1<<num_loop_ver; 		h_scan_freq=1;		if( tmp-(1<<(num_loop_ver-1)) >= 0 ) 	tmp = start_v = tmp-(1<<(num_loop_ver-1));		else									start_v = tmp+(1<<(num_loop_ver-1)) ;				skip_ver = 1<<(num_loop_ver-1);		for(i=start_v;i<(height-4);i+=v_scan_freq){			for(j=start_h;j<(width-4);j+=h_scan_freq){				current=(*(smb_data+i*width+j) == MPEG4_OPAQUE);				if(i-skip_ver < -2)	prev=(*(smb_data+(-2)*width+j) == MPEG4_OPAQUE);				else 				prev=(*(smb_data+(i-skip_ver)*width+j) == MPEG4_OPAQUE);				if(i+skip_ver > 17)	next=(*(smb_data+(17)*width+j) == MPEG4_OPAQUE);				else				next=(*(smb_data+(i+skip_ver)*width+j) == MPEG4_OPAQUE);				if(i - skip_ver < 0)	skip_upper = i +2;				else					skip_upper = skip_ver;				if(i + skip_ver > 15)	skip_bottom = MB_SIZE+1 - i ;				else					skip_bottom = skip_ver;				type_id = contextSIHorizontal(smb_data+i*width+j,skip_upper,skip_bottom);				if(prev==next){					type_id_mis[match_cnt][0]=type_id;					type_id_mis[match_cnt][1]=current;					type_id_mis[match_cnt][2]=i;					type_id_mis[match_cnt][3]=j;					if(prev!=current) mismatch_cnt++;					match_cnt++;				}				if(prev!=next){					type_id_mis[match_cnt][0]=type_id;					type_id_mis[match_cnt][1]=2+current;					type_id_mis[match_cnt][2]=i;					type_id_mis[match_cnt][3]=j;					xor_cnt++;					match_cnt++;				}				sample_cnt++;			}		}		num_loop_ver--;	}	*no_mismatch=mismatch_cnt;	*no_match=match_cnt;	*no_xor=xor_cnt;}//~OBSS_SAIT_991015Int CVideoObject::contextIntra (const PixelC* ppxlcSrc){	Int iContext = 0, i;	static Int rgiNeighbourIndx [10];	rgiNeighbourIndx [0] = -1;	rgiNeighbourIndx [1] = -2;	rgiNeighbourIndx [2] = -m_iWidthCurrBAB + 2;	rgiNeighbourIndx [3] = -m_iWidthCurrBAB + 1;	rgiNeighbourIndx [4] = -m_iWidthCurrBAB;	rgiNeighbourIndx [5] = -m_iWidthCurrBAB - 1;	rgiNeighbourIndx [6] = -m_iWidthCurrBAB - 2;	rgiNeighbourIndx [7] = -2 * m_iWidthCurrBAB + 1;	rgiNeighbourIndx [8] = -2 * m_iWidthCurrBAB;	rgiNeighbourIndx [9] = -2 * m_iWidthCurrBAB - 1;	for (i = 0; i < 10; i++)		iContext += (ppxlcSrc [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i;	assert (iContext >= 0 && iContext < 1024);	return iContext;}Int CVideoObject::contextIntraTranspose (const PixelC* ppxlcSrc){	Int iContext = 0, i;	static Int rgiNeighbourIndx [10];	rgiNeighbourIndx [0] = -m_iWidthCurrBAB;	rgiNeighbourIndx [1] = -2 * m_iWidthCurrBAB;	rgiNeighbourIndx [2] = -1 + 2 * m_iWidthCurrBAB;	rgiNeighbourIndx [3] = -1 + m_iWidthCurrBAB;	rgiNeighbourIndx [4] = -1;	rgiNeighbourIndx [5] = -m_iWidthCurrBAB - 1;	rgiNeighbourIndx [6] = -1 - 2 * m_iWidthCurrBAB;	rgiNeighbourIndx [7] = -2 + m_iWidthCurrBAB;	rgiNeighbourIndx [8] = -2;	rgiNeighbourIndx [9] = -2 - m_iWidthCurrBAB;	for (i = 0; i < 10; i++)		iContext += (ppxlcSrc [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i;	assert (iContext >= 0 && iContext < 1024);	return iContext;}Int CVideoObject::contextInter (const PixelC* ppxlcSrc, const PixelC* ppxlcPred){	Int i, iContext = 0;	static Int rgiNeighbourIndx [9];	Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;	rgiNeighbourIndx [0] = -1;	rgiNeighbourIndx [1] = -m_iWidthCurrBAB + 1;	rgiNeighbourIndx [2] = -m_iWidthCurrBAB;	rgiNeighbourIndx [3] = -m_iWidthCurrBAB - 1;	rgiNeighbourIndx [4] = iSizePredBAB;	rgiNeighbourIndx [5] = 1;	rgiNeighbourIndx [6] = 0;	rgiNeighbourIndx [7] = -1;	rgiNeighbourIndx [8] = -iSizePredBAB;	for (i = 0; i < 4; i++)	{		iContext += (ppxlcSrc [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i;	}	for (i = 4; i < 9; i++)	{		iContext += (ppxlcPred [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i;	}	assert (iContext >= 0 && iContext < 1024);	return iContext;}Int CVideoObject::contextInterTranspose (const PixelC* ppxlcSrc, const PixelC* ppxlcPred){	Int i, iContext = 0;	static Int rgiNeighbourIndx [9];	Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;	rgiNeighbourIndx [0] = -m_iWidthCurrBAB;	rgiNeighbourIndx [1] = m_iWidthCurrBAB - 1;	rgiNeighbourIndx [2] = -1;	rgiNeighbourIndx [3] = -m_iWidthCurrBAB - 1;	rgiNeighbourIndx [4] = 1;	rgiNeighbourIndx [5] = iSizePredBAB;	rgiNeighbourIndx [6] = 0;	rgiNeighbourIndx [7] = -iSizePredBAB;	rgiNeighbourIndx [8] = -1;		for (i = 0; i < 4; i++)		iContext += (ppxlcSrc [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i;	for (i = 4; i < 9; i++)		iContext += (ppxlcPred [rgiNeighbourIndx [i]] == MPEG4_OPAQUE) << i;	assert (iContext >= 0 && iContext < 1024);	return iContext;}Void CVideoObject::copyReconShapeToMbAndRef (	PixelC* ppxlcDstMB, 	PixelC* ppxlcRefFrm, PixelC pxlcSrc){	pxlcmemset (ppxlcDstMB, pxlcSrc, MB_SQUARE_SIZE); // Modified by swinder	for (Int i = 0; i < MB_SIZE; i++)	{		pxlcmemset (ppxlcRefFrm, pxlcSrc, MB_SIZE);		ppxlcRefFrm += m_iFrameWidthY;	}}Void CVideoObject::copyReconShapeUVToRef (	PixelC* ppxlcRefFrm, const PixelC* ppxlcSrc){	for (Int i = 0; i < BLOCK_SIZE; i++)	{		memcpy (ppxlcRefFrm, ppxlcSrc, BLOCK_SIZE*sizeof(PixelC));		ppxlcRefFrm += m_iFrameWidthUV;		ppxlcSrc += BLOCK_SIZE;	}}Void CVideoObject::copyReconShapeToMbAndRef (	PixelC* ppxlcDstMB, 	PixelC* ppxlcRefFrm, 	const PixelC* ppxlcSrc, Int iSrcWidth, Int iBorder){	Int iUnit = sizeof(PixelC); // NBIT: for memcpy	ppxlcSrc += iSrcWidth * iBorder + iBorder;	for (Int i = 0; i < MB_SIZE; i++)	{		memcpy (ppxlcDstMB, ppxlcSrc, MB_SIZE*iUnit);		memcpy (ppxlcRefFrm, ppxlcSrc, MB_SIZE*iUnit);		ppxlcRefFrm += m_iFrameWidthY;		ppxlcDstMB  += MB_SIZE;		ppxlcSrc += iSrcWidth;	}}CMotionVector CVideoObject::findShapeMVP (	const CMotionVector* pmv, const CMotionVector* pmvBY, 	const CMBMode* pmbmd,	Int iMBX, Int iMBY) const{	CMotionVector mvRet;	// try shape vector first	Bool bLeftBndry, bRightBndry, bTopBndry;	Int iMBnum = VPMBnum(iMBX, iMBY);	bLeftBndry = bVPNoLeft(iMBnum, iMBX);	bTopBndry = bVPNoTop(iMBnum);	bRightBndry = bVPNoRightTop(iMBnum, iMBX);//OBSS_SAIT_991015	if (iMBX==0 && iMBY==0) {		mvRet.iMVX = mvRet.iMVY = mvRet.iHalfX  =mvRet.iHalfY = 0;		}	else mvRet = *(pmvBY - 1);	/* !!!	mvRet = *(pmvBY - 1);	*///~OBSS_SAIT_991015//	Modified for error resilient mode by Toshiba(1997-11-14)//	if ((iMBX > 0) && ((pmbmd - 1)->m_shpmd == INTER_CAE_MVDZ ||	if (!bLeftBndry && ((pmbmd - 1)->m_shpmd == INTER_CAE_MVDZ ||		(pmbmd - 1)->m_shpmd == INTER_CAE_MVDNZ ||		(pmbmd - 1)->m_shpmd == MVDZ_NOUPDT ||		(pmbmd - 1)->m_shpmd == MVDNZ_NOUPDT))		return mvRet;	if (iMBY > 0)   {		mvRet = *(pmvBY - m_iNumMBX);//	Modified for error resilient mode by Toshiba(1997-11-14)//		if ((pmbmd - m_iNumMBX)->m_shpmd == INTER_CAE_MVDZ ||		if (!bTopBndry && ((pmbmd - m_iNumMBX)->m_shpmd == INTER_CAE_MVDZ ||			(pmbmd - m_iNumMBX)->m_shpmd == INTER_CAE_MVDNZ ||			(pmbmd - m_iNumMBX)->m_shpmd == MVDZ_NOUPDT ||			(pmbmd - m_iNumMBX)->m_shpmd == MVDNZ_NOUPDT//	Modified for error resilient mode by Toshiba(1997-11-14)//		)		))			return mvRet;					mvRet = *(pmvBY - m_iNumMBX + 1);//	Modified for error resilient mode by Toshiba(1997-11-14)//		if ((iMBX < m_iNumMBX - 1) && ((pmbmd - m_iNumMBX + 1)->m_shpmd == INTER_CAE_MVDZ ||		if (!bRightBndry && ((pmbmd - m_iNumMBX + 1)->m_shpmd == INTER_CAE_MVDZ ||			(pmbmd - m_iNumMBX + 1)->m_shpmd == INTER_CAE_MVDNZ ||			(pmbmd - m_iNumMBX + 1)->m_shpmd == MVDZ_NOUPDT ||			(pmbmd - m_iNumMBX + 1)->m_shpmd == MVDNZ_NOUPDT)		)			return mvRet;	}	// try texture vector then; truncate half pel	if(m_volmd.bShapeOnly==FALSE && (m_vopmd.vopPredType==PVOP || (m_uiSprite == 2 && m_vopmd.vopPredType==SPRITE))) // GMC	{	  Int iSubDim;	  if (m_volmd.bQuarterSample) // Quarter sample	    iSubDim = 4;	  else	    iSubDim = 2;//	Modified for error resilient mode by Toshiba(1997-11-14)//		if (iMBX != 0 && validBlock (pmbmd - 1, gIndexOfCandBlk [1] [0]))		if (!bLeftBndry && validBlock (pmbmd, pmbmd - 1, gIndexOfCandBlk [1] [0]))// GMC			if(!((pmbmd-1)->m_bMCSEL)){// ~GMC				return CMotionVector ((pmv - PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [0])->m_vctTrueHalfPel.x / iSubDim,								  (pmv - PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [0])->m_vctTrueHalfPel.y / iSubDim);// GMC			}else{				return CMotionVector ();			}// ~GMC		if (iMBY != 0)   {//	Modified for error resilient mode by Toshiba(1997-11-14)//			if (validBlock (pmbmd - m_iNumMBX, gIndexOfCandBlk [1] [1]))			if (!bTopBndry && validBlock (pmbmd, pmbmd - m_iNumMBX, gIndexOfCandBlk [1] [1]))// GMC				if(!((pmbmd-m_iNumMBX)->m_bMCSEL)){// ~GMC					return CMotionVector ((pmv - m_iNumOfTotalMVPerRow + gIndexOfCandBlk [1] [1])->m_vctTrueHalfPel.x / iSubDim,									  (pmv - m_iNumOfTotalMVPerRow + gIndexOfCandBlk [1] [1])->m_vctTrueHalfPel.y / iSubDim);// GMC				}else{					return CMotionVector ();				}// ~GMC//	Modified for error resilient mode by Toshiba(1997-11-14)//			if (iMBX < m_iNumMBX - 1 && validBlock (pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [1] [2]))			if (!bRightBndry && validBlock (pmbmd, pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [1] [2]))// GMC				if(!((pmbmd-m_iNumMBX + 1)->m_bMCSEL)){// ~GMC					return CMotionVector ((pmv - m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [2])->m_vctTrueHalfPel.x / iSubDim,									  (pmv - m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [2])->m_vctTrueHalfPel.y / iSubDim);// GMC				}else{					return CMotionVector ();				}// ~GMC		}	}	return CMotionVector ();																		}

⌨️ 快捷键说明

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