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

📄 h264avcdecoder.cpp

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

					m_pauiPocInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize]	+=	m_uiMaxGopSize;
					m_uiFrameIdx[m_uiNextLayerId]++;
				}
				if ( frame_num != m_uiNextFrameNum || uiLayerId != m_uiNextLayerId || uiPocLsb != (m_uiNextPoc % uiMaxPocLsb))
				{
					if ( m_uiNextLayerId == 0)
					{
						BinData	*pcBinData = new BinData;
						pcBinData->set( new UChar[11], 11);
//						*(pcBinData->data()+0)	=	NAL_UNIT_VIRTUAL_BASELAYER;
						*(pcBinData->data()+0)	=	NAL_UNIT_CODED_SLICE;
						*(Int*)(pcBinData->data()+1)	=	0xdeadface;
						*(Short*)(pcBinData->data()+5)	=	(Short)m_uiNextFrameNum;
						*(Short*)(pcBinData->data()+7)	=	(Short)m_uiNextPoc;
						*(pcBinData->data()+9)	=	(UChar)m_uiNextTempLevel;
						*(pcBinData->data()+pcBinData->size()-1)	=	0;
						cVirtualSliceList.pushFront( pcBinData);

					}
					else
					{
						BinData	*pcBinData = new BinData;
						pcBinData->set( new UChar[11], 11);
//						*(pcBinData->data()+0)	=	NAL_UNIT_VIRTUAL_ENHANCELAYER;
						*(pcBinData->data()+0)	=	NAL_UNIT_CODED_SLICE_SCALABLE;
						*(Int*)(pcBinData->data()+1)	=	0xdeadface;
						*(Short*)(pcBinData->data()+5)	=	(Short)m_uiNextFrameNum;
						*(Short*)(pcBinData->data()+7)	=	 (Short)m_uiNextPoc;
						*(pcBinData->data()+9)	=	(UChar)m_uiNextTempLevel;
						*(pcBinData->data()+pcBinData->size()-1)	=	0;
						cVirtualSliceList.pushFront( pcBinData);

            m_uiNumOfNALInAU++;  //TMM_EC
					}
				}
			}
		}
	}

  if( pcSliceHeader != NULL )
    delete pcSliceHeader;

  return Err::m_nOK;
}
//TMM_EC }}

