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

📄 grayf.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*************************************************************************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 standard> conforming products. This copyright notice must be included in all copies or derivative works. Copyright (c) 1996, 1997.Module Name:	grayf.hppAbstract:	Float image class for gray (one-plane) pictures Revision History:*************************************************************************/#include <stdlib.h>#include <math.h>#include <stdio.h>#include <string.h>#include "typeapi.h"#ifdef __MFC_#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define new DEBUG_NEW				   #endif // __MFC_CFloatImage::~CFloatImage (){	delete [] m_ppxlf;	m_ppxlf = NULL;}Void CFloatImage::allocate (const CRct& r, PixelF pxlf) {	m_rc = r;	delete [] m_ppxlf, m_ppxlf = NULL;	// allocate pixels and initialize	if (m_rc.empty ()) return;	m_ppxlf = new PixelF [m_rc.area ()];	PixelF* ppxlf = m_ppxlf;	UInt area = where ().area ();	for (UInt i = 0; i < area; i++)		*ppxlf++ = pxlf;}Void CFloatImage::copyConstruct (const CFloatImage& fi, const CRct& rct) {	CRct r = rct;	if (!r.valid()) 		r = fi.where ();	if (!fi.valid () || (!fi.m_rc.empty () && fi.m_ppxlf == NULL))		assert (FALSE);	allocate (r, (PixelF) 0);	if (!valid ()) return; 	// Copy data	if (r == fi.where ())		memcpy (m_ppxlf, fi.pixels (), m_rc.area () * sizeof (PixelF));	else {		r.clip (fi.where ()); // find the intersection		CoordI x = r.left; // copy pixels		Int cbLine = r.width * sizeof (PixelF);		PixelF* ppxl = (PixelF*) pixels (x, r.top);		const PixelF* ppxlFi = fi.pixels (x, r.top);		Int widthCurr = where ().width;		Int widthFi = fi.where ().width;		for (CoordI y = r.top; y < r.bottom; y++) {			memcpy (ppxl, ppxlFi, cbLine);			ppxl += widthCurr;			ppxlFi += widthFi;		}	}}Void CFloatImage::swap (CFloatImage& fi) {	assert (this && &fi);	CRct rcT = fi.m_rc; 	fi.m_rc = m_rc; 	m_rc = rcT; 	PixelF* ppxlfT = fi.m_ppxlf; 	fi.m_ppxlf = m_ppxlf; 	m_ppxlf = ppxlfT; }CFloatImage::CFloatImage (const CFloatImage& fi, const CRct& r) : m_ppxlf (NULL){	copyConstruct (fi, r);}CFloatImage::CFloatImage (const CIntImage& ii, const CRct& rct) : m_ppxlf (NULL){	CRct r = rct;	if (!r.valid()) 		r = ii.where ();	if (!ii.valid ())		assert (FALSE);	allocate (r, (PixelF) 0);	if (!valid ()) return; 	// Copy data	if (r == ii.where ())	{		Int i;		PixelF *ppxlf = m_ppxlf;		const PixelI *ppxli = ii.pixels();		for(i=m_rc.area();i;i--)			*ppxlf++ = (PixelF)*ppxli++;	}	else {		r.clip (ii.where ()); // find the intersection		CoordI x = r.left; // copy pixels		Int cbLine = r.width;		PixelF* ppxlf = (PixelF*) pixels (x, r.top);		const PixelI* ppxli = ii.pixels (x, r.top);		Int widthCurr = where ().width;		Int widthii = ii.where ().width;		for (CoordI y = r.top; y < r.bottom; y++) {			for(x = 0;x<cbLine;x++)				ppxlf[x]=(PixelF)ppxli[x];			ppxlf += widthCurr;			ppxli += widthii;		}	}}CFloatImage::CFloatImage (const CRct& r, PixelF px) : m_ppxlf (NULL){	allocate (r, px);}CFloatImage::CFloatImage (const CVideoObjectPlane& vop, RGBA comp, const CRct& r) : m_ppxlf (NULL){	if (!vop.valid ()) return;	CFloatImage* pfi = new CFloatImage (vop.where ());	PixelF* ppxlf = (PixelF*) pfi -> pixels ();	const CPixel* ppxl = vop.pixels ();	UInt area = pfi -> where ().area ();	for (UInt ip = 0; ip < area; ip++, ppxl++)		*ppxlf++ = (PixelF) ppxl -> pxlU.color [comp];	copyConstruct (*pfi, r);	delete pfi;}CFloatImage::CFloatImage (		const Char* pchFileName, 		UInt ifr,		const CRct& rct,		UInt nszHeader ) : m_ppxlf (NULL){	assert (!rct.empty ());	assert (ifr >= 0);	assert (nszHeader >= 0);	UInt area = rct.area ();	// allocate mem for buffers	U8* pchBuffer = new U8 [area];	U8* pchBuffer0 = pchBuffer;	// read data from a file	FILE* fpSrc = fopen (pchFileName, "rb");	assert (fpSrc != NULL);	fseek (fpSrc, nszHeader + ifr * sizeof (U8) * area, SEEK_SET);	Int size = (Int) fread (pchBuffer, sizeof (U8), area, fpSrc);	assert (size != 0);	fclose (fpSrc);	// assign buffers to a vframe	allocate (rct, .0f); 	PixelF* p = (PixelF*) pixels ();	UInt areaThis = where ().area ();	for (UInt ip = 0; ip < areaThis; ip++)		*p++ = (PixelF) *pchBuffer0++;	delete [] pchBuffer;}CFloatImage::CFloatImage (const Char* vdlFileName) : m_ppxlf (NULL)// read from a VM file.{	CVideoObjectPlane vop (vdlFileName);	allocate (vop.where (), 0.0f);	const CPixel* ppxlVop = vop.pixels ();	PixelF* ppxlfRet = (PixelF*) pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++, ppxlfRet++, ppxlVop++)		*ppxlfRet = (PixelF) ppxlVop -> pxlU.rgb.r;}Void CFloatImage::where (const CRct& r) {	if (!valid ()) return; 	if (where () == r) return; 	CFloatImage* pfi = new CFloatImage (*this, r);	swap (*pfi);	delete pfi;}CRct CFloatImage::boundingBox (const PixelF pxlfOutsideColor) const{	if (allValue ((PixelF) pxlfOutsideColor))			return CRct ();	CoordI left = where ().right - 1;	CoordI top = where ().bottom - 1;	CoordI right = where ().left;	CoordI bottom = where ().top;	const PixelF* ppxlfThis = pixels ();	for (CoordI y = where ().top; y < where ().bottom; y++) {		for (CoordI x = where ().left; x < where ().right; x++) {			if (*ppxlfThis != (PixelF) pxlfOutsideColor) {				left = min (left, x);				top = min (top, y);				right = max (right, x);				bottom = max (bottom, y);			}											ppxlfThis++;		}	}	right++;	bottom++;	return (CRct (left, top, right, bottom));				}Double CFloatImage::mean () const{	if (where ().empty ()) return 0;	Double meanRet = 0;	PixelF* ppxlf = (PixelF*) pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++)		meanRet += *ppxlf++;	meanRet /= area;	return meanRet;}Double CFloatImage::mean (const CFloatImage* pfiMsk) const{	assert (where () == pfiMsk -> where ()); // no compute if rects are different	if (where ().empty ()) return 0;	Double meanRet = 0;	PixelF* ppxlf = (PixelF*) pixels ();	const PixelF* ppxlfMsk = pfiMsk -> pixels ();	UInt area = where ().area ();	UInt uiNumNonTransp = 0;	for (UInt ip = 0; ip < area; ip++, ppxlf++, ppxlfMsk++) {		if (*ppxlfMsk != transpValueF) {			uiNumNonTransp++;			meanRet += *ppxlf;		}	}	meanRet /= uiNumNonTransp;	return meanRet;}Double CFloatImage::sumAbs (const CRct& rct) const {	CRct rctToDo = (!rct.valid ()) ? where () : rct;	Double dblRet = 0;	if (rctToDo == where ())	{			const PixelF* ppxlf = pixels ();		UInt area = where ().area ();		for (UInt ip = 0; ip < area; ip++, ppxlf++) {			if (*ppxlf > 0)				dblRet += *ppxlf;			else				dblRet -= *ppxlf;		}	}	else	{		Int width = where ().width;		const PixelF* ppxlfRow = pixels (rct.left, rct.top);		for (CoordI y = rctToDo.top; y < rctToDo.bottom; y++) {			const PixelF* ppxlf = ppxlfRow;			for (CoordI x = rctToDo.left; x < rctToDo.right; x++, ppxlf++) {				if (*ppxlf > 0)					dblRet += *ppxlf;				else					dblRet -= *ppxlf;			}			ppxlfRow += width;		}	}	return dblRet;}Double CFloatImage::sumDeviation (const CFloatImage* pfiMsk) const // sum of first-order deviation{	Double meanPxl = mean (pfiMsk);	Double devRet = 0;	PixelF* ppxlf = (PixelF*) pixels ();	const PixelF* ppxlfMsk = pfiMsk -> pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++, ppxlf++, ppxlfMsk++) {		if (*ppxlfMsk != transpValueF) {			Float fDiff = *ppxlf - (Float) meanPxl;			if (fDiff > 0)				devRet += fDiff;			else 				devRet -= fDiff;		}	}	return devRet;}Double CFloatImage::sumDeviation () const // sum of first-order deviation{	Double meanPxl = mean ();	Double devRet = 0;	PixelF* ppxlf = (PixelF*) pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++, ppxlf++) {		Float fDiff = *ppxlf - (Float) meanPxl;		if (fDiff > 0)			devRet += fDiff;		else 			devRet -= fDiff;	}	return devRet;}Bool CFloatImage::allValue (Float vl, const CRct& rct) const{	Int ivl = (Int) vl;	Bool bRet = TRUE;	CRct rctToDo = (!rct.valid ()) ? where () : rct;	if (rctToDo == where ())	{			const PixelF* ppxlf = pixels ();		UInt area = where ().area ();		for (UInt ip = 0; ip < area; ip++, ppxlf++) {			Int ipxl = (Int) *ppxlf; //truncation//			if (*ppxlf != vl) {			if (ipxl != ivl) {				bRet = FALSE;				return bRet;			}		}	}	else	{		Int width = where ().width;		const PixelF* ppxlf = pixels (rct.left, rct.top);		for (CoordI y = rctToDo.top; y < rctToDo.bottom; y++) {			const PixelF* ppxlfRow = ppxlf;			for (CoordI x = rctToDo.left; x < rctToDo.right; x++, ppxlfRow++) {				Int ipxl = (Int) *ppxlfRow; //truncation//				if (*ppxlfRow != vl)	{				if (ipxl != ivl)	{					bRet = FALSE;					return bRet;				}			}			ppxlf += width;		}	}	return bRet;}Bool CFloatImage::biLevel (const CRct& rct) const{	Bool bRet = TRUE;	CRct rctToDo = (!rct.valid ()) ? where () : rct;	if (rctToDo == where ())	{			const PixelF* ppxlf = pixels ();		UInt area = where ().area ();		for (UInt ip = 0; ip < area; ip++, ppxlf++) {			Int ipxl = (Int) *ppxlf; //truncation			if (ipxl != opaqueValue && ipxl != transpValue ) {				bRet = FALSE;				return bRet;			}		}	}	else	{		Int width = where ().width;		const PixelF* ppxlf = pixels (rct.left, rct.top);		for (CoordI y = rctToDo.top; y < rctToDo.bottom; y++) {			const PixelF* ppxlfRow = ppxlf;			for (CoordI x = rctToDo.left; x < rctToDo.right; x++, ppxlfRow++) {				Int ipxl = (Int) *ppxlfRow; //truncation

⌨️ 快捷键说明

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