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

📄 mbencoder.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		  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;
			  }
	  }
	  else
	  {
		  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=pcBaseLayer->getChannelDistortion()[blockIndex];
				  pcFrame->getChannelDistortion()[y*KBlock+x]=(p*ep_base+(q-p)*(ec_rec+ec_ep))/q;
			  }
	  }
  }
  //JVT-R057 LA-RDO}  


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

  return Err::m_nOK;
}






ErrVal
MbEncoder::xCheckInterMbMode8x8( IntMbTempData*&   rpcMbTempData,
                                 IntMbTempData*&   rpcMbBestData,
                                 IntMbTempData*    pcMbRefData,
                                 RefFrameList&     rcRefFrameList0,
                                 RefFrameList&     rcRefFrameList1,
                                 MbDataAccess*     pcMbDataAccessBaseMotion )
{
  ROTRS( ! rpcMbTempData->getSH().getPPS().getTransform8x8ModeFlag(), Err::m_nOK );
  ROTRS( ! pcMbRefData->is8x8TrafoFlagPresent(),                      Err::m_nOK );

  if( pcMbRefData == rpcMbTempData )
  {
    rpcMbTempData->clearCost          ();
    rpcMbTempData->getMbTCoeffs       ().clear();
    rpcMbTempData->setTransformSize8x8( true );
  }
  else
  {
    rpcMbTempData->clear                ();
    rpcMbTempData->setMbMode            (           pcMbRefData->getMbMode            () );
    rpcMbTempData->setBLSkipFlag        (           pcMbRefData->getBLSkipFlag        () );
    rpcMbTempData->setResidualPredFlags (           pcMbRefData->getResidualPredFlags () );
    rpcMbTempData->setBlkMode           ( B_8x8_0,  pcMbRefData->getBlkMode           ( B_8x8_0 ) );
    rpcMbTempData->setBlkMode           ( B_8x8_1,  pcMbRefData->getBlkMode           ( B_8x8_1 ) );
    rpcMbTempData->setBlkMode           ( B_8x8_2,  pcMbRefData->getBlkMode           ( B_8x8_2 ) );
    rpcMbTempData->setBlkMode           ( B_8x8_3,  pcMbRefData->getBlkMode           ( B_8x8_3 ) );
    rpcMbTempData->setTransformSize8x8  ( true );

    rpcMbTempData->getMbMotionData( LIST_0 ).copyFrom( pcMbRefData->getMbMotionData( LIST_0 ) );
    rpcMbTempData->getMbMotionData( LIST_1 ).copyFrom( pcMbRefData->getMbMotionData( LIST_1 ) );
    rpcMbTempData->getMbMvdData   ( LIST_0 ).copyFrom( pcMbRefData->getMbMvdData   ( LIST_0 ) );
    rpcMbTempData->getMbMvdData   ( LIST_1 ).copyFrom( pcMbRefData->getMbMvdData   ( LIST_1 ) );


  }

#if JMVM_ONLY 
//JMVM-W031
  if( rpcMbTempData->getMbDataAccess().getSH().getIcEnable() )
  {
    rpcMbTempData->setIcOn( pcMbRefData->getIcOn() );
    if( pcMbRefData->getIcOn() )
         rpcMbTempData->getMbIcp().copyFrom( pcMbRefData->getMbIcp() );
    else rpcMbTempData->getMbIcp().reset();

    rpcMbTempData->getMbDataAccess().getMbData().setSkipFlagTmp( false );
  }
#endif

  RNOK( xSetRdCost8x8InterMb( *rpcMbTempData, pcMbDataAccessBaseMotion, rcRefFrameList0, rcRefFrameList1 ) );

  //JVT-R057 LA-RDO{
  if(m_bLARDOEnable)
	  rpcMbTempData->rdCost()+=getEpRef();
  //JVT-R057 LA-RDO}

  RNOK( xCheckBestEstimation(  rpcMbTempData, rpcMbBestData ) );

  return Err::m_nOK;
}

