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

📄 sys_encoder_mcenc.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*************************************************************************This software module was originally developed by 	Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation	Bruce Lin (blin@microsoft.com), Microsoft Corporation	Simon Winder (swinder@microsoft.com), Microsoft Corporation	(date: June, 1997)and edited by        Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Centerand also edited by    Mathias Wien (wien@ient.rwth-aachen.de) RWTH Aachen / Robert BOSCH GmbHand also edited by	Yoshinori Suzuki (Hitachi, Ltd.)and also edited by	Hideaki Kimata (NTT)in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). This software module is an implementation of a part of one or more MPEG-4 Video tools as specified by the MPEG-4 Video. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. The original developer of this software module and his/her company, the subsequent editors and their companies, and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. Copyright is not released for non MPEG-4 Video conforming products. Microsoft retains full right to use the code for his/her own purpose, assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. This copyright notice must be included in all copies or derivative works. Copyright (c) 1996, 1997.Module Name:	mcenc.cppAbstract:	Motion compensation routines for encoder.Revision History:	Dec 20, 1997:	Interlaced tools added by NextLevel Systems    Feb.16, 1999:   add Quarter Sample                     Mathias Wien (wien@ient.rwth-aachen.de) 	Feb 23, 1999:	GMC added by Yoshinori Suzuki (Hitachi, Ltd.)	Aug.24, 1999:   NEWPRED added by Hideaki Kimata (NTT) *************************************************************************/#include <stdio.h>#include <math.h>#include <stdlib.h>#include <iostream>#include "typeapi.h"#include "codehead.h"#include "global.hpp"#include "bitstrm.hpp"#include "entropy.hpp"#include "huffman.hpp"#include "mode.hpp"#include "vopses.hpp"#include "vopseenc.hpp"// NEWPRED#include "newpred.hpp"// ~NEWPRED#ifdef __MFC_#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define new DEBUG_NEW				   #endif // __MFC_#define OFFSET_BLK1 8#define OFFSET_BLK2 128#define OFFSET_BLK3 136Void CVideoObjectEncoder::motionCompMBYEnc (											const CMotionVector* pmv, const CMBMode* pmbmd, 											Int imbX, Int imbY,											CoordI x, CoordI y,											CRct *prctMVLimit											){	// should use functions in ./sys/mc.cpp:	motionCompMB (m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),		pmv, pmbmd, 		imbX, imbY, 		x, y,		FALSE, FALSE,		&m_rctRefVOPY0		);		if(m_volmd.fAUsage == EIGHT_BIT) {		for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 29-Nov-99			motionCompMB (				m_ppxlcPredMBA[iAuxComp], m_pvopcRefQ0->pixelsA (iAuxComp),				pmv, pmbmd, 				imbX, imbY, 				x, y,				FALSE, TRUE,				&m_rctRefVOPY0				);		}	}	//	//	if (!m_volmd.bAdvPredDisable  && !pmbmd -> m_bMCSEL && !pmbmd->m_bFieldMV) { // GMC	// 		motionCompOverLapEncY (	// 			pmv, pmbmd,	// 			(imbX == 0), (imbX == m_iNumMBX - 1), (imbY == 0),	// 			x, y,	// 			prctMVLimit	// 		);	// 	}	// 	else {	//		if (!pmbmd -> m_bhas4MVForward && !pmbmd -> m_bFieldMV && !pmbmd -> m_bMCSEL) // ~GMC	// 			motionCompEncY (	// 				m_pvopcRefQ0->pixelsY (), 	// 				m_puciRefQZoom0->pixels (),	// 				m_ppxlcPredMBY, MB_SIZE, pmv, x, y,	// 				prctMVLimit	// 			);	// // INTERLACE	// 		else if (pmbmd -> m_bFieldMV) {	// 			const CMotionVector* pmvTop = pmv + 5 + pmbmd->m_bForwardTop;	// 			motionCompYField(m_ppxlcPredMBY,	// 				m_pvopcRefQ0->pixelsY () + pmbmd->m_bForwardTop * m_iFrameWidthY,	// 				2*x + pmvTop->m_vctTrueHalfPel.x, 2*y + pmvTop->m_vctTrueHalfPel.y);		// 			const CMotionVector* pmvBottom = pmv + 7 + pmbmd->m_bForwardBottom;	// 			motionCompYField(m_ppxlcPredMBY + MB_SIZE,	// 				m_pvopcRefQ0->pixelsY () + pmbmd->m_bForwardBottom * m_iFrameWidthY,	// 				2*x + pmvBottom->m_vctTrueHalfPel.x, 2*y + pmvBottom->m_vctTrueHalfPel.y);	// 		}	// // ~INTERLACE	// // GMC	//		else if (pmbmd -> m_bMCSEL) {	//			FindGlobalPredForGMC (x,y,m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY ());	//		}	// // ~GMC	// 		else {	// 			const CMotionVector* pmv8 = pmv;	// 			pmv8++;	// 			CoordI blkX = x + BLOCK_SIZE;	// 			CoordI blkY = y + BLOCK_SIZE;	// 			motionCompEncY (	// 				m_pvopcRefQ0->pixelsY (), 	// 				m_puciRefQZoom0->pixels (),	// 				m_ppxlcPredMBY, 	// 				BLOCK_SIZE, pmv8, x, y,	// 				prctMVLimit	// 			);	// 			pmv8++;	// 			motionCompEncY (	// 				m_pvopcRefQ0->pixelsY (), 	// 				m_puciRefQZoom0->pixels (),	// 				m_ppxlcPredMBY + OFFSET_BLK1, 	// 				BLOCK_SIZE, pmv8, blkX, y,	// 				prctMVLimit	// 			);	// 			pmv8++;	// 			motionCompEncY (	// 				m_pvopcRefQ0->pixelsY (), 	// 				m_puciRefQZoom0->pixels (),	// 				m_ppxlcPredMBY + OFFSET_BLK2, 	// 				BLOCK_SIZE, pmv8, x, blkY,	// 				prctMVLimit	// 			);	// 			pmv8++;	// 			motionCompEncY (	// 				m_pvopcRefQ0->pixelsY (), 	// 				m_puciRefQZoom0->pixels (),	// 				m_ppxlcPredMBY + OFFSET_BLK3, 	// 				BLOCK_SIZE, pmv8, blkX, blkY,	// 				prctMVLimit	// 			);	// 		}	// 	}	// 	if(m_volmd.fAUsage == EIGHT_BIT)	// 		motionCompMBAEnc (	// 			pmv, pmbmd,	// 			m_ppxlcPredMBA,	// 			m_pvopcRefQ0,	// 			x, y,	// 			m_vopmd.iRoundingControl,	// 			prctMVLimit	// 		);}Void CVideoObjectEncoder::motionCompMBAEnc (											const CMotionVector* pmv, const CMBMode* pmbmd, 											PixelC **pppxlcPredMBA,											CVOPU8YUVBA* pvopcRefQ,											CoordI x, CoordI y,											Int iRoundingControl,											CRct *prctMVLimit,											Int direction, //12.22.98											Int iAuxComp											){	if (!pmbmd -> m_bhas4MVForward && !pmbmd -> m_bFieldMV) //12.22.98		// GMC	{		if (pmbmd -> m_bMCSEL)			FindGlobalPredForGMC (x,y,pppxlcPredMBA[iAuxComp], pvopcRefQ->pixelsA (iAuxComp));		else{			// ~GMC			if (m_volmd.bQuarterSample) // Quarter sample				motionCompQuarterSample (				pppxlcPredMBA[iAuxComp],				pvopcRefQ->pixelsA (iAuxComp), 				MB_SIZE,				x * 4 + pmv->trueMVHalfPel ().x, 				y * 4 + pmv->trueMVHalfPel ().y ,				iRoundingControl,				prctMVLimit				);			else				motionComp (				pppxlcPredMBA[iAuxComp],				pvopcRefQ->pixelsA (iAuxComp), 				MB_SIZE,				x * 2 + pmv->trueMVHalfPel ().x, 				y * 2 + pmv->trueMVHalfPel ().y ,				iRoundingControl,				prctMVLimit				);			// GMC		}	}	// ~GMC	// INTERLACE  12.22.98	else if (pmbmd -> m_bFieldMV) {		Int itmpref1,itmpref2;				itmpref1=pmbmd->m_bForwardTop;		itmpref2=pmbmd->m_bForwardBottom;				if(m_vopmd.vopPredType==BVOP&&direction)		{			itmpref1=pmbmd->m_bBackwardTop;			itmpref2=pmbmd->m_bBackwardBottom;		}				const CMotionVector* pmvTop,*pmvBottom;		if(m_vopmd.vopPredType==BVOP)			pmvTop = pmv + 1 + itmpref1;		else			pmvTop = pmv + 5 + itmpref1;				if (m_volmd.bQuarterSample) // Quarter sample			motionCompQuarterSample (pppxlcPredMBA[iAuxComp],			pvopcRefQ->pixelsA (iAuxComp) + itmpref1 * m_iFrameWidthY,0,			4*x + pmvTop->trueMVHalfPel ().x, 			4*y + pmvTop->trueMVHalfPel ().y,			iRoundingControl, prctMVLimit			);		else			motionCompYField(pppxlcPredMBA[iAuxComp],			pvopcRefQ->pixelsA (iAuxComp) + itmpref1 * m_iFrameWidthY,			2*x + pmvTop->trueMVHalfPel ().x, 2*y + pmvTop->trueMVHalfPel ().y,			prctMVLimit); // added by Y.Suzuki for the extended bounding box support						if(m_vopmd.vopPredType==BVOP)			pmvBottom = pmv + 3 + itmpref2;		else			pmvBottom = pmv + 7 + itmpref2;		if (m_volmd.bQuarterSample) // Quarter sample			motionCompQuarterSample (pppxlcPredMBA[iAuxComp] + MB_SIZE,			pvopcRefQ->pixelsA (iAuxComp) + itmpref2 * m_iFrameWidthY,0,			4*x + pmvBottom->trueMVHalfPel ().x, 			4*y + pmvBottom->trueMVHalfPel ().y,			iRoundingControl, prctMVLimit			);		else			motionCompYField(pppxlcPredMBA[iAuxComp] + MB_SIZE,			pvopcRefQ->pixelsA (iAuxComp) + itmpref2 * m_iFrameWidthY,			2*x + pmvBottom->trueMVHalfPel ().x, 2*y + pmvBottom->trueMVHalfPel ().y,			prctMVLimit); // added by Y.Suzuki for the extended bounding box support			}	// ~INTERLACE 12.22.98	else {		const CMotionVector* pmv8 = pmv;		pmv8++;		CoordI blkX = x + BLOCK_SIZE;		CoordI blkY = y + BLOCK_SIZE;		if (m_volmd.bQuarterSample) // Quarter sample			motionCompQuarterSample (			pppxlcPredMBA[iAuxComp],			pvopcRefQ->pixelsA (iAuxComp),			BLOCK_SIZE,			x * 4 + pmv8->trueMVHalfPel ().x, 			y * 4 + pmv8->trueMVHalfPel ().y,			iRoundingControl,			prctMVLimit			);		else			motionComp (			pppxlcPredMBA[iAuxComp],			pvopcRefQ->pixelsA (iAuxComp),			BLOCK_SIZE,			x * 2 + pmv8->trueMVHalfPel ().x, 			y * 2 + pmv8->trueMVHalfPel ().y,			iRoundingControl,			prctMVLimit			);		pmv8++;				if (m_volmd.bQuarterSample) // Quarter sample			motionCompQuarterSample (			pppxlcPredMBA[iAuxComp] + OFFSET_BLK1,			pvopcRefQ->pixelsA (iAuxComp), 				 			BLOCK_SIZE,			blkX * 4 + pmv8->trueMVHalfPel ().x, 			y * 4 + pmv8->trueMVHalfPel ().y,			iRoundingControl,			prctMVLimit			);		else			motionComp (			pppxlcPredMBA[iAuxComp] + OFFSET_BLK1,			pvopcRefQ->pixelsA (iAuxComp), 				 			BLOCK_SIZE,			blkX * 2 + pmv8->trueMVHalfPel ().x, 			y * 2 + pmv8->trueMVHalfPel ().y,			iRoundingControl,			prctMVLimit			);		pmv8++;		if (m_volmd.bQuarterSample) // Quarter sample			motionCompQuarterSample (			pppxlcPredMBA[iAuxComp] + OFFSET_BLK2, 			pvopcRefQ->pixelsA (iAuxComp), 			BLOCK_SIZE,			x * 4 + pmv8->trueMVHalfPel ().x, 			blkY * 4 + pmv8->trueMVHalfPel ().y,			iRoundingControl,			prctMVLimit			);		else			motionComp (			pppxlcPredMBA[iAuxComp] + OFFSET_BLK2, 			pvopcRefQ->pixelsA (iAuxComp), 			BLOCK_SIZE,			x * 2 + pmv8->trueMVHalfPel ().x, 			blkY * 2 + pmv8->trueMVHalfPel ().y,			iRoundingControl,			prctMVLimit			);		pmv8++;		if (m_volmd.bQuarterSample) // Quarter sample			motionCompQuarterSample (			pppxlcPredMBA[iAuxComp] + OFFSET_BLK3,			pvopcRefQ->pixelsA (iAuxComp),			BLOCK_SIZE,			blkX * 4 + pmv8->trueMVHalfPel ().x, 			blkY * 4 + pmv8->trueMVHalfPel ().y,			iRoundingControl,			prctMVLimit			);		else			motionComp (			pppxlcPredMBA[iAuxComp] + OFFSET_BLK3,			pvopcRefQ->pixelsA (iAuxComp),			BLOCK_SIZE,			blkX * 2 + pmv8->trueMVHalfPel ().x, 			blkY * 2 + pmv8->trueMVHalfPel ().y,			iRoundingControl,			prctMVLimit			);	}}// added for BVOP direct mode , mwiVoid CVideoObjectEncoder::motionCompMBAEncDirect (	const CMotionVector* pmv, const CMBMode* pmbmd, 	PixelC **pppxlcPredMBA,	CVOPU8YUVBA* pvopcRefQ,	CoordI x, CoordI y,	Int iRoundingControl,	CRct *prctMVLimit,  Int iAuxComp){    const CMotionVector* pmv8 = pmv;

⌨️ 快捷键说明

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