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

📄 picencoder.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// JVT-W040 just to make sure
  if ( ! bInterPredFirst )
    rpcSliceHeader->setDirectSpatialMvPredFlag            ( true );

  for( UInt uiList = 0; uiList < uiMaxLists; uiList++ )
  {
     ListIdx eListIdx  = ListIdx( uiList );
    // generate RPLR commands for inter-view prediciton pictures
    RplrBuffer * pcRplrBufferInterView = new RplrBuffer;
    RplrBuffer * pRplr = &rpcSliceHeader->getRplrBuffer( eListIdx );
    UInt        idx          = 0;
    Bool  bInterViewRPLRStart   = true;
    for (idx=0; idx< pcSPSMVC->getNumRefsForListX (uiCurrViewId, eListIdx, bAnchor); idx++)
    {
      if(bInterViewRPLRStart)
        pcRplrBufferInterView->set( idx, Rplr(RPLR_VIEW_NEG, 0));
      else 
        pcRplrBufferInterView->set( idx, Rplr(RPLR_VIEW_POS, 0));
      bInterViewRPLRStart = false;
    }
    
    pcRplrBufferInterView->set( idx, Rplr(RPLR_END));
    // update the RPLR commands for all
    UInt      uiIndex          = 0;
    UInt      uiIndexInterView =0;
    if (bInterPredFirst)
    {
      while( RPLR_END != ( uiCommand = pRplr->get( uiIndex ).getCommand( uiIdentifier ) ) )
        uiIndex++;
      while( RPLR_END != ( uiCommand = pcRplrBufferInterView->get( uiIndexInterView).getCommand( uiIdentifier ) ) )
      {
        pRplr->set( uiIndex+uiIndexInterView, pcRplrBufferInterView->get( uiIndexInterView)) ;
        uiIndexInterView++;
      }
      pRplr->set( uiIndex+uiIndexInterView, Rplr(RPLR_END)); 
      if( uiIndex+uiIndexInterView > 0) pRplr->setRefPicListReorderingFlag (true);
    }
    else
    {
      while( RPLR_END != ( uiCommand = pcRplrBufferInterView->get( uiIndexInterView).getCommand( uiIdentifier ) ) )
        uiIndexInterView++;  
      while( RPLR_END != ( uiCommand = pRplr->get( uiIndex ).getCommand( uiIdentifier ) ) )
      {
        pcRplrBufferInterView->set( uiIndex+uiIndexInterView, pRplr->get( uiIndex ));
        uiIndex++;
      }
      pcRplrBufferInterView->set( uiIndex+uiIndexInterView, Rplr(RPLR_END)); 
      uiIndexInterView = 0;
      while( RPLR_END != ( uiCommand = pcRplrBufferInterView->get( uiIndexInterView).getCommand( uiIdentifier ) ) )
      {
        pRplr->set( uiIndexInterView, pcRplrBufferInterView->get( uiIndexInterView) );
        uiIndexInterView++;  
      }
      pRplr->set(uiIndexInterView, Rplr(RPLR_END));        
      if( uiIndexInterView >0) pRplr->setRefPicListReorderingFlag ( true ) ;
    }
    delete pcRplrBufferInterView;
  }

  return Err::m_nOK;

}

