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

📄 gopencoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//            RNOK( pcMbDataAccess->getMbData().saveAll( m_pMotionInfoFile ) );
          }*/
// TMM_INTERLACE}
        }
        else
        {
          //===== load prediction data =====
            RNOK( pcMbDataAccess->getMbData().loadAll( m_pMotionInfoFile ) );
        }
        uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress);
        uiNumMBInSlice++;
      }
    }
  }
  else
  {
   
    FMO* pcFMO = rcControlData.getSliceHeader( ePicType )->getFMO(); //TMM
 
    for (UInt iSliceGroupID=0;!pcFMO->SliceGroupCompletelyCoded(iSliceGroupID);iSliceGroupID++)
    {
      rcSliceHeader.setFirstMbInSlice(pcFMO->getFirstMacroblockInSlice(iSliceGroupID));
      rcSliceHeader.setLastMbInSlice(pcFMO->getLastMBInSliceGroup(iSliceGroupID));
      // JVT-S054 (2) (ADD)
      rcSliceHeader.setNumMbsInSlice(rcSliceHeader.getFMO()->getNumMbsInSlice(rcSliceHeader.getFirstMbInSlice(), rcSliceHeader.getLastMbInSlice()));
      UInt uiMbAddress       = rcSliceHeader.getFirstMbInSlice();
      UInt uiLastMbAddress   = rcSliceHeader.getLastMbInSlice();
      UInt uiNumMBInSlice;


      //===== initialization =====
      RefFrameList rcRefFrameList1 = rcControlData.getPrdFrameList( LIST_1 );
      if( rcSliceHeader.isMbaffFrame() )
        RNOK( pcMbDataCtrl->initUsedField( rcSliceHeader, rcRefFrameList1 ) );

      //===== initialization =====
      RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, ENCODE_PROCESS, false, pcMbDataCtrlL1 ) );
      if( ! m_bLoadMotionInfo )
      {
        RNOK( m_pcMotionEstimation->initSlice( rcSliceHeader ) );
        RNOK( pcMbEncoder         ->initSlice( rcSliceHeader ) );
        RNOK( m_pcMotionEstimation->getSW()->initSlice( rcSliceHeader ) );
      }

      //===== loop over macroblocks =====
      //for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
      for(  uiNumMBInSlice = 0; uiMbAddress <= uiLastMbAddress;  )
      {
        MbDataAccess* pcMbDataAccess      = 0;
        MbDataAccess* pcMbDataAccessBase  = 0;

        UInt          uiMbY, uiMbX;
        Double        dCost              = 0;

        rcSliceHeader.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress     );

        //===== init macroblock =====
        RNOK  ( pcMbDataCtrl            ->initMb( pcMbDataAccess,     uiMbY, uiMbX ) );
        if    ( pcBaseLayerCtrl )
        {
          RNOK( pcBaseLayerCtrl         ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
          if (rcSliceHeader.getTCoeffLevelPredictionFlag())
            pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
        }

        if( ! m_bLoadMotionInfo )
        {
          //===== initialisation =====
          RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX, false           ) );
          RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX, false           ) );
          RNOK( m_pcMotionEstimation    ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );

          if( !rcSliceHeader.getNoInterLayerPredFlag() )
          {
            pcMbEncoder->setBaseModeAllowedFlag( m_apabBaseModeFlagAllowedArrays[0][uiMbAddress] );
          }

          RNOK( pcMbEncoder->estimatePrediction ( *pcMbDataAccess,
                                                  pcMbDataAccessBase,
                                                  *pcRefFrameList0,
                                                  *pcRefFrameList1,
                                                 
                                                  pcBaseLayerFrame    ? pcBaseLayerFrame   ->getPic( ePicType ) : NULL,
                                                  pcBaseLayerResidual ? pcBaseLayerResidual->getPic( ePicType ) : NULL,
                                                  *pcOrigFrame                              ->getPic( ePicType ),
                                                  *pcIntraRecFrame                          ->getPic( ePicType ),
                                                  
                                                  bBiPredOnly,
                                                  uiNumMaxIter,
                                                  uiIterSearchRange,
                                                  m_bBLSkipEnable, //JVT-Q065 EIDR
                                                  rcControlData.getLambda(),
                                                  dCost,
                                                  true ) );
// TMM_INTERLACE{
         /* if( m_bSaveMotionInfo )
          {
            //===== save prediction data =====
           // saveAll is displaced because the Mvs are Ok but the other data could be modified (mode,...).
           // Do it after m_pcSliceEncoder->encodeHighPassPicture
           //            RNOK( pcMbDataAccess->getMbData().saveAll( m_pMotionInfoFile ) );
          }*/
