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

📄 mbheaddec.cpp

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	else	{									//skipped
		pmbmd->m_dctMd = INTER;
		pmbmd -> m_bhas4MVForward = FALSE;
		pmbmd -> m_bFieldMV = FALSE;
	}
	setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);
	pmbmd->m_stepSize = iCurrentQP;
	pmbmd->m_stepSizeDelayed = iCurrentQP;
	if (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ) {
		assert (!pmbmd->m_bSkip);
		Int iDQUANT = m_pbitstrmIn->getBits (2);
		switch (iDQUANT) {
		case 0:
			pmbmd->m_intStepDelta = -1;
			break;
		case 1:
			pmbmd->m_intStepDelta = -2;
			break;
		case 2:
			pmbmd->m_intStepDelta = 1;
			break;
		case 3:
			pmbmd->m_intStepDelta = 2;
			break;
		default:
			assert (FALSE);
		}
		pmbmd->m_stepSize += pmbmd->m_intStepDelta;
		if(bUseNewQPForVlcThr) // need to prevent delay of quantiser
			pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;

		Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
		checkrange (pmbmd->m_stepSize, 1, iQuantMax);
		iCurrentQP = pmbmd->m_stepSize;
	}

	if(!pmbmd->m_bSkip)
	{
		// gets set to true at start of vop / packet header
		bUseNewQPForVlcThr = FALSE; // set to false once we decoded a non-skipped macroblock
	}

// INTERLACE
	if (m_vopmd.bInterlace && !pmbmd->m_bSkip) {
		if ((pmbmd->m_dctMd == INTRA) || (pmbmd->m_dctMd == INTRAQ) || (iCBPY || iCBPC)) 
			pmbmd->m_bFieldDCT = m_pbitstrmIn->getBits (1); // get dct_type
		else
			pmbmd->m_bFieldDCT = FALSE;
		if (((pmbmd->m_dctMd == INTERQ) || (pmbmd->m_dctMd == INTER)) && (pmbmd -> m_bhas4MVForward == FALSE)) {
			pmbmd->m_bFieldMV = m_pbitstrmIn->getBits (1); // get field_prediction
			if (pmbmd->m_bFieldMV == TRUE) {
				pmbmd->m_bForwardTop = m_pbitstrmIn->getBits (1); // get top field reference
				pmbmd->m_bForwardBottom = m_pbitstrmIn->getBits (1); // get bottom field reference
			}
		}
	}
// ~INTERLACE
}

