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

📄 mbdec.cpp

📁 此源码是在VC平台下,实现MPEG4编解码的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                                        if (pmbmd->m_bMerged [1])       iDstBlk = (Int) Y_BLOCK2;
                                        else if (pmbmd->m_bMerged [3])  iDstBlk = (Int) Y_BLOCK3;
                                        else if (pmbmd->m_bMerged [5])  iDstBlk = (Int) Y_BLOCK4;
                                        break;
                                case (Y_BLOCK2):
                                        if (pmbmd->m_bMerged [4])       iDstBlk = (Int) Y_BLOCK4;
                                        else if (pmbmd->m_bMerged [6])  iDstBlk = (Int) Y_BLOCK3;
                                        break;
                                case (Y_BLOCK3):
                                        if (pmbmd->m_bMerged [2])       iDstBlk = (Int) Y_BLOCK4;
                                        break;
                        }
                        if (iDstBlk) {
                                MacroBlockMemory* pmbmCurr = m_rgpmbmCurr [iMBX];
                                pmbmCurr->rgblkm [iDstBlk-1][0] = pmbmCurr->rgblkm [iBlk-1][0];
                                for (UInt x = 1; x < (BLOCK_SIZE<<1)-1; x++)
                                        pmbmCurr->rgblkm [iDstBlk-1][x] = 0;
                        }
                }
		// End of Hyundai(1998-5-9)*/
	}
}

