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

📄 mbenc.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		if(iBlk >=(Int) A_BLOCK1)			iCoefToStart = pmbmd->m_bCodeDcAsAcAlpha==TRUE ? 0 : 1;				for (i = iCoefToStart; i < BLOCK_SQUARE_SIZE; i++) {			if (rgiCoefQ [i] != 0)	{				bCoded = TRUE;				break;			}		}		pmbmd->setCodedBlockPattern ( iBlk, bCoded);	}}// HHI Schueuer: added const PixelC *ppxlcCurrMBBY, const PixelC *ppxlcCurrMBBUV Void CVideoObjectEncoder::quantizeTextureInterMB (CMBMode* pmbmd,                                                   const CMotionVector* pmv,                                                   PixelC **pppxlcCurrQMBA,                                                  Bool bSkip,                                                  const PixelC *ppxlcCurrMBBY,                                                  const PixelC *ppxlcCurrMBBUV)	//bSkip: tested mv is zero{	// in case of qp changes, the dct is done with the new qp, and if the status is skip	// then we keep this as a skip mb, but do not actually use the new qp, since it cannot	// be sent - swinder	assert (pmbmd != NULL);	assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);	assert (pmbmd->m_rgTranspStatus [0] != ALL);	Int iQP = pmbmd->m_stepSize; // new (including dquant)		if ((pmbmd->m_rgTranspStatus [0] == NONE) && (m_vopmd.bInterlace == TRUE)) {		pmbmd->m_bFieldDCT = FrameFieldDCTDecideI(m_ppxliErrorMBY);		m_statsMB.nFieldDCTMB += (Int) pmbmd->m_bFieldDCT;	}	else		pmbmd->m_bFieldDCT = 0;	Bool bMBCoded = FALSE;		Int iQPA = 0;	Int iAuxComp;	for(iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++)  // MAC (SB) 29-Nov-99 		pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED;		if(m_volmd.fAUsage == EIGHT_BIT)	{		iQPA = pmbmd->m_stepSizeAlpha;		Int i, iThresh = 256 - iQPA;				for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 29-Nov-99			pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_ALL255;			for(i = 0; i<MB_SQUARE_SIZE; i++) {				if(m_ppxlcCurrMBA[iAuxComp][i] <= iThresh)				{					pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED;					break;				}			}		}	}		// Bool bSkip = pmbmd->m_bhas4MVForward ? (bSkipAllowed && pmv [1].isZero () && pmv [2].isZero () && pmv [3].isZero () && pmv [4].isZero ())	//										 : bSkipAllowed && pmv->isZero ();	// the above is actually already passed into this function	Int* rgiBlkCurrQ = m_ppxliErrorMBY;	Int* rgiCoefQ;	Int iWidthCurrQ;		Bool* pbSkipAlpha = new Bool [m_volmd.iAuxCompCount];	for(; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ )		pbSkipAlpha[iAuxComp] = TRUE;		// HHI Schueuer: sadct	const PixelC* rgchBlkShape = NULL;	// end HHI		Bool bAlphaQPReset = FALSE;	Bool bCBPY = FALSE;	for (UInt iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) pmbmd->blkEnd(); iBlk++) { 		if (iBlk < (UInt) U_BLOCK || iBlk> (UInt) V_BLOCK) {						if (iBlk>=A_BLOCK1 && pmbmd->m_rgTranspStatus [((iBlk-7)%4)+1] == ALL) // MAC patch				continue;			else if (iBlk<A_BLOCK1 && pmbmd -> m_rgTranspStatus [iBlk % 6] == ALL) // %6 hack!!				continue;						switch (iBlk) 			{			case (Y_BLOCK1): 				rgiBlkCurrQ = m_ppxliErrorMBY;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY : NULL;				break;			case (Y_BLOCK2): 				rgiBlkCurrQ = m_ppxliErrorMBY + BLOCK_SIZE;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE: NULL;				break;			case (Y_BLOCK3): 				rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;				break;			case (Y_BLOCK4): 				rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;				break;							}			// MAC (SB) 29-Nov-99			if (iBlk>=A_BLOCK1) {				Int iBlkA = (iBlk-7)&0x3;				iAuxComp  = iBlkA/4;								rgiBlkCurrQ = m_ppxliErrorMBA[iAuxComp];								switch (iBlkA) {				case 0: rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[1] == PARTIAL) ? ppxlcCurrMBBY : NULL;					break;				case 1: rgiBlkCurrQ += BLOCK_SIZE;					rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[2] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE: NULL;					break;				case 2: rgiBlkCurrQ += MB_SIZE * BLOCK_SIZE;					rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[3] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;					break;				case 3: rgiBlkCurrQ += MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;					rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[4] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;					break;				}			}			//~MAC						iWidthCurrQ = MB_SIZE;		}		else {			iWidthCurrQ = BLOCK_SIZE;			rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV;			rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL;		}				rgiCoefQ = m_rgpiCoefQ [iBlk - 1];		if(iBlk>=A_BLOCK1 && !bAlphaQPReset)		{			if(bSkip || m_vopmd.vopPredType == BVOP && !bCBPY)			{				// if found that texture is not coded, then must cancel qp updates and recalculate quantiser for alpha				// because alpha may still be coded but we cant change alpha qp if alpha qp is slaved to texture qp				// in bvops, cbpy=0 also prevents qp updates, but not in pvops				cancelQPUpdate(pmbmd);				iQPA = pmbmd->m_stepSizeAlpha;				bAlphaQPReset = TRUE;			}		}		if(iBlk>=A_BLOCK1)			quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQPA, TRUE, rgchBlkShape, ((iBlk<U_BLOCK) || (iBlk >V_BLOCK)) ? MB_SIZE : BLOCK_SIZE, iBlk); // HHI Schueuer		else			quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQP, FALSE, rgchBlkShape, (iBlk<U_BLOCK) ? MB_SIZE : BLOCK_SIZE, iBlk);		// end		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 			pbSkipAlpha[(iBlk-7)/4] = pbSkipAlpha[(iBlk-7)/4] & !bCoded;				if(iBlk <= A_BLOCK1)		{			bCBPY |= bCoded;		}		pmbmd->setCodedBlockPattern (iBlk, bCoded);	}		pmbmd->m_bSkip = bSkip; 		if(m_volmd.fAUsage == EIGHT_BIT)	{ 		for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 30-Nov-99			if(pbSkipAlpha[iAuxComp] == TRUE)				pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_SKIPPED;			else if(pmbmd->m_pCODAlpha[iAuxComp] == ALPHA_ALL255)			{				PixelC *ppxlc = pppxlcCurrQMBA[iAuxComp];				Int i;				for(i = 0; i<MB_SIZE; i++, ppxlc += m_iFrameWidthY)					pxlcmemset(ppxlc, 255, MB_SIZE);			}		}	}		delete [] pbSkipAlpha;		// INTERLACE	if ((pmbmd->m_rgTranspStatus [0] == NONE)		&&(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE) 		&& (bMBCoded == TRUE))		fieldDCTtoFrameI(m_ppxliErrorMBY);	// ~INTERLACE}//OBSS_SAIT_991015Bool CVideoObjectEncoder::quantizeTextureMBBackwardCheck (CMBMode* pmbmd, 														  PixelC *ppxlcCurrMBY,														  PixelC *ppxlcCurrMBBY,														  const PixelC *ppxlcRef1MBY)														  {	Int bSkip = TRUE;	Int *ppxliErrorMBY;	ppxliErrorMBY = new Int [MB_SIZE*MB_SIZE];	pmbmd->m_stepSize = m_vopmd.intStepB;		Int iQP = pmbmd->m_stepSize;		Int iBlkEnd = Y_BLOCK4;		for(int i=0;i<MB_SIZE;i++){		for(int j=0;j<MB_SIZE;j++){			if(*(ppxlcCurrMBBY+i*MB_SIZE+j) == transpValue)				*(ppxliErrorMBY+i*MB_SIZE+j) = 0;			else				*(ppxliErrorMBY+i*MB_SIZE+j) = *(ppxlcCurrMBY +i*MB_SIZE+j) - *(ppxlcRef1MBY +i*448+j);		}	}	Int* rgiBlkCurrQ = ppxliErrorMBY;	Int* rgiCoefQ;	Int iWidthCurrQ;	for (UInt iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt)iBlkEnd; iBlk++) { 		if (pmbmd -> m_rgTranspStatus [iBlk % 6] == ALL) 			continue;				switch (iBlk) 		{		case (Y_BLOCK1): 			rgiBlkCurrQ = ppxliErrorMBY;			break;		case (Y_BLOCK2): 			rgiBlkCurrQ = ppxliErrorMBY + BLOCK_SIZE;			break;		case (Y_BLOCK3): 			rgiBlkCurrQ = ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;			break;		case (Y_BLOCK4): 			rgiBlkCurrQ = ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;			break;		}		iWidthCurrQ = MB_SIZE;		rgiCoefQ = m_rgpiCoefQ [iBlk - 1];		quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQP, FALSE, NULL, (iBlk<U_BLOCK) ? MB_SIZE : BLOCK_SIZE, iBlk);		Bool bCoded = FALSE;		UInt i;		for (i = 0; i < BLOCK_SQUARE_SIZE; i++) {			if (rgiCoefQ [i] != 0)	{				bCoded = TRUE;				break;			}		}		bSkip = bSkip & !bCoded;	}		return (bSkip);}//~OBSS_SAIT_991015Void CVideoObjectEncoder::sendDCTCoefOfInterMBTexture (const CMBMode* pmbmd) {	assert (pmbmd != NULL);	assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);	assert (pmbmd -> m_rgTranspStatus [0] != ALL);		Int* scan = grgiStandardZigzag;  // HHI Schueuer	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 (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) {					// HHI Schueuer: modified scan for sadcdt					if (!m_volmd.bSadctDisable)						scan = m_pscanSelector->select(scan, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk);					// nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, grgiStandardZigzag, TRUE);					nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, scan, TRUE);					// end HHI				}								else {					// HHI Schueuer: modified scan for sadct					// nBits = sendTCOEFInter (rgiCoefQ, 0,					// m_vopmd.bAlternateScan ? grgiVerticalZigzag : grgiStandardZigzag);					scan = (m_vopmd.bAlternateScan) ? grgiVerticalZigzag : grgiStandardZigzag;					if (!m_volmd.bSadctDisable) 						scan = m_pscanSelector->select(scan, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk);					nBits = sendTCOEFInter (rgiCoefQ, 0, scan );					// end HHI				}				// 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, iBlk);			}			if (pmbmd->getCodedBlockPattern (iBlk))	{				Int* rgiZigzag = grgiStandardZigzag;				if (m_vopmd.bAlternateScan)					rgiZigzag = grgiVerticalZigzag;				else if (pmbmd->m_bACPrediction)						rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;				// HHI Schueuer: modified scan for sadct				if (!m_volmd.bSadctDisable)					rgiZigzag = m_pscanSelector->select(rgiZigzag, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk); 				// end HHI				// 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, Int iAuxComp){	// get CBPA	Int CBPA = 0;	UInt cNonTrnspBlk = 0, iBlk;		for (iBlk = (UInt) A_BLOCK1

⌨️ 快捷键说明

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