// B-VOP
Void CVideoObjectDecoder::decodeMBTextureHeadOfBVOP (CMBMode* pmbmd, Int& iCurrQP)
{
	assert (pmbmd -> m_rgTranspStatus [0] != ALL);
	pmbmd -> m_bhas4MVForward = pmbmd -> m_bhas4MVBackward = FALSE;
	Int iBlk = 0, cNonTrnspBlk = 0;
	for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
		if (pmbmd->m_rgTranspStatus [iBlk] != ALL)	
			cNonTrnspBlk++;
	}
	Int iMODB = 0;
	//Int iMCBPC = 0;
	Int iCBPC = 0;
	Int iCBPY = 0;
	Int iMbType = -1, uiCBPB = 0;
	if (m_pbitstrmIn->getBits (1) == 1)	 {					//MODB=1 colocated non-skip but curr skip
		pmbmd->m_bSkip = TRUE;  
		iMODB = 0;
		pmbmd->m_mbType = (!(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0))? DIRECT : FORWARD;
		pmbmd->m_dctMd = INTER;
		if(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0)
			return;
	}
	else if (m_pbitstrmIn->getBits (1) == 1)	{	//MODB="01"
		pmbmd->m_bSkip = FALSE;
		if (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode != 0))
			iMbType = m_pentrdecSet->m_pentrdecMbTypeBVOP->decodeSymbol ();
		else	{
			if (m_pbitstrmIn->getBits (1) == 1)	
				iMbType = FORWARD;
			else if (m_pbitstrmIn->getBits (1) == 1)	
				iMbType = INTERPOLATE;
			else if (m_pbitstrmIn->getBits (1) == 1)
				iMbType = BACKWARD;
			else {
				fprintf(stderr,"MB Type 0000 does not exsit.\n");
				exit(2);
			}
		}
		assert (iMbType >= 0 && iMbType <= 3);
		pmbmd->m_mbType = (MBType) iMbType;
		iMODB = 1;
	}												//MODB="00"
	else {
		pmbmd->m_bSkip = FALSE;
		if (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode != 0))
			iMbType = m_pentrdecSet->m_pentrdecMbTypeBVOP->decodeSymbol ();
		else	{
			if (m_pbitstrmIn->getBits (1) == 1)	
				iMbType = FORWARD;
			else if (m_pbitstrmIn->getBits (1) == 1)	
				iMbType = INTERPOLATE;
			else if (m_pbitstrmIn->getBits (1) == 1)
				iMbType = BACKWARD;
			else{
				fprintf(stderr,"MB Type 0000 is not exsit.\n");
				exit(2);
			}
		}
		assert (iMbType >= 0 && iMbType <= 3);
		pmbmd->m_mbType = (MBType) iMbType;		
		iMODB = 2;
		uiCBPB = m_pbitstrmIn->getBits (cNonTrnspBlk + 2);
		pmbmd->m_bhas4MVForward = pmbmd->m_bhas4MVBackward = FALSE;	//this is okay; will be reset later
									//Only one mv for B-VOP except direct mode (will be reset in mvdec.cpp)
		iCBPC = uiCBPB & 0x0003;
		iCBPY = (uiCBPB >> 2) & 0x000F;
		pmbmd->m_stepSize = iCurrQP;
		if (pmbmd->m_mbType != DIRECT)	{
			Int DQUANT;
			if (m_pbitstrmIn->getBits (1) == 0)
				DQUANT = 0;
			else if (m_pbitstrmIn->getBits (1) == 0)
				DQUANT = -2;
			else
				DQUANT = 2;
			pmbmd->m_intStepDelta = DQUANT;
			pmbmd->m_stepSize += pmbmd->m_intStepDelta;
			Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
            pmbmd->m_stepSize = checkrange (pmbmd->m_stepSize, 1, iQuantMax); 
			iCurrQP = pmbmd->m_stepSize;
		}
	}
	setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);

	if (pmbmd->m_mbType == DIRECT)
		pmbmd->m_dctMd = INTER;		//direct mode doesn't have dquant
	else	
		pmbmd->m_dctMd = INTERQ;		//meaningless in B_VOP 'cause DQUANT is always sent
// INTERLACE
	pmbmd->m_bFieldDCT = FALSE;
	pmbmd->m_bFieldMV = FALSE;
	if (m_vopmd.bInterlace) {
		if (uiCBPB != 0)
			pmbmd->m_bFieldDCT = m_pbitstrmIn->getBits (1); // get dct_type
		if (pmbmd->m_mbType != DIRECT) {
			pmbmd->m_bFieldMV = m_pbitstrmIn->getBits (1);
			if (pmbmd->m_bFieldMV) {
				if (pmbmd->m_mbType != BACKWARD) {
					pmbmd->m_bForwardTop = m_pbitstrmIn->getBits (1);
					pmbmd->m_bForwardBottom = m_pbitstrmIn->getBits (1);
				}
				if (pmbmd->m_mbType != FORWARD) {
					pmbmd->m_bBackwardTop = m_pbitstrmIn->getBits (1);
					pmbmd->m_bBackwardBottom = m_pbitstrmIn->getBits (1);
				}
			}
		}
	}
// ~INTERLACE
}

