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

📄 h264avcencoder.cpp

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

  //===== finish encoding =====
  for( UInt uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
  {
    RNOK( m_apcMCTFEncoder[uiLayer]->finish           ( ruiNumCodedFrames, rdHighestLayerOutputRate, dGetFramerate(), dGetBitrate(), m_aaauidSeqBits ) );
    RNOK( m_apcMCTFEncoder[uiLayer]->SingleLayerFinish( m_aaauidSeqBits, m_aaadSingleLayerBitrate ) );
  }
  printf("\n");

  return Err::m_nOK;
}



ErrVal
H264AVCEncoder::xProcessGOP( PicBufferList* apcPicBufferOutputList,
                             PicBufferList* apcPicBufferUnusedList )
{
  UInt uiAUIndex, uiLayer; 

  //===== init GOP =====
  for( uiLayer = 0; uiLayer <  m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
  {
    m_apcMCTFEncoder[uiLayer]->setLayerCGSSNR           ( m_pcCodingParameter->getLayerParameters( uiLayer ).getLayerCGSSNR           () );
    m_apcMCTFEncoder[uiLayer]->setQualityLevelCGSSNR    ( m_pcCodingParameter->getLayerParameters( uiLayer ).getQualityLevelCGSSNR    () );
    m_apcMCTFEncoder[uiLayer]->setBaseLayerCGSSNR       ( m_pcCodingParameter->getLayerParameters( uiLayer ).getBaseLayerCGSSNR       () );
    m_apcMCTFEncoder[uiLayer]->setBaseQualityLevelCGSSNR( m_pcCodingParameter->getLayerParameters( uiLayer ).getBaseQualityLevelCGSSNR() );

    RNOK( m_apcMCTFEncoder[uiLayer]->initGOP( m_cAccessUnitList, m_acOrgPicBufferList[uiLayer] ) );
  }

  //===== loop over access units in GOP, and layers inside access units =====
  for( uiAUIndex = 0; uiAUIndex <= 64;                                       uiAUIndex++ )
  for( uiLayer   = 0; uiLayer   <  m_pcCodingParameter->getNumberOfLayers(); uiLayer  ++ )
  {
    if( m_pcCodingParameter->getNonRequiredEnable() )
    {
      if( uiLayer == m_pcCodingParameter->getNumberOfLayers() - 1 )   m_apcMCTFEncoder[ uiLayer ]->setNonRequiredWrite( 2 );
      else                                                            m_apcMCTFEncoder[ uiLayer ]->setNonRequiredWrite( 1 );
    }

    RNOK( m_apcMCTFEncoder[uiLayer]->process( uiAUIndex,
                                              m_cAccessUnitList,
                                              m_acOrgPicBufferList  [uiLayer],
                                              m_acRecPicBufferList  [uiLayer],
                                              apcPicBufferUnusedList[uiLayer],
                                              m_aaauidSeqBits ) );
  }

  //===== update pic buffer lists =====
  for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
  {
    //----- set output list -----
    apcPicBufferOutputList[ uiLayer ] += m_acRecPicBufferList[ uiLayer ];
    //----- update unused list -----
    apcPicBufferUnusedList[ uiLayer ] += m_acOrgPicBufferList[ uiLayer ];
    apcPicBufferUnusedList[ uiLayer ] += m_acRecPicBufferList[ uiLayer ];
    //----- reset lists -----
    m_acOrgPicBufferList  [ uiLayer ].clear();
    m_acRecPicBufferList  [ uiLayer ].clear();
  }

  return Err::m_nOK;
}


ErrVal
H264AVCEncoder::xInitParameterSets()
{
  UInt uiSPSId = 0;
  UInt uiPPSId = 0;
  UInt uiIndex;

  //===== determine values for Poc calculation =====
  UInt uiMaxResolutionStages  = m_pcCodingParameter->getDecompositionStages();  
  UInt uiRequiredPocBits      = max( 4, 1 + (Int)ceil( log10( 1.0 + ( 1 << uiMaxResolutionStages ) ) / log10( 2.0 ) ) );


  //===== loop over layers =====
  for( uiIndex = 0; uiIndex < m_pcCodingParameter->getNumberOfLayers(); uiIndex++ )
  {
    //===== get configuration parameters =====
    LayerParameters&  rcLayerParameters   = m_pcCodingParameter->getLayerParameters( uiIndex );
//bug-fix suffix{{
	//Bool              bH264AVCCompatible  = m_pcCodingParameter->getBaseLayerMode() > 0 && uiIndex == 0;
	Bool              bH264AVCCompatible  = ( uiIndex == 0 );
//bug-fix suffix}}
	UInt              uiMbY               = rcLayerParameters.getFrameHeight() / 16;
    UInt              uiMbX               = rcLayerParameters.getFrameWidth () / 16;
    UInt              uiOutFreq           = (UInt)ceil( rcLayerParameters.getOutputFrameRate() );
    UInt              uiMvRange           = m_pcCodingParameter->getMotionVectorSearchParams().getSearchRange() / 4;
    UInt              uiDPBSize           = ( 1 << max( 1, rcLayerParameters.getDecompositionStages() ) );
    UInt              uiNumRefPic         = uiDPBSize; 
    UInt              uiLevelIdc          = SequenceParameterSet::getLevelIdc( uiMbY, uiMbX, uiOutFreq, uiMvRange, uiDPBSize );
//bug-fix suffix{{
//	if(m_pcCodingParameter->getBaseLayerMode() > 0)
//bug-fix suffix}}
//	{
//		ROT( bH264AVCCompatible && uiDPBSize > 16 );
//	}
	ROT( uiLevelIdc == MSYS_UINT_MAX );

    
    //===== create parameter sets, set Id's, and store =====
    SequenceParameterSet* pcSPS;
    PictureParameterSet*  pcPPSLP;
    PictureParameterSet*  pcPPSHP;
    
    RNOK( SequenceParameterSet::create( pcSPS   ) );
    RNOK( PictureParameterSet ::create( pcPPSHP ) );
    pcPPSHP->setPicParameterSetId( uiPPSId++ );
    pcPPSHP->setSeqParameterSetId( uiSPSId   );
    RNOK( m_pcParameterSetMng->store( pcPPSHP ) );
    if( rcLayerParameters.getContrainedIntraForLP() )
    {
      pcPPSLP = pcPPSHP;
    }
    else
    {
      RNOK( PictureParameterSet ::create( pcPPSLP ) );
      pcPPSLP->setPicParameterSetId( uiPPSId++ );
      pcPPSLP->setSeqParameterSetId( uiSPSId   );
      RNOK( m_pcParameterSetMng->store( pcPPSLP ) );
    }
    pcSPS->setSeqParameterSetId( uiSPSId++ );
    RNOK( m_pcParameterSetMng->store( pcSPS   ) );


    //===== set sequence parameter set parameters =====
    pcSPS->setNalUnitType                         ( NAL_UNIT_SPS );
    pcSPS->setLayerId                             ( rcLayerParameters.getLayerId() );
    pcSPS->setProfileIdc                          ( bH264AVCCompatible ? ( rcLayerParameters.getAdaptiveTransform() > 0 ? HIGH_PROFILE : MAIN_PROFILE ) : SCALABLE_PROFILE );
    pcSPS->setConstrainedSet0Flag                 ( false );
    pcSPS->setConstrainedSet1Flag                 ( bH264AVCCompatible ? 1 : 0 );
    pcSPS->setConstrainedSet2Flag                 ( false );
    pcSPS->setConstrainedSet3Flag                 ( false );
    pcSPS->setLevelIdc                            ( uiLevelIdc );
    pcSPS->setSeqScalingMatrixPresentFlag         ( rcLayerParameters.getAdaptiveTransform() > 1 );
    pcSPS->setLog2MaxFrameNum                     ( MAX_FRAME_NUM_LOG2 );
    pcSPS->setLog2MaxPicOrderCntLsb               ( min( 15, uiRequiredPocBits + 2 ) );  // HS: decoder robustness -> value increased by 2
    pcSPS->setNumRefFrames                        ( uiNumRefPic );
    pcSPS->setGapsInFrameNumValueAllowedFlag      ( true );
    pcSPS->setFrameWidthInMbs                     ( uiMbX );
    pcSPS->setFrameHeightInMbs                    ( uiMbY );
    pcSPS->setDirect8x8InferenceFlag              ( true  );
    // TMM_ESS 
    pcSPS->setResizeParameters                    (rcLayerParameters.getResizeParameters());

    if (uiIndex == 0)
    {  // base layer AVC rewrite flag should always be false
      pcSPS->setAVCRewriteFlag(false);
      pcSPS->setAVCAdaptiveRewriteFlag(false);
    }
    else
    {
      pcSPS->setAVCRewriteFlag(rcLayerParameters.getAVCRewriteFlag());
      pcSPS->setAVCAdaptiveRewriteFlag(rcLayerParameters.getAVCAdaptiveRewriteFlag());
    }
    
    const Bool  bInterlaced = ( rcLayerParameters.getPaff() || rcLayerParameters.getMbAff() );
    pcSPS->setPaff                                ( bH264AVCCompatible || ! rcLayerParameters.getPaff() );
	  pcSPS->setFrameMbsOnlyFlag										( ! bInterlaced );
    pcSPS->setMbAdaptiveFrameFieldFlag            ( (rcLayerParameters.getMbAff() ? true : false ) );
   
    if( pcSPS->getMbAdaptiveFrameFieldFlag() && uiMbY % 2)
    {
      printf(" MBAFF ignored ");
      pcSPS->setMbAdaptiveFrameFieldFlag( false ); //not allowed
    }
    
    // always send FGS info in SPS, and always send only 1 set of VectMode parameters
    pcSPS->setFGSInfoPresentFlag                  ( true  );
    pcSPS->setFGSCycleAlignedFragment             ( m_pcCodingParameter->getFGSParallelDecodingFlag() );
    pcSPS->setNumFGSVectModes                     ( 1     );
    pcSPS->setFGSCodingMode                       ( 0, (rcLayerParameters.getFGSCodingMode() != 0)    );
    pcSPS->setGroupingSize                        ( 0, rcLayerParameters.getGroupingSize()            );

    for( UInt ui = 0; ui < 16; ui++ )
    {
      pcSPS->setPosVect                           ( 0, ui, rcLayerParameters.getPosVect(ui)           );
    }

    RNOK( pcSPS->checkPosVectors( 0 ) );

    pcSPS->setRCDOBlockSizes         ( false );
    pcSPS->setRCDOMotionCompensationY( false );
    pcSPS->setRCDOMotionCompensationC( false );
    pcSPS->setRCDODeblocking         ( false );
    UInt  uiRCDOBS  = m_pcCodingParameter->getRCDOBlockSizes         ();
    UInt  uiRCDOMCY = m_pcCodingParameter->getRCDOMotionCompensationY();
    UInt  uiRCDOMCC = m_pcCodingParameter->getRCDOMotionCompensationC();
    UInt  uiRCDODB  = m_pcCodingParameter->getRCDODeblocking         ();
    pcSPS->setRCDOBlockSizes         ( ( uiIndex && uiRCDOBS  ) || ( uiRCDOBS  > 1 ) );
    pcSPS->setRCDOMotionCompensationY( ( uiIndex && uiRCDOMCY ) || ( uiRCDOMCY > 1 ) );
    pcSPS->setRCDOMotionCompensationC( ( uiIndex && uiRCDOMCC ) || ( uiRCDOMCC > 1 ) );
    pcSPS->setRCDODeblocking         ( ( uiIndex && uiRCDODB  ) || ( uiRCDODB  > 1 ) );

	// V090
	pcSPS->set4TapMotionCompensationY( false );
	UInt  ui4TapMCY = m_pcCodingParameter->get4TapMotionCompensationY();                 // V090
	pcSPS->set4TapMotionCompensationY( ( uiIndex && ui4TapMCY ) || ( ui4TapMCY > 1 ) );  // V090
	// V090

    //===== set picture parameter set parameters =====
    pcPPSHP->setNalUnitType                           ( NAL_UNIT_PPS );
    pcPPSHP->setLayerId                               ( rcLayerParameters.getLayerId() );
    pcPPSHP->setEntropyCodingModeFlag                 ( rcLayerParameters.getEntropyCodingModeFlag() );
    pcPPSHP->setPicOrderPresentFlag                   ( true );
    pcPPSHP->setNumRefIdxActive( LIST_0               , m_pcCodingParameter->getNumRefFrames() );
    pcPPSHP->setNumRefIdxActive( LIST_1               , m_pcCodingParameter->getNumRefFrames() );
    // heiko.schwarz@hhi.fhg.de: ensures that the PPS QP will be in the valid range (specified QP can be outside that range to force smaller/higher lambdas)
    //pcPPSHP->setPicInitQp                             ( (Int)rcLayerParameters.getBaseQpResidual() );
    pcPPSHP->setPicInitQp                             ( min( 51, max( 0, (Int)rcLayerParameters.getBaseQpResidual() ) ) );
    pcPPSHP->setChomaQpIndexOffset                    ( 0 );
    pcPPSHP->setDeblockingFilterParametersPresentFlag ( ! m_pcCodingParameter->getLoopFilterParams().isDefault() );
    pcPPSHP->setConstrainedIntraPredFlag              ( true );
    pcPPSHP->setRedundantPicCntPresentFlag            ( rcLayerParameters.getUseRedundantSliceFlag() ); // JVT-Q054 Red. Picture
    pcPPSHP->setTransform8x8ModeFlag                  ( rcLayerParameters.getAdaptiveTransform() > 0 );
    pcPPSHP->setPicScalingMatrixPresentFlag           ( false );
    pcPPSHP->set2ndChromaQpIndexOffset                ( 0 );

    pcPPSHP->setWeightedPredFlag                      ( WEIGHTED_PRED_FLAG );
    pcPPSHP->setWeightedBiPredIdc                     ( WEIGHTED_BIPRED_IDC );
//TMM_WP
    pcPPSHP->setWeightedPredFlag                   (m_pcCodingParameter->getIPMode()!=0);
    pcPPSHP->setWeightedBiPredIdc                  (m_pcCodingParameter->getBMode());  
//TMM_WP

	  //--ICU/ETRI FMO Implementation : FMO stuff start
	  pcPPSHP->setNumSliceGroupsMinus1                  (rcLayerParameters.getNumSliceGroupsMinus1());
	  pcPPSHP->setSliceGroupMapType                     (rcLayerParameters.getSliceGroupMapType());
	  pcPPSHP->setArrayRunLengthMinus1					      (rcLayerParameters.getArrayRunLengthMinus1());
	  pcPPSHP->setArrayTopLeft								  (rcLayerParameters.getArrayTopLeft());
	  pcPPSHP->setArrayBottomRight							  (rcLayerParameters.getArrayBottomRight());
	  pcPPSHP->setSliceGroupChangeDirection_flag		  (rcLayerParameters.getSliceGroupChangeDirection_flag());
	  pcPPSHP->setSliceGroupChangeRateMinus1			  (rcLayerParameters.getSliceGroupChangeRateMinus1());
	  pcPPSHP->setNumSliceGroupMapUnitsMinus1			  (rcLayerParameters.getNumSliceGroupMapUnitsMinus1());
	  pcPPSHP->setArraySliceGroupId						  (rcLayerParameters.getArraySliceGroupId());
	  //--ICU/ETRI FMO Implementation : FMO stuff end

    if( ! rcLayerParameters.getContrainedIntraForLP() )
    {
      pcPPSLP->setNalUnitType                           ( pcPPSHP->getNalUnitType                           ()  );
      pcPPSLP->setLayerId                               ( pcPPSHP->getLayerId                               ()  );
      pcPPSLP->setEntropyCodingModeFlag                 ( pcPPSHP->getEntropyCodingModeFlag                 ()  );
      pcPPSLP->setPicOrderPresentFlag                   ( pcPPSHP->getPicOrderPresentFlag                   ()  );
      pcPPSLP->setNumRefIdxActive( LIST_0               , pcPPSHP->getNumRefIdxActive               ( LIST_0 )  );
      pcPPSLP->setNumRefIdxActive( LIST_1               , pcPPSHP->getNumRefIdxActive               ( LIST_1 )  );
      pcPPSLP->setPicInitQp                             ( pcPPSHP->getPicInitQp                             ()  );
      pcPPSLP->setChomaQpIndexOffset                    ( pcPPSHP->getChomaQpIndexOffset                    ()  );
      pcPPSLP->setDeblockingFilterParametersPresentFlag ( pcPPSHP->getDeblockingFilterParametersPresentFlag ()  );
      pcPPSLP->setConstrainedIntraPredFlag              ( false                                                 );
      pcPPSLP->setRedundantPicCntPresentFlag            ( pcPPSHP->getRedundantPicCntPresentFlag            ()  );  //JVT-Q054 Red. Picture
      pcPPSLP->setTransform8x8ModeFlag                  ( pcPPSHP->getTransform8x8ModeFlag                  ()  );
      pcPPSLP->setPicScalingMatrixPresentFlag           ( pcPPSHP->getPicScalingMatrixPresentFlag           ()  );
      pcPPSLP->set2ndChromaQpIndexOffset                ( pcPPSHP->get2ndChromaQpIndexOffset                ()  );
      pcPPSLP->setWeightedPredFlag                      ( pcPPSHP->getWeightedPredFlag                      ()  );
      pcPPSLP->setWeightedBiPredIdc                     ( pcPPSHP->getWeightedBiPredIdc                     ()  );
    }

  	//--ICU/ETRI FMO Implementation : FMO stuff start
	  pcPPSLP->setNumSliceGroupsMinus1                  (rcLayerParameters.getNumSliceGroupsMinus1());
	  pcPPSLP->setSliceGroupMapType                     (rcLayerParameters.getSliceGroupMapType());
	  pcPPSLP->setArrayRunLengthMinus1					      (rcLayerParameters.getArrayRunLengthMinus1());
	  pcPPSLP->setArrayTopLeft								  (rcLayerParameters.getArrayTopLeft());
	  pcPPSLP->setArrayBottomRight							  (rcLayerParameters.getArrayBottomRight());
	  pcPPSLP->setSliceGroupChangeDirection_flag		  (rcLayerParameters.getSliceGroupChangeDirection_flag());
	  pcPPSLP->setSliceGroupChangeRateMinus1			  (rcLayerParameters.getSliceGroupChangeRateMinus1());
	  pcPPSLP->setNumSliceGroupMapUnitsMinus1			  (rcLayerParameters.getNumSliceGroupMapUnitsMinus1());
	  pcPPSLP->setArraySliceGroupId						  (rcLayerParameters.getArraySliceGroupId());
	  //--ICU/ETRI FMO Implementation : FMO stuff end

    //===== initialization using parameter sets =====
    RNOK( m_pcControlMng->initParameterSets( *pcSPS, *pcPPSLP, *pcPPSHP ) );
  }


  uiIndex = 0;
  LayerParameters&  rcLayerParameters   = m_pcCodingParameter->getLayerParameters( uiIndex );
//bug-fix suffix{{
  //Bool              bH264AVCCompatible  = m_pcCodingParameter->getBaseLayerMode() > 0 && uiIndex == 0;
  Bool              bH264AVCCompatible  = ( uiIndex == 0 );
//bug-fix suffix}}
  if(bH264AVCCompatible && m_pcCodingParameter->getNumberOfLayers() == 1 && rcLayerParameters.getNumFGSLayers() > 0)
  {
    UInt              uiMbY               = rcLayerParameters.getFrameHeight() / 16;
    UInt              uiMbX               = rcLayerParameters.getFrameWidth () / 16;
    UInt              uiOutFreq           = (UInt)ceil( rcLayerParameters.getOutputFrameRate() );
    UInt              uiMvRange           = m_pcCodingParameter->getMotionVectorSearchParams().getSearchRange() / 4;
    UInt              uiDPBSize           = ( 1 << max( 1, rcLayerParameters.getDecompositionStages() ) );
    UInt              uiNumRefPic         = uiDPBSize; 
    UInt              uiLevelIdc          = SequenceParameterSet::getLevelIdc( uiMbY, uiMbX, uiOutFreq, uiMvRange, uiDPBSize );
//bug-fix suffix{{
	if

⌨️ 快捷键说明

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