ErrVal
H264AVCDecoder::initPacket( BinDataAccessor*  pcBinDataAccessor,
													  UInt&             ruiNalUnitType,
														UInt&             ruiMbX,
														UInt&             ruiMbY,
														UInt&             ruiSize
														//,UInt&             ruiNonRequiredPic  //NonRequired JVT-Q066
														//JVT-P031
														, Bool            bPreParseHeader //FRAG_FIX
														, Bool			      bConcatenated //FRAG_FIX_3
														, Bool&           rbStartDecoding,
														UInt&             ruiStartPos,
														UInt&             ruiEndPos,
														Bool&             bFragmented,
														Bool&             bDiscardable
                            //~JVT-P031
                            , Bool*           pbFgsParallelDecoding
                            , UInt*           puiNumFragments
                            , UChar**         ppucFragBuffers
                            )
{
  ROF( m_bInitDone );
  UInt uiLayerId;

  ROT( NULL == pcBinDataAccessor );
  if ( NULL == pcBinDataAccessor->data() || 0 == pcBinDataAccessor->size() )
  {
    // switch
    SliceHeader* pTmp = m_pcSliceHeader;
    m_pcSliceHeader   = m_pcPrevSliceHeader;
    m_pcPrevSliceHeader = pTmp;


    m_bLastFrame = true;
    delete m_pcSliceHeader;
    m_pcSliceHeader = 0;
    rbStartDecoding = true; //JVT-P031
    return Err::m_nOK;
  }

//  Bool KeyPicFlag = false; //bug-fix suffix shenqiu
  static Bool bSuffixUnit = false;  //JVT-S036 lsj

  Bool bFirstFragment;

  //JVT-P031
  Bool bLastFragment;
  UInt uiHeaderBits;
  getDecodedResolution(m_uiDecodedLayer);
  m_pcNalUnitParser->setDecodedLayer(m_uiDecodedLayer);
  ruiStartPos = m_pcNalUnitParser->getNalHeaderSize(pcBinDataAccessor);
  ruiStartPos = 0; //FRAG_FIX
  //~JVT-P031
  UInt uiNumBytesRemoved; //FIX_FRAG_CAVLC
//bug-fix suffix shenqiu{{
  //RNOK( m_pcNalUnitParser->initNalUnit( pcBinDataAccessor, &KeyPicFlag,uiNumBytesRemoved, bPreParseHeader , bConcatenated) ); //BUG_FIX_FT_01_2006_2 //FIX_FRAG_CAVLC

  RNOK( m_pcNalUnitParser->initNalUnit(
    pcBinDataAccessor, uiNumBytesRemoved, bPreParseHeader,
    bConcatenated, false, puiNumFragments, ppucFragBuffers) ); //BUG_FIX_FT_01_2006_2 //FIX_FRAG_CAVLC

//bug-fix suffix shenqiu}}
  UInt uiBitsLeft = m_pcNalUnitParser->getBitsLeft(); //JVT-P031

  ruiNalUnitType = m_pcNalUnitParser->getNalUnitType();
//prefix unit{{
	if(m_pcPrefixSliceHeader && (ruiNalUnitType != NAL_UNIT_CODED_SLICE && ruiNalUnitType != NAL_UNIT_CODED_SLICE_IDR))
	{
		delete m_pcPrefixSliceHeader;
		m_pcPrefixSliceHeader = NULL;
		bDiscardable = true;//JVT-P031
    rbStartDecoding = true;//JVT-P031
		ruiEndPos = pcBinDataAccessor->size(); //JVT-P031
		return Err::m_nOK;
	}
//prefix unit}}
  //TMM_EC {{
  if(!bPreParseHeader && ruiNalUnitType==NAL_UNIT_END_OF_STREAM)
  {
	  SliceHeader* pTmp = m_pcSliceHeader;
    m_pcSliceHeader   = m_pcPrevSliceHeader;
    m_pcPrevSliceHeader = pTmp;

		for ( UInt i=0; i< m_uiNumLayers; i++)
		{
			if (m_pauiPocInGOP[i])       delete	[] m_pauiPocInGOP[i];
      if (m_pauiFrameNumInGOP[i])  delete	[] m_pauiFrameNumInGOP[i];
			if (m_pauiTempLevelInGOP[i]) delete	[] m_pauiTempLevelInGOP[i];
		}
    m_bLastFrame = true;
    delete m_pcSliceHeader;
    m_pcSliceHeader = NULL;
    return Err::m_nOK;
  }
//TMM_EC }}
  switch ( m_pcNalUnitParser->getNalUnitType() )
  {
  case NAL_UNIT_CODED_SLICE:
  case NAL_UNIT_CODED_SLICE_IDR:
		{
    //JVT-P031
    RNOK( xStartSlice(bPreParseHeader,bFirstFragment, bLastFragment, pbFgsParallelDecoding, bDiscardable) ); //FRAG_FIX //TMM_EC //JVT-S036 lsj
//prefix unit{{
	if(m_pcPrefixSliceHeader)
	{
		m_pcSliceHeader->copyPrefix(*m_pcPrefixSliceHeader);
		delete m_pcPrefixSliceHeader;
		m_pcPrefixSliceHeader = NULL;
	}
//prefix unit}}
    ruiEndPos = pcBinDataAccessor->size();
    bDiscardable = false;
    uiHeaderBits = uiBitsLeft - m_pcNalUnitParser->getBitsLeft();
    ruiStartPos += (uiHeaderBits+7)>>3;
  	ruiStartPos = 0; //FRAG_FIX
    //~JVT-P031
    RNOK( m_pcControlMng      ->initSlice0(m_pcSliceHeader) );
    m_bActive = true;
    rbStartDecoding = true; //JVT-P031
	bSuffixUnit = true; //JVT-S036 lsj

//TMM_EC {{
		if (!m_bNotSupport && !bPreParseHeader)
		{
				UInt	uiMaxGopSize	=	m_uiMaxGopSize;
			  UInt	uiGopSize;
			  m_uiNextLayerId		=	m_pcSliceHeader->getLayerId();
			  do
			  {
				  m_uiNextLayerId		=	(m_uiNextLayerId + 1) % m_uiNumLayers;
				  uiGopSize	=	1 << m_uiDecompositionStages[m_uiNextLayerId];

				  if (m_uiFrameIdx[m_uiNextLayerId] % uiMaxGopSize < m_uiGopSize[m_uiNextLayerId])
					  break;
				  m_uiFrameIdx[m_uiNextLayerId]++;
			  }
			  while( true);

			  if ( m_pcNalUnitParser->getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR || m_uiNextLayerId == 0)
			  {
				  UInt	uiMaxFrameNum	=	1 << m_pcSliceHeader->getSPS().getLog2MaxFrameNum();
  				//UInt	uiMaxPocLsb		=	1 << m_pcSliceHeader->getSPS().getLog2MaxPicOrderCntLsb();
				  m_uiNextFrameNum		=	m_pauiFrameNumInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize] % uiMaxFrameNum;
				  m_uiNextPoc					=	m_pauiPocInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize];
				  m_uiNextTempLevel		=	m_pauiTempLevelInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize];
				  if ( uiGopSize == 1)
					  m_pauiFrameNumInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize]	+=	1;
				  else
					  m_pauiFrameNumInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize]	+=	uiGopSize >> 1;
				  m_pauiPocInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize]	+=	uiMaxGopSize;
				  m_uiFrameIdx[m_uiNextLayerId]++;
			  }
			  else
			  {
				  m_uiNextFrameNum	=	0;
				  m_uiNextPoc			=	0;
			  }
		}