// TMM_INTERLACE}
        }
        else
        {
          //===== load prediction data =====
            RNOK( pcMbDataAccess->getMbData().loadAll( m_pMotionInfoFile ) );
        }
        uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress);
        uiNumMBInSlice++;
      }
    }
  }

  if( ePicType!=FRAME )
  {
    if( pcOrigFrame )         RNOK( pcOrigFrame        ->removeFieldBuffer( ePicType ) );
    if( pcIntraRecFrame )     RNOK( pcIntraRecFrame    ->removeFieldBuffer( ePicType ) );
    if( pcBaseLayerFrame )    RNOK( pcBaseLayerFrame   ->removeFieldBuffer( ePicType ) );
    if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFieldBuffer( ePicType ) );
  }
  
  return Err::m_nOK;
}




ErrVal
LayerEncoder::xMotionCompensation( Frame*        pcMCFrame,
                                  RefFrameList*    pcRefFrameList0,
                                  RefFrameList*    pcRefFrameList1,
                                  MbDataCtrl*      pcMbDataCtrl,
                                  SliceHeader&     rcSH )
{
  Bool        bCalcMv         = false;
  Bool        bFaultTolerant  = false;
  MbEncoder*  pcMbEncoder     = m_pcSliceEncoder->getMbEncoder();

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

  MbDataCtrl*      pcBaseMbDataCtrl = getBaseMbDataCtrl();

  RefFrameList* apcRefFrameList0[4] = { NULL, NULL, NULL, NULL };
  RefFrameList* apcRefFrameList1[4] = { NULL, NULL, NULL, NULL };
  const PicType ePicType = rcSH.getPicType();
  const Bool    bMbAff   = rcSH.isMbaffFrame   ();
  Frame* apcBLFrame[3] = { 0, 0, m_pcBaseLayerFrame };
  
  if( bMbAff )
  {
    RefFrameList acRefFrameList0[2];
    RefFrameList acRefFrameList1[2];
  
    RNOK( gSetFrameFieldLists( acRefFrameList0[0], acRefFrameList0[1], *pcRefFrameList0 ) );
    RNOK( gSetFrameFieldLists( acRefFrameList1[0], acRefFrameList1[1], *pcRefFrameList1 ) );
  
    apcRefFrameList0[ TOP_FIELD ] = ( NULL == pcRefFrameList0 ) ? NULL : &acRefFrameList0[0];
    apcRefFrameList0[ BOT_FIELD ] = ( NULL == pcRefFrameList0 ) ? NULL : &acRefFrameList0[1];
    apcRefFrameList1[ TOP_FIELD ] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[0];
    apcRefFrameList1[ BOT_FIELD ] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[1];
    apcRefFrameList0[     FRAME ] = pcRefFrameList0;
    apcRefFrameList1[     FRAME ] = pcRefFrameList1;

    if( m_pcBaseLayerFrame )
    {
      m_pcBaseLayerFrame->addFrameFieldBuffer();
      apcBLFrame[0] = m_pcBaseLayerFrame->getPic( TOP_FIELD );
      apcBLFrame[1] = m_pcBaseLayerFrame->getPic( BOT_FIELD );
    }
  }
  else
  {
    RNOK( pcMCFrame->addFieldBuffer( ePicType ) );
    apcRefFrameList0[ ePicType ] = pcRefFrameList0;
    apcRefFrameList1[ ePicType ] = pcRefFrameList1;
  }

  //===== loop over macroblocks =====
  const UInt uiMbNumber = rcSH.getMbInPic(); //TMM
  for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ ) //TMM
  {
    MbDataAccess* pcMbDataAccess = NULL;
    MbDataAccess* pcMbDataAccessBase  = 0;
    UInt          uiMbY, uiMbX;

    rcSH.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress                                );

    RNOK( pcMbDataCtrl            ->initMb( pcMbDataAccess, uiMbY, uiMbX                  ) );
    if    ( pcBaseMbDataCtrl )
    {
      RNOK( pcBaseMbDataCtrl         ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
    }
    RNOK( m_pcYuvFullPelBufferCtrl->initMb(                 uiMbY, uiMbX, bMbAff          ) );
    RNOK( m_pcYuvHalfPelBufferCtrl->initMb(                 uiMbY, uiMbX, bMbAff          ) );
    RNOK( m_pcMotionEstimation    ->initMb(                 uiMbY, uiMbX, *pcMbDataAccess ) );

    const PicType eMbPicType = pcMbDataAccess->getMbPicType();
    pcMbDataAccess->setMbDataAccessBase(pcMbDataAccessBase);
    pcMbEncoder->setBaseLayerRec( apcBLFrame[ eMbPicType - 1 ] );

    RNOK( pcMbEncoder->compensatePrediction( *pcMbDataAccess, 
                                              pcMCFrame->getPic( eMbPicType ),
                                             *apcRefFrameList0 [ eMbPicType ],
                                             *apcRefFrameList1 [ eMbPicType ],
                                             bCalcMv, bFaultTolerant) );

  }

  return Err::m_nOK;
}


