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

📄 shpdec.cpp

📁 jpeg and mpeg 编解码技术源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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');
}

Int CVideoObjectDecoder::shpMdTableIndex (const CMBMode* pmbmd, Int iMBX, Int iMBY)
{	
	//get previous shape codes; 
	//	Added for error resilient mode by Toshiba(1997-11-14)
	Bool bLeftBndry, bRightTopBndry, bTopBndry, bLeftTopBndry;
	Int iMBnum = VPMBnum(iMBX, iMBY);
	bLeftBndry = bVPNoLeft(iMBnum, iMBX);
	bTopBndry = bVPNoTop(iMBnum);
	bRightTopBndry = bVPNoRightTop(iMBnum, iMBX);
	bLeftTopBndry = bVPNoLeftTop(iMBnum, iMBX);

	ShapeMode shpmdTop	= !bTopBndry ? (pmbmd - m_iNumMBX)->m_shpmd : ALL_TRANSP;
	ShapeMode shpmdTopR	= !bRightTopBndry ? (pmbmd - m_iNumMBX + 1)->m_shpmd : ALL_TRANSP;
	ShapeMode shpmdTopL	= !bLeftTopBndry ? (pmbmd - m_iNumMBX - 1)->m_shpmd : ALL_TRANSP;
	ShapeMode shpmdLeft	= !bLeftBndry ? (pmbmd - 1)->m_shpmd : ALL_TRANSP;
	return (shpmdTopL * 81 +  shpmdTop * 27 + shpmdTopR * 9 + shpmdLeft * 3);

	//const CMBMode* pmbmdTop = pmbmd - m_iNumMBX;
	//ShapeMode shpmdTop		= (iMBY > 0) ? pmbmdTop->m_shpmd : ALL_TRANSP;
	//ShapeMode shpmdTopR	= (iMBY > 0 && iMBX < m_iNumMBX - 1) ? (pmbmdTop + 1)->m_shpmd : ALL_TRANSP;
	//ShapeMode shpmdTopL	= (iMBY > 0 && iMBX > 0) ? (pmbmdTop - 1)->m_shpmd : ALL_TRANSP;
	//ShapeMode shpmdLeft		= (iMBX > 0) ? (pmbmd - 1)->m_shpmd : ALL_TRANSP;
	//return (shpmdTopL * 81 +  shpmdTop * 27 + shpmdTopR * 9 + shpmdLeft * 3);
	// End Toshiba(1997-11-14)
}

Void CVideoObjectDecoder::decodeIntraCaeBAB (PixelC* ppxlcBYMB, PixelC* ppxlcBYFrm)
{
	if (m_volmd.bNoCrChange == TRUE || m_pbitstrmIn->getBits (1) == 0)	{
		m_iInverseCR = 1;
		m_iWidthCurrBAB = BAB_SIZE;
		copyLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcReconCurrBAB);  //used for upsample and CAE
		m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB;		//assign encoding buffer
		if (m_pbitstrmIn->getBits (1) == 1) 
			decodeIntraCAEH ();			//right bottom border made on the fly
		else
			decodeIntraCAEV ();
	}
	else	{
		if (m_pbitstrmIn->getBits (1) == 0)	{
			m_iInverseCR = 2;
			m_iWidthCurrBAB = 12;
			subsampleLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcCurrMBBYDown2);
			m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown2;		//assign encoding buffer
		}
		else {
			m_iInverseCR = 4;
			m_iWidthCurrBAB = 8;
			subsampleLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcCurrMBBYDown4);
			m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown4;		//assign encoding buffer
		}
		if (m_pbitstrmIn->getBits (1) == 1) 
			decodeIntraCAEH ();     //right bottom border made on the fly
		else
			decodeIntraCAEV (); 

		upSampleShape(ppxlcBYFrm,m_rgpxlcCaeSymbol,m_ppxlcReconCurrBAB);
	}
	
	copyReconShapeToMbAndRef (ppxlcBYMB, ppxlcBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);
}

Void CVideoObjectDecoder::decodeIntraCAEH ()
{
	StartArDecoder (m_parcodec, m_pbitstrmIn);
	PixelC* ppxlcDstRow = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;
	for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB - BAB_BORDER; iRow++)	{
		PixelC* ppxlcDst = ppxlcDstRow;
		for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB - BAB_BORDER; iCol++)	{
			Int iContext = contextIntra (ppxlcDst);//printf("%d ",iContext);
			*ppxlcDst++ = (ArDecodeSymbol (gCAEintraProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;
		}
		*ppxlcDst = *(ppxlcDst - 1);
		*(ppxlcDst + 1) = *ppxlcDst;		//make right border on the fly
		ppxlcDstRow += m_iWidthCurrBAB;
	}//printf("\n\n");
	StopArDecoder (m_parcodec, m_pbitstrmIn);
	PixelC* ppxlcDst = m_rgpxlcCaeSymbol + 
		m_iWidthCurrBAB * (m_iWidthCurrBAB - BAB_BORDER) + BAB_BORDER;
	for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB; iCol++)	{
		//make bottom border
		*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);
		*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;
		ppxlcDst++;
	}
}