//TMM_EC }}
    m_pcSliceHeader->setFGSCodingMode( m_bFGSCodingMode );
    m_pcSliceHeader->setGroupingSize ( m_uiGroupingSize );
    UInt ui;
    for( ui = 0; ui < 16; ui++ )
    {
      m_pcSliceHeader->setPosVect( ui, m_uiPosVect[ui] );
    }
    RNOK( m_pcSliceHeader->checkPosVectors() );
	}
	break;
  case NAL_UNIT_SPS:
    {
      SequenceParameterSet* pcSPS = NULL;
      RNOK( SequenceParameterSet::create  ( pcSPS   ) );
      RNOK( pcSPS               ->read    ( m_pcHeaderSymbolReadIf,
                                            m_pcNalUnitParser->getNalUnitType() ) );
      // It is assumed that layer 0 and layer 1 use the first two SPSs, respectively.
      if( NULL == m_pcVeryFirstSPS )
      {
        setVeryFirstSPS( pcSPS );
      }
//TMM_EC {{
			for ( UInt i=0; i<m_uiNumLayers; i++)
			{
				UInt	uiDecompositionStagesSub	=	m_uiMaxDecompositionStages - m_uiDecompositionStages[i];
				UInt	uiGopSize	=	m_uiGopSize[i];
				 //NS leak fix begin
        if (m_pauiPocInGOP[i])       delete	[] m_pauiPocInGOP[i];
        if (m_pauiFrameNumInGOP[i])  delete	[] m_pauiFrameNumInGOP[i];
        if (m_pauiTempLevelInGOP[i]) delete	[] m_pauiTempLevelInGOP[i];
        //NS leak fix end
        m_pauiPocInGOP[i]				=	new	UInt[uiGopSize];
				m_pauiFrameNumInGOP[i]	=	new	UInt[uiGopSize];
				m_pauiTempLevelInGOP[i]	=	new	UInt[uiGopSize];
				UInt	uiFrameIdx	=	0;
				UInt	uiFrameNum	=	1;
				for( UInt uiTemporalLevel = 0; uiTemporalLevel <= m_uiDecompositionStages[i]; uiTemporalLevel++ )
				{
					UInt      uiStep    = ( 1 << ( m_uiDecompositionStages[i] - uiTemporalLevel ) );
					for( UInt uiFrameId = uiStep; uiFrameId <= uiGopSize; uiFrameId += ( uiStep << 1 ) )
					{
						m_pauiPocInGOP[i][uiFrameIdx]	=	uiFrameId << uiDecompositionStagesSub;
						m_pauiFrameNumInGOP[i][uiFrameIdx]	=	uiFrameNum;
						m_pauiTempLevelInGOP[i][uiFrameIdx]	=	uiTemporalLevel;
						uiFrameIdx++;
						if ( uiFrameId % 2 == 0)
							uiFrameNum++;
					}
				}
			}
//TMM_EC }}
			if ( pcSPS->getProfileIdc()==SCALABLE_PROFILE )
      {
//TMM_EC {{
				if ( pcSPS->getSeqParameterSetId() == 0)
				{
					 // m_bNotSupport	=	true;
					m_baseMode = 0;
				}
//TMM_EC }}
				m_bEnhancementLayer = true;
        m_bSpatialScalability = pcSPS->getFrameHeightInMbs() != m_pcVeryFirstSPS->getFrameHeightInMbs();
      }
			m_bNewSPS = true;
      RNOK( m_pcParameterSetMng ->store   ( pcSPS   ) );

      // Copy simple priority ID mapping from SPS to NAL unit parser
    /*  if ( !pcSPS->getNalUnitExtFlag() )
      {
        for ( UInt uiPriId = 0; uiPriId < pcSPS->getNumSimplePriIdVals(); uiPriId++)
        {
            UInt uiLayer, uiTempLevel, uiQualLevel;
            pcSPS->getSimplePriorityMap( uiPriId, uiTempLevel, uiLayer, uiQualLevel );
            m_pcNalUnitParser->setSimplePriorityMap( uiPriId, uiTempLevel, uiLayer, uiQualLevel );
        }

      }
 JVT-S036 lsj */

      ruiMbX  = pcSPS->getFrameWidthInMbs ();
      ruiMbY  = pcSPS->getFrameHeightInMbs();
      ruiSize = max( ruiSize, ( (ruiMbX << 3 ) + YUV_X_MARGIN ) * ( ( ruiMbY << 3 ) + YUV_Y_MARGIN ) * 6 );
			m_pcControlMng->initSPS( *pcSPS, m_uiRecLayerId );
      ruiEndPos = pcBinDataAccessor->size(); //JVT-P031
      bDiscardable = false;//JVT-P031
      rbStartDecoding = true;//JVT-P031

      if( pcSPS->getNumFGSVectModes() == 1)
      {
        m_bFGSCodingMode = pcSPS->getFGSCodingMode( 0 );
        m_uiGroupingSize = pcSPS->getGroupingSize ( 0 );
        UInt ui;
        for(ui = 0; ui < 16; ui++)
        {
          m_uiPosVect[ui] = pcSPS->getPosVect( 0, ui );
        }
      }
      else if( m_pcSliceHeader )
      {
        m_bFGSCodingMode = m_pcSliceHeader->getFGSCodingMode();
        m_uiGroupingSize = m_pcSliceHeader->getGroupingSize ();
        UInt ui;
        for(ui = 0; ui < 16; ui++)
        {
          m_uiPosVect[ui] = m_pcSliceHeader->getPosVect(ui);
        }
      }
    }
    break;

  case NAL_UNIT_PPS:
    {
      PictureParameterSet* pcPPS = NULL;
      RNOK( PictureParameterSet::create( pcPPS  ) );
      RNOK( pcPPS->read( m_pcHeaderSymbolReadIf,
                         m_pcNalUnitParser->getNalUnitType() ) );
      RNOK( m_pcParameterSetMng->store( pcPPS   ) );
      ruiEndPos = pcBinDataAccessor->size();//JVT-P031
      bDiscardable = false;//JVT-P031
      rbStartDecoding = true;//JVT-P031
    }
    break;

  case NAL_UNIT_CODED_SLICE_SCALABLE:
  case NAL_UNIT_CODED_SLICE_IDR_SCALABLE:
    {
      bFragmented = m_pcNalUnitParser->getFragmentedFlag() && (m_pcNalUnitParser->getFragmentOrder()!=0 || !m_pcNalUnitParser->getLastFragmentFlag());
      //JVT-P031
      getDecodedResolution(m_uiDecodedLayer);
      if(m_pcNalUnitParser->getLayerId() < m_uiDecodedLayer && m_pcNalUnitParser->getDiscardableFlag())
        bDiscardable = true;
      else
        bDiscardable = false;

      RNOK( xStartSlice(bPreParseHeader, bFirstFragment, bLastFragment, pbFgsParallelDecoding, bDiscardable) );

      if(bDiscardable)
        ruiEndPos = 0;
      else
        ruiEndPos = pcBinDataAccessor->size();

      uiHeaderBits = uiBitsLeft - m_pcNalUnitParser->getBitsLeft();
      // JVT-U116 LMI {
      UChar ucByte = pcBinDataAccessor->data()[3];
      if ( ucByte & 1 )
        uiHeaderBits += 8;
      // JVT-U116 LMI }

      if( (bDiscardable) || (!bFragmented) || (bFragmented && m_pcNalUnitParser->getFragmentOrder()==0) )
      {
        ruiStartPos = 0;
      }
      else
      {
        ruiStartPos += (uiHeaderBits+(1+NAL_UNIT_HEADER_SVC_EXTENSION_BYTES)*8+7)>>3;//BUG_FIX_FT_01_2006_2
        //(1+NAL_UNIT_HEADER_SVC_EXTENSION_BYTES)*8 is used to take into account the nal header which has already been read
      }
      if(m_pcNalUnitParser->getFragmentedFlag() && ! m_pcNalUnitParser->getLastFragmentFlag())
      { //FIX_FRAG_CAVLC
        if(bPreParseHeader)
        {
          ruiEndPos -= uiNumBytesRemoved;
        }//~FIX_FRAG_CAVLC
        while( pcBinDataAccessor->data()[ruiEndPos - 1] == 0 )
          ruiEndPos --;
        if( pbFgsParallelDecoding != 0 && (! (*pbFgsParallelDecoding) ) )
        {
          ruiEndPos --;
        }

      }//FIX_FRAG_CAVLC
      if(!bDiscardable)//~JVT-P031
        RNOK( m_pcControlMng      ->initSlice0(m_pcSliceHeader) );
      //bug-fix suffix shenqiu{{
      // if(m_pcSliceHeader) //JVT-P031

      //bug-fix suffix shenqiu
      //JVT-P031

      // the variable m_pcSliceHeader->m_uiLastFragOrder is not updated

⌨️ 快捷键说明

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