#if JMVM_ONLY  // JVT-W081
ErrVal
MbEncoder::xCheckInterMbMode8x8MotionSkip( IntMbTempData*&   rpcMbTempData,
                                 IntMbTempData*&   rpcMbBestData,
                                 IntMbTempData*    pcMbRefData,
                                 RefFrameList&     rcRefFrameList0,
                                 RefFrameList&     rcRefFrameList1,
                                 MbDataAccess*     pcMbDataAccessBaseMotion )
{
  ROTRS( ! rpcMbTempData->getSH().getPPS().getTransform8x8ModeFlag(), Err::m_nOK );
  ROTRS( ! pcMbRefData->is8x8TrafoFlagPresent(),                      Err::m_nOK );

  if( pcMbRefData == rpcMbTempData )
  {
    rpcMbTempData->clearCost          ();
    rpcMbTempData->getMbTCoeffs       ().clear();
    rpcMbTempData->setTransformSize8x8( true );
  }
  else
  {
    rpcMbTempData->clear                ();
    rpcMbTempData->setMbMode            (           pcMbRefData->getMbMode            () );
    rpcMbTempData->setBLSkipFlag        (           pcMbRefData->getBLSkipFlag        () );
    rpcMbTempData->setResidualPredFlags (           pcMbRefData->getResidualPredFlags () );
	rpcMbTempData->setMotionSkipFlag    (           pcMbRefData->getMotionSkipFlag    () ); // 
	rpcMbTempData->setFwdBwd            (           pcMbRefData->getFwdBwd            () ); // 
	rpcMbTempData->setBlkMode           ( B_8x8_0,  pcMbRefData->getBlkMode           ( B_8x8_0 ) );
    rpcMbTempData->setBlkMode           ( B_8x8_1,  pcMbRefData->getBlkMode           ( B_8x8_1 ) );
    rpcMbTempData->setBlkMode           ( B_8x8_2,  pcMbRefData->getBlkMode           ( B_8x8_2 ) );
    rpcMbTempData->setBlkMode           ( B_8x8_3,  pcMbRefData->getBlkMode           ( B_8x8_3 ) );
    rpcMbTempData->setTransformSize8x8  ( true );

    rpcMbTempData->getMbMotionData( LIST_0 ).copyFrom( pcMbRefData->getMbMotionData( LIST_0 ) );
    rpcMbTempData->getMbMotionData( LIST_1 ).copyFrom( pcMbRefData->getMbMotionData( LIST_1 ) );
    rpcMbTempData->getMbMvdData   ( LIST_0 ).copyFrom( pcMbRefData->getMbMvdData   ( LIST_0 ) );
    rpcMbTempData->getMbMvdData   ( LIST_1 ).copyFrom( pcMbRefData->getMbMvdData   ( LIST_1 ) );

#if JMVM_ONLY //JVT-Z021

	rpcMbTempData->m_cMbImsm.copyFrom(pcMbRefData->m_cMbImsm);

#endif
  }

  RNOK( xSetRdCost8x8InterMbMotionSkip( *rpcMbTempData, pcMbDataAccessBaseMotion, rcRefFrameList0, rcRefFrameList1 ) );

  //JVT-R057 LA-RDO{
  if(m_bLARDOEnable)
	  rpcMbTempData->rdCost()+=getEpRef();
  //JVT-R057 LA-RDO}

  MbDataAccess&  rcMbDataAccess  = rpcMbTempData->getMbDataAccess();

  RNOK( xCheckBestEstimation( rpcMbTempData, rpcMbBestData ) );

  return Err::m_nOK;
}
#endif  // JVT-W081

ErrVal
MbEncoder::encodeMacroblock( MbDataAccess&  rcMbDataAccess,
                             IntFrame*      pcFrame,
                             RefFrameList&  rcList0,
                             RefFrameList&  rcList1,
                             UInt           uiNumMaxIter,
                             UInt           uiIterSearchRange,
                             Double         dLambda 
#if JMVM_ONLY  // JVT-Z021
							 , Mv cCenterL0

							 , Mv cCenterL1
#endif  // JVT-Z021
							 )
{
  ROF( m_bInitDone );

  UInt  uiQp = rcMbDataAccess.getMbData().getQp();
  RNOK( m_pcRateDistortionIf->setMbQpLambda( rcMbDataAccess, uiQp, dLambda ) );

  m_pcIntMbBestIntraChroma  = NULL;
  m_pcIntMbBestData   ->init( rcMbDataAccess );
  m_pcIntMbTempData   ->init( rcMbDataAccess );
  m_pcIntMbBest8x8Data->init( rcMbDataAccess );
  m_pcIntMbTemp8x8Data->init( rcMbDataAccess );

#if JMVM_ONLY  // JVT-W081
  rcMbDataAccess.getMbData().setMotionSkipFlag(false); 
#endif  // JVT-W081

  m_pcIntPicBuffer = pcFrame->getFullPelYuvBuffer();
  m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
  m_pcTransform->setQp( rcMbDataAccess, rcMbDataAccess.getSH().getKeyPictureFlag() );

  //====== evaluate macroblock modes ======
  if( rcMbDataAccess.getSH().isInterP() )
  {
    RNOK( xEstimateMbSkip     ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1 ) );
  }
  if( rcMbDataAccess.getSH().isInterB() )
  {
    RNOK( xEstimateMbDirect   ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,                                                    NULL, false ) );

#if JMVM_ONLY  // JVT-U052
    if( rcMbDataAccess.getSH().getIcEnable()  )
    {
      m_pcIntMbTempData->setIcOn( true );
      RNOK( xEstimateMbDirect   ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,                                                    NULL, false ) );
      m_pcIntMbTempData->setIcOn( false );
    }
#endif
  }
  if( rcMbDataAccess.getSH().isInterP() || rcMbDataAccess.getSH().isInterB() )
  {
    RNOK( xEstimateMb16x16    ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,  false,  uiNumMaxIter, uiIterSearchRange,  false,  NULL, false ) );
    RNOK( xEstimateMb16x8     ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,  false,  uiNumMaxIter, uiIterSearchRange,  false,  NULL, false ) );
    RNOK( xEstimateMb8x16     ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,  false,  uiNumMaxIter, uiIterSearchRange,  false,  NULL, false ) );

