h264avcencoder.cpp

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

CPP
1,655
字号
        SequenceParameterSet* pcSPS;
        RNOK( m_pcParameterSetMng->get( pcSPS, uiSPSId ) );

        UInt  uiLayer = pcSPS->getLayerId();
        UInt  uiSize  = pcExtBinDataAccessor->size();
        RNOK( m_apcMCTFEncoder[uiLayer]->addParameterSetBits( 8*(uiSize+4) ) );
      }
      
      m_cUnWrittenPPS.pop_front();
    }
    else
    {
      AF();
      rbMoreSets = false;
      return Err::m_nERR;
    }
  }

  rbMoreSets = !(m_cUnWrittenSPS.empty() && m_cUnWrittenPPS.empty());
  return Err::m_nOK;
}



ErrVal
H264AVCEncoder::process( ExtBinDataAccessorList&  rcExtBinDataAccessorList,
                         PicBuffer*               apcOriginalPicBuffer    [MAX_LAYERS],
                         PicBuffer*               apcReconstructPicBuffer [MAX_LAYERS],
                         PicBufferList*           apcPicBufferOutputList,
                         PicBufferList*           apcPicBufferUnusedList )
{
  UInt  uiLayer;
	UInt	uiScalableLayer = 0;
  UInt  uiNumLayers = m_pcCodingParameter->getNumberOfLayers();

  //{{Adaptive GOP structure
  // --ETRI & KHU
  if ( !m_pcCodingParameter->getUseAGS() ) {
  //}}Adaptive GOP structure

  for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
  {
    if( apcOriginalPicBuffer[uiLayer] )
    {
      RNOK( xProcessGOP( uiLayer,
 												 uiScalableLayer,
                         apcOriginalPicBuffer   [uiLayer],
                         apcReconstructPicBuffer[uiLayer],
                         apcPicBufferOutputList [uiLayer],
                         apcPicBufferUnusedList [uiLayer] ) );
    }
    else
    {
      if( apcReconstructPicBuffer[uiLayer] )
      {
        apcPicBufferUnusedList[uiLayer].push_back( apcReconstructPicBuffer[uiLayer] );
      }
    }
  }

  m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );

  //{{Adaptive GOP structure
  // --ETRI & KHU
  }
  else 
  {
    if ( m_pcCodingParameter->getWriteGOPMode() ) 
    {
      m_uiGOPOrder = 0xffffffff;	
      for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
      {
        if( apcOriginalPicBuffer[uiLayer] )
        {
          RNOK( xProcessGOP( uiLayer,
														 uiScalableLayer,
                             apcOriginalPicBuffer   [uiLayer],
                             apcReconstructPicBuffer[uiLayer],
                             apcPicBufferOutputList [uiLayer],
                             apcPicBufferUnusedList [uiLayer] ) );
        }
        else
        {
          if( apcReconstructPicBuffer[uiLayer] )
          {
            apcPicBufferUnusedList[uiLayer].push_back( apcReconstructPicBuffer[uiLayer] );
          }
        }
      }

      m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
    }
    else 
    {
      if ((1 == (m_uiTarget - m_acOrgPicBufferList[uiNumLayers-1].size()) 
          && apcOriginalPicBuffer[uiNumLayers-1])|| (m_uiTarget == m_acOrgPicBufferList[uiNumLayers-1].size()))
      {

				int order = 0;
				int i;

				for (i = 0; i < 8 && (m_apcMCTFEncoder[0]->getSelect(m_uiGOPOrder,i ) ); i++) {
					if ( m_apcMCTFEncoder[0]->getSelect(m_uiGOPOrder,i) )
						order++;
				}

				m_bGOPDone = false;
			
			  for (i = 0; i < order; i++) 
        {
				
					if (i == order-1 ) {
						m_bGOPDone = true;
					}
					for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
          {
            m_apcMCTFEncoder[uiLayer]->setSelectPos(i);
            if( apcOriginalPicBuffer[uiLayer] )
            {
              RNOK( xProcessGOP( uiLayer,
 																 uiScalableLayer,
                                 apcOriginalPicBuffer   [uiLayer],
                                 apcReconstructPicBuffer[uiLayer],
                                 apcPicBufferOutputList [uiLayer],
                                 apcPicBufferUnusedList [uiLayer] ) );
            }
            else
            {
              if( apcReconstructPicBuffer[uiLayer] )
              {
                apcPicBufferUnusedList[uiLayer].push_back( apcReconstructPicBuffer[uiLayer] );
              }
            }
          }
          m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList ); //!! ??
				}
			  m_uiTarget = 0xffffffff;
				m_uiGOPOrder++;
			}
			else {
        for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
        {
          if( apcOriginalPicBuffer[uiLayer] )
          {
            RNOK( xProcessGOP( uiLayer,
															 uiScalableLayer,
                               apcOriginalPicBuffer   [uiLayer],
                               apcReconstructPicBuffer[uiLayer],
                               apcPicBufferOutputList [uiLayer],
                               apcPicBufferUnusedList [uiLayer] ) );
          }
          else
          {
            if( apcReconstructPicBuffer[uiLayer] )
            {
              apcPicBufferUnusedList[uiLayer].push_back( apcReconstructPicBuffer[uiLayer] );
            }
          }
        }
        m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList ); //!! ??
			}
    }

  }
  //}}Adaptive GOP structure

  return Err::m_nOK;
}