Void CVideoObjectDecoder::decodeMBAlphaHeadOfPVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA)
{
	if(pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)
	{
		decodeMBAlphaHeadOfIVOP(pmbmd, iCurrQP, iCurrQPA, m_vopmd.intStep, m_vopmd.intStepPAlpha);
	}
	else
	{
		// update alpha quantiser
		if(!m_volmd.bNoGrayQuantUpdate)
		{
			iCurrQPA = (iCurrQP * m_vopmd.intStepPAlpha) / m_vopmd.intStep;
			if(iCurrQPA<1)
				iCurrQPA = 1;
		}
		pmbmd->m_stepSizeAlpha = iCurrQPA;

		assert (pmbmd->m_rgTranspStatus [0] != ALL);

		if(m_pbitstrmIn->getBits (1) == 0)	 {
			if(m_pbitstrmIn->getBits (1) == 0)
				pmbmd->m_CODAlpha = ALPHA_CODED;
			else
				pmbmd->m_CODAlpha = ALPHA_ALL255;
		}
		else
			pmbmd->m_CODAlpha = ALPHA_SKIPPED;

		if(pmbmd->m_CODAlpha!=ALPHA_CODED)
			return;

		Int iBlk = 0, cNonTrnspBlk = 0;
		for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
			if (pmbmd->m_rgTranspStatus [iBlk] != ALL)	
				cNonTrnspBlk++;
		}

		Int iCBPA = 0;
		switch (cNonTrnspBlk) {
		case 1:
			iCBPA = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
			break;
		case 2:
			iCBPA = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
			break;
		case 3:
			iCBPA = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
			break;
		case 4:
			iCBPA = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
			break;
		default:
			assert (FALSE);
		}

		Int iBitPos = 1;
		for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++)	{
			if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)	{
				pmbmd->setCodedBlockPattern (
					(BlockNum) iBlk, 
					(iCBPA >> (cNonTrnspBlk - iBitPos)) & 1
				);
				iBitPos++;
			}
			else
				pmbmd->setCodedBlockPattern ((BlockNum) iBlk, 0);
		}
	}
}

Void CVideoObjectDecoder::decodeMBAlphaHeadOfBVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA)
{
	// update alpha quantiser
	if(!m_volmd.bNoGrayQuantUpdate)
	{
		iCurrQPA = (iCurrQP * m_vopmd.intStepBAlpha) / m_vopmd.intStepB;
		if(iCurrQPA<1)
			iCurrQPA = 1;
	}
	pmbmd->m_stepSizeAlpha = iCurrQPA;

	assert (pmbmd->m_rgTranspStatus [0] != ALL);

	if(m_pbitstrmIn->getBits (1) == 0)	 {
		if(m_pbitstrmIn->getBits (1) == 0)
			pmbmd->m_CODAlpha = ALPHA_CODED;
		else
			pmbmd->m_CODAlpha = ALPHA_ALL255;
	}
	else
		pmbmd->m_CODAlpha = ALPHA_SKIPPED;

	if(pmbmd->m_CODAlpha!=ALPHA_CODED)
		return;

	Int iBlk = 0, cNonTrnspBlk = 0;
	for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
		if (pmbmd->m_rgTranspStatus [iBlk] != ALL)	
			cNonTrnspBlk++;
	}

	Int iCBPA = 0;
	switch (cNonTrnspBlk) {
	case 1:
		iCBPA = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
		break;
	case 2:
		iCBPA = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
		break;
	case 3:
		iCBPA = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
		break;
	case 4:
		iCBPA = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
		break;
	default:
		assert (FALSE);
	}

	Int iBitPos = 1;
	for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++)	{
		if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)	{
			pmbmd->setCodedBlockPattern (
				(BlockNum) iBlk, 
				(iCBPA >> (cNonTrnspBlk - iBitPos)) & 1
			);
			iBitPos++;
		}
		else
			pmbmd->setCodedBlockPattern ((BlockNum) iBlk, 0);
	}
}



⌨️ 快捷键说明

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