h264avcencoder.cpp

来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,655 行 · 第 1/5 页

CPP
1,655
字号
    }

    rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
    rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];

    m_acOrgPicBufferList[uiLayer].clear();
    m_acRecPicBufferList[uiLayer].clear();

    return Err::m_nOK;
  }

  
  //===== INSERT BUFFERS =====
  m_acOrgPicBufferList[uiLayer].push_back( pcOriginalPicBuffer );
  m_acRecPicBufferList[uiLayer].push_back( pcReconstructPicBuffer );

  
  UInt  uiTargetBufferSize = ( 1 << m_pcCodingParameter->getLayerParameters(uiLayer).getDecompositionStages() );
  if( ! m_apcMCTFEncoder[uiLayer]->firstGOPCoded() )
  {
    uiTargetBufferSize++;
  }
  ROT( m_acOrgPicBufferList[uiLayer].size() > uiTargetBufferSize );


  if( m_acOrgPicBufferList[uiLayer].size() == uiTargetBufferSize )
  {
    //===== ENCODE GROUP OF PICTURES =====
    m_apcMCTFEncoder[uiLayer]->setScalableLayer( uiScalableLayer );
    RNOK( m_apcMCTFEncoder[uiLayer]->process( m_cAccessUnitList,
                                              m_acOrgPicBufferList[uiLayer],
                                              m_acRecPicBufferList[uiLayer],
                                              rcPicBufferUnusedList,
																							m_aaauidSeqBits ) );
		uiScalableLayer = m_apcMCTFEncoder[uiLayer]->getScalableLayer();

    //----- set output list -----
    rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];

    //----- update unused list -----
    rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
    rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];

    //----- reset orig and reconstructed list -----
    m_acOrgPicBufferList[uiLayer].clear();
    m_acRecPicBufferList[uiLayer].clear();
  }

  //{{Adaptive GOP structure
  // --ETRI & KHU
  }
  else
  {
		if( pcOriginalPicBuffer == NULL )
		{
			//===== FINISH ENCODING =====
			if( pcReconstructPicBuffer )
			{
				rcPicBufferUnusedList.push_back( pcReconstructPicBuffer );
			}

      if ( m_pcCodingParameter->getWriteGOPMode() ) { // mode decision

				if( m_acOrgPicBufferList[uiLayer].size() )
				{
					RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
                                                         m_acOrgPicBufferList[uiLayer],
                                                         m_acRecPicBufferList[uiLayer],
                                                         rcPicBufferUnusedList,
																												 m_aaauidSeqBits ) );
					rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
				}
				
				rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
				rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
				
				m_acOrgPicBufferList[uiLayer].clear();
				m_acRecPicBufferList[uiLayer].clear();
			}
			else {
				if ( !m_bGOPDone ) 
        {
					PicBufferList templist;
					templist +=	rcPicBufferUnusedList;
					rcPicBufferUnusedList.clear();
					
					if( m_acOrgPicBufferList[uiLayer].size() ) { // !!!!!
						RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
                                                           m_acOrgPicBufferList[uiLayer],
                                                           m_acRecPicBufferList[uiLayer],
                                                           rcPicBufferUnusedList,
																													 m_aaauidSeqBits ) );
						rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
				  }
          m_acRecPicBufferList[uiLayer] += rcPicBufferUnusedList;
				  rcPicBufferUnusedList.clear();
					rcPicBufferUnusedList += templist;
					
				}
				else 
        {
					PicBufferList templist;
					PicBufferList templist2;
					templist +=	rcPicBufferUnusedList;
					rcPicBufferUnusedList.clear();

					if( m_acOrgPicBufferList[uiLayer].size() ) {	// !!!!!
					//===== ENCODE GROUP OF PICTURES =====
						RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
                                                           m_acOrgPicBufferList[uiLayer],
                                                           m_acRecPicBufferList[uiLayer],
                                                           rcPicBufferUnusedList,
																													 m_aaauidSeqBits ) );
						
						//----- set output list -----
						rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
						templist2 += rcPicBufferUnusedList;
						rcPicBufferUnusedList.clear();
						rcPicBufferUnusedList += templist;
						
						
					}
          //----- update unused list -----
          rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
					rcPicBufferUnusedList += templist2;
					rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
					
					//----- reset orig and reconstructed list -----
					m_acOrgPicBufferList[uiLayer].clear();
					m_acRecPicBufferList[uiLayer].clear();
				}
			}
			
			return Err::m_nOK;
		}
		
		UInt  uiTargetBufferSize = ( 1 << m_pcCodingParameter->getLayerParameters(uiLayer).getDecompositionStages() );

		if( ! m_apcMCTFEncoder[uiLayer]->firstGOPCoded() )
		{
			uiTargetBufferSize++;
		}
		
		UInt add_size = 0;
		if (!m_uiGOPOrder && !(uiTargetBufferSize%2))
			add_size = 1;
		
		if (uiTargetBufferSize + add_size != m_acOrgPicBufferList[uiLayer].size()) {
			//===== INSERT BUFFERS =====
			m_acOrgPicBufferList[uiLayer].push_back( pcOriginalPicBuffer );
			m_acRecPicBufferList[uiLayer].push_back( pcReconstructPicBuffer );
		
			ROT( m_acOrgPicBufferList[uiLayer].size() > uiTargetBufferSize );
			
			if (uiLayer == (m_pcCodingParameter->getNumberOfLayers()-1))
				m_uiTarget = uiTargetBufferSize;
		}

		if( m_acOrgPicBufferList[uiLayer].size() == uiTargetBufferSize + add_size)
		{
			
			if (m_pcCodingParameter->getWriteGOPMode()) {
				
				//===== ENCODE GROUP OF PICTURES =====
				RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
                                                       m_acOrgPicBufferList[uiLayer],
                                                       m_acRecPicBufferList[uiLayer],
                                                       rcPicBufferUnusedList,
																											 m_aaauidSeqBits ) );
				
				//----- set output list -----
				rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
				
				//----- update unused list -----
				rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
				rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
				
				//----- reset orig and reconstructed list -----
				m_acOrgPicBufferList[uiLayer].clear();
				m_acRecPicBufferList[uiLayer].clear();
				
				
			}
			else {
				if ( !m_bGOPDone ) {
					PicBufferList templist;
					templist +=	rcPicBufferUnusedList;
					rcPicBufferUnusedList.clear();
					
					RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
                                                         m_acOrgPicBufferList[uiLayer],
                                                         m_acRecPicBufferList[uiLayer],
                                                         rcPicBufferUnusedList,
																												 m_aaauidSeqBits ) );
					rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
					m_acRecPicBufferList[uiLayer] += rcPicBufferUnusedList;
					rcPicBufferUnusedList.clear();
					rcPicBufferUnusedList += templist;
					
				}
				else {
					PicBufferList templist;
					PicBufferList templist2;
					templist +=	rcPicBufferUnusedList;
					rcPicBufferUnusedList.clear();
					//===== ENCODE GROUP OF PICTURES =====
					RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
                                                         m_acOrgPicBufferList[uiLayer],
                                                         m_acRecPicBufferList[uiLayer],
                                                         rcPicBufferUnusedList,
																												 m_aaauidSeqBits ) );
					
					//----- set output list -----
					rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
					templist2 += rcPicBufferUnusedList;
					rcPicBufferUnusedList.clear();
					rcPicBufferUnusedList += templist;
					//----- update unused list -----
					rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
					rcPicBufferUnusedList += templist2;
					rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
					
					//----- reset orig and reconstructed list -----
					m_acOrgPicBufferList[uiLayer].clear();
					m_acRecPicBufferList[uiLayer].clear();
				}
			}
		}
  }
  //}}Adaptive GOP structure

  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 );
    Bool              bH264AVCCompatible  = m_pcCodingParameter->getBaseLayerMode() > 0 && uiIndex == 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() ) ) 

											                      //{{Adaptive GOP structure -- 10.18.2005
                                            // --ETRI & KHU
                                            + (m_pcCodingParameter->getUseAGS() && !bH264AVCCompatible? 20: 0);
                                            //}}Adaptive GOP structure -- 10.18.2005
    UInt              uiNumRefPic         = uiDPBSize; 
    UInt              uiLevelIdc          = SequenceParameterSet::getLevelIdc( uiMbY, uiMbX, uiOutFreq, uiMvRange, uiDPBSize );
    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->setRequiredFrameNumUpdateBehaviourFlag ( true );
    pcSPS->setFrameWidthInMbs                     ( uiMbX );
    pcSPS->setFrameHeightInMbs                    ( uiMbY );
    pcSPS->setDirect8x8InferenceFlag              ( true  );
    // TMM_ESS 
    pcSPS->setResizeParameters                    (rcLayerParameters.getResizeParameters());

#if MULTIPLE_LOOP_DECODING
    pcSPS->setAlwaysDecodeBaseLayer               ( rcLayerParameters.getInterLayerPredictionMode() > 0 && 
                                                    rcLayerParameters.getDecodingLoops() > 1 );
#endif
    if(rcLayerParameters.getFGSCodingMode() == 0)
    {
      pcSPS->setFGSCodingMode                     ( false );
    }
    else
    {
      pcSPS->setFGSCodingMode                     ( true );
    }
    pcSPS->setGroupingSize                        ( rcLayerParameters.getGroupingSize() );
    for( UInt ui = 0; ui < 16; ui++ )
    {
      pcSPS->setPo

⌨️ 快捷键说明

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