Void CVideoObjectDecoder::decodeIntraCAEV ()
{
	StartArDecoder (m_parcodec, m_pbitstrmIn);
	PixelC* ppxlcDstCol = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;
	for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB - BAB_BORDER; iCol++)	{
		PixelC* ppxlcDst = ppxlcDstCol;
		for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB - BAB_BORDER; iRow++)	{
			Int iContext = contextIntraTranspose (ppxlcDst);
			*ppxlcDst = (ArDecodeSymbol (gCAEintraProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;
			ppxlcDst += m_iWidthCurrBAB;
		}
		*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);
		*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;		//make bottom border on the fly
		ppxlcDstCol++;
	}
	StopArDecoder (m_parcodec, m_pbitstrmIn);
	PixelC* ppxlcDst = m_rgpxlcCaeSymbol + (m_iWidthCurrBAB - BAB_BORDER) + m_iWidthCurrBAB * BAB_BORDER;
	for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB; iRow++)	{
		//make right border
		*ppxlcDst = *(ppxlcDst - 1);
		*(ppxlcDst + 1) = *ppxlcDst;
		ppxlcDst += m_iWidthCurrBAB;
	}
}


Void CVideoObjectDecoder::decodeInterCAEH (const PixelC *ppxlcPredBAB)
{
	StartArDecoder (m_parcodec, m_pbitstrmIn);
	Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;
	Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER;
	PixelC* ppxlcDstRow  = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;
	const PixelC* ppxlcPredRow = ppxlcPredBAB + iSizePredBAB * MC_BAB_BORDER + MC_BAB_BORDER;
	for (Int iRow = 0; iRow < iSizeMB; iRow++)	{
		PixelC* ppxlcDst = ppxlcDstRow;
		const PixelC* ppxlcPred = ppxlcPredRow;
		for (Int iCol = 0; iCol < iSizeMB; iCol++)	{
			Int iContext = contextInter (ppxlcDst, ppxlcPred);
			*ppxlcDst++ = (ArDecodeSymbol (gCAEinterProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;
			ppxlcPred++;
		}
		*ppxlcDst = *(ppxlcDst - 1);
		*(ppxlcDst + 1) = *ppxlcDst;		//make right border on the fly
		ppxlcDstRow += m_iWidthCurrBAB;
		ppxlcPredRow += iSizePredBAB;
	}
	StopArDecoder (m_parcodec, m_pbitstrmIn);
	PixelC* ppxlcDst = m_rgpxlcCaeSymbol + 
		m_iWidthCurrBAB * (m_iWidthCurrBAB - BAB_BORDER) + BAB_BORDER;
	for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB; iCol++)	{
		//make bottom border
		*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);
		*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;
		ppxlcDst++;
	}
}

Void CVideoObjectDecoder::decodeInterCAEV (const PixelC *ppxlcPredBAB)
{
	StartArDecoder (m_parcodec, m_pbitstrmIn);
	Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;
	Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER;
	PixelC* ppxlcDstCol  = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;
	const PixelC* ppxlcPredCol = ppxlcPredBAB + iSizePredBAB * MC_BAB_BORDER + MC_BAB_BORDER;
	for (Int iCol = 0; iCol < iSizeMB;iCol++)	{
		PixelC* ppxlcDst = ppxlcDstCol;
		const PixelC* ppxlcPred = ppxlcPredCol;
		for (Int iRow = 0; iRow < iSizeMB; iRow++)	{
			Int iContext = contextInterTranspose (ppxlcDst, ppxlcPred);
			*ppxlcDst = (ArDecodeSymbol (gCAEinterProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;
			ppxlcDst += m_iWidthCurrBAB;
			ppxlcPred += iSizePredBAB;
		}
		*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);
		*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;		//make bottom border on the fly
		ppxlcDstCol++;
		ppxlcPredCol++;
	}
	StopArDecoder (m_parcodec, m_pbitstrmIn);
	PixelC* ppxlcDst = m_rgpxlcCaeSymbol + (m_iWidthCurrBAB - BAB_BORDER) + m_iWidthCurrBAB * BAB_BORDER;
	for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB; iRow++)	{
		//make right border
		*ppxlcDst = *(ppxlcDst - 1);
		*(ppxlcDst + 1) = *ppxlcDst;
		ppxlcDst += m_iWidthCurrBAB;
	}
}

Void CVideoObjectDecoder::decodeMVDS (CMotionVector& mvDiff)
{
	mvDiff.iMVX = m_pentrdecSet->m_pentrdecShapeMV1->decodeSymbol ();			
	if (mvDiff.iMVX != 0)
		if (m_pbitstrmIn->getBits (1) == 0)
			mvDiff.iMVX *= -1;
	if (mvDiff.iMVX == 0)	
		mvDiff.iMVY = m_pentrdecSet->m_pentrdecShapeMV2->decodeSymbol () + 1;			
	else
		mvDiff.iMVY = m_pentrdecSet->m_pentrdecShapeMV1->decodeSymbol ();			
	if (mvDiff.iMVY != 0)
		if (m_pbitstrmIn->getBits (1) == 0)
			mvDiff.iMVY *= -1;
	mvDiff.computeTrueMV ();
}

⌨️ 快捷键说明

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