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

📄 mbenc.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//										 : bSkipAllowed && pmv->isZero ();	Int* rgiBlkCurrQ = m_ppxliErrorMBY;	Int* rgiCoefQ;	Int iWidthCurrQ;	Bool bSkipAlpha = TRUE;	for (UInt iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt)iBlkEnd; iBlk++) { 		if (iBlk < (UInt) U_BLOCK || iBlk> (UInt) V_BLOCK) {			if (pmbmd -> m_rgTranspStatus [iBlk % 6] == 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;			case (A_BLOCK1): 				rgiBlkCurrQ = m_ppxliErrorMBA;				break;			case (A_BLOCK2): 				rgiBlkCurrQ = m_ppxliErrorMBA + BLOCK_SIZE;				break;			case (A_BLOCK3): 				rgiBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE;				break;			case (A_BLOCK4): 				rgiBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;				break;			}			iWidthCurrQ = MB_SIZE;		}		else {			iWidthCurrQ = BLOCK_SIZE;			rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV;		}		rgiCoefQ = m_rgpiCoefQ [iBlk - 1];		if(iBlk>=A_BLOCK1)			quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQPA, TRUE);		else			quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQP, FALSE);		Bool bCoded = FALSE;		UInt i;		for (i = 0; i < BLOCK_SQUARE_SIZE; i++) {			if (rgiCoefQ [i] != 0)	{				bCoded = TRUE;				bMBCoded = TRUE;				break;			}		}		if(iBlk<A_BLOCK1)			bSkip = bSkip & !bCoded;		else			bSkipAlpha = bSkipAlpha & !bCoded;		pmbmd->setCodedBlockPattern ((BlockNum) iBlk, bCoded);	}		pmbmd->m_bSkip = bSkip; 	if(m_volmd.fAUsage == EIGHT_BIT)	{		if(bSkipAlpha == TRUE)			pmbmd->m_CODAlpha = ALPHA_SKIPPED;		else if(pmbmd->m_CODAlpha == ALPHA_ALL255)		{			PixelC *ppxlc = ppxlcCurrQMBA;			Int i;			for(i = 0; i<MB_SIZE; i++, ppxlc += m_iFrameWidthY)				pxlcmemset(ppxlc, 255, MB_SIZE);		}	}// INTERLACE	if ((pmbmd->m_rgTranspStatus [0] == NONE)		&&(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE) 		&& (bMBCoded == TRUE))		fieldDCTtoFrameI(m_ppxliErrorMBY);// ~INTERLACE}Void CVideoObjectEncoder::sendDCTCoefOfInterMBTexture (const CMBMode* pmbmd) {	assert (pmbmd != NULL);	assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);	assert (pmbmd -> m_rgTranspStatus [0] != ALL);	UInt nBits, iBlk = 0;	for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (iBlk, "BLK_NO");#endif // __TRACE_AND_STATS_		if (iBlk < U_BLOCK)			if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue;		if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))	{			Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_// Modified for data partitioning mode by Toshiba(1998-1-16)			if(m_volmd.bDataPartitioning && m_volmd.bReversibleVlc && m_vopmd.vopPredType != BVOP)				nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, grgiStandardZigzag, TRUE);			else			nBits = sendTCOEFInter (rgiCoefQ, 0,                m_vopmd.bAlternateScan ? grgiVerticalZigzag : grgiStandardZigzag);// End Toshiba(1998-1-16)			switch (iBlk) {			case U_BLOCK: 				m_statsMB.nBitsCr += nBits;				break;			case V_BLOCK: 				m_statsMB.nBitsCb += nBits;				break;			default:				m_statsMB.nBitsY += nBits;			}		}	}	}Void CVideoObjectEncoder::sendDCTCoefOfIntraMBTexture (const CMBMode* pmbmd) {	assert (pmbmd != NULL);	assert (pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ);	assert (pmbmd->m_rgTranspStatus [0] != ALL);	UInt iBlk = 0;	for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {		UInt nBits = 0;#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (iBlk, "BLK_NO");#endif // __TRACE_AND_STATS_		if (iBlk < U_BLOCK)			if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue;		Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_		Int iCoefStart = 0;		if (pmbmd->m_bCodeDcAsAc != TRUE)	{			iCoefStart = 1;			nBits = sendIntraDC (rgiCoefQ, (BlockNum) iBlk);		}		if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))	{			Int* rgiZigzag = grgiStandardZigzag;            if (m_vopmd.bAlternateScan)                rgiZigzag = grgiVerticalZigzag;            else if (pmbmd->m_bACPrediction)					rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;// Modified for data partitioning mode by Toshiba(1998-1-16)				if(m_volmd.bDataPartitioning && m_volmd.bReversibleVlc && m_vopmd.vopPredType != BVOP)					nBits += sendTCOEFIntraRVLC (rgiCoefQ, iCoefStart, rgiZigzag, TRUE);				else					nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag);// End Toshiba(1998-1-16)		}		switch (iBlk) {		case U_BLOCK: 			m_statsMB.nBitsCr += nBits;			break;		case V_BLOCK: 			m_statsMB.nBitsCb += nBits;			break;		default:			m_statsMB.nBitsY += nBits;		}	}	}UInt CVideoObjectEncoder::sumAbsCurrMB (){	PixelC* ppxlcCurrMBY = m_ppxlcCurrMBY;	UInt uisumAbs = 0;	Int ic;	for (ic = 0; ic < MB_SQUARE_SIZE; ic++) {		uisumAbs += ppxlcCurrMBY [ic];	}	return uisumAbs;}Void CVideoObjectEncoder::codeMBAlphaHeadOfIVOP (const CMBMode* pmbmd){	// get CBPA	Int CBPA = 0;	UInt cNonTrnspBlk = 0, iBlk;	for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {		if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)				cNonTrnspBlk++;	}	UInt iBitPos = 1;	for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++)	{		if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)	{			CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos);			iBitPos++;		}	}	assert (CBPA >= 0 && CBPA <= 15);		Int iCODA = 0;	if(pmbmd->m_CODAlpha==ALPHA_ALL255)		iCODA = 1;	m_pbitstrmOut->putBits(iCODA, 1, "MB_CODA");	m_statsMB.nBitsCODA++;	if(iCODA)		return;	m_pbitstrmOut->putBits (pmbmd->m_bACPredictionAlpha, 1, "MB_ACPRED_ALPHA");	m_statsMB.nBitsIntraPred++;#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (CBPA, "MB_CBPA");#endif // __TRACE_AND_STATS_	switch (cNonTrnspBlk) {	case 1:		m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA");		break;	case 2:		m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA");		break;	case 3:		m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA");		break;	case 4:		m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA");		break;	default:		assert (FALSE);	}}Void CVideoObjectEncoder::codeMBAlphaHeadOfPVOP (const CMBMode* pmbmd){	if(pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ)		codeMBAlphaHeadOfIVOP(pmbmd);	else	{		// get CBPA		Int CBPA = 0;		UInt cNonTrnspBlk = 0, iBlk;		for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {			if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)					cNonTrnspBlk++;		}		UInt iBitPos = 1;		for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++)	{			if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)	{				CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos);				iBitPos++;			}		}		assert (CBPA >= 0 && CBPA <= 15);				if(pmbmd->m_CODAlpha==ALPHA_CODED)		{			m_pbitstrmOut->putBits(0, 2, "MB_CODA");			m_statsMB.nBitsCODA += 2;		}		else if(pmbmd->m_CODAlpha==ALPHA_ALL255)		{			m_pbitstrmOut->putBits(1, 2, "MB_CODA");			m_statsMB.nBitsCODA += 2;			return;		}		else // ALPHA_SKIPPED		{			m_pbitstrmOut->putBits(1, 1, "MB_CODA");			m_statsMB.nBitsCODA ++;			return;		}#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (CBPA, "MB_CBPA");#endif // __TRACE_AND_STATS_		switch (cNonTrnspBlk) {		case 1:			m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA");			break;		case 2:			m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA");			break;		case 3:			m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA");			break;		case 4:			m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA");			break;		default:			assert (FALSE);		}	}}Void CVideoObjectEncoder::sendDCTCoefOfIntraMBAlpha (const CMBMode* pmbmd){	assert (pmbmd != NULL);	assert (pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ);	assert (pmbmd->m_rgTranspStatus [0] != ALL);	if(pmbmd->m_CODAlpha != ALPHA_CODED)		return;	UInt iBlk;	for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {		UInt nBits = 0;#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (iBlk, "ALPHA_BLK_NO");#endif // __TRACE_AND_STATS_		if (pmbmd -> m_rgTranspStatus [iBlk - 6 ] == ALL)			continue;		Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_				Int iCoefStart = 0;		if (pmbmd->m_bCodeDcAsAcAlpha != TRUE)	{			iCoefStart = 1;			nBits = sendIntraDC (rgiCoefQ, (BlockNum) iBlk);		}		if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))	{			Int* rgiZigzag = grgiStandardZigzag;			if (pmbmd->m_bACPredictionAlpha)					rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;			nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag);		}		m_statsMB.nBitsA += nBits;	}	}Void CVideoObjectEncoder::sendDCTCoefOfInterMBAlpha (const CMBMode* pmbmd){	assert (pmbmd != NULL);	assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);	assert (pmbmd -> m_rgTranspStatus [0] != ALL);	assert (pmbmd -> m_CODAlpha == ALPHA_CODED);	UInt nBits, iBlk = 0;	for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (iBlk, "BLK_NO");#endif // __TRACE_AND_STATS_		if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) continue;		if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))	{			Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];#ifdef __TRACE_AND_STATS_			m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");#endif // __TRACE_AND_STATS_			nBits = sendTCOEFInter (rgiCoefQ, 0, grgiStandardZigzag);			m_statsMB.nBitsA += nBits;		}	}	}Void CVideoObjectEncoder::codeMBAlphaHeadOfBVOP (const CMBMode* pmbmd){	// get CBPA	Int CBPA = 0;	UInt cNonTrnspBlk = 0, iBlk;	for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {		if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)				cNonTrnspBlk++;	}	UInt iBitPos = 1;	for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++)	{		if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)	{			CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos);			iBitPos++;		}	}	assert (CBPA >= 0 && CBPA <= 15);		if(pmbmd->m_CODAlpha==ALPHA_CODED)	{		m_pbitstrmOut->putBits(0, 2, "MB_CODBA");		m_statsMB.nBitsCODA += 2;	}	else if(pmbmd->m_CODAlpha==ALPHA_ALL255)	{		m_pbitstrmOut->putBits(1, 2, "MB_CODBA");		m_statsMB.nBitsCODA += 2;		return;	}	else // ALPHA_SKIPPED	{		m_pbitstrmOut->putBits(1, 1, "MB_CODBA");		m_statsMB.nBitsCODA ++;		return;	}#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (CBPA, "MB_CBPBA");#endif // __TRACE_AND_STATS_	switch (cNonTrnspBlk) {	case 1:		m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA");		break;	case 2:		m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA");		break;	case 3:		m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA");		break;	case 4:		m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA");		break;	default:		assert (FALSE);	}}

⌨️ 快捷键说明

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