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

📄 sliceencoder.cpp

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

  return Err::m_nOK;
}

// TMM_INTERLACE{
ErrVal SliceEncoder::encodeHighPassPictureMbAff( UInt&				ruiMbCoded,
                                                 UInt&				ruiBits,
                                                 SliceHeader&	rcSH,
                                                 Frame*    pcOrgFrame,
                                                 Frame*    pcFrame,
                                                 Frame*    pcResidual,
                                                 Frame*    pcPredSignal,
     																						 Frame*    pcBaseSubband,
                                                 Frame*    pcBaseLayer,
                                                 MbDataCtrl*	pcMbDataCtrl,
                                                 MbDataCtrl*  pcMbDataCtrlBaseMotion,
                                                 MbDataCtrl*   pcMbDataCtrlInterlBaseMotion,
                                                 UInt					uiMbInRow,
                                                 Double				dLambda,
                                                 Int					iMaxDeltaQp )
{
  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.getSliceQp           ();
  Int  iQPIntra = rcSH.getSliceQp           (); //- 2;

  YuvMbBuffer  cZeroBuffer;
  cZeroBuffer.setAllSamplesToZero();

  Frame*	apcFrame      [4] = { NULL, NULL, NULL, NULL };
  Frame*	apcOrgFrame   [4] = { NULL, NULL, NULL, NULL };
  Frame*	apcResidual   [4] = { NULL, NULL, NULL, NULL };
  Frame*	apcPredSignal [4] = { NULL, NULL, NULL, NULL };
  Frame*	apcBaseSubband[4] = { NULL, NULL, NULL, NULL };
  Frame*	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 ) );

      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 );

        if( ! rcSH.getNoInterLayerPredFlag() )
        {
          Int iField = ( bField ? 1 : 0 );
          m_pcMbEncoder->setBaseModeAllowedFlag( m_apabBaseModeFlagAllowedArrays[iField][uiMbAddressMbAff] );
        }

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

        RNOK( m_pcMbCoder   ->encode     ( *pcMbDataAccess,
					                                  pcMbDataAccessBase,
																						(uiMbAddressMbAff == uiLastMbAddress ),
																						(eP == 1)  ) );
		
        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],
                                                 bCoded,
                                                 dLambda,
                                                 iMaxDeltaQp ) );

        if( ! pcMbDataAccess->getSH().getNoInterLayerPredFlag() && ! pcMbDataAccess->getSH().getAdaptiveBaseModeFlag() && pcMbDataAccessBase->getMbData().getInCropWindowFlag() )
        {
          ROF( pcMbDataAccess->getMbData().getResidualPredFlag() );
          pcMbDataAccess->getMbData().setBLSkipFlag( true );
        }

        m_pcTransform->setClipMode( true );

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

        if( bCoded )
        {
          ruiMbCoded++;
        }
       
         RNOK( apcPredSignal[uiLI]->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );
      }
    }
  }

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

  return Err::m_nOK;
}
// TMM_INTERLACE}

