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

📄 sliceencoder.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  Int             iQPIntra          = rcSH.getPicQp(); //- 2;

  IntYuvMbBuffer  cZeroBuffer;
  cZeroBuffer.setAllSamplesToZero();

	if( ePicType!=FRAME )
	{
		if( pcFrame )       RNOK( pcFrame      ->addFieldBuffer( ePicType ) );
		if( pcResidual )    RNOK( pcResidual   ->addFieldBuffer( ePicType ) );
		if( pcBaseSubband ) RNOK( pcBaseSubband->addFieldBuffer( ePicType ) );
		if( pcBaseLayer )   RNOK( pcBaseLayer  ->addFieldBuffer( ePicType ) );
		if( pcPredSignal )  RNOK( pcPredSignal ->addFieldBuffer( ePicType ) );
	}

  //===== loop over macroblocks =====
  for(  ruiMbCoded = 0; uiMbAddress <= uiLastMbAddress;  ) //--ICU/ETRI FMO Implementation
  {
    ETRACE_NEWMB( uiMbAddress );

    MbDataAccess* pcMbDataAccess = NULL;
    Bool          bCoded;
    UInt          uiMbY, uiMbX;

    rcSH.getMbPositionFromAddress           ( uiMbY, uiMbX, uiMbAddress );

    RNOK( pcMbDataCtrl    ->initMb          (  pcMbDataAccess,    uiMbY, uiMbX ) );
    RNOK( m_pcControlMng  ->initMbForCoding ( *pcMbDataAccess,    uiMbY, uiMbX, false, false ) );
    pcMbDataAccess->getMbData().deactivateMotionRefinement();

    MbDataAccess* pcMbDataAccessBase  = 0;

    if( pcMbDataCtrlBaseMotion)
    {
      RNOK( pcMbDataCtrlBaseMotion->initMb  ( pcMbDataAccessBase, uiMbY, uiMbX ) );
    }
    pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );

    if( pcMbDataAccess->getMbData().isIntra() )
    {
      Double dCost = 0;
      //JVT-U106 Behaviour at slice boundaries{
	   if( rcSH.getBaseLayerId() != MSYS_UINT_MAX )
		    m_pcMbEncoder->setIntraBLFlag(m_pbIntraBLFlag[uiMbAddress]);
	    //JVT-U106 Behaviour at slice boundaries}

      pcMbDataAccess->getMbData().setQp( iQPIntra );

      RNOK( m_pcMbEncoder ->encodeIntra   ( *pcMbDataAccess,
                                             pcMbDataAccessBase,
                                             pcFrame                  ->getPic( ePicType ),
                                             pcFrame                  ->getPic( ePicType ),
                                             pcResidual               ->getPic( ePicType ),
																						 pcBaseLayer ? pcBaseLayer->getPic( ePicType ) : NULL,
																						 pcPredSignal             ->getPic( ePicType ),
                                             dLambda,
                                             dCost ) );

      RNOK( m_pcMbCoder   ->encode        ( *pcMbDataAccess,
                                             pcMbDataAccessBase,
                                             iSpatialScalabilityType,
                                             (uiMbAddress == uiLastMbAddress ),
                                             true ) );
			//-- JVT-R091
			// update with best data (intra)
			pcSRFrame->getFullPelYuvBuffer()->loadBuffer( m_pcMbEncoder->getBestIntData() );
			//--

      ruiMbCoded++;
    }
    else
    {
      pcMbDataAccess->getMbData().setQp( iQPRes );

      m_pcTransform->setClipMode( false );
      RNOK( m_pcMbEncoder ->encodeResidual  ( *pcMbDataAccess,
                                               pcOrgFrame->getPic( ePicType ),
                                               pcFrame   ->getPic( ePicType ),
                                               pcResidual->getPic( ePicType ),
											   pcBaseSubband ? pcBaseSubband->getPic( ePicType ) : NULL,
											   pcSRFrame, // JVT-R091
                                               bCoded,
                                               dLambda,
                                               iMaxDeltaQp ) );

      if( pcMbDataAccess->getSH().getBaseLayerId() != MSYS_UINT_MAX && ! pcMbDataAccess->getSH().getAdaptivePredictionFlag() )
      {
        ROF( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) );
        pcMbDataAccess->getMbData().setBLSkipFlag( true );
      }

      m_pcTransform->setClipMode( true );

      RNOK( m_pcMbCoder->encode( *pcMbDataAccess, pcMbDataAccessBase, iSpatialScalabilityType, (uiMbAddress == uiLastMbAddress ), true ) );

      if( bCoded )
      {
        ruiMbCoded++;
      }

      if( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) && !rcSH.getAVCRewriteFlag() )
      {
        pcMbDataAccess->getMbData().setMbExtCbp( pcMbDataAccess->getMbData().getMbExtCbp() | pcMbDataAccessBase->getMbData().getMbExtCbp() );
      }

			//-- JVT-R091
			// update with best-data (inter)
			IntYuvMbBuffer	cPredBuffer, cResBuffer;
			cPredBuffer.loadBuffer	( ((IntFrame*)pcSRFrame		)->getFullPelYuvBuffer() );
			cResBuffer.	loadBuffer	( ((IntFrame*)pcResidual  )->getFullPelYuvBuffer() );
			cPredBuffer.add( cResBuffer );
			cPredBuffer.clip				();
			pcSRFrame->getFullPelYuvBuffer()->loadBuffer( &cPredBuffer );
			//--

      RNOK( pcPredSignal->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );
    }

    uiMbAddress = rcSH.getFMO()->getNextMBNr(uiMbAddress);
  }

  if( ePicType!=FRAME )
	{
		if( pcFrame )       RNOK( pcFrame      ->removeFieldBuffer( ePicType ) );
		if( pcResidual )    RNOK( pcResidual   ->removeFieldBuffer( ePicType ) );
		if( pcBaseSubband ) RNOK( pcBaseSubband->removeFieldBuffer( ePicType ) );
		if( pcBaseLayer )   RNOK( pcBaseLayer  ->removeFieldBuffer( ePicType ) );
		if( pcPredSignal )  RNOK( pcPredSignal ->removeFieldBuffer( ePicType ) );
	}

  ruiBits += m_pcMbCoder->getBitCount() - uiBits;

  return Err::m_nOK;
}

