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

📄 mbheaddec.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			case 3:				iCBPY = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();				break;			case 4:				iCBPY = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();				break;			default:				assert (FALSE);			}		}		assert (iCBPY >= 0 && iCBPY <= 15);				}	else	{									//skipped		pmbmd->m_dctMd = INTER;		pmbmd -> m_bhas4MVForward = FALSE;		pmbmd -> m_bFieldMV = FALSE;// GMC		pmbmd -> m_bMCSEL = FALSE;		if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)			pmbmd -> m_bMCSEL = TRUE;// ~GMC	}	setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);	pmbmd->m_intStepDelta = 0;	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);		}		iCurrentQP += pmbmd->m_intStepDelta;		Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;		iCurrentQP = checkrange (iCurrentQP, 1, iQuantMax);	}	pmbmd->m_stepSize = iCurrentQP;	//printf("(%d)", iCurrentQP);// 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;// GMC		pmbmd->m_bFieldMV = FALSE;// ~GMC		if (((pmbmd->m_dctMd == INTERQ) || (pmbmd->m_dctMd == INTER)) && (pmbmd -> m_bhas4MVForward == FALSE) && (pmbmd -> m_bMCSEL == FALSE)) { // GMC			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	setDCVLCMode(pmbmd, pbRestart);}// B-VOPVoid CVideoObjectDecoder::decodeMBTextureHeadOfBVOP (CMBMode* pmbmd, Int& iCurrQP){	assert (pmbmd -> m_rgTranspStatus [0] != ALL);	pmbmd -> m_bhas4MVForward = pmbmd -> m_bhas4MVBackward = FALSE;	pmbmd->m_bMCSEL = FALSE;	pmbmd->m_bSkip = FALSE;	pmbmd->m_dctMd = INTER;	pmbmd->m_intStepDelta = 0;	pmbmd->m_bFieldDCT = FALSE;	pmbmd->m_bFieldMV = 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, 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;		if(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0)			return;	}	else if (m_pbitstrmIn->getBits (1) == 1)	{	//MODB="01"		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);			}		} 		//yrchen to throw severe exception caused by packet loss 10.21.2003 		//assert (iMbType >= 0 && iMbType <= 3); 		ASSERT (iMbType >= 0 && iMbType <= 3);		pmbmd->m_mbType = (MBType) iMbType;		iMODB = 1;	}												//MODB="00"	else {		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);			}		} 		//yrchen to throw severe exception caused by packet loss 10.21.2003 		//assert (iMbType >= 0 && iMbType <= 3); 		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;				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;			iCurrQP += pmbmd->m_intStepDelta;			Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;            iCurrQP = checkrange (iCurrQP, 1, iQuantMax); 		}	}	pmbmd->m_stepSize = iCurrQP;	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	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, Int iAuxComp){	if(pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)	{		decodeMBAlphaHeadOfIVOP(pmbmd, iCurrQP, iCurrQPA, m_vopmd.intStep, m_vopmd.intStepPAlpha[iAuxComp], iAuxComp);	}	else	{		// update alpha quantiser		if(!m_volmd.bNoGrayQuantUpdate)		{			iCurrQPA = (pmbmd->m_stepSize * m_vopmd.intStepPAlpha[iAuxComp]) / 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_pCODAlpha[iAuxComp] = ALPHA_CODED;			else				pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_ALL255;		}		else			pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_SKIPPED;		if(pmbmd->m_pCODAlpha[iAuxComp]!=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 (					iBlk+iAuxComp*4, 					(iCBPA >> (cNonTrnspBlk - iBitPos)) & 1				);				iBitPos++;			}			else				pmbmd->setCodedBlockPattern (iBlk+iAuxComp*4, 0);		}	}}Void CVideoObjectDecoder::decodeMBAlphaHeadOfBVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA, Int iAuxComp){	// update alpha quantiser	if(!m_volmd.bNoGrayQuantUpdate)	{		iCurrQPA = (iCurrQP * m_vopmd.intStepBAlpha[iAuxComp]) / 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_pCODAlpha[iAuxComp] = ALPHA_CODED;		else			pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_ALL255;	}	else		pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_SKIPPED;	if(pmbmd->m_pCODAlpha[iAuxComp]!=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 (				iBlk+iAuxComp*4, 				(iCBPA >> (cNonTrnspBlk - iBitPos)) & 1			);			iBitPos++;		}		else			pmbmd->setCodedBlockPattern (iBlk+iAuxComp*4, 0);	}}

⌨️ 快捷键说明

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