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

📄 sliceencoder.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		if( pcBaseLayerFrame )    RNOK( pcBaseLayerFrame   ->removeFieldBuffer( ePicType ) );
		if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFieldBuffer( ePicType ) );
	}

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

  return Err::m_nOK;
}




ErrVal SliceEncoder::encodeIntraPicture( UInt&        ruiBits,
                                         ControlData& rcControlData,
                                         IntFrame*    pcFrame,
                                         IntFrame*    pcRecSubband,
                                         IntFrame*    pcBaseLayer,
                                         IntFrame*    pcPredSignal,
                                         UInt         uiMbInRow,
                                         Double				dLambda,
																				 PicType      ePicType )
{
  ROF( m_bInitDone );

  SliceHeader&  rcSliceHeader           = *rcControlData.getSliceHeader           ( ePicType );
  MbDataCtrl*   pcMbDataCtrl      =  rcControlData.getMbDataCtrl            ();
  MbDataCtrl*   pcBaseLayerCtrl   =  rcControlData.getBaseLayerCtrl         ();
  Int           iSpatialScalabilityType =  rcControlData.getSpatialScalabilityType(); // TMM_ESS

  //====== initialization ======
  RNOK( pcMbDataCtrl      ->initSlice         ( rcSliceHeader, ENCODE_PROCESS, false, NULL ) );
  if( pcBaseLayerCtrl )
  {
    RNOK( pcBaseLayerCtrl ->initSlice         ( rcSliceHeader, PRE_PROCESS,    false, NULL ) );
  }
  RNOK( m_pcControlMng    ->initSliceForCoding( rcSliceHeader ) );

  //====== initialization ======
  UInt          uiMbAddress         = rcSliceHeader.getFirstMbInSlice ();
  UInt          uiLastMbAddress     = rcSliceHeader.getLastMbInSlice  ();
  UInt          uiBits              = m_pcMbCoder ->getBitCount       ();

  if(uiMbAddress == -1) return Err::m_nOK;
if( ePicType!=FRAME )
	{
		if( pcFrame )      RNOK( pcFrame     ->addFieldBuffer( ePicType ) );
		if( pcRecSubband ) RNOK( pcRecSubband->addFieldBuffer( ePicType ) );
		if( pcBaseLayer )  RNOK( pcBaseLayer ->addFieldBuffer( ePicType ) );
		if( pcPredSignal ) RNOK( pcPredSignal->addFieldBuffer( ePicType ) );
	}

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

    MbDataAccess* pcMbDataAccess     = NULL;
    MbDataAccess* pcMbDataAccessBase = NULL;
    UInt          uiMbY, uiMbX;
    Double        dCost              = 0;

    rcSliceHeader.getMbPositionFromAddress    ( uiMbY, uiMbX, uiMbAddress );

    RNOK( pcMbDataCtrl      ->initMb          ( pcMbDataAccess,     uiMbY, uiMbX ) );
    if( pcBaseLayerCtrl )
    {
      RNOK( pcBaseLayerCtrl ->initMb          ( pcMbDataAccessBase, uiMbY, uiMbX ) );
    }
    RNOK( m_pcControlMng    ->initMbForCoding ( *pcMbDataAccess,    uiMbY, uiMbX, false, false ) );
    pcMbDataAccess->getMbData().deactivateMotionRefinement();
    pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );

	//JVT-U106 Behaviour at slice boundaries{
    if( rcSliceHeader.getBaseLayerId() != MSYS_UINT_MAX )
	     m_pcMbEncoder->setIntraBLFlag(m_pbIntraBLFlag[uiMbAddress]);
	//JVT-U106 Behaviour at slice boundaries}
    RNOK( m_pcMbEncoder     ->encodeIntra     ( *pcMbDataAccess,
                                                pcMbDataAccessBase,
                                                 pcFrame                   ->getPic( ePicType ),
                                                 pcFrame                   ->getPic( ePicType ),
                                                 pcRecSubband              ->getPic( ePicType ),
																								 pcBaseLayer ? pcBaseLayer ->getPic( ePicType ) : NULL,
																								 pcPredSignal              ->getPic( ePicType ),
                                                 dLambda,
                                                 dCost) );

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

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

  if( ePicType!=FRAME )
	{
		if( pcFrame )      RNOK( pcFrame     ->removeFieldBuffer( ePicType ) );
		if( pcRecSubband ) RNOK( pcRecSubband->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::encodeIntraPictureMbAff( UInt&				 ruiBits,
                                              ControlData& rcControlData,
                                              IntFrame*    pcOrgFrame,
                                              IntFrame*    pcFrame,
                                              IntFrame*    pcRecSubband,
                                              IntFrame*    pcBaseLayer,
                                              IntFrame*    pcPredSignal,
                                              UInt				 uiMbInRow,
                                              Double			 dLambda )
{
  ROF( m_bInitDone );

  SliceHeader&  rcSliceHeader           = *rcControlData.getSliceHeader           ( FRAME );
  MbDataCtrl*   pcMbDataCtrl            =  rcControlData.getMbDataCtrl            ();
  MbDataCtrl*   pcBaseLayerCtrl         =  rcControlData.getBaseLayerCtrl         ();
  MbDataCtrl*   pcBaseLayerCtrlField    =  rcControlData.getBaseLayerCtrlField   ();
  Int           iSpatialScalabilityType =  rcControlData.getSpatialScalabilityType();

  //====== initialization ======
  RNOK( pcMbDataCtrl      ->initSlice         ( rcSliceHeader, ENCODE_PROCESS, false, NULL ) );
  if( pcBaseLayerCtrl )
  {
    RNOK( pcBaseLayerCtrl ->initSlice         ( rcSliceHeader, PRE_PROCESS,    false, NULL ) );
  }

  if( pcBaseLayerCtrlField )
  {
    RNOK( pcBaseLayerCtrlField ->initSlice   ( rcSliceHeader, PRE_PROCESS,    false, NULL ) );
  }

  RNOK( m_pcControlMng    ->initSliceForCoding( rcSliceHeader ) );

  UInt uiBits = m_pcMbCoder ->getBitCount();

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

	RNOK( gSetFrameFieldArrays( apcOrgFrame,   pcOrgFrame   ) );
  RNOK( gSetFrameFieldArrays( apcFrame,      pcFrame      ) );
  RNOK( gSetFrameFieldArrays( apcRecSubband, pcRecSubband ) );
  RNOK( gSetFrameFieldArrays( apcBaseLayer,  pcBaseLayer  ) );
  RNOK( gSetFrameFieldArrays( apcPredSignal, pcPredSignal ) );

  IntYuvMbBuffer acIntYuvMbBufferPredSignal[2];
  IntYuvMbBuffer acIntYuvMbBufferRecSubBand[2];
  IntYuvMbBuffer acIntYuvMbBufferFrame     [2];

  UInt uiLastQp = rcSliceHeader.getPicQp();

  //===== loop over macroblocks =====
  UInt          uiMbAddress     = rcSliceHeader.getFirstMbInSlice ();
  const UInt    uiLastMbAddress = rcSliceHeader.getLastMbInSlice  ();
  for( ; uiMbAddress<= uiLastMbAddress; uiMbAddress+=2 )
  {
    MbDataBuffer acMbData[2];
    Double adCost[2]  = {0,0};

    IntYuvMbBuffer cTempBuffer;

    UInt auiLastQpTest[2] = {uiLastQp, uiLastQp};
    Int eP;
    for( eP = 0; eP < 4; eP++ )
    {
      MbDataAccess* pcMbDataAccess     = NULL;
      MbDataAccess* pcMbDataAccessBase = NULL;
      Double        dCost              = 0;
      UInt          uiMbY, uiMbX;

      const Bool    bField = (eP < 2);
      const UInt    uiMbAddressMbAff   = uiMbAddress+(eP%2);

      rcSliceHeader.getMbPositionFromAddress         ( uiMbY, uiMbX, uiMbAddressMbAff      );

      RNOK( pcMbDataCtrl      ->initMb               (  pcMbDataAccess,     uiMbY, uiMbX ) );

      if  (eP < 2 && pcBaseLayerCtrlField)  // field case
      {
        RNOK( pcBaseLayerCtrlField         ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
      }
      else if  (eP >= 2 && pcBaseLayerCtrl )  //frame case
      {
        RNOK( pcBaseLayerCtrl         ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
      }

      RNOK( m_pcControlMng    ->initMbForCoding ( *pcMbDataAccess,    uiMbY, uiMbX, true, bField ) );
      pcMbDataAccess->getMbData().deactivateMotionRefinement();
			pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );

      pcMbDataAccess->setLastQp( auiLastQpTest[bField] );
      RNOK( m_pcMbEncoder     ->encodeIntra     ( *pcMbDataAccess,
                                                   pcMbDataAccessBase,
                                                   apcOrgFrame  [eP],
                                                   apcFrame     [eP],
                                                   apcRecSubband[eP],
                                                   apcBaseLayer [eP],
                                                   apcPredSignal[eP],
                                                   dLambda,
                                                   dCost ) );
      auiLastQpTest[bField] = pcMbDataAccess->getMbData().getQp();
      adCost [eP>>1] += dCost;
      if( bField )
      {
        acMbData[eP].copy( pcMbDataAccess->getMbData() );
        acIntYuvMbBufferPredSignal[eP].loadBuffer( apcPredSignal[eP]->getFullPelYuvBuffer() );
        acIntYuvMbBufferRecSubBand[eP].loadBuffer( apcRecSubband[eP]->getFullPelYuvBuffer() );
        acIntYuvMbBufferFrame     [eP].loadBuffer( apcFrame     [eP]->getFullPelYuvBuffer() );
      }
    }

    const Bool bFieldMode = ( adCost[0] < adCost[1] );
#ifdef RANDOM_MBAFF
    bFieldMode = gBoolRandom();
#endif

    // coding part

    for( eP = 0; eP < 2; eP++ )
    {
      MbDataAccess* pcMbDataAccess     = NULL;
      MbDataAccess* pcMbDataAccessBase = NULL;
      UInt          uiMbY, uiMbX;
      const UInt    uiMbAddressMbAff   = uiMbAddress+eP;

      ETRACE_NEWMB( uiMbAddressMbAff );

      rcSliceHeader.getMbPositionFromAddress    ( uiMbY, uiMbX, uiMbAddressMbAff );

      RNOK( pcMbDataCtrl      ->initMb          ( pcMbDataAccess,     uiMbY, uiMbX ) );

      if( bFieldMode && pcBaseLayerCtrlField )
      {
        RNOK( pcBaseLayerCtrlField ->initMb    ( pcMbDataAccessBase, uiMbY, uiMbX ) );
      }
      else if( !bFieldMode && pcBaseLayerCtrl )
      {
        RNOK( pcBaseLayerCtrl ->initMb          ( pcMbDataAccessBase, uiMbY, uiMbX ) );
      }

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

      if( bFieldMode )
      {
        pcMbDataAccess->getMbData().copy( acMbData[eP] );
        apcRecSubband [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferRecSubBand[eP] );
        apcPredSignal [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferPredSignal[eP] );
        apcFrame      [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferFrame     [eP] );
      }
      pcMbDataAccess->setLastQp( uiLastQp );
      uiLastQp = pcMbDataAccess->getMbData().getQp();
			pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );

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

  ruiBits += m_pcMbCoder ->getBitCount() - uiBits;
	return Err::m_nOK;
}

// TMM_INTERLACE}


ErrVal SliceEncoder::encodeHighPassPicture( 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,
                                            UInt          uiMbInRow,
                                            Double        dLambda,
                                            Int           iMaxDeltaQp,
                                            Int          iSpatialScalabilityType,
																						PicType      ePicType )
{
  ROF( m_bInitDone );

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

  //====== initialization ======
  UInt            uiMbAddress       = rcSH.getFirstMbInSlice();
  UInt            uiLastMbAddress   = rcSH.getLastMbInSlice ();
  UInt            uiBits            = m_pcMbCoder->getBitCount();
  Int             iQPRes            = rcSH.getPicQp();

⌨️ 快捷键说明

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