ErrVal
LayerEncoder::xGetConnections( Double&       rdL0Rate,
                              Double&       rdL1Rate,
                              Double&       rdBiRate )
{
  //=== just a guess ===
  if( m_bHaarFiltering )
  {
    rdL0Rate = 1.0;
    rdL1Rate = 0.0;
    rdBiRate = 0.0;
  }
  else if( m_bBiPredOnly )
  {
    rdL0Rate = 0.0;
    rdL1Rate = 0.0;
    rdBiRate = 1.0;
  }
  else
  {
    rdL0Rate = 0.2;
    rdL1Rate = 0.2;
    rdBiRate = 0.6;
  }
  return Err::m_nOK;
}




ErrVal
LayerEncoder::xZeroIntraMacroblocks( Frame*    pcFrame,
                                    ControlData& rcCtrlData, 
                                    PicType      ePicType )
{
  MbDataCtrl*       pcMbDataCtrl  = rcCtrlData.getMbDataCtrl       ();
  SliceHeader*      pcSliceHeader = rcCtrlData.getSliceHeader      (ePicType);
  

  RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );

  YuvMbBuffer cZeroMbBuffer;
  cZeroMbBuffer.setAllSamplesToZero();

  const Bool bMbAff = pcSliceHeader->isMbaffFrame();
  if( ePicType!=FRAME )
  {
    RNOK( pcFrame->addFieldBuffer     ( ePicType ) );
  }
  else if( bMbAff )
  {
    RNOK( pcFrame->addFrameFieldBuffer() );
  }

  //===== loop over macroblocks =====
  const UInt uiMbNumber = pcSliceHeader->getMbInPic(); //TMM
  for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ ) //TMM
  {
    MbDataAccess* pcMbDataAccess = NULL;
    UInt          uiMbY, uiMbX;

    pcSliceHeader->getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress              );

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

    if( pcMbDataAccess->getMbData().isIntra() )
    {
      const PicType eMbPicType = pcMbDataAccess->getMbPicType();
      pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer()->loadBuffer( &cZeroMbBuffer );
    }
  }

  if( ePicType!=FRAME )
  {
    RNOK( pcFrame->removeFieldBuffer     ( ePicType ) );
  }
  else if( bMbAff )
  {
    RNOK( pcFrame->removeFrameFieldBuffer()           );
  }
  return Err::m_nOK;
}



ErrVal
LayerEncoder::xClipIntraMacroblocks( Frame*    pcFrame,
                                    ControlData& rcCtrlData, 
                                    Bool         bClipAll,
                                    PicType      ePicType )
{
  MbDataCtrl*       pcMbDataCtrl  = rcCtrlData.getMbDataCtrl       ();
  SliceHeader* pcSliceHeader = rcCtrlData.getSliceHeader( ePicType );
  ROF( pcSliceHeader );
  YuvPicBuffer* pcPicBuffer;
  YuvMbBuffer    cMbBuffer;

  RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );

  const Bool bMbAff = pcSliceHeader->isMbaffFrame();
  if( ePicType!=FRAME )
  {
    RNOK( pcFrame->addFieldBuffer     ( ePicType ) );
  }
  else if( bMbAff )
  {
    RNOK( pcFrame->addFrameFieldBuffer() );
  }

  //===== loop over macroblocks =====
  const UInt uiMbNumber = pcSliceHeader->getMbInPic();//TMM
  for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ )//TMM
  {
    MbDataAccess* pcMbDataAccess = 0;
    UInt          uiMbY, uiMbX;

    pcSliceHeader->getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress              );

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

    if( bClipAll || pcMbDataAccess->getMbData().isIntra() )
    {
      const PicType eMbPicType = pcMbDataAccess->getMbPicType();
      pcPicBuffer = pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer();
      cMb

⌨️ 快捷键说明

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