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

📄 sys_decoder_shpdec.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*************************************************************************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)    Sehoon Son (shson@unitel.co.kr) Samsung AITin 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 "bitstrm.hpp"#include "entropy.hpp"#include "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_#define SIGN(n)	(n>0)?1:((n<0)?-1:0)				//OBSS_SAIT_991015// HHI Klaas Schueuer: sadctVoid CVideoObjectDecoder::deriveSADCTRowLengths(Int **piCoeffWidths, const PixelC* ppxlcMBBY, const PixelC* ppxlcCurrMBBUV, 												const TransparentStatus *pTransparentStatus){	CInvSADCT *pidct = (CInvSADCT *)m_pidct;	const PixelC *pSrc = NULL;	int i;	for (i=Y_BLOCK1; i<U_BLOCK; i++) {		if (pTransparentStatus[i] != PARTIAL) {        	memset(piCoeffWidths[i], 0, BLOCK_SIZE * sizeof(piCoeffWidths[i][0]));			continue;		}		switch (i) {		case Y_BLOCK1: 			pSrc = ppxlcMBBY;			break;		case Y_BLOCK2:				pSrc = ppxlcMBBY + BLOCK_SIZE;			break;		case Y_BLOCK3:			pSrc = ppxlcMBBY + BLOCK_SIZE*MB_SIZE;			break;		case Y_BLOCK4:			pSrc = ppxlcMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE;			break;		}		pidct->getRowLength(piCoeffWidths[i], pSrc, MB_SIZE);#ifdef _DEBUG		for (int iy=0; iy<BLOCK_SIZE; iy++) {        	int l = *(piCoeffWidths[i] + iy);        	assert(l>=0 && l<=BLOCK_SIZE); 		}#endif			}    if (pTransparentStatus[U_BLOCK] == PARTIAL) { 		pidct->getRowLength(piCoeffWidths[U_BLOCK], ppxlcCurrMBBUV, BLOCK_SIZE);    #ifdef _DEBUG		for (int iy=0; iy<BLOCK_SIZE; iy++) {        	int l = *(piCoeffWidths[i] + iy);        	assert(l>=0 && l<=BLOCK_SIZE); 		}#endif	     }	else    	memset(piCoeffWidths[U_BLOCK], 0, BLOCK_SIZE * sizeof(piCoeffWidths[i][0]));      #ifdef __TRACE_DECODING_	m_ptrcer->dumpSADCTRowLengths(piCoeffWidths);#endif}// end 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);//OBSS_SAIT_991015 //for OBSS		pmvBY->iMVX = NOT_MV;		pmvBY->iMVY = NOT_MV;//~OBSS_SAIT_991015		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);//OBSS_SAIT_991015 //for OBSS		pmvBY->iMVX = NOT_MV;		pmvBY->iMVY = NOT_MV;//~OBSS_SAIT_991015		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);//OBSS_SAIT_991015 //for OBSS		pmvBY->iMVX = NOT_MV;		pmvBY->iMVY = NOT_MV;//~OBSS_SAIT_991015		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//OBSSFIX_MODE3		if(m_volmd.volType == ENHN_LAYER && m_vopmd.vopPredType == PVOP &&m_volmd.bSpatialScalability == 1 && m_volmd.iHierarchyType == 0 && m_volmd.iEnhnType == 1 && m_volmd.iuseRefShape == 1)			memset((void *)m_puciPredBAB->pixels(),255, MC_BAB_SIZE*MC_BAB_SIZE);		else			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//		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//~OBSSFIX_MODE3			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)				upSampleShape(ppxlcMBBYFrm,m_rgpxlcCaeSymbol,m_ppxlcReconCurrBAB);			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);	//copy rounded data		}		else {			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);		}				decideTransparencyStatus (pmbmd, ppxlcMBBY);		assert (pmbmd->m_rgTranspStatus [0] != ALL);	}//putchar('\n');}//OBSS_SAIT_991015//for OBSS shape decoding -PVOPVoid CVideoObjectDecoder::decodeSIShapePVOP (CVOPU8YUVBA* pvopcRefQ, CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, CoordI iX, CoordI iY, CMotionVector* pmv, CMotionVector* pmvBY, CMotionVector* pmvBaseBY, PixelC* ppxlcMBBY, PixelC* ppxlcMBBYFrm, const ShapeMode& shpmdColocatedMB){	assert (shpmdColocatedMB != UNKNOWN);	//	Added for error resilient mode by Toshiba(1997-11-14)	Int iMBnum = VPMBnum(iMBX, iMBY);	m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX);	m_bVPNoTop = bVPNoTop(iMBnum);	m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX);	m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX);	m_bVPNoRight = bVPNoRight(iMBX);	m_bVPNoBottom = bVPNoBottom(iMBY);	assert ( m_vopmd.vopPredType==PVOP );	if((m_volmd.iuseRefShape ==1) && !m_volmd.bShapeOnly) {		motionCompBY ((PixelC*) m_puciPredBAB->pixels (),					  (PixelC*) pvopcRefQ->getPlane(BY_PLANE)->pixels (),					  iX-1, iY-1);			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);		decideTransparencyStatus (pmbmd, ppxlcMBBY);		return;	}	CEntropyDecoder* pentrdec = m_pentrdecSet->m_ppentrdecShapeSSModeIntra [0];	pmbmd->m_shpssmd = (ShapeSSMode) pentrdec->decodeSymbol ();		if (pmbmd->m_shpssmd == INTRA_NOT_CODED)	{//printf("S");		motionCompBY ((PixelC*) m_puciPredBAB->pixels (),					  (PixelC*) pvopcRefQ->getPlane(BY_PLANE)->pixels (),					  iX-1, iY-1);			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);		decideTransparencyStatus (pmbmd, ppxlcMBBY);	}	else if (pmbmd->m_shpssmd == INTRA_CODED)	{		motionCompBY ((PixelC*) m_puciPredBAB->pixels (),					  (PixelC*) pvopcRefQ->getPlane (BY_PLANE)->pixels (),					  iX-1, iY-1);				copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);				decodeSIBAB (	ppxlcMBBY, ppxlcMBBYFrm, 						(pvopcRefQ->getPlane (BY_PLANE)->m_pbHorSamplingChk)+iX, 						(pvopcRefQ->getPlane (BY_PLANE)->m_pbVerSamplingChk)+iY,						iMBX, iMBY, 						(PixelC*)((pvopcRefQ->getPlane (BY_PLANE)->pixels ())+(iY + EXPANDY_REF_FRAME) * m_iFrameWidthY + iX + EXPANDY_REF_FRAME));		decideTransparencyStatus (pmbmd, ppxlcMBBY);	}}//for OBSS shape decoding -BVOPVoid CVideoObjectDecoder::decodeSIShapeBVOP (CVOPU8YUVBA* pvopcRefQ0, //previous VOP											 CVOPU8YUVBA* pvopcRefQ1, //lower reference layer											 CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, CoordI iX, CoordI iY, CMotionVector* pmv, CMotionVector* pmvBY, CMotionVector* pmvBaseBY, PixelC* ppxlcMBBY, PixelC* ppxlcMBBYFrm, const ShapeMode& shpmdColocatedMB){	assert (shpmdColocatedMB != UNKNOWN);	//	Added for error resilient mode by Toshiba(1997-11-14)	Int iMBnum = VPMBnum(iMBX, iMBY);	m_bVPNoLeft = bVPNoLeft(iMBnum, iMBX);	m_bVPNoTop = bVPNoTop(iMBnum);	m_bVPNoRightTop = bVPNoRightTop(iMBnum, iMBX);	m_bVPNoLeftTop = bVPNoLeftTop(iMBnum, iMBX);	m_bVPNoRight = bVPNoRight(iMBX);	m_bVPNoBottom = bVPNoBottom(iMBY);	if((m_volmd.iuseRefShape ==1) && !m_volmd.bShapeOnly) {		motionCompLowerBY ((PixelC*) m_puciPredBAB->pixels (),					  (PixelC*) pvopcRefQ1->getPlane(BY_PLANE)->pixels (),					  iX-1, iY-1);			copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);		decideTransparencyStatus (pmbmd, ppxlcMBBY);		return;	}	if(m_vopmd.vopPredType==BVOP){		Int colocatedIndex[7]={0,0,1,3,3,2,2};

⌨️ 快捷键说明

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