Void CVideoObjectDecoder::decodeAlphaIntraMB (CMBMode* pmbmd, Int iMBX, Int iMBY, PixelC* ppxlcRefMBA)
{
	assert (pmbmd != NULL);
	if (pmbmd -> m_rgTranspStatus [0] == ALL) 
		return;

	assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);
	Int iQP = pmbmd->m_stepSizeAlpha;
	Int iDcScalerA;

	if (pmbmd -> m_stepSizeAlpha < 1)
		pmbmd -> m_stepSizeAlpha = 1;
	if (iQP <= 4)	{
		iDcScalerA = 8;
	}
	else if (iQP >= 5 && iQP <= 8)	{
		iDcScalerA = 2 * iQP;
	}
	else if (iQP >= 9 && iQP <= 24)	{
		iDcScalerA = iQP + 8;
	}
	else	{
		iDcScalerA = 2 * iQP - 16;
	}

	assert (iQP > 0 && iQP < 64);

	// should be stepSizeAlpha and a different table
	//if (pmbmd -> m_stepSize >= grgiDCSwitchingThreshold [m_vopmd.iIntraDcSwitchThr])
	//	pmbmd->m_bCodeDcAsAcAlpha = TRUE;
	//else
	pmbmd->m_bCodeDcAsAcAlpha = FALSE;

	if(pmbmd->m_CODAlpha==ALPHA_ALL255)
	{
		// fill curr macroblock with 255
		Int iY;
		PixelC *ppxlc = ppxlcRefMBA;
		for(iY = 0; iY<MB_SIZE; iY++, ppxlc += m_iFrameWidthY)
			pxlcmemset(ppxlc, 255, MB_SIZE);

		// fix intra prediction
		Int iBlk;
		MacroBlockMemory* pmbmCurr = m_rgpmbmCurr [iMBX];
		for(iBlk = A_BLOCK1; iBlk<=A_BLOCK4; iBlk++)
		{
			Int i;
			pmbmCurr->rgblkm [iBlk - 1] [0] = divroundnearest(255 * 8, iDcScalerA) * iDcScalerA;
			//save recon value of DC for intra pred								//save Qcoef in memory
			for (i = 1; i < BLOCK_SIZE; i++)	{
				pmbmCurr->rgblkm [iBlk - 1] [i] = 0;
				pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = 0;
			}				
		}

		return;
	}


	//for intra pred
	MacroBlockMemory* pmbmLeft = NULL;
	MacroBlockMemory* pmbmTop = NULL;
	MacroBlockMemory* pmbmLeftTop = NULL;
	CMBMode* pmbmdLeft = NULL;
	CMBMode* pmbmdTop = NULL;
	CMBMode* pmbmdLeftTop = NULL;
											 
	Int iMBTop	= iMBY - 1;
	if (iMBTop >= 0)	{
		if (pmbmd->m_iVideoPacketNumber == (pmbmd - m_iNumMBX)->m_iVideoPacketNumber)	{
			pmbmTop  = m_rgpmbmAbove [iMBX];
			pmbmdTop = pmbmd - m_iNumMBX; 
		}
	}

	if (iMBX > 0)	{
		if (pmbmd->m_iVideoPacketNumber == (pmbmd - 1)->m_iVideoPacketNumber)	{
			pmbmLeft  = m_rgpmbmCurr [iMBX - 1];
			pmbmdLeft = pmbmd -  1; 
		}
	}

	if (iMBTop >= 0 && iMBX > 0)	{
		if (pmbmd->m_iVideoPacketNumber == (pmbmd - m_iNumMBX - 1)->m_iVideoPacketNumber)	{
			pmbmLeftTop  = m_rgpmbmAbove [iMBX - 1];
			pmbmdLeftTop = pmbmd - m_iNumMBX - 1;
		}
	}

	PixelC* rgchBlkDst = NULL;
	Int* rgiCoefQ;
	for (Int iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
		if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) 
			continue;
		switch (iBlk) 
		{
		case (A_BLOCK1): 
			rgchBlkDst = ppxlcRefMBA;
			break;
		case (A_BLOCK2): 
			rgchBlkDst = ppxlcRefMBA + BLOCK_SIZE;
			break;
		case (A_BLOCK3): 
			rgchBlkDst = ppxlcRefMBA + m_iFrameWidthYxBlkSize;
			break;
		case (A_BLOCK4): 
			rgchBlkDst = ppxlcRefMBA + m_iFrameWidthYxBlkSize + BLOCK_SIZE;
			break;
		}

		rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
		BlockMemory blkmPred = NULL;
		Int iQpPred = iQP;
		decideIntraPred (blkmPred, 
						 pmbmd,
						 iQpPred,
						 (BlockNum) iBlk,
						 pmbmLeft, 
  						 pmbmTop, 
						 pmbmLeftTop,
						 m_rgpmbmCurr [iMBX], // save for curr coefs
						 pmbmdLeft,
						 pmbmdTop,
						 pmbmdLeftTop);
		decodeIntraBlockTexture (rgchBlkDst,
								 m_iFrameWidthY,
								 iQP, 
								 iDcScalerA,
								 iBlk,	
								 m_rgpmbmCurr [iMBX],
								 pmbmd,
 								 blkmPred, //for intra-pred
								 iQpPred);	
		/*BBM// Added for Boundary by Hyundai(1998-5-9)
                if (m_vopmd.bInterlace && pmbmd->m_bMerged [0]) {
                        Int iDstBlk = 0;
                        switch (iBlk) {
                                case (A_BLOCK1):
                                        if (pmbmd->m_bMerged [1])       iDstBlk = (Int) A_BLOCK2;
                                        else if (pmbmd->m_bMerged [3])  iDstBlk = (Int) A_BLOCK3;
                                        else if (pmbmd->m_bMerged [5])  iDstBlk = (Int) A_BLOCK4;
                                        break;
                                case (A_BLOCK2):
                                        if (pmbmd->m_bMerged [4])       iDstBlk = (Int) A_BLOCK4;
                                        else if (pmbmd->m_bMerged [6])  iDstBlk = (Int) A_BLOCK3;
                                        break;
                                case (A_BLOCK3):
                                        if (pmbmd->m_bMerged [2])       iDstBlk = (Int) A_BLOCK4;
                                        break;
                        }
                        if (iDstBlk) {
                                MacroBlockMemory* pmbmCurr = m_rgpmbmCurr [iMBX];
                                pmbmCurr->rgblkm [iDstBlk-1][0] = pmbmCurr->rgblkm [iBlk-1][0];
                                for (UInt x = 1; x < (BLOCK_SIZE<<1)-1; x++)
                                        pmbmCurr->rgblkm [iDstBlk-1][x] = 0;
                        }
                }
		// End of Hyundai(1998-5-9)*/
	}
}