ErrVal
H264AVCEncoder::finish( ExtBinDataAccessorList&  rcExtBinDataAccessorList,
                        PicBufferList*           apcPicBufferOutputList,
                        PicBufferList*           apcPicBufferUnusedList,
                        UInt&                    ruiNumCodedFrames,
                        Double&                  rdHighestLayerOutputRate )
{
  UInt  uiLayer;
	UInt	uiScalableLayer = 0;
  UInt  uiNumLayers = m_pcCodingParameter->getNumberOfLayers();

  //{{Adaptive GOP structure
  // --ETRI & KHU
  if ( !m_pcCodingParameter->getUseAGS() ) {
  //}}Adaptive GOP structure

  for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
  {
    RNOK( xProcessGOP( uiLayer,
 											 uiScalableLayer,
                       NULL,
                       NULL,
                       apcPicBufferOutputList[uiLayer],
                       apcPicBufferUnusedList[uiLayer] ) );
  }

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

  //{{Adaptive GOP structure
  // --ETRI & KHU
  }
  else
  {
    if (m_pcCodingParameter->getWriteGOPMode())
    {
      for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
      {
        RNOK( xProcessGOP( uiLayer,
													 uiScalableLayer,
                           NULL,
                           NULL,
                           apcPicBufferOutputList[uiLayer],
                           apcPicBufferUnusedList[uiLayer] ) );
      }

      m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
  
      for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
      {
        RNOK( m_apcMCTFEncoder[uiLayer]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate,
																								 dGetFramerate(), dGetBitrate(), m_aaauidSeqBits ) );
// BUG_FIX liuhui{
	    RNOK( m_apcMCTFEncoder[uiLayer]->SingleLayerFinish( m_aaauidSeqBits, m_aaadSingleLayerBitrate) );
// BUG_FIX liuhui}
      }
      printf("\n");
    }
    else
    {
      int order = 0;
		  int i;
		  
		  for (i = 0; i < 8 && (m_apcMCTFEncoder[0]->getSelect(m_uiGOPOrder,i ) ); i++) {
			  if ( m_apcMCTFEncoder[0]->getSelect(m_uiGOPOrder,i) )
				  order++;
		  }

		  m_bGOPDone = false;
		  
		  for (i = 0; i < order; i++) {
			  
			  if (i == order-1 ) {
				  m_bGOPDone = true;
			  }
        for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
        {
          m_apcMCTFEncoder[uiLayer]->setSelectPos(i);
          RNOK( xProcessGOP( uiLayer,
 														 uiScalableLayer,
                             NULL,
                             NULL,
                             apcPicBufferOutputList[uiLayer],
                             apcPicBufferUnusedList[uiLayer] ) );
        }
        
        m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
      }  
      for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
      {
        RNOK( m_apcMCTFEncoder[uiLayer]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate,
																								 dGetFramerate(), dGetBitrate(), m_aaauidSeqBits ) );
// BUG_FIX liuhui{
	    RNOK( m_apcMCTFEncoder[uiLayer]->SingleLayerFinish( m_aaauidSeqBits, m_aaadSingleLayerBitrate) );
// BUG_FIX liuhui}     
     }
      printf("\n");
    }
  }
  //}}Adaptive GOP structure

  return Err::m_nOK;
}



ErrVal
H264AVCEncoder::xProcessGOP( UInt                     uiLayer,
														 UInt&										uiScalableLayer,
                             PicBuffer*               pcOriginalPicBuffer,
                             PicBuffer*               pcReconstructPicBuffer,
                             PicBufferList&           rcPicBufferOutputList,
                             PicBufferList&           rcPicBufferUnusedList )
{ 
	//NonRequired JVT-Q066 (06-04-08){{
	if(m_pcCodingParameter->getNonRequiredEnable())
	{
		if(uiLayer == m_pcCodingParameter->getNumberOfLayers() - 1)
			m_apcMCTFEncoder[uiLayer]->setNonRequiredWrite(2);
		else
			m_apcMCTFEncoder[uiLayer]->setNonRequiredWrite(1);
	}
	//NonRequired JVT-Q066 (06-04-08)}}

  //{{Adaptive GOP structure
  // --ETRI & KHU
  if ( !m_pcCodingParameter->getUseAGS() ) {
  //}}Adaptive GOP structure

  if( pcOriginalPicBuffer == NULL )
  {
    //===== FINISH ENCODING =====
    if( pcReconstructPicBuffer )
    {
      rcPicBufferUnusedList.push_back( pcReconstructPicBuffer );
    }

    if( m_acOrgPicBufferList[uiLayer].size() )
    {
// BUG_FIX liuhui{
		if( uiLayer && uiScalableLayer == 0 )
			m_apcMCTFEncoder[uiLayer]->setScalableLayer( m_apcMCTFEncoder[uiLayer-1]->getScalableLayer() );
		else
// BUG_FIX liuhui}
			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();
      rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];

⌨️ 快捷键说明

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