ErrVal
PicEncoder::xInitSliceHeader( SliceHeader*&     rpcSliceHeader,
                  			      FrameSpec&  rcFrameSpec,
                              Double&           rdLambda,
                              Bool              fakeHeader)
{
  ROF( m_bInitParameterSets );

  //===== create new slice header =====
  if ( getAVCFlag() )
    rpcSliceHeader = new SliceHeader( *m_pcSPSBase, *m_pcPPSBase );
  else 
    rpcSliceHeader = new SliceHeader( *m_pcSPS, *m_pcPPS );
  ROF( rpcSliceHeader );

  //===== determine parameters =====
  Double dQp      = m_pcCodingParameter->getBasisQp() + m_pcCodingParameter->getDeltaQpLayer( rcFrameSpec.getTemporalLayer() );
  Int    iQp      = min( 51, max( 0, (Int)dQp ) );
  rdLambda        = 0.85 * pow( 2.0, min( 52.0, dQp ) / 3.0 - 4.0 );

  //===== set NAL unit header =====
  rpcSliceHeader->setNalRefIdc                          ( rcFrameSpec.getNalRefIdc    () );
  rpcSliceHeader->setNalUnitType                        ( rcFrameSpec.getNalUnitType  () );
  rpcSliceHeader->setLayerId                            ( 0 );
  rpcSliceHeader->setTemporalLevel                      ( rcFrameSpec.getTemporalLayer() );
  rpcSliceHeader->setQualityLevel                       ( 0 );
  rpcSliceHeader->setKeyPictureFlag                     ( rcFrameSpec.getTemporalLayer() == 0 );
  rpcSliceHeader->setSimplePriorityId                   ( 0 );
  rpcSliceHeader->setDiscardableFlag                    ( false );
  rpcSliceHeader->setReservedZeroBit                   ( false ); //JVT-S036 //rpcSliceHeader->setExtensionFlag  ( false );
  rpcSliceHeader->setViewId(this->getViewId());	
  rpcSliceHeader->setAVCFlag( getAVCFlag()!=0);  //JVT-W035


  //===== set general parameters =====
  rpcSliceHeader->setFirstMbInSlice                     ( 0 );
  rpcSliceHeader->setLastMbInSlice                      ( m_uiMbNumber - 1 );
  rpcSliceHeader->setSliceType                          ( rcFrameSpec.getSliceType    () );
  rpcSliceHeader->setFrameNum                           ( rcFrameSpec.getFrameNum     () );
  rpcSliceHeader->setNumMbsInSlice                      ( m_uiMbNumber );
  rpcSliceHeader->setIdrPicId                           ( m_uiIdrPicId );
  rpcSliceHeader->setDirectSpatialMvPredFlag            ( true ); //JVT-W040
  rpcSliceHeader->setBaseLayerId                        ( MSYS_UINT_MAX );
  rpcSliceHeader->setBaseQualityLevel                   ( 3 );
  rpcSliceHeader->setAdaptivePredictionFlag             ( false );
  rpcSliceHeader->setNoOutputOfPriorPicsFlag            ( true );
  rpcSliceHeader->setCabacInitIdc                       ( 0 );
  rpcSliceHeader->setSliceHeaderQp                      ( iQp );
  rpcSliceHeader->setFragmentedFlag                     ( false );
  rpcSliceHeader->setFragmentOrder                      ( 0 );
  rpcSliceHeader->setLastFragmentFlag                   ( true );
  rpcSliceHeader->setBaseLayerUsesConstrainedIntraPred  ( false );
  rpcSliceHeader->setFgsComponentSep                    ( false );

#if JMVM_ONLY  // JVT-U052
  if(!rpcSliceHeader->getAVCFlag()) //JVT-W035
  {
    rpcSliceHeader->setIcEnable                           ( m_pcSliceEncoder->getIcEnable() );

	rpcSliceHeader->setMotionSkip                         ( m_pcSliceEncoder->getMotionSkipFlag());
		
  }
#endif //JMVM_ONLY  // JVT-U052

  //===== set deblocking filter parameters =====
  if( rpcSliceHeader->getPPS().getDeblockingFilterParametersPresentFlag() )
  {
    rpcSliceHeader->getDeblockingFilterParameter().setDisableDeblockingFilterIdc(   m_pcCodingParameter->getLoopFilterParams().getFilterIdc   () );
    rpcSliceHeader->getDeblockingFilterParameter().setSliceAlphaC0Offset        ( 2*m_pcCodingParameter->getLoopFilterParams().getAlphaOffset () );
    rpcSliceHeader->getDeblockingFilterParameter().setSliceBetaOffset           ( 2*m_pcCodingParameter->getLoopFilterParams().getBetaOffset  () );
  }
  //
  rpcSliceHeader->setIDRFlag( (rcFrameSpec.getNalUnitType () == NAL_UNIT_CODED_SLICE_IDR ) ? true : false ); // JVT-W035
  rpcSliceHeader->setSimplePriorityId( rpcSliceHeader->getViewId()== 0 ? rpcSliceHeader->getTemporalLevel() : ( m_uiMaxTL+rpcSliceHeader->getViewId()%2 +1) ); // JVT-W035
  //===== set prediction and update list sizes =====
  //===== reference picture list ===== (init with default data, later updated)
  if( !rcFrameSpec.isIdrNalUnit())
  {
    //--- prediction ---
    UInt auiNumViewRef [2];
    if( rcFrameSpec.getSliceType()==I_SLICE) rcFrameSpec.setNumRefIdxActive(LIST_0, 0);
    if( rcFrameSpec.getSliceType()!=B_SLICE) rcFrameSpec.setNumRefIdxActive(LIST_1, 0);
    auiNumViewRef [LIST_0] = ( TimeForVFrameP(rcFrameSpec.getContFrameNumber()) ? m_uiAnchorNumFwdViewRef : rcFrameSpec.getNumRefIdxActive(LIST_0) + m_uiNonAncNumFwdViewRef );
    auiNumViewRef [LIST_1] = ( TimeForVFrameP(rcFrameSpec.getContFrameNumber()) ? m_uiAnchorNumBwdViewRef : rcFrameSpec.getNumRefIdxActive(LIST_1) + m_uiNonAncNumBwdViewRef );

    SliceType eSliceType =( auiNumViewRef [LIST_1] > 0 ? B_SLICE : auiNumViewRef [LIST_0] > 0 ? P_SLICE : I_SLICE);
    rpcSliceHeader->setSliceType( eSliceType );
    rpcSliceHeader->setNumRefIdxActive( LIST_0, auiNumViewRef[LIST_0] );
    rpcSliceHeader->setNumRefIdxActive( LIST_1, auiNumViewRef[LIST_1] );
    UInt  uiMaxLists = ( eSliceType == B_SLICE ? 2 : eSliceType == P_SLICE ? 1 : 0 );
    for( UInt uiList = 0; uiList < uiMaxLists; uiList++ )
    {
      ListIdx eListIdx  = ListIdx( uiList );
      

      if( rpcSliceHeader->getPPS().getNumRefIdxActive( eListIdx ) != rpcSliceHeader->getNumRefIdxActive( eListIdx))
      {
        rpcSliceHeader->setNumRefIdxActiveOverrideFlag( true );
      }
    }
    //===== set MMCO commands =====
    if(rcFrameSpec.isIdrNalUnit())
    {
      rpcSliceHeader->setAdaptiveRefPicBufferingFlag(false);
      rpcSliceHeader->getRplrBuffer( LIST_0 ).setRefPicListReorderingFlag(false);
      rpcSliceHeader->getRplrBuffer( LIST_1 ).setRefPicListReorderingFlag(false);
    }
    else
    {
     if( rcFrameSpec.getMmcoBuf() )
     {
      rpcSliceHeader->setAdaptiveRefPicBufferingFlag( rcFrameSpec.getAdaptiveRefPicBufferingFlag());
      rpcSliceHeader->getMmcoBuffer().copy( *rcFrameSpec.getMmcoBuf() );
     }

     //===== set RPRL commands =====
     if( rcFrameSpec.getRplrBuf( LIST_0 ) )
     {
      rpcSliceHeader->getRplrBuffer( LIST_0 ).setRefPicListReorderingFlag( rcFrameSpec.getRplrBuf( LIST_0 )->getRefPicListReorderingFlag() );
      rpcSliceHeader->getRplrBuffer( LIST_0 ).copy( *(StatBuf<Rplr,32>*)rcFrameSpec.getRplrBuf( LIST_0 ) );
     }
     if( rcFrameSpec.getRplrBuf( LIST_1 ) )
     {
      rpcSliceHeader->getRplrBuffer( LIST_1 ).setRefPicListReorderingFlag( rcFrameSpec.getRplrBuf( LIST_1 )->getRefPicListReorderingFlag() );
      rpcSliceHeader->getRplrBuffer( LIST_1 ).copy( *(StatBuf<Rplr,32>*)rcFrameSpec.getRplrBuf( LIST_1 ) );
     }
    }

  }


  //===== set picture order count =====
  RNOK( m_pcPocCalculator->setPoc( *rpcSliceHeader, rcFrameSpec.getContFrameNumber() ) );

  
#if 0
  //===== initialize prediction weights =====
  RNOK( xInitPredWeights( *rpcSliceHeader ) );
#endif 

  //===== flexible macroblock ordering =====
  rpcSliceHeader->setSliceGroupChangeCycle( 1 );
  rpcSliceHeader->FMOInit();

  
/*
  //===== update parameters =====
  if( rpcSliceHeader->getNalRefIdc() && !fakeHeader) // !fakeHeader not good solution from MERL
  {
    m_uiFrameNum  = ( m_uiFrameNum + 1 ) % ( 1 << rpcSliceHeader->getSPS().getLog2MaxFrameNum() );
  }
 */
//  if( rpcSliceHeader->isIdrNalUnit()
//  {
//    m_uiIdrPicId  = ( m_uiIdrPicId + 1 ) % 3;
//  }
//  only support one IDR currently 
  return Err::m_nOK;

}

