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

📄 mbenc.cpp

📁 《Visual C++小波变换技术与工程实践》靳济芳编著的光盘程序。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			// HHI: for sadct
			rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL;
			iDcScaler = iDcScalerC; //m_rgiDcScalerC [iQP];
		}
		
		if (m_volmd.nBits<=8) { // NBIT: not always valid when nBits>8
			assert(iDcScaler > 0 && iDcScaler < 128);
		}

		rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
		iSumErr += quantizeIntraBlockTexture (
			rgchBlkSrc,
			iWidthSrc,
			rgchBlkDst,
			iWidthDst,
			rgiCoefQ, 
			(iBlk<=V_BLOCK ? iQP : iQPA), 
			iDcScaler,
			iBlk,	//from here til last
			pmbmLeft, 
			pmbmTop, 
			pmbmLeftTop, 
			m_rgpmbmCurr [imbX],
			pmbmdLeft, 
			pmbmdTop, 
			pmbmdLeftTop, 
			pmbmd,
			rgchBlkShape, ((iBlk<U_BLOCK) || (iBlk > V_BLOCK)) ? MB_SIZE : BLOCK_SIZE,	// HHI
      iAuxComp
		); //all for intra-pred
		if(iBlk>=A_BLOCK1)
			pmbmd->m_pbACPredictionAlpha[iAuxComp]	= (pmbmd->m_pCODAlpha[iAuxComp] == ALPHA_CODED && iSumErr >= 0);
		else
			pmbmd->m_bACPrediction =(iSumErr >= 0);
	}

// INTERLACE
	if ((pmbmd->m_rgTranspStatus [0] == NONE) && (m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
		fieldDCTtoFrameC(ppxlcCurrQMBY);
// ~INTERLACE

	for (iBlk = (UInt) Y_BLOCK1; iBlk <= (Int)pmbmd->blkEnd(); iBlk++) { // + 1 is because of the indexing
    Int iBlkMap;
    if (iBlk>=A_BLOCK1) // alpha blocks
			iBlkMap = ((iBlk-7)&0x3)+1;
    else
      iBlkMap = iBlk;
    if (pmbmd->m_rgTranspStatus [iBlkMap % 6] == ALL) { // hack %6 ok if [6]==[0]
			pmbmd->setCodedBlockPattern (iBlk, FALSE);
			continue;
		}
		rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
		if (iBlk < (Int) U_BLOCK) 
			iDcScaler = iDcScalerY; //m_rgiDcScalerY [iQP];
		else if(iBlk < (Int) A_BLOCK1)
			iDcScaler = iDcScalerC; //m_rgiDcScalerC [iQP];
		else
			iDcScaler = iDcScalerA;

		intraPred ( iBlk, pmbmd, rgiCoefQ,
			(iBlk<=V_BLOCK ? iQP : iQPA), iDcScaler, m_rgblkmCurrMB [iBlk - 1],
      m_rgiQPpred [iBlk - 1]);
		Bool bCoded = FALSE;
		UInt i;
		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
{
	assert (pmbmd != NULL);
	assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);

	assert (pmbmd->m_rgTranspStatus [0] != ALL);
	Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
	if (pmbmd -> m_stepSize < 1)
		pmbmd -> m_stepSize = 1;
	else if (pmbmd -> m_stepSize > iQuantMax)
		pmbmd -> m_stepSize = iQuantMax;
	Int iQP = pmbmd->m_stepSize;
#ifdef __TRACE_AND_STATS_
	m_statsMB.nQMB++;
	m_statsMB.nQp += iQP;
#endif // __TRACE_AND_STATS_

// INTERLACE
	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;
// ~INTERLACE

	Int iQPA;

  for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++)  // MAC (SB) 29-Nov-99 
	  pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED;
	//Int iBlkEnd = V_BLOCK;

  if(m_volmd.fAUsage == EIGHT_BIT)
	{
		//iBlkEnd = A_BLOCK4;
		if (pmbmd -> m_stepSizeAlpha < 1)
			pmbmd -> m_stepSizeAlpha = 1;
		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 ();
	Int* rgiBlkCurrQ = m_ppxliErrorMBY;
	Int* rgiCoefQ;
	Int iWidthCurrQ;

	Bool* pbSkipAlpha = new Bool [m_volmd.iAuxCompCount];
  for(iAuxComp; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ )
    pbSkipAlpha[iAuxComp] = TRUE;

	// HHI Schueuer: sadct
	const PixelC* rgchBlkShape = NULL;
	// end HHI

	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)
			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;
  
	  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_991015
Bool 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 iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
	if (pmbmd -> m_stepSize < 1)
		pmbmd -> m_stepSize = 1;
	else if (pmbmd -> m_stepSize > iQuantMax)
		pmbmd -> m_stepSize = iQuantMax;
	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_991015

Void 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.

⌨️ 快捷键说明

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