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

📄 typeapi.cpp

📁 完整的RTP RTSP代码库
💻 CPP
字号:
/*************************************************************************This software module was originally developed by 	Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation	Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation	Bruce Lin (blin@microsoft.com), Microsoft Corporation	Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation	(date: March, 1996)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-4 Video conforming products. This copyright notice must be included in all copies or derivative works. Copyright (c) 1996, 1997.Module Name:    typeapi.cppAbstract:    Glue for TYPE called from elsewhereRevision History:	NOTE: CALLER OWNS ALL THE RETURNED POINTERS!!*************************************************************************/#include "typeapi.h"#include <stdlib.h>#include <math.h>#ifdef __MFC_#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define new DEBUG_NEW				   #endif // __MFC_//	handy functionsInt nint (Double x)  // returns nearest integer to x, analog of FORTRAN NINT{	return x > 0 ? (Int) (x + .5) : (Int) (x - .5);}#ifndef __DOUBLE_PRECISION_Double checkrange (Double x, Double cMin, Double cMax)	// returns cMin if x < cMin, cMax if x > cMax, otherwise x{	if (x < cMin)	return cMin;	if (x > cMax)	return cMax;	return x;}#endif // __DOUBLE_PRECISION_U8 checkrangeU8 (U8 x, U8 cMin, U8 cMax)	// returns cMin if x < cMin, cMax if x > cMax, otherwise x{	if (x < cMin)	return cMin;	if (x > cMax)	return cMax;	return x;}// NBIT: add checkrange for U16U16 checkrange (U16 x, U16 cMin, U16 cMax)	// returns cMin if x < cMin, cMax if x > cMax, otherwise x{	if (x < cMin)	return cMin;	if (x > cMax)	return cMax;	return x;}Int checkrange (Int x, Int cMin, Int cMax)	// returns cMin if x < cMin, cMax if x > cMax, otherwise x{	if (x < cMin)	return cMin;	if (x > cMax)	return cMax;	return x;}Long checkrange (Long x, Long cMin, Long cMax)	// returns cMin if x < cMin, cMax if x > cMax, otherwise x{	if (x < cMin)	return cMin;	if (x > cMax)	return cMax;	return x;}Float checkrange (Float x, Float cMin, Float cMax)	// returns cMin if x < cMin, cMax if x > cMax, otherwise x{	if (x < cMin)	return cMin;	if (x > cMax)	return cMax;	return x;}Double dist (Double x0, Double y0, Double x1, Double y1)	// returns distance between (x0,y0) and (x1,y1){	Double dx = x0 - x1;	Double dy = y0 - y1;	return sqrt (dx * dx + dy * dy);}// handy numerical functionsInt sad (const CIntImage& fi0, const CIntImage& fi1, const CIntImage& fiMsk){	assert (fi0.where () == fi1.where ());	const UInt area = fi0.where ().area ();	const PixelI* ppxlf0 = fi0.pixels ();	const PixelI* ppxlf1 = fi1.pixels ();	const PixelI* ppxlfMsk = fiMsk.pixels ();	Int sadRet = 0;	for (UInt ip = 0; ip < area; ip++, ppxlf0++, ppxlf1++, ppxlfMsk++) {		if (*ppxlfMsk != (PixelI) transpValue)			sadRet += abs (*ppxlf0 - *ppxlf1);	}	return sadRet;}Void mse (const CVideoObjectPlane& vop1, const CVideoObjectPlane& vop2, Double dmse [3]){	assert (vop1.where () == vop2.where ());	Int sqrR = 0, sqrG = 0, sqrB = 0;	const CPixel* ppxlVopThis = vop1.pixels ();	const CPixel* ppxlVopCompare = vop2.pixels ();	UInt area = vop1.where ().area ();	for (UInt i = 0; i < area; i++) {		Int diffR = ppxlVopThis -> pxlU.rgb.r - ppxlVopCompare -> pxlU.rgb.r;		Int diffG = ppxlVopThis -> pxlU.rgb.g - ppxlVopCompare -> pxlU.rgb.g;		Int diffB = ppxlVopThis -> pxlU.rgb.b - ppxlVopCompare -> pxlU.rgb.b;		sqrR += diffR * diffR;		sqrG += diffG * diffG;		sqrB += diffB * diffB;		ppxlVopThis++;		ppxlVopCompare++;	}	dmse [0] = (Double) sqrR / (Double) area;	 	dmse [1] = (Double) sqrG / (Double) area;	dmse [2] = (Double) sqrB / (Double) area;}Void snr (const CVideoObjectPlane& vop1, const CVideoObjectPlane& vop2, Double dsnr [3]){	Double msError [3];	mse (vop1, vop2, msError);	for (UInt i = 0; i < 3; i++) {		if (msError [i] == 0.0)			dsnr [i] = 1000.0;		else 			dsnr [i] = (log10 (255 * 255 / msError [i]) * 10.0);	}}// CRctCRct rctFromIndex (UInt indexX, UInt indexY, const CRct& rct, UInt size) // starting from 0{	assert (rct.width % size == 0 &&	rct.height () % size == 0);	CoordI left = rct.left + indexX * size;	CoordI right = left + size;	CoordI top = rct.top + indexY * size;	CoordI bottom = top + size;	return CRct (left, top, right, bottom); }CRct rctDivide (const CRct& rctBlk, const CRct& rctVOP, UInt rate) // divide the rctBlk by rate, with refererence to rvtVOP{	assert (rctBlk <= rctVOP);	CoordI left = (rctBlk.left - rctVOP.left) / rate + rctVOP.left;	CoordI top = (rctBlk.top - rctVOP.top) / rate + rctVOP.top;	CoordI right = left + rctBlk.width / rate;	CoordI bottom = top + rctBlk.height () / rate;	return CRct (left, top, right, bottom);}// CVOPIntYUVBA ----------  probably unused (SB)Void getBlockDataFromMB (const CVOPIntYUVBA* pvopfMB, CIntImage*& pfiBlk, CIntImage*& pfiB, Int blkNum){		if (blkNum == ALL_Y_BLOCKS) {		pfiB = new CIntImage (*pvopfMB -> getPlane (BY_PLANE));		pfiBlk = new CIntImage (*pvopfMB -> getPlane (Y_PLANE));				}	else if (blkNum == ALL_A_BLOCKS) {		pfiB = new CIntImage (*pvopfMB -> getPlane (BY_PLANE));		pfiBlk = new CIntImage (*pvopfMB -> getPlaneA (0));				}	else if (blkNum == U_BLOCK || blkNum == V_BLOCK) {		pfiB = new CIntImage (*pvopfMB -> getPlane (BUV_PLANE));		pfiBlk = 			(blkNum == U_BLOCK) ? new CIntImage (*pvopfMB -> getPlane (U_PLANE)) :			new CIntImage (*pvopfMB -> getPlane (V_PLANE));	}	else if ((Int) blkNum >= (Int) Y_BLOCK1 && (Int) blkNum <= (Int) Y_BLOCK4)  {		UInt idx = (blkNum == Y_BLOCK1 || blkNum == Y_BLOCK3) ? 0 : 1;		UInt idy = (blkNum == Y_BLOCK1 || blkNum == Y_BLOCK2) ? 0 : 1;		CRct rct = pvopfMB -> whereY ();		CoordI left = rct.left + idx * BLOCK_SIZE;		CoordI top = rct.top + idy * BLOCK_SIZE;		CRct rctF (left, top, left + BLOCK_SIZE, top + BLOCK_SIZE);		pfiBlk = new CIntImage (*pvopfMB -> getPlane (Y_PLANE), rctF);		pfiB = new CIntImage (*pvopfMB -> getPlane (BY_PLANE), rctF);	}	else { // alpha plane		assert (pvopfMB -> fAUsage () == EIGHT_BIT);		UInt idx = (blkNum == A_BLOCK1 || blkNum == A_BLOCK3) ? 0 : 1;		UInt idy = (blkNum == A_BLOCK1 || blkNum == A_BLOCK2) ? 0 : 1;		CRct rct = pvopfMB -> whereY ();		CoordI left = rct.left + idx * BLOCK_SIZE;		CoordI top = rct.top + idy * BLOCK_SIZE;		CRct rctF (left, top, left + BLOCK_SIZE, top + BLOCK_SIZE);		pfiBlk = new CIntImage (*pvopfMB -> getPlaneA (0), rctF);		pfiB = new CIntImage (*pvopfMB -> getPlane (BY_PLANE), rctF);	}}Void getTextureDataFromMB (const CVOPIntYUVBA* pvopfMB, CIntImage*& pfiBlk, Int blkNum){		if (blkNum == ALL_Y_BLOCKS) {		pfiBlk = new CIntImage (*pvopfMB -> getPlane (Y_PLANE));				}	else if (blkNum == ALL_A_BLOCKS) {		pfiBlk = new CIntImage (*pvopfMB -> getPlaneA (0));				}	else if (blkNum == U_BLOCK || blkNum == V_BLOCK) {		pfiBlk = 			(blkNum == U_BLOCK) ? new CIntImage (*pvopfMB -> getPlane (U_PLANE)) :			new CIntImage (*pvopfMB -> getPlane (V_PLANE));	}	else if ((Int) blkNum >= (Int) Y_BLOCK1 && (Int) blkNum <= (Int) Y_BLOCK4)  {		UInt idx = (blkNum == Y_BLOCK1 || blkNum == Y_BLOCK3) ? 0 : 1;		UInt idy = (blkNum == Y_BLOCK1 || blkNum == Y_BLOCK2) ? 0 : 1;		CRct rct = pvopfMB -> whereY ();		CoordI left = rct.left + idx * BLOCK_SIZE;		CoordI top = rct.top + idy * BLOCK_SIZE;		CRct rctF (left, top, left + BLOCK_SIZE, top + BLOCK_SIZE);		pfiBlk = new CIntImage (*pvopfMB -> getPlane (Y_PLANE), rctF);	}	else { // alpha plane		assert (pvopfMB -> fAUsage () == EIGHT_BIT);		UInt idx = (blkNum == A_BLOCK1 || blkNum == A_BLOCK3) ? 0 : 1;		UInt idy = (blkNum == A_BLOCK1 || blkNum == A_BLOCK2) ? 0 : 1;		CRct rct = pvopfMB -> whereY ();		CoordI left = rct.left + idx * BLOCK_SIZE;		CoordI top = rct.top + idy * BLOCK_SIZE;		CRct rctF (left, top, left + BLOCK_SIZE, top + BLOCK_SIZE);		pfiBlk = new CIntImage (*pvopfMB -> getPlaneA (0), rctF);	}}Void getBinaryDataFromMB (const CVOPIntYUVBA* pvopfMB, CIntImage*& pfiA, Int blkNum){		if (blkNum == U_BLOCK || blkNum == V_BLOCK) {		pfiA = new CIntImage (*pvopfMB -> getPlane (BUV_PLANE));	}	else if ((Int) blkNum >= (Int) Y_BLOCK1 && (Int) blkNum <= (Int) Y_BLOCK4)  {		UInt idx = (blkNum == Y_BLOCK1 || blkNum == Y_BLOCK3) ? 0 : 1;		UInt idy = (blkNum == Y_BLOCK1 || blkNum == Y_BLOCK2) ? 0 : 1;		CRct rct = pvopfMB -> whereY ();		CoordI left = rct.left + idx * BLOCK_SIZE;		CoordI top = rct.top + idy * BLOCK_SIZE;		CRct rctF (left, top, left + BLOCK_SIZE, top + BLOCK_SIZE);		pfiA = new CIntImage (*pvopfMB -> getPlane (BY_PLANE), rctF);	}	else { // alpha plane		assert (pvopfMB -> fAUsage () == EIGHT_BIT);		UInt idx = (blkNum == A_BLOCK1 || blkNum == A_BLOCK3) ? 0 : 1;		UInt idy = (blkNum == A_BLOCK1 || blkNum == A_BLOCK2) ? 0 : 1;		CRct rct = pvopfMB -> whereY ();		CoordI left = rct.left + idx * BLOCK_SIZE;		CoordI top = rct.top + idy * BLOCK_SIZE;		CRct rctF (left, top, left + BLOCK_SIZE, top + BLOCK_SIZE);		pfiA = new CIntImage (*pvopfMB -> getPlane (BY_PLANE), rctF);	}}CRct fitToMulOfSize (const CRct& rctOrg, UInt size){	CRct rct = rctOrg;	Int remW = rct.width % size;	Int right = rct.right;	if (remW != 0) 		right = rct.left + rct.width + size - remW;	Int remH = rct.height () % size;	Int bottom = rct.bottom;	if (remH != 0) 		bottom = rct.top + rct.height () + size - remH;	return CRct (rct.left, rct.top, right, bottom);}own CIntImage* fiFitToMulOfSize (const CIntImage* pfi, UInt size, const CSite* pstLeftTop){	CRct rctOrig = pfi -> where ();	if (pstLeftTop != NULL)	{		rctOrig.left = pstLeftTop->x;		rctOrig.top = pstLeftTop->y;	}	CRct rctExpanded = fitToMulOfSize (rctOrig, size); 	return new CIntImage (*pfi, rctExpanded);}own CVOPIntYUVBA* vopfFitToMulOfMBSize (const CVOPIntYUVBA* pvopf, const CSite* pstLeftTop){	if (!pvopf -> valid ()) return NULL;	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (pvopf -> fAUsage ());	UInt iPln;	for (iPln = Y_PLANE; iPln <= BUV_PLANE; iPln++) {		if (pvopf -> fAUsage () != EIGHT_BIT) {			if (iPln == A_PLANE)				continue;		}		UInt size;		CSite stOrig;		if (iPln == U_PLANE || iPln == V_PLANE  || iPln == BUV_PLANE)		{			size = MB_SIZE >> 1;			if (pstLeftTop != NULL)				stOrig = *pstLeftTop / 2;			else				stOrig = CSite (pvopf -> whereUV ().left, pvopf -> whereUV ().top);		}		else {			size = MB_SIZE;			if (pstLeftTop != NULL)				stOrig = *pstLeftTop;			else				stOrig = CSite (pvopf -> whereY ().left, pvopf -> whereY ().top);		}		CIntImage* pfiNew = fiFitToMulOfSize (pvopf -> getPlane ((PlaneType) iPln), size, &stOrig);		pvopfRet -> setPlane (pfiNew, (PlaneType) iPln);		delete pfiNew;	}	return pvopfRet;}own CIntImage* alphaFromCompFile (	const Char* pchSeg, 	UInt ifr, UInt iobj, 	const CRct& rct, 	UInt nszHeader){	CIntImage* pfiRet = new CIntImage (pchSeg, ifr, rct, nszHeader);	PixelI* ppxlf = (PixelI*) pfiRet -> pixels ();	UInt area = pfiRet -> where ().area ();	for (UInt ip = 0; ip < area; ip++, ppxlf++) {		if (*ppxlf == (PixelI) iobj)			*ppxlf = (PixelI) opaqueValue;		else			*ppxlf = (PixelI) transpValue;	}	return pfiRet;}

⌨️ 快捷键说明

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