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

📄 shpdec.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************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: July, 1997)and edited by	Yoshihiro Kikuchi (TOSHIBA CORPORATION)	Takeshi Nagai (TOSHIBA CORPORATION)	Toshiaki Watanabe (TOSHIBA CORPORATION)	Noboru Yamaguchi (TOSHIBA CORPORATION)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:	shpdec.cppAbstract:	Block decoding functionsRevision History:*************************************************************************/#include <stdlib.h>#include <math.h>#include "typeapi.h"#include "codehead.h"#include "mode.hpp"#include "global.hpp"#include "entropy/bitstrm.hpp"#include "entropy/entropy.hpp"#include "entropy/huffman.hpp"#include "dct.hpp"#include "cae.h"#include "vopses.hpp"#include "vopsedec.hpp"#ifdef __MFC_#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#define new DEBUG_NEW				   #endif // __MFC_Void CVideoObjectDecoder::decodeIntraShape (CMBMode* pmbmd, Int iMBX, Int iMBY, PixelC* ppxlcCurrMBBY, PixelC* ppxlcCurrMBBYFrm){	static Int rgiShapeMdCode [3];	Int iMBnum = VPMBnum(iMBX, iMBY);	m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX);	m_bVPNoTop = bVPNoTop(iMBnum);	m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX);	m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX);	//printf("(%d,%d)",iMBX,iMBY);	Int iTblIndex = shpMdTableIndex (pmbmd, iMBX, iMBY);	rgiShapeMdCode [ALL_TRANSP] = grgchFirstShpCd [iTblIndex + ALL_TRANSP];	rgiShapeMdCode [ALL_OPAQUE] = grgchFirstShpCd [iTblIndex + ALL_OPAQUE];	rgiShapeMdCode [INTRA_CAE]  = grgchFirstShpCd [iTblIndex + INTRA_CAE];	//	Modified for error resilient mode by Toshiba(1997-11-14)	//Int iBits = m_pbitstrmIn->peekBits (2);	//iBits = (iBits > 1) ? m_pbitstrmIn->getBits (2) : m_pbitstrmIn->getBits (1);	Int iBits = m_pbitstrmIn->peekBits (3);	assert (iBits != 0);	if (iBits >= 4) {		iBits = m_pbitstrmIn->getBits (1);		iBits = 0;	}	else if (iBits >= 2) {		iBits = m_pbitstrmIn->getBits (2);		iBits = 2;	}	else if (iBits == 1) {		iBits = m_pbitstrmIn->getBits (3);		iBits = 3;	}	//	End Toshiba(1997-11-14)	assert (iBits == 0 || iBits == 2 || iBits == 3);	//printf("[%08x]",m_pbitstrmIn->peekBits(32));	if (iBits == rgiShapeMdCode [ALL_TRANSP])	{		pmbmd->m_shpmd = ALL_TRANSP;//printf("_");		pxlcmemset (ppxlcCurrMBBY, MPEG4_TRANSPARENT, MB_SQUARE_SIZE);		copyReconShapeToMbAndRef (ppxlcCurrMBBY, ppxlcCurrMBBYFrm, MPEG4_TRANSPARENT);		pmbmd->m_rgTranspStatus [0] = pmbmd->m_rgTranspStatus [1] = pmbmd->m_rgTranspStatus [2] = pmbmd->m_rgTranspStatus [3] =		pmbmd->m_rgTranspStatus [4] = pmbmd->m_rgTranspStatus [5] = pmbmd->m_rgTranspStatus [6] = ALL;	}	else if (iBits == rgiShapeMdCode [ALL_OPAQUE])	{		pmbmd->m_shpmd = ALL_OPAQUE;//printf("X");		copyReconShapeToMbAndRef (ppxlcCurrMBBY, ppxlcCurrMBBYFrm, MPEG4_OPAQUE);		pmbmd->m_rgTranspStatus [0] = pmbmd->m_rgTranspStatus [1] = pmbmd->m_rgTranspStatus [2] = pmbmd->m_rgTranspStatus [3] =		pmbmd->m_rgTranspStatus [4] = pmbmd->m_rgTranspStatus [5] = pmbmd->m_rgTranspStatus [6] = NONE;	}	else if (iBits == rgiShapeMdCode [INTRA_CAE])	{			pmbmd->m_shpmd = INTRA_CAE;//printf("S");		decodeIntraCaeBAB (ppxlcCurrMBBY, ppxlcCurrMBBYFrm);		decideTransparencyStatus (pmbmd, ppxlcCurrMBBY);		assert (pmbmd->m_rgTranspStatus [0] == PARTIAL);	}	else		assert (FALSE);}Void CVideoObjectDecoder::decodeInterShape (CVOPU8YUVBA* pvopcRefQ, CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, CoordI iX, CoordI iY, CMotionVector* pmv, CMotionVector* pmvBY, PixelC* ppxlcMBBY, PixelC* ppxlcMBBYFrm, const ShapeMode& shpmdColocatedMB){	assert (shpmdColocatedMB != UNKNOWN);	//	Added for error resilient mode by Toshiba(1997-11-14)	//printf("m_iVPMBnum=%d\n",m_iVPMBnum);	Int iMBnum = VPMBnum(iMBX, iMBY);	m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX);	m_bVPNoTop = bVPNoTop(iMBnum);	m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX);	m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX);	//printf("(%d,%d)",iMBX,iMBY);	CEntropyDecoder* pentrdec = m_pentrdecSet->m_ppentrdecShapeMode [shpmdColocatedMB];	pmbmd->m_shpmd = (ShapeMode) pentrdec->decodeSymbol ();	//printf("[%08x]",m_pbitstrmIn->peekBits(32));	if (pmbmd->m_shpmd == ALL_TRANSP)	{//printf("_");		copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, MPEG4_TRANSPARENT);		pmbmd->m_rgTranspStatus [0] = pmbmd->m_rgTranspStatus [1] = pmbmd->m_rgTranspStatus [2] = pmbmd->m_rgTranspStatus [3] =		pmbmd->m_rgTranspStatus [4] = pmbmd->m_rgTranspStatus [5] = pmbmd->m_rgTranspStatus [6] = ALL;	}	else if (pmbmd->m_shpmd == ALL_OPAQUE)	{//printf("X");		copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, MPEG4_OPAQUE);		pmbmd->m_rgTranspStatus [0] = pmbmd->m_rgTranspStatus [1] = pmbmd->m_rgTranspStatus [2] = pmbmd->m_rgTranspStatus [3] =		pmbmd->m_rgTranspStatus [4] = pmbmd->m_rgTranspStatus [5] = pmbmd->m_rgTranspStatus [6] = NONE;	}	else if (pmbmd->m_shpmd == INTRA_CAE)	{//printf("S");		decodeIntraCaeBAB (ppxlcMBBY, ppxlcMBBYFrm);		decideTransparencyStatus (pmbmd, ppxlcMBBY);		assert (pmbmd->m_rgTranspStatus [0] == PARTIAL || pmbmd->m_rgTranspStatus [0] == NONE);	}	else {//printf("M");		CMotionVector mvShapeDiff (0, 0);		if (pmbmd->m_shpmd == MVDNZ_NOUPDT || pmbmd->m_shpmd == INTER_CAE_MVDNZ)				decodeMVDS (mvShapeDiff);		CMotionVector mvShapeMVP = findShapeMVP (pmv, pmvBY, pmbmd, iMBX, iMBY);		*pmvBY = mvShapeMVP + mvShapeDiff;		//printf("(%d,%d)",pmvBY->iMVX*2,pmvBY->iMVY*2);		//motion comp		motionCompBY ((PixelC*) m_puciPredBAB->pixels (),					  (PixelC*) pvopcRefQ->getPlane (BY_PLANE)->pixels (),					  pmvBY->iMVX + iX - 1,							  pmvBY->iMVY + iY - 1);	//-1 due to 18x18 motion comp		if (pmbmd->m_shpmd == INTER_CAE_MVDZ || pmbmd->m_shpmd == INTER_CAE_MVDNZ)		{			m_iInverseCR = 1;			m_iWidthCurrBAB = BAB_SIZE;			const PixelC *ppxlcPredBAB = m_puciPredBAB->pixels ();			if(!m_volmd.bNoCrChange && m_pbitstrmIn->getBits (1) != 0)			{				if(m_pbitstrmIn->getBits (1) == 0)				{					m_iInverseCR = 2;					m_iWidthCurrBAB = 12;					downSampleShapeMCPred(ppxlcPredBAB,m_ppxlcPredBABDown2,2);					ppxlcPredBAB = m_ppxlcPredBABDown2;					subsampleLeftTopBorderFromVOP (ppxlcMBBYFrm, m_ppxlcCurrMBBYDown2);					m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown2;				}				else				{					m_iInverseCR = 4;					m_iWidthCurrBAB = 8;					downSampleShapeMCPred(ppxlcPredBAB,m_ppxlcPredBABDown4,4);					ppxlcPredBAB = m_ppxlcPredBABDown4;					subsampleLeftTopBorderFromVOP (ppxlcMBBYFrm, m_ppxlcCurrMBBYDown4);					m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown4;				}				}			else			{				copyLeftTopBorderFromVOP (ppxlcMBBYFrm, m_ppxlcReconCurrBAB);  //used for upsample and CAE				m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB;		//assign encoding buffer			}			if (m_pbitstrmIn->getBits (1) == 1)				decodeInterCAEH (ppxlcPredBAB);			//right bottom border made on the fly			else				decodeInterCAEV (ppxlcPredBAB); 			if(m_iInverseCR>1)

⌨️ 快捷键说明

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