// TMM_INTERLACE{
ErrVal
SliceEncoder::encodeInterPicturePMbAff( UInt&         ruiBits,
                                        Frame*     pcOrgFrame,
                                        Frame*     pcFrame,
                                        Frame*     pcRecSubband,
                                        Frame*     pcPredSignal,
                                        ControlData&  rcControlData,
                                        UInt          uiMbInRow,
                                        RefFrameList& rcRefFrameList,
                                        RefFrameList& rcRefFrameListBase )
{
  ROF( m_bInitDone );

  SliceHeader&  rcSliceHeader						= *rcControlData.getSliceHeader          ( FRAME );
  MbDataCtrl*   pcMbDataCtrl						= rcControlData.getMbDataCtrl            ();
	Frame*     pcBaseLayerFrame        = rcControlData.getBaseLayerRec          ();
	Frame*     pcBaseLayerResidual     = rcControlData.getBaseLayerSbb          ();
  MbDataCtrl*   pcBaseLayerCtrl					= rcControlData.getBaseLayerCtrl         ();
  MbDataCtrl*   pcBaseLayerCtrlField  =  rcControlData.getBaseLayerCtrlField    ();
  Double        dLambda									= rcControlData.getLambda                ();
  UInt          uiBits									= m_pcMbCoder ->getBitCount              ();

  //====== 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 ) );

  RefFrameList acRefFrameList    [2];
  RefFrameList acRefFrameListBase[2];

  YuvMbBuffer acIntYuvMbBufferPredSignal[2];
  YuvMbBuffer acIntYuvMbBufferRecSubBand[2];
  YuvMbBuffer acIntYuvMbBufferFrame     [2];

  RNOK( gSetFrameFieldLists( acRefFrameList    [0], acRefFrameList    [1], rcRefFrameList     ) );
  RNOK( gSetFrameFieldLists( acRefFrameListBase[0], acRefFrameListBase[1], rcRefFrameListBase ) );

  Frame* apcOrgFrame  [4] = { NULL, NULL, NULL, NULL };
  Frame* apcFrame     [4] = { NULL, NULL, NULL, NULL };
  Frame* apcRecSubband[4] = { NULL, NULL, NULL, NULL };
  Frame* apcPredSignal[4] = { NULL, NULL, NULL, NULL };
  Frame* apcBaseLayerF[4] = { NULL, NULL, NULL, NULL };
  Frame* apcBaseLayerR[4] = { NULL, NULL, NULL, NULL };

	RNOK( gSetFrameFieldArrays( apcFrame,      pcFrame             ) );
  RNOK( gSetFrameFieldArrays( apcOrgFrame,   pcOrgFrame          ) );
  RNOK( gSetFrameFieldArrays( apcRecSubband, pcRecSubband        ) );
  RNOK( gSetFrameFieldArrays( apcPredSignal, pcPredSignal        ) );
  RNOK( gSetFrameFieldArrays( apcBaseLayerF, pcBaseLayerFrame    ) );
  RNOK( gSetFrameFieldArrays( apcBaseLayerR, pcBaseLayerResidual ) );

  MbDataBuffer acMbData[2];
  Bool   abSkipModeAllowed[4] = {true,true,true,true};
  UInt uiLastQp = rcSliceHeader.getSliceQp();

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

    for( eP = 0; eP < 4; eP++ )
    {
      RefFrameList* pcRefFrameList;
      RefFrameList* pcRefFrameListBase;
      MbDataAccess* pcMbDataAccess     = NULL;
      MbDataAccess* pcMbDataAccessBase = NULL;
      Double        dCost = 0;
      UInt          uiMbY, uiMbX;

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

      if( bField )
      {
        pcRefFrameList     = acRefFrameList     + eP;
        pcRefFrameListBase = acRefFrameListBase + eP;
      }
      else
      {
        pcRefFrameList     = &rcRefFrameList;
        pcRefFrameListBase = &rcRefFrameListBase;
      }

      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->setLastQp( auiLastQpTest[bField] );

      if( 0 == eP )
      {
        abSkipModeAllowed[1] = pcMbDataAccess->getDefaultFieldFlag(); // do not move
        abSkipModeAllowed[3] = ! abSkipModeAllowed[1];
      }

      pcRefFrameListBase = pcRefFrameListBase->getSize()? pcRefFrameListBase : NULL;

      if( ! rcSliceHeader.getNoInterLayerPredFlag() )
      {
        Int iField = ( bField ? 1 : 0 );
        m_pcMbEncoder->setBaseModeAllowedFlag( m_apabBaseModeFlagAllowedArrays[iField][uiMbAddressMbAff] );
      }

      RNOK( m_pcMbEncoder     ->encodeInterP    ( *pcMbDataAccess,
                                                   pcMbDataAccessBase,
                                                   apcOrgFrame  [eP],
                                                   apcFrame     [eP],
                                                   apcRecSubband[eP],
                                                   apcPredSignal[eP],
                                                   apcBaseLayerF[eP],
                                                   apcBaseLayerR[eP],
                                                  *pcRefFrameList,
                                                   pcRefFrameListBase,
                                                   dLambda,
                                                   dCost,
                                                   abSkipModeAllowed[eP] ) );
	  
      auiLastQpTest[bField] = pcMbDataAccess->getMbData().getQp();

      if( adCost[eP>>1] != DOUBLE_MAX )
      {
        adCost [eP>>1] += dCost;
      }

      if( bField )
      {
        acMbData[eP].copy( pcMbDataAccess->getMbData() );
        if( apcPredSignal [eP] ) acIntYuvMbBufferPredSignal[eP].loadBuffer( apcPredSignal [eP]->getFullPelYuvBuffer() );
        if( apcRecSubband [eP] ) acIntYuvMbBufferRecSubBand[eP].loadBuffer( apcRecSubband [eP]->getFullPelYuvBuffer() );
        if( apcFrame      [eP] ) acIntYuvMbBufferFrame     [eP].loadBuffer( apcFrame      [eP]->getFullPelYuvBuffer() );
      }
    }

    const Bool bFieldMode = ( adCost[0] < adCost[1] );
#ifdef RANDOM_MBAFF
    bFieldMode = gBoolRandom();
#endif
    for( eP = 0; eP < 2; eP++ )
    {

⌨️ 快捷键说明

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