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

📄 mbencoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  }


  //===== inter modes without residual prediction =====
  if( bInterEnable && ( ! bIsEnhLayer || rcMbDataAccess.getSH().getAdaptiveBaseModeFlag() || ! bInCropWindow ) )
  {
    if( bInCropWindow && !pcMbDataAccessBase->getMbData().isIntra() && rcRefFrameList0.getActive() )
    {
      RNOK( xEstimateMbBLSkip( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, pcBaseLayerRec, false, pcMbDataAccessBase, rcMbDataAccess, bDefaultResPredFlag ) );// TMM_INTERLACE
    }

    // if 2 reference frames are supplied, do not evaluate the skip mode here
	  if( rcRefFrameList0.getActive() )  // JVT-Q065 EIDR
	  {
      if( pcRefFrameList0Base == 0 && bSkipModeAllowed && ( !bLowComplexMbEnable ) )  // JVT-V079
      {
 		    RNOK( xEstimateMbSkip     ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1 ) );
      }
		  RNOK  ( xEstimateMb16x16    ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
		  RNOK  ( xEstimateMb16x8     ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
		  RNOK  ( xEstimateMb8x16     ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
		  RNOK  ( xEstimateMb8x8      ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
		  RNOK  ( xEstimateMb8x8Frext ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
	  }
  }


  // motion estimation was made with the enhancement reference frame
  // cost evaluation with the actual reference frame
  if( bInterEnable && pcRefFrameList0Base != 0 && ! m_pcIntMbBestData->getMbDataAccess().getMbData().isIntra() )
  {
    Bool bResidualPredUsed = false;

    //===== residual prediction =====
    if( bInCropWindow && m_pcIntMbBestData->getMbDataAccess().getMbData().getResidualPredFlag() )
    {
      bResidualPredUsed = true;
    }

    if( bResidualPredUsed )
    {
      ROF( pcBaseLayerSbb );
      cBaseLayerBuffer    .loadBuffer ( pcBaseLayerSbb->getFullPelYuvBuffer() );
      m_pcIntOrgMbPelData->subtract( cBaseLayerBuffer );
    }
    if( m_pcIntMbBestData->getMbDataAccess().getMbData().isTransformSize8x8())
    {
      RNOK( xSetRdCost8x8InterMb( *m_pcIntMbBestData, pcMbDataAccessBase, *pcRefFrameList0Base, cRefFrameList1 ) );
    }
    else
    {
      RNOK( xSetRdCostInterMb   ( *m_pcIntMbBestData, pcMbDataAccessBase, *pcRefFrameList0Base, cRefFrameList1 ) );
    }
    if( bResidualPredUsed )
    {
      m_pcIntOrgMbPelData->add( cBaseLayerBuffer );
    }

    // get skip mode motion vector
    Mv  cMvPredL0, cCurrentMv;

    m_pcIntMbBestData->getMbDataAccess().getMvPredictorSkipMode( cMvPredL0 );
    cCurrentMv = m_pcIntMbBestData->getMbMotionData( LIST_0 ).getMv();

    // check skip mode only when motion vector is equal to skip mode motion vector
    if( m_pcIntMbBestData->getMbMode() == MODE_16x16 && cCurrentMv == cMvPredL0 && bSkipModeAllowed )
    {
      RNOK( xEstimateMbSkip( m_pcIntMbTempData, m_pcIntMbBestData, *pcRefFrameList0Base, cRefFrameList1 ) );
    }
  }
  m_pcTransform->setClipMode( true );


  //==== normal intra modes =====
  if( bIntraEnable && ( ! bIsEnhLayer || rcMbDataAccess.getSH().getAdaptiveBaseModeFlag() || ! bInCropWindow ) && rcMbDataAccess.getSH().getSPS().getNumberOfQualityLevelsCGSSNR() == 1 )
  {
    RNOK  ( xEstimateMbIntra16  ( m_pcIntMbTempData, m_pcIntMbBestData,                 false ) );
    RNOK  ( xEstimateMbIntra8   ( m_pcIntMbTempData, m_pcIntMbBestData,                 false ) );
    RNOK  ( xEstimateMbIntra4   ( rcMbDataAccess, m_pcIntMbTempData, m_pcIntMbBestData, false ) );
    RNOK  ( xEstimateMbPCM      ( m_pcIntMbTempData, m_pcIntMbBestData,                 false ) );
  }

  // JVT-W043 {
  if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
  {
    pcGenericRC->update_rc( jsvmCalcMAD( m_pcIntMbBestData, rcMbDataAccess ) );
  }
  // JVT-W043 }
  // JVT-V079 Low-complexity MB mode decision {
  if ( (bLowComplexMbEnable==true) && (!m_pcIntMbBestData->isIntra()) )
  {
   if ( (m_pcIntMbBestData->getMbMode() == MODE_16x16) & (m_pcIntMbBestData->cbp()==0) &
         (m_pcIntMbBestData->getMbMotionData( LIST_0 ).getRefIdx()==1) )
    RNOK  ( xEstimateMbSkip     ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1 ) );
    

   /* Inter mode needs motion compensation */
   RNOK( xSetRdCostInterMb   ( *m_pcIntMbBestData, pcMbDataAccessBase, rcRefFrameList0, cRefFrameList1 ) );
  }
  //JVT-V079 Low-complexity MB mode decision }
  
  RNOK( m_pcRateDistortionIf->fixMacroblockQP( *m_pcIntMbBestData ) );
  RNOK( xStoreEstimation( rcMbDataAccess, *m_pcIntMbBestData, pcRecSubband, pcPredSignal, &rcRefFrameList0, 0, false, &cBaseLayerBuffer ) );

  //JVT-R057 LA-RDO{
  if(m_bLARDOEnable)
  {
	  Int x,y;
	  MbMode mode=rcMbDataAccess.getMbData().getMbMode();
	  Bool bInter= !rcMbDataAccess.getSH().getNoInterLayerPredFlag();
	  Int KBlock = m_pcIntPicBuffer->getLWidth()/4;

	  Int blockX=rcMbDataAccess.getMbX()*4;
	  Int blockY=rcMbDataAccess.getMbY()*4;
	  Int ep_ref,ec_rec,ec_ep;
	  m_pcIntPicBuffer->getYuvBufferCtrl().initMb();

	  UInt p=1;
	  UInt q=100;
	  if(bInter)
	  {
		  for(UInt i=0;i<=m_uiLayerID;i++)
		  {
			  //Bug_Fix JVT-R057 0806{
			  //p=p*(100-m_auiPLR[m_uiLayerID]);
			  p=p*(100-m_auiPLR[i]);
			  //Bug_Fix JVT-R057 0806}
		  }
		  //q=(UInt)pow(100,(m_uiLayerID+1));
	    q=(UInt)pow(100.0,(int)(m_uiLayerID+1));
    }
	  else
	  {
		  p=100-m_auiPLR[m_uiLayerID];
	  }

	  if(mode==INTRA_BL)
	  {
		  Int ep_base;
		  Int blockIndex;
		  Int xx,yy;
		  for(y=blockY;y<(blockY+4);y++)
			  for(x=blockX;x<(blockX+4);x++)
			  {
				  if(m_pcFrameEcEp)
					  ec_ep=m_pcFrameEcEp->getChannelDistortion()[y*KBlock+x];
				  else
					  ec_ep=0;
				  m_pcIntPicBuffer->getYuvBufferCtrl().initMb();
				  if(m_pcFrameEcEp)
					  ec_rec=GetEC_REC(m_pcIntPicBuffer,m_pcFrameEcEp->getFullPelYuvBuffer(),x,y);
				  else
					  ec_rec=0;
				  xx=(Int)(x/m_aadRatio[m_uiLayerID][0]);
				  yy=(Int)(y/m_aadRatio[m_uiLayerID][1]);
				  blockIndex=yy*(Int)(KBlock/m_aadRatio[m_uiLayerID][0])+xx;
				  ep_base=pcBaseLayerRec->getChannelDistortion()[blockIndex];
				  pcFrame->getChannelDistortion()[y*KBlock+x]=(p*ep_base+(q-p)*(ec_rec+ec_ep))/q;
			  }
	  }

	  else if(mode==MODE_SKIP||mode==MODE_16x16||mode==MODE_16x8||mode==MODE_8x16||mode==MODE_8x8||mode==MODE_8x8ref0)
	  {
		  for( Int n = 0; n <16; n++)
		  {
			  Int iRefIdx[2];
			  iRefIdx [0]=rcMbDataAccess.getMbMotionData(LIST_0).getRefIdx(B4x4Idx(n));
			  iRefIdx [1]=rcMbDataAccess.getMbMotionData(LIST_1).getRefIdx(B4x4Idx(n));
			  Frame* pcRefFrame0 = ( iRefIdx [0] > 0 ? rcRefFrameList0[ iRefIdx [0] ] : NULL );
			  Frame* pcRefFrame1 = ( iRefIdx [1] > 0 ? cRefFrameList1[ iRefIdx [1] ] : NULL );
			  Int iMvX;
			  Int iMvY;
			  Int iDLIST0=0,iDLIST1=0;
			  if(pcRefFrame0)
			  {
				  iMvX=rcMbDataAccess.getMbMotionData(LIST_0).getMv(B4x4Idx(n)).getHor();
				  iMvY=rcMbDataAccess.getMbMotionData(LIST_0).getMv(B4x4Idx(n)).getVer();
				  getChannelDistortion(rcMbDataAccess,*pcRefFrame0,&iDLIST0,iMvX,iMvY,n%4,n/4,1,1);
			  }
			  if(pcRefFrame1)
			  {
				  iMvX=rcMbDataAccess.getMbMotionData(LIST_1).getMv(B4x4Idx(n)).getHor();
				  iMvY=rcMbDataAccess.getMbMotionData(LIST_1).getMv(B4x4Idx(n)).getVer();
				  getChannelDistortion(rcMbDataAccess,*pcRefFrame1,&iDLIST1,iMvX,iMvY,n%4,n/4,1,1);
				  iDLIST0=(iDLIST0+iDLIST1)/2;
			  }
			  ep_ref=iDLIST0;

			  x=blockX+n%4;
			  y=blockY+n/4;
			  if(m_pcFrameEcEp)
				  ec_ep=m_pcFrameEcEp->getChannelDistortion()[y*KBlock+x];
			  else
				  ec_ep=0;
			  m_pcIntPicBuffer->getYuvBufferCtrl().initMb();
			  if(m_pcFrameEcEp)
				  ec_rec=GetEC_REC(m_pcIntPicBuffer,m_pcFrameEcEp->getFullPelYuvBuffer(),x,y);
			  else
				  ec_rec=0;

			  pcFrame->getChannelDistortion()[y*KBlock+x]=(p*ep_ref+(q-p)*(ec_rec+ec_ep))/q;
		  }
	  }
	  else
	  {
		  for(y=blockY;y<(blockY+4);y++)
			  for(x=blockX;x<(blockX+4);x++)
			  {
				  if(m_pcFrameEcEp)
					  ec_ep=m_pcFrameEcEp->getChannelDistortion()[y*KBlock+x];
				  else
					  ec_ep=0;
				  m_pcIntPicBuffer->getYuvBufferCtrl().initMb();
				  if(m_pcFrameEcEp)
					  ec_rec=GetEC_REC(m_pcIntPicBuffer,m_pcFrameEcEp->getFullPelYuvBuffer(),x,y);
				  else
					  ec_rec=0;
				  pcFrame->getChannelDistortion()[y*KBlock+x]=(q-p)*(ec_rec+ec_ep)/q;
			  }
	  }
  }
  //JVT-R057 LA-RDO}

  rdCost = m_pcIntMbBestData->rdCost();

  m_pcIntMbBestData   ->uninit();
  m_pcIntMbTempData   ->uninit();
  m_pcIntMbBest8x8Data->uninit();
  m_pcIntMbTemp8x8Data->uninit();

  return Err::m_nOK;
}





ErrVal
MbEncoder::encodeResidual( MbDataAccess&  rcMbDataAccess,
                           Frame*      pcOrgFrame,
                           Frame*      pcFrame,
                           Frame*      pcResidual,
                           Frame*      pcBaseSubband,
													 Bool&          rbCoded,
                           Double         dLambda,
                           Int            iMaxQpDelta )
{
  ROF( bInitDone );

  m_pcIntPicBuffer    = pcFrame->getFullPelYuvBuffer();

  UInt    uiMinTrafo  = 0;
  UInt    uiMaxTrafo  = ( ( rcMbDataAccess.getSH().getPPS().getTransform8x8ModeFlag() && rcMbDataAccess.getMbData().is8x8TrafoFlagPresent(rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag()) ) ? 2 : 1 );
  UChar   ucMinQp     = (UChar)min( MAX_QP, max( MIN_QP, rcMbDataAccess.getMbData().getQp() - iMaxQpDelta ) );
  UChar   ucMaxQp     = (UChar)min( MAX_QP, max( MIN_QP, rcMbDataAccess.getMbData().getQp() + iMaxQpDelta ) );
  Double  dMinCost    = 1e30;
  UInt    uiDist=0, uiRate;
  Bool    bCoded      = false;
  Double  dCost       = 1e30;

  UInt    uiRPred     = ( rcMbDataAccess.getSH().getNoInterLayerPredFlag() ? 0 :
                          rcMbDataAccess.getSH().getAdaptiveBaseModeFlag() ? 2 : 1 );
  Int     iMinCnt     = ( uiRPred == 0 || uiRPred == 2 ? 0 : 1 );
  Int     iMaxCnt     = ( uiRPred == 1 || uiRPred == 2 ? 2 : 1 );
  Bool    bPotentialBSkip = true;
  Bool avcRewriteFlag = rcMbDataAccess.getSH().getTCoeffLevelPredictionFlag();
  Bool coeffResidualPredFlag = rcMbDataAccess.getCoeffResidualPredFlag();

  //>>> fix (skip mode in hierarchical P pictures) - H. Schwarz
  Bool    bRemovePSkip= false;
  //<<< fix (skip mode in hierarchical P pictures) - H. Schwarz

  // JVT-W043 {
  UInt bestuiDist = MSYS_UINT_MAX;
  // JVT-W043 }
  if( ! rcMbDataAccess.getMbDataAccessBase() || ! rcMbDataAccess.getMbDataAccessBase()->getMbData().getInCropWindowFlag() )
  {
    iMaxCnt = 1;
  }

  Bool disableCoeffResidualPred =  rcMbDataAccess.getDisableCoeffResidualPredFlag();
  if (iMaxCnt > 1 && (!avcRewriteFlag && disableCoeffResidualPred))
  {
    iMaxCnt = 1;  // disable residual prediction if it can not be done in transform domain
  }

  if( (avcRewriteFlag || coeffResidualPredFlag) && (iMaxCnt > 1) )
  {
    if( (rcMbDataAccess.getMbDataAccessBase()->getMbData().isTransformSize8x8() == true)
      && (uiMaxTrafo < 2) )
    { // if AVC rewrite is enabled, do not allow residual prediction if base layer and enhancement layer transofrm size do not match
      iMaxCnt = 1;      
    }
  }

  if( rcMbDataAccess.getSH().getSliceSkipFlag() )
  {
    iMinCnt = 1;
    ROF( iMaxCnt == 2 );
  }

  Bool  bDefaultResPredFlag = false;
  if( rcMbDataAccess.getSH().getPPS().getEntropyCodingModeFlag() &&
     !rcMbDataAccess.getSH().getNoInterLayerPredFlag() &&
      rcMbDataAccess.getMbDataAccessBase()->getMbData().getInCropWindowFlag() &&
     !rcMbDataAccess.getMbDataAccessBase()->getMbData().isIntra() )
  {
    ROF( pcBaseSubband );
    YuvMbBuffer cBaseLayerBuffer;
    cBaseLayerBuffer.loadBuffer( const_cast<Frame*>(pcBaseSubband)->getFullPelYuvBuffer() );

    if (!avcRewriteFlag && !coeffResidualPredFlag)
      bDefaultResPredFlag = cBaseLayerBuffer.isZero();
  }

  m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
  m_pcTransform     ->setStoreCoeffFlag(true);

  Int iCnt;
  for( iCnt = iMinCnt; iCnt < iMaxCnt; iCnt++ )
  {
		//-- JVT-R091
    YuvMbBuffer cBaseResMbBuffer, cOrgMbBuffer;

		// store original residual
		cOrgMbBuffer		.loadLuma	 ( *m_pcIntOrgMbPelData										);
		cOrgMbBuffer		.loadChroma( *m_pcIntOrgMbPelData										);

    for( UChar ucQp = ucMinQp; ucQp <= ucMaxQp; ucQp++ )

⌨️ 快捷键说明

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