// rplr and mmco:  }}

ErrVal
PicEncoder::xInitPredWeights( SliceHeader& rcSliceHeader )
{
  if( rcSliceHeader.isInterP() )
  {
    RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).init( 64 ) );

    if( rcSliceHeader.getPPS().getWeightedPredFlag() )
    {
      rcSliceHeader.setLumaLog2WeightDenom  ( 6 );
      rcSliceHeader.setChromaLog2WeightDenom( 6 );
      RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).initDefaults( rcSliceHeader.getLumaLog2WeightDenom(), rcSliceHeader.getChromaLog2WeightDenom() ) );
      RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).createRandomParameters() );
    }
  }
  else if( rcSliceHeader.isInterB() )
  {
    RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).init( 64 ) );
    RNOK( rcSliceHeader.getPredWeightTable( LIST_1 ).init( 64 ) );

    if( rcSliceHeader.getPPS().getWeightedBiPredIdc() == 1 )
    {
      rcSliceHeader.setLumaLog2WeightDenom  ( 6 );
      rcSliceHeader.setChromaLog2WeightDenom( 6 );
      RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).initDefaults( rcSliceHeader.getLumaLog2WeightDenom(), rcSliceHeader.getChromaLog2WeightDenom() ) );
      RNOK( rcSliceHeader.getPredWeightTable( LIST_1 ).initDefaults( rcSliceHeader.getLumaLog2WeightDenom(), rcSliceHeader.getChromaLog2WeightDenom() ) );
      RNOK( rcSliceHeader.getPredWeightTable( LIST_0 ).createRandomParameters() );
      RNOK( rcSliceHeader.getPredWeightTable( LIST_1 ).createRandomParameters() );
    }
  }
  return Err::m_nOK;
}


