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

📄 vopses.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}Void CVideoObject::computeVOLConstMembers (){	m_iOffsetForPadY = m_rctRefFrameY.offset (m_rctCurrVOPY.left, m_rctCurrVOPY.top);	m_iOffsetForPadUV = m_rctRefFrameUV.offset (m_rctCurrVOPUV.left, m_rctCurrVOPUV.top);	m_rctPrevNoExpandY = m_rctCurrVOPY;	m_rctPrevNoExpandUV = m_rctCurrVOPUV;	m_iVOPWidthY = m_rctCurrVOPY.width;	m_iVOPWidthUV = m_rctCurrVOPUV.width;	m_iNumMBX = m_iNumMBXRef = m_iVOPWidthY / MB_SIZE; 	m_iNumMBY = m_iNumMBYRef = m_rctCurrVOPY.height () / MB_SIZE;	m_iNumMB = m_iNumMBRef = m_iNumMBX * m_iNumMBY;	m_iNumOfTotalMVPerRow = PVOP_MV_PER_REF_PER_MB * m_iNumMBX;	setRefStartingPointers ();	m_pvopcCurrQ->setBoundRct (m_rctCurrVOPY);	m_pvopcRefQ0->setBoundRct (m_rctRefVOPY0);	m_pvopcRefQ1->setBoundRct (m_rctRefVOPY1);	Int iMB, iBlk;	Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 6+m_volmd.iAuxCompCount*4 : 6;	m_rgblkmCurrMB = (const BlockMemory *)new BlockMemory [nBlk];	m_rgpmbmAbove = new MacroBlockMemory* [m_iNumMBX];	m_rgpmbmCurr  = new MacroBlockMemory* [m_iNumMBX];	for (iMB = 0; iMB < m_iNumMBX; iMB++)	{		m_rgpmbmAbove [iMB] = new MacroBlockMemory;		m_rgpmbmAbove [iMB]->rgblkm = new BlockMemory [nBlk];		m_rgpmbmCurr  [iMB] = new MacroBlockMemory;		m_rgpmbmCurr  [iMB]->rgblkm = new BlockMemory [nBlk];		for (iBlk = 0; iBlk < nBlk; iBlk++)	{			(m_rgpmbmAbove [iMB]->rgblkm) [iBlk] = new Int [(BLOCK_SIZE << 1) - 1];			(m_rgpmbmCurr  [iMB]->rgblkm) [iBlk] = new Int [(BLOCK_SIZE << 1) - 1];		}	}}Void CVideoObject::computeVOPMembers (){	m_iVOPWidthY = m_rctCurrVOPY.width;	m_iVOPWidthUV = m_rctCurrVOPUV.width;	m_iNumMBX = m_iVOPWidthY / MB_SIZE; 	m_iNumMBY = m_rctCurrVOPY.height () / MB_SIZE;	m_iNumMB = m_iNumMBX * m_iNumMBY;	m_iNumOfTotalMVPerRow = PVOP_MV_PER_REF_PER_MB * m_iNumMBX;	Int iMB, iBlk;	Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 6+m_volmd.iAuxCompCount*4 : 6;	m_rgblkmCurrMB = (const BlockMemory *)new BlockMemory [nBlk];	m_rgpmbmAbove = new MacroBlockMemory* [m_iNumMBX];	m_rgpmbmCurr  = new MacroBlockMemory* [m_iNumMBX];	for (iMB = 0; iMB < m_iNumMBX; iMB++)	{		m_rgpmbmAbove [iMB] = new MacroBlockMemory;		m_rgpmbmAbove [iMB]->rgblkm = new BlockMemory [nBlk];		m_rgpmbmCurr  [iMB] = new MacroBlockMemory;		m_rgpmbmCurr  [iMB]->rgblkm = new BlockMemory [nBlk];		for (iBlk = 0; iBlk < nBlk; iBlk++)	{			// BLOCK_SIZE*2-1 is 15 Ints for dc/ac prediction of coefficients			(m_rgpmbmAbove [iMB]->rgblkm) [iBlk] = new Int [(BLOCK_SIZE << 1) - 1];			(m_rgpmbmCurr  [iMB]->rgblkm) [iBlk] = new Int [(BLOCK_SIZE << 1) - 1];		}	}}Void CVideoObject::repeatPadYOrA (PixelC* ppxlcOldLeft, CVOPU8YUVBA* pvopcRef){	Int iScale	= (m_vopmd.RRVmode.iOnOff == 1) ? (2) : (1);	Int iExpand = EXPANDY_REFVOP * iScale;	Int iStride = pvopcRef->whereY ().width;	Int iOldWidth = (m_volmd.fAUsage == RECTANGLE) ? m_ivolWidth : m_rctPrevNoExpandY.width;	Int iOldHeight = (m_volmd.fAUsage == RECTANGLE) ? m_ivolHeight : m_rctPrevNoExpandY.height();	PixelC* ppxlcLeftTop = ppxlcOldLeft - iExpand * iStride - iExpand;	Int iExpandR = iExpand + MB_SIZE * ((iOldWidth + MB_SIZE - 1)/MB_SIZE) - iOldWidth;	Int iExpandB = iExpand + MB_SIZE * ((iOldHeight + MB_SIZE - 1)/MB_SIZE) - iOldHeight; // extra is added for non mb-multiple sizes	Int iNewWidth = iExpand + iOldWidth + iExpandR;	const PixelC* ppxlcOldRight = ppxlcOldLeft + iOldWidth - 1;	const PixelC* ppxlcOldTopLn = ppxlcOldLeft - iExpand;	PixelC* ppxlcNewLeft = (PixelC*) ppxlcOldTopLn;	PixelC* ppxlcNewRight = (PixelC*) ppxlcOldRight + 1;	CoordI y;	Int i;	for (y = 0; y < iOldHeight; y++) {		for (i=0; i<iExpand; i++)			ppxlcNewLeft[i] = *ppxlcOldLeft;		for (i=0; i<iExpandR; i++)			ppxlcNewRight[i] = *ppxlcOldRight;		ppxlcNewLeft += iStride;				ppxlcNewRight += iStride;		ppxlcOldLeft += iStride;		ppxlcOldRight += iStride;	}	const PixelC* ppxlcOldBotLn = ppxlcNewLeft - iStride;	for (y = 0; y < iExpand; y++) {		memcpy (ppxlcLeftTop, ppxlcOldTopLn, iNewWidth * sizeof(PixelC));		ppxlcLeftTop += iStride;	}	for (y = 0; y < iExpandB; y++) {			memcpy (ppxlcNewLeft, ppxlcOldBotLn, iNewWidth * sizeof(PixelC));		ppxlcNewLeft += iStride;	}}Void CVideoObject::repeatPadUV (CVOPU8YUVBA* pvopcRef){	Int iScale	= (m_vopmd.RRVmode.iOnOff == 1) ? (2) : (1);	Int iExpand = EXPANDUV_REFVOP * iScale;	Int iStride = pvopcRef->whereUV ().width;	Int iOldWidth = (m_volmd.fAUsage == RECTANGLE) ? m_ivolWidth/2 : m_rctPrevNoExpandUV.width;	Int iOldHeight = (m_volmd.fAUsage == RECTANGLE) ? m_ivolHeight/2 : m_rctPrevNoExpandUV.height();	Int iMBSize = MB_SIZE>>1;	Int iExpandR = iExpand + iMBSize * ((iOldWidth + iMBSize - 1)/iMBSize) - iOldWidth;	Int iExpandB = iExpand + iMBSize * ((iOldHeight + iMBSize - 1)/iMBSize) - iOldHeight; // extra is added for non mb-multiple sizes	Int iNewWidth = iExpand + iOldWidth + iExpandR;	const PixelC* ppxlcOldLeftU = pvopcRef->pixelsU () + m_iOffsetForPadUV; // point to the left-top of bounding box	const PixelC* ppxlcOldLeftV = pvopcRef->pixelsV () + m_iOffsetForPadUV; // point to the left-top of bounding box	PixelC* ppxlcLeftTopU = (PixelC*) ppxlcOldLeftU - iExpand * iStride - iExpand;	PixelC* ppxlcLeftTopV = (PixelC*) ppxlcOldLeftV - iExpand * iStride - iExpand;		// point to the left top of the expanded bounding box (+- EXPANDY_REFVOP)	const PixelC* ppxlcOldRightU = ppxlcOldLeftU + iOldWidth - 1;	const PixelC* ppxlcOldRightV = ppxlcOldLeftV + iOldWidth - 1;		// point to the right-top of the bounding box	const PixelC* ppxlcOldTopLnU = ppxlcOldLeftU - iExpand;	const PixelC* ppxlcOldTopLnV = ppxlcOldLeftV - iExpand;	PixelC* ppxlcNewLeftU = (PixelC*) ppxlcOldTopLnU;	PixelC* ppxlcNewLeftV = (PixelC*) ppxlcOldTopLnV;	PixelC* ppxlcNewRightU = (PixelC*) ppxlcOldRightU + 1;	PixelC* ppxlcNewRightV = (PixelC*) ppxlcOldRightV + 1;		CoordI y;	for (y = 0; y < iOldHeight; y++) {		Int i;		for (i=0; i<iExpand; i++) {			ppxlcNewLeftU[i] = *ppxlcOldLeftU;			ppxlcNewLeftV[i] = *ppxlcOldLeftV;		}		for (i=0; i<iExpandR; i++) {			ppxlcNewRightU[i] = *ppxlcOldRightU;			ppxlcNewRightV[i] = *ppxlcOldRightV;		}				ppxlcNewLeftU += iStride;				ppxlcNewLeftV += iStride;				ppxlcNewRightU += iStride;		ppxlcNewRightV += iStride;		ppxlcOldLeftU += iStride;		ppxlcOldLeftV += iStride;		ppxlcOldRightU += iStride;		ppxlcOldRightV += iStride;	}	const PixelC* ppxlcOldBotLnU = ppxlcNewLeftU - iStride;	const PixelC* ppxlcOldBotLnV = ppxlcNewLeftV - iStride;	for (y = 0; y < iExpand; y++) {		memcpy (ppxlcLeftTopU, ppxlcOldTopLnU, iNewWidth * sizeof(PixelC));		memcpy (ppxlcLeftTopV, ppxlcOldTopLnV, iNewWidth * sizeof(PixelC));		ppxlcLeftTopU += iStride;		ppxlcLeftTopV += iStride;	}	for (y = 0; y < iExpandB; y++) {		memcpy (ppxlcNewLeftU, ppxlcOldBotLnU, iNewWidth * sizeof(PixelC));		memcpy (ppxlcNewLeftV, ppxlcOldBotLnV, iNewWidth * sizeof(PixelC));		ppxlcNewLeftU += iStride;		ppxlcNewLeftV += iStride;	}//	pvopcRef->dump("bar.yuv");}Void CVideoObject::saveShapeMode(){	// called after reference frame encode/decode	if(m_rgshpmd == NULL)	{		// first time		m_iRefShpNumMBX = m_iNumMBX;		m_iRefShpNumMBY = m_iNumMBY;		m_rgshpmd = new ShapeMode [m_iNumMB];	}	else	{		// update if changed		if(m_iRefShpNumMBX!=m_iNumMBXRef || m_iRefShpNumMBY != m_iNumMBYRef)		{			delete [] m_rgshpmd;			m_rgshpmd = new ShapeMode [m_iNumMBRef];			m_iRefShpNumMBX = m_iNumMBXRef;			m_iRefShpNumMBY = m_iNumMBYRef;		}		// copy shape mode from previous ref to save		Int i;		for (i=0; i<m_iNumMBRef; i++ )			m_rgshpmd[i] = m_rgmbmdRef[i].m_shpmd;	}}//OBSS_SAIT_991015Void CVideoObject::saveBaseShapeMode(){	// called after reference frame encode/decode	if(m_rgBaseshpmd == NULL){		// first time		m_iNumMBBaseXRef = m_iNumMBX;							m_iNumMBBaseYRef = m_iNumMBY;							// save current shape mode for enhancement layer shape mode coding		if(m_volmd.volType == BASE_LAYER) {													m_rgBaseshpmd = new ShapeMode [m_iNumMB];			// first time			m_iRefShpNumMBX = m_iNumMBX;			m_iRefShpNumMBY = m_iNumMBY;						Int i;			Int iMBX, iMBY;			for (iMBY=0, i=0; iMBY<m_iNumMBY; iMBY++ ) {				for (iMBX=0; iMBX<m_iNumMBX; iMBX++ ) {					m_rgBaseshpmd[i] = m_rgmbmd[i].m_shpmd;					i++;				}			}		}	} else {		// update if changed		if(m_volmd.volType == BASE_LAYER) {							//for save lower layer shape mode			if(m_iNumMBBaseXRef!=m_iNumMBX || m_iNumMBBaseYRef != m_iNumMBY){				delete [] m_rgBaseshpmd;				m_rgBaseshpmd = new ShapeMode [m_iNumMB];				m_iNumMBBaseXRef = m_iNumMBX;						m_iNumMBBaseYRef = m_iNumMBY;					}			Int i=0;			Int iMBX, iMBY;			for (iMBY=0, i=0; iMBY<m_iNumMBY; iMBY++ ){ 				for (iMBX=0; iMBX<m_iNumMBX; iMBX++ ){						m_rgBaseshpmd[i] = m_rgmbmd[i].m_shpmd;						i++;				}			}			m_iNumMBBaseXRef = m_iNumMBX;								m_iNumMBBaseYRef = m_iNumMBY;								//for save lawer layer shape mode		}		}}//~OBSS_SAIT_991015Void CVideoObject::resetBYPlane (){	if (m_vopmd.vopPredType == PVOP || m_vopmd.vopPredType == IVOP || (m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)) { // GMC		PixelC* ppxlcBY = (PixelC*) m_pvopcRefQ1->pixelsBY ();		memset (ppxlcBY, 0, m_pvopcRefQ1->whereY().area() * sizeof(PixelC));	}	else {		PixelC* ppxlcBY = (PixelC*) m_pvopcCurrQ->pixelsBY ();		memset (ppxlcBY, 0, m_pvopcCurrQ->whereY().area() * sizeof(PixelC));	}}Void CVideoObject::updateAllRefVOPs ()// perform this after VOP prediction type decided and before encoding{	if (m_vopmd.vopPredType != BVOP) {		m_rctRefVOPY0 = m_rctRefVOPY1;		swapVOPU8Pointers (m_pvopcRefQ0, m_pvopcRefQ1);	}}// for spatial scalabilityVoid CVideoObject::updateAllRefVOPs (const CVOPU8YUVBA* pvopcRefBaseLayer){	CVOPU8YUVBA *pvopcUpSampled = NULL;	//	Int fEnhancementLayer = 0;	assert (m_volmd.volType == ENHN_LAYER);//OBSS_SAIT_991015	pvopcUpSampled = pvopcRefBaseLayer->upsampleForSpatialScalability (													m_volmd.iver_sampling_factor_m,													m_volmd.iver_sampling_factor_n,													m_volmd.ihor_sampling_factor_m,													m_volmd.ihor_sampling_factor_n,													m_volmd.iver_sampling_factor_m_shape,													m_volmd.iver_sampling_factor_n_shape,													m_volmd.ihor_sampling_factor_m_shape,													m_volmd.ihor_sampling_factor_n_shape,													m_volmd.iFrmWidth_SS,				 													m_volmd.iFrmHeight_SS,				 													m_volmd.bShapeOnly,					 													EXPANDY_REF_FRAME,													EXPANDUV_REF_FRAME);//~OBSS_SAIT_991015	if(m_vopmd.vopPredType == PVOP || (m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)) { // GMC//OBSS_SAIT_991015		if(m_volmd.fAUsage == RECTANGLE) {			m_rctRefVOPY0 = m_rctRefVOPY1;			}//OBSSFIX__000323		else if(m_volmd.bSpatialScalability && m_volmd.iHierarchyType == 0 && m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape == 1){//			m_rctRefVOPY0 = m_rctRefVOPY1;			if(pvopcUpSampled->fAUsage() == RECTANGLE)				m_rctRefVOPY0 = pvopcUpSampled->whereY();			else{				CRct tmp;				tmp = m_rctBase;				tmp.left = (int)((tmp.left) * (m_volmd.ihor_sampling_factor_n_shape)/(m_volmd.ihor_sampling_factor_m_shape));				tmp.right = (int)((tmp.right) * (m_volmd.ihor_sampling_factor_n_shape)/(m_volmd.ihor_sampling_factor_m_shape));				tmp.top = (int)((tmp.top) * (m_volmd.iver_sampling_factor_n_shape)/(m_volmd.iver_sampling_factor_m_shape));				tmp.bottom = (int)((tmp.bottom) * (m_volmd.iver_sampling_factor_n_shape)/(m_volmd.iver_sampling_factor_m_shape));				tmp.width = tmp.right - tmp.left ;				tmp.left -= 32; tmp.right += 32;				tmp.top -= 32; tmp.bottom += 32;				tmp.width += 64;//OBSS_SAIT_FIX000524				if(!( tmp <= pvopcUpSampled->whereY () )) {					if(!(tmp.left >= (pvopcUpSampled->whereY ()).left))						tmp.left = (pvopcUpSampled->whereY ()).left;					if(!(tmp.top >= (pvopcUpSampled->whereY ()).top))						tmp.top = (pvopcUpSampled->whereY ()).top;					if(!(tmp.right <= (pvopcUpSampled->whereY ()).right))						tmp.right = (pvopcUpSampled->whereY ()).right;					if(!(tmp.bottom <= (pvopcUpSampled->whereY ()).bottom))						tmp.bottom = (pvopcUpSampled->whereY ()).bottom;				}//~OBSS_SAIT_FIX000524				m_rctRefVOPY0 = tmp;	// m_rctBase : BASE_LAYER RECT SIZE			}		}//~OBSSFIX__000323		else if(m_volmd.fAUsage == ONE_BIT) {					CRct tmp;			tmp = m_rctBase;			tmp.left = (int)((tmp.left) * (m_volmd.ihor_sampling_factor_n_shape)/(m_volmd.ihor_sampling_factor_m_shape));			tmp.right = (int)((tmp.right) * (m_volmd.ihor_sampling_factor_n_shape)/(m_volmd.ihor_sampling_factor_m_shape));			tmp.top = (int)((tmp.top) * (m_volmd.iver_sampling_factor_n_shape)/(m_volmd.iver_sampling_factor_m_shape));			tmp.bottom = (int)((tmp.bottom) * (m_volmd.iver_sampling_factor_n_shape)/(m_volmd.iver_sampling_factor_m_shape));			tmp.width = tmp.right - tmp.left ;			tmp.left -= 32; tmp.right += 32;			tmp.top -= 32; tmp.bottom += 32;			tmp.width += 64;//OBSS_SAIT_FIX000524			if(!( tmp <= pvopcUpSampled->whereY () )) {				if(!(tmp.left >= (pvopcUpSampled->whereY ()).left))					tmp.left = (pvopcUpSampled->whereY ()).left;				if(!(tmp.top >= (pvopcUpSampled->whereY ()).top))					tmp.top = (pvopcUpSampled->whereY ()).top;				if(!(tmp.right <= (pvopcUpSampled->whereY ()).right))					tmp.right = (pvopcUpSampled->whereY ()).right;				if(!(tmp.bottom <= (pvopcUpSampled->whereY ()).bottom))					tmp.bottom = (pvopcUpSampled->whereY ()).bottom;			}//~OBSS_SAIT_FIX000524			m_rctRefVOPY0 = tmp;	// m_rctBase : BASE_LAYER RECT SIZE		}//~OBSS_SAIT_991015		swapVOPU8Pointers (m_pvopcRefQ0,pvopcUpSampled);		m_pvopcRefQ0->setBoundRct(m_rctRefVOPY0);		delete pvopcUpSampled;	}	else if(m_vopmd.vopPredType == BVOP){		CRct tmp;//OBSS_SAIT_991015		if(m_volmd.fAUsage == RECTANGLE) {			tmp = m_rctRefVOPY0; 		}//OBSSFIX_MODE3_02		else if(m_volmd.bSpatialScalability && m_volmd.iHierarchyType == 0 && m_volmd.iEnhnType != 0 && m_volmd.iuseRefShape == 1){//			tmp = pvopcUpSampled->whereY();			if(pvopcUpSampled->fAUsage()==RECTANGLE)				tmp = pvopcUpSampled->whereY();			else{				tmp = m_rctBase;				tmp.left = (int)((tmp.left) * (m_volmd.ihor_sampling_factor_n_shape)/(m_volmd.ihor_sampling_factor_m_shape));				tmp.right = (int)((tmp.right) * (m_volmd.ihor_sampling_factor_n_shape)/(m_volmd.ihor_sampling_factor_m_shape));				tmp.top = (int)((tmp.top) * (m_volmd.iver_sampling_factor_n_shape)/(m_volmd.iver_sampling_factor_m_shape));				tmp.bottom = (int)((tmp.bottom) * (m_volmd.iver_sampling_factor_n_shape)/(m_volmd.iver_sampling_factor_m_shape));				tmp.width = tmp.right - tmp.left ;				tmp.left -= 32; tmp.right += 32;				tmp.top -= 32; tmp.bottom += 32;				tmp.width += 64;//OBSS_SAIT_FIX000524				if(!( tmp <= pvopcUpSampled->whereY () )) {					if(!(tmp.left >= (pvopcUpSampled->whereY ()).left))						tmp.left = (pvopcUpSampled->whereY ()).left;					if(!(tmp.top >= (pvopcUpSampled->whereY ()).top))						tmp.top = (pvopcUpSampled->whereY ()).top;					if(!(tmp.right <= (pvopcUpSampled->whereY ()).right))

⌨️ 快捷键说明

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