Void CVideoObjectDecoder::decodeTextureInterMB (CMBMode* pmbmd)
{
	assert (pmbmd != NULL);
	if (pmbmd->m_rgTranspStatus [0] == ALL || pmbmd->m_bSkip) 
		return;

	assert (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ);
	Int iQP = pmbmd->m_stepSize;
	Int* rgiBlkCurrQ = m_ppxliErrorMBY;
	Int iWidthCurrQ;
	for (Int iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {
		if (iBlk < U_BLOCK) {
			if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) 
				continue;
			switch (iBlk) 
			{
			case (Y_BLOCK1): 
				rgiBlkCurrQ = m_ppxliErrorMBY;
				break;
			case (Y_BLOCK2): 
				rgiBlkCurrQ = m_ppxliErrorMBY + BLOCK_SIZE;
				break;
			case (Y_BLOCK3): 
				rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;
				break;
			case (Y_BLOCK4): 
				rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
				break;
			}
			iWidthCurrQ = MB_SIZE;
		}
		else {
			iWidthCurrQ = BLOCK_SIZE;
			rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV;
		}
		if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))
			decodeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, iQP, FALSE); //all for intra-pred
		else 
			for (Int i = 0; i < BLOCK_SIZE; i++)	{
				memset (rgiBlkCurrQ, 0, sizeof (Int) * BLOCK_SIZE);
				rgiBlkCurrQ += iWidthCurrQ;
			}
	}
}

Void CVideoObjectDecoder::decodeAlphaInterMB (CMBMode* pmbmd, PixelC *ppxlcRefMBA)
{
	assert (pmbmd != NULL);

	if (pmbmd->m_rgTranspStatus [0] == ALL)
		return;
	if(pmbmd->m_CODAlpha == ALPHA_ALL255) 
	{
		// fill curr macroblock with 255
		Int iY;
		PixelC *ppxlc = ppxlcRefMBA;
		for(iY = 0; iY<MB_SIZE; iY++, ppxlc += m_iFrameWidthY)
			pxlcmemset(ppxlc, 255, MB_SIZE);
		return;
	}
	if(pmbmd->m_CODAlpha != ALPHA_CODED)
		return;

	assert (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ);

	Int iQP = pmbmd->m_stepSizeAlpha;
	Int* piBlkCurrQ = NULL;
	for (Int iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
		if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) 
			continue;
		switch (iBlk) 
		{
		case (A_BLOCK1): 
			piBlkCurrQ = m_ppxliErrorMBA;
			break;
		case (A_BLOCK2): 
			piBlkCurrQ = m_ppxliErrorMBA + BLOCK_SIZE;
			break;
		case (A_BLOCK3): 
			piBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE;
			break;
		case (A_BLOCK4): 
			piBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
			break;
		}

		Int *pix = piBlkCurrQ;
		Int i;
		if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))
		{
			decodeTextureInterBlock (piBlkCurrQ, MB_SIZE, iQP, TRUE);
			/*printf("\nBlock %d DCT Coefs Quant\n",iBlk);
			for(i=0;i<64;i++)
				printf("%d ",m_rgpiCoefQ [0][i]);
			printf("\n");
			
			printf("Block %d DCT Coefs Inv Quant\n",iBlk);
			for(i=0;i<64;i++)
				printf("%d ",m_rgiDCTcoef[i]);
			printf("\n");*/
		}
		else 
			for (i = 0; i < BLOCK_SIZE; i++)	{
				memset (piBlkCurrQ, 0, sizeof (Int) * BLOCK_SIZE);
				piBlkCurrQ += MB_SIZE;
			}
		/*Int j;
		printf("\nblock %d update\n",iBlk);
		for(i=0;i<BLOCK_SIZE;i++,pix+=BLOCK_SIZE){
			for(j=0;j<BLOCK_SIZE;j++,pix++)
				printf("%3d ",*pix);
			printf("\n");
		}*/
	}
}

Void CVideoObjectDecoder::setCBPYandC (CMBMode* pmbmd, Int iCBPC, Int iCBPY, Int cNonTrnspBlk)
{
	pmbmd->setCodedBlockPattern (U_BLOCK, (iCBPC >> 1) & 1) ;
	pmbmd->setCodedBlockPattern (V_BLOCK, iCBPC & 1) ;
	Int iBitPos = 1, iBlk;
	for (iBlk = Y_BLOCK1; iBlk <= Y_BLOCK4; iBlk++)	{
		if (pmbmd->m_rgTranspStatus [iBlk] != ALL)	{
			pmbmd->setCodedBlockPattern (
				(BlockNum) iBlk, 
				(iCBPY >> (cNonTrnspBlk - iBitPos)) & 1
			);
			iBitPos++;
		}
		else
			pmbmd->setCodedBlockPattern ((BlockNum) iBlk, 0);
	}
}

⌨️ 快捷键说明

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