// TMM_INTERLACE{
ErrVal SliceEncoder::encodeHighPassPictureMbAff( UInt&				ruiMbCoded,
                                                 UInt&				ruiBits,
                                                 SliceHeader&	rcSH,
                                                 IntFrame*    pcOrgFrame,
                                                 IntFrame*    pcFrame,
                                                 IntFrame*    pcResidual,
                                                 IntFrame*    pcPredSignal,
     																						 IntFrame*		pcSRFrame, // JVT-R091
                                                 IntFrame*    pcBaseSubband,
                                                 IntFrame*    pcBaseLayer,
                                                 MbDataCtrl*	pcMbDataCtrl,
                                                 MbDataCtrl*  pcMbDataCtrlBaseMotion,
                                                 MbDataCtrl*   pcMbDataCtrlInterlBaseMotion,
                                                 UInt					uiMbInRow,
                                                 Double				dLambda,
                                                 Int					iMaxDeltaQp,
                                                 Int					iSpatialScalabilityType )
{
  ROF( m_bInitDone );

  //====== initialization ======
  RNOK( pcMbDataCtrl  ->initSlice         ( rcSH, PRE_PROCESS, false, NULL ) );
  RNOK( m_pcControlMng->initSliceForCoding( rcSH              ) );

  UInt uiBits   = m_pcMbCoder->getBitCount();
  Int  iQPRes   = rcSH.getPicQp           ();
  Int  iQPIntra = rcSH.getPicQp           (); //- 2;

  IntYuvMbBuffer  cZeroBuffer;
  cZeroBuffer.setAllSamplesToZero();

  IntFrame*	apcFrame      [4] = { NULL, NULL, NULL, NULL };
  IntFrame*	apcOrgFrame   [4] = { NULL, NULL, NULL, NULL };
  IntFrame*	apcResidual   [4] = { NULL, NULL, NULL, NULL };
  IntFrame*	apcPredSignal [4] = { NULL, NULL, NULL, NULL };
  IntFrame*	apcBaseSubband[4] = { NULL, NULL, NULL, NULL };
  IntFrame*	apcBaseLayer  [4] = { NULL, NULL, NULL, NULL };

	RNOK( gSetFrameFieldArrays( apcFrame,       pcFrame       ) );
	RNOK( gSetFrameFieldArrays( apcOrgFrame,    pcOrgFrame    ) );
  RNOK( gSetFrameFieldArrays( apcResidual,    pcResidual    ) );
  RNOK( gSetFrameFieldArrays( apcPredSignal,  pcPredSignal  ) );
  RNOK( gSetFrameFieldArrays( apcBaseSubband, pcBaseSubband ) );
  RNOK( gSetFrameFieldArrays( apcBaseLayer,   pcBaseLayer   ) );

  //===== loop over macroblocks =====
  UInt       uiMbAddress     = rcSH.getFirstMbInSlice();
  const UInt uiLastMbAddress = rcSH.getLastMbInSlice  ();
  for( ; uiMbAddress <= uiLastMbAddress; uiMbAddress+=2 )
  {
    for( Int eP = 0; eP < 2; eP++ )
    {
      MbDataAccess* pcMbDataAccess     = NULL;
      MbDataAccess* pcMbDataAccessBase = NULL;
      UInt          uiMbY, uiMbX;
      const UInt    uiMbAddressMbAff   = uiMbAddress+eP;
      Bool          bCoded;

      ETRACE_NEWMB( uiMbAddressMbAff );

      rcSH.getMbPositionFromAddress           ( uiMbY, uiMbX, uiMbAddressMbAff );

      RNOK( pcMbDataCtrl    ->initMb          (  pcMbDataAccess,    uiMbY, uiMbX ) );
      const Bool bField = pcMbDataAccess->getMbData().getFieldFlag();

      RNOK( m_pcControlMng  ->initMbForCoding ( *pcMbDataAccess,    uiMbY, uiMbX, true, bField ) );

      pcMbDataAccess->getMbData().deactivateMotionRefinement();

      if( bField && pcMbDataCtrlInterlBaseMotion)   // field case
      {
        RNOK( pcMbDataCtrlInterlBaseMotion ->      initMb  ( pcMbDataAccessBase, uiMbY, uiMbX ) );
      }
      else if( !bField && pcMbDataCtrlBaseMotion)   // frame case
      {
        RNOK( pcMbDataCtrlBaseMotion       ->      initMb  ( pcMbDataAccessBase, uiMbY, uiMbX ) );
      }

      const PicType eMbPicType = pcMbDataAccess->getMbPicType();
      const UInt    uiLI       = eMbPicType - 1;

      if( pcMbDataAccess->getMbData().isIntra() )
      {
        Double dCost = 0;
        pcMbDataAccess->getMbData().setQp( iQPIntra );
			  pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );

        RNOK( m_pcMbEncoder ->encodeIntra( *pcMbDataAccess,
					                                  pcMbDataAccessBase,
                                            apcFrame     [uiLI],
                                            apcFrame     [uiLI],
                                            apcResidual  [uiLI],
                                            apcBaseLayer [uiLI],
                                            apcPredSignal[uiLI],
																						dLambda,
																						dCost ) );

        RNOK( m_pcMbCoder   ->encode     ( *pcMbDataAccess,
					                                  pcMbDataAccessBase,
																						iSpatialScalabilityType,
																						(uiMbAddressMbAff == uiLastMbAddress ),
																						(eP == 1)  ) );
			//-- JVT-R091
			// update with best data (intra)
			pcSRFrame->getFullPelYuvBuffer()->loadBuffer( m_pcMbEncoder->getBestIntData() );
			//--

        ruiMbCoded++;
      }
      else
      {
        pcMbDataAccess->getMbData().setQp( iQPRes );
			  pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );

        m_pcTransform->setClipMode( false );
        RNOK( m_pcMbEncoder ->encodeResidual  ( *pcMbDataAccess,
					                             apcOrgFrame   [uiLI],
					                             apcFrame      [uiLI],
												 apcResidual   [uiLI],
												 apcBaseSubband[uiLI],
												 pcSRFrame, // JVT-R091,
                                                 bCoded,
												 dLambda,
                                                 iMaxDeltaQp ) );

        if( pcMbDataAccess->getSH().getBaseLayerId() != MSYS_UINT_MAX && ! pcMbDataAccess->getSH().getAdaptivePredictionFlag() )
        {
          ROF( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) );
          pcMbDataAccess->getMbData().setBLSkipFlag( true );
        }

        m_pcTransform->setClipMode( true );

        RNOK( m_pcMbCoder->encode( *pcMbDataAccess,
                                    pcMbDataAccessBase,
                                    iSpatialScalabilityType,
                                    (uiMbAddressMbAff == uiLastMbAddress ),
                                    (eP == 1) ) );

        if( bCoded )
        {
          ruiMbCoded++;
        }

        if( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) )
        {
          pcMbDataAccess->getMbData().setMbExtCbp( pcMbDataAccess->getMbData().getMbExtCbp() | pcMbDataAccessBase->getMbData().getMbExtCbp() );
        }
			//-- JVT-R091
			// update with best-data (inter)
			IntYuvMbBuffer	cPredBuffer, cResBuffer;
			cPredBuffer.loadBuffer	( ((IntFrame*)pcSRFrame		)->getFullPelYuvBuffer() );
			cResBuffer.	loadBuffer	( ((IntFrame*)pcResidual  )->getFullPelYuvBuffer() );
			cPredBuffer.add					( cResBuffer );
			cPredBuffer.clip				();
			pcSRFrame->getFullPelYuvBuffer()->loadBuffer( &cPredBuffer );
			//--

        RNOK( apcPredSignal[uiLI]->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );
      }
    }
  }

  ruiBits += m_pcMbCoder->getBitCount() - uiBits;

  return Err::m_nOK;
}
// TMM_INTERLACE}

// TMM_INTERLACE{

⌨️ 快捷键说明

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