#if JMVM_ONLY  // JVT-U052
    if( rcMbDataAccess.getSH().getIcEnable() )
    {
      m_pcIntMbTempData->setIcOn( true );
      RNOK( xEstimateMb16x16    ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,  false,  uiNumMaxIter, uiIterSearchRange,  false,  NULL, false ) );
      m_pcIntMbTempData->setIcOn( false );
    }

    RNOK( xEstimateMb8x8      ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,  false,  uiNumMaxIter, uiIterSearchRange,  false,  NULL, false ) );
    RNOK( xEstimateMb8x8Frext ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,  false,  uiNumMaxIter, uiIterSearchRange,  false,  NULL, false ) );

#else

    RNOK( xEstimateMb8x8      ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,  false,  uiNumMaxIter, uiIterSearchRange,  false,  NULL, false ) );
    RNOK( xEstimateMb8x8Frext ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1,  false,  uiNumMaxIter, uiIterSearchRange,  false,  NULL, false ) );
#endif
  }
  RNOK(   xEstimateMbIntra16  ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcMbDataAccess.getSH().isInterB() ) );
  RNOK(   xEstimateMbIntra8   ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcMbDataAccess.getSH().isInterB() ) );
  RNOK(   xEstimateMbIntra4   ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcMbDataAccess.getSH().isInterB() ) );
  RNOK(   xEstimateMbPCM      ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcMbDataAccess.getSH().isInterB() ) );

#if JMVM_ONLY  // JVT-W081
  //JVT-Z021
  if ( /*FMb.m_iViewMode < INTRA_4X4 &&*/ //linsx
	  !rcMbDataAccess.getSH().getAVCFlag() && rcMbDataAccess.getSH().getMotionSkip() &&
	  ( rcMbDataAccess.getSH().isInterP() || rcMbDataAccess.getSH().isInterB() ) && 
	  !rcMbDataAccess.getSH().getAnchorPicFlag()  )
  { 
	  //JVT-Z021

	  Bool bMSDone = false;

	  Bool bIsView0, bIsView1;

	  if(rcMbDataAccess.getSH().getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD

	  {

		  bIsView0 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcMbDataAccess.getSH().getViewId(), LIST_0);

	  }

	  else

	  {

		  bIsView0 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcMbDataAccess.getSH().getViewId(), LIST_0);

	  }

	  if(bIsView0)

	  {

		  MBMotion cMbMotionTmp;

		  for(int k=0; k<rcMbDataAccess.getSH().getMbMotionModeNum(LIST_0); k++)

		  {

			  cMbMotionTmp = rcMbDataAccess.getSH().getMbMotionInfo(LIST_0,k);



			  if (cMbMotionTmp.m_iViewMode < INTRA_4X4 &&

				  ( rcMbDataAccess.getSH().isInterP() || rcMbDataAccess.getSH().isInterB() ) )

			  { 

				  bMSDone = true;

				  MbImsm cMbImsm;

				  Mv cOffsetPred;



				  Mv cPosCur;

				  Mv cCenter;



				  cCenter.setHor(cCenterL0.getHor());  

				  cCenter.setVer(cCenterL0.getVer());



				  cPosCur.setHor(k%9 - 9/2);          

				  cPosCur.setVer(k/9 - 9/2);



				  cMbImsm.m_iListXFlag = LIST_0;

				  cMbImsm.m_cOffset.setHor(cPosCur.getHor());

				  cMbImsm.m_cOffset.setVer(cPosCur.getVer());





				  RNOK( xEstimateMbMotionSkip  ( m_pcIntMbTempData,  m_pcIntMbBestData,  rcList0,  rcList1, 

					  &cMbMotionTmp, cMbImsm) );

			  }

		  }

	  }

	  {

		  //JVT-Z021

		  if(rcMbDataAccess.getSH().getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD

		  {

			  bIsView1 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcMbDataAccess.getSH().getViewId(), LIST_1);

		  }

		  else

		  {

			  bIsView1 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcMbDataAccess.getSH().getViewId(), LIST_1);

		  }

		  if(bIsView0)

		  {

			  MBMotion cMbMotionTmp;

			  for(int k=0; k<rcMbDataAccess.getSH().getMbMotionModeNum(LIST_1); k++)

			  {

				  cMbMotionTmp = rcMbDataAccess.getSH().getMbMotionInfo(LIST_1,k);



				  if (cMbMotionTmp.m_iViewMode < INTRA_4X4 &&

					  ( rcMbDataAccess.getSH().isInterP() || rcMbDataAccess.getSH().isInterB() ) )

				  { 

					  MbImsm cMbImsm;

					  Mv cOffsetPred;



					  Mv cPosCur;

					  Mv cCenter;



					  cCenter.setHor(cCenterL1.getHor() );  

					  cCenter.setVer(cCenterL1.getVer() );



					  cPosCur.setHor(k%9 - 9/2);          

					  cPosCur.setVer(k/9 - 9/2);



⌨️ 快捷键说明

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