ErrVal
PicEncoder::xInitExtBinDataAccessor( ExtBinDataAccessor& rcExtBinDataAccessor )
{
  ROF( m_pucWriteBuffer );
  m_cBinData.reset          ();
  m_cBinData.set            ( m_pucWriteBuffer, m_uiWriteBufferSize );
  m_cBinData.setMemAccessor ( rcExtBinDataAccessor );

  return Err::m_nOK;
}


ErrVal
PicEncoder::xAppendNewExtBinDataAccessor( ExtBinDataAccessorList& rcExtBinDataAccessorList,
                                          ExtBinDataAccessor*     pcExtBinDataAccessor )
{
  ROF( pcExtBinDataAccessor );
  ROF( pcExtBinDataAccessor->data() );

  UInt    uiNewSize     = pcExtBinDataAccessor->size();
  UChar*  pucNewBuffer  = new UChar [ uiNewSize ];
  ROF( pucNewBuffer );
  ::memcpy( pucNewBuffer, pcExtBinDataAccessor->data(), uiNewSize * sizeof( UChar ) );

  ExtBinDataAccessor* pcNewExtBinDataAccessor = new ExtBinDataAccessor;
  ROF( pcNewExtBinDataAccessor );

  m_cBinData              .reset          ();
  m_cBinData              .set            (  pucNewBuffer, uiNewSize );
  m_cBinData              .setMemAccessor ( *pcNewExtBinDataAccessor );
  rcExtBinDataAccessorList.push_back      (  pcNewExtBinDataAccessor );

  m_cBinData              .reset          ();
  m_cBinData              .setMemAccessor ( *pcExtBinDataAccessor );

  return Err::m_nOK;
}



ErrVal
PicEncoder::xEncodePicture( ExtBinDataAccessorList& rcExtBinDataAccessorList,
                            RecPicBufUnit&          rcRecPicBufUnit,
                            SliceHeader&            rcSliceHeader,
                            Double                  dLambda,
                            UInt&                   ruiBits  )
{
  UInt  uiBits = 0;

  m_pcRecPicBuffer->SetCodeAsVFrameFlag(TimeForVFrameP
					(rcSliceHeader.getPoc()));
  rcSliceHeader.setSvcMvcFlag(this->getSvcMvcFlag());
  rcSliceHeader.setAVCFlag( this->getAVCFlag()!=0);  //JVT-W035
  rcSliceHeader.setViewId(this->getViewId());
  rcSliceHeader.setAnchorPicFlag(TimeForVFrameP(rcSliceHeader.getPoc()));
  rcSliceHeader.setReservedZeroBits(0);
  rcSliceHeader.setInterViewFalg(this->derivation_Inter_View_Flag(this->getViewId(), rcSliceHeader)); // JVT-W056 Samsung

#if JMVM_ONLY
  if(!rcSliceHeader.getAVCFlag())
  {
	  if(rcSliceHeader.getAnchorPicFlag())
		rcSliceHeader.setMotionSkip(false);
	  else
		  rcSliceHeader.setMotionSkip	( ( m_pcSliceEncoder->getMotionSkipFlag() ) && 
										(rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX( getViewId(), LIST_0 ) || 
										 rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX( getViewId(), LIST_1 ) ) );
  }
#endif //JMVM_ONLY

  //===== start picture =====
  RefFrameList  cList0, cList1;
  RNOK( xStartPicture( rcRecPicBufUnit, rcSliceHeader, cList0, cList1 ) );
//  bug fix for TD March 19
  xSetRefPictures(rcSliceHeader, cList0, cList1);
//TMM_WP
  if(rcSliceHeader.getSliceType() == P_SLICE)
      m_pcSliceEncoder->xSetPredWeights( rcSliceHeader, 
                                         rcRecPicBufUnit.getRecFrame(),
                                         cList0,
                                         cList1);
  else if(rcSliceHeader.getSliceType() == B_SLICE)
      m_pcSliceEncoder->xSetPredWeights( rcSliceHeader, 
                                         rcRecPicBufUnit.getRecFrame(),
                                         cList0,
                                         cList1);
      
//TMM_WP

  //===== encoding o

⌨️ 快捷键说明

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