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

📄 mbenc.cpp

📁 此源码是在VC平台下,实现MPEG4编解码的源码
💻 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 + -