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

📄 h264avcdecoder.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
      if( (bLastFragment) || (!bFragmented) ||
        ( bFragmented && m_uiLastFragOrder+1 == m_uiNumberOfFragment[m_pcSliceHeader->getLayerId()][m_pcSliceHeader->getQualityLevel()]))

        rbStartDecoding = true;
      //~JVT-P031
      //TMM_EC {{
      if ( !m_bNotSupport && !bPreParseHeader && m_pcNalUnitParser->getQualityLevel() == 0)
      {
        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);
//EC bug fix
				if ( m_pcNalUnitParser->getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR_SCALABLE || 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 }}
  if(m_pcSliceHeader)
  {
    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_SEI:
    {
      //===== just for trace file =====
      SEI::MessageList  cMessageList;
			UInt	i;
      RNOK( SEI::read( m_pcHeaderSymbolReadIf, cMessageList ) );
      while( ! cMessageList.empty() )
      {
        SEI::SEIMessage*  pcSEIMessage = cMessageList.popBack();
		if(pcSEIMessage->getMessageType() == SEI::NON_REQUIRED_SEI)
		{
			m_pcNonRequiredSei = (SEI::NonRequiredSei*) pcSEIMessage;
			m_uiNonRequiredSeiReadFlag = 1;
		}
		else
		{
				  if ( pcSEIMessage->getMessageType() == SEI::SCALABLE_SEI)
				  {
//	trick
            m_uiNumLayers						=	((SEI::ScalableSei*)pcSEIMessage)->getDependencyId( ((SEI::ScalableSei*)pcSEIMessage)->getNumLayersMinus1()) + 1;
					  for ( uiLayerId=0; uiLayerId<((SEI::ScalableSei*)pcSEIMessage)->getNumLayersMinus1()+1; uiLayerId++)
            {
              if ( ((SEI::ScalableSei*)pcSEIMessage)->getDependencyId( uiLayerId) != 0)
                break;
            }
            uiLayerId--;
            m_uiDecompositionStages[0]	=	((SEI::ScalableSei*)pcSEIMessage)->getTemporalLevel( uiLayerId);
            m_uiDecompositionStages[m_uiNumLayers-1]	=	((SEI::ScalableSei*)pcSEIMessage)->getTemporalLevel( ((SEI::ScalableSei*)pcSEIMessage)->getNumLayersMinus1());
					  m_uiMaxDecompositionStages = m_uiDecompositionStages[m_uiNumLayers-1];
					  m_uiMaxGopSize	=	1 << m_uiMaxDecompositionStages;
						for ( i=0; i< m_uiNumLayers; i++)
						  m_uiGopSize[i]	=	1 << m_uiDecompositionStages[i];
				  }
// JVT-T073 {
				  else if( pcSEIMessage->getMessageType() == SEI::SCALABLE_NESTING_SEI )
				  {
				      //do nothing, or add your code here
				  }
// JVT-T073 }
			    delete pcSEIMessage;
          pcSEIMessage = NULL;
		}
      }
      ruiEndPos = (uiBitsLeft+7)/8; //FRAG_FIX
      bDiscardable = false;//JVT-P031
      rbStartDecoding = true;//JVT-P031
    }
    break;
  case NAL_UNIT_ACCESS_UNIT_DELIMITER:
    {
      RNOK ( m_pcNalUnitParser->readAUDelimiter());
      ruiEndPos = pcBinDataAccessor->size();//JVT-P031
      bDiscardable = false;//JVT-P031
      rbStartDecoding = true;//JVT-P031
    }
    break;
  case NAL_UNIT_END_OF_SEQUENCE:
    {
      RNOK ( m_pcNalUnitParser->readEndOfSeqence());
      ruiEndPos = pcBinDataAccessor->size();//JVT-P031
      bDiscardable = false;//JVT-P031
      rbStartDecoding = true;//JVT-P031
    }
  case NAL_UNIT_END_OF_STREAM:
    {
      RNOK ( m_pcNalUnitParser->readEndOfStream());
      ruiEndPos = pcBinDataAccessor->size();//JVT-P031
      bDiscardable = false;//JVT-P031
      rbStartDecoding = true;//JVT-P031
    }
    break;
//prefix unit{{
  case NAL_UNIT_PREFIX:  
	{
	  SequenceParameterSet* pcSPS;
    PictureParameterSet*  pcPPS;
	  RNOK( m_pcParameterSetMng ->get    ( pcPPS, 0) );
    RNOK( m_pcParameterSetMng ->get    ( pcSPS, 0) );
		if(m_pcPrefixSliceHeader)
			{
				delete m_pcPrefixSliceHeader;
				m_pcPrefixSliceHeader = NULL;
			}
	  m_pcPrefixSliceHeader = new SliceHeader(*pcSPS, *pcPPS);
	  RNOK( m_pcSliceReader->readSliceHeaderPrefix( m_pcNalUnitParser->getNalUnitType   (),
														  m_pcNalUnitParser->getNalRefIdc     (),
														  m_pcNalUnitParser->getLayerId		  (),
														  m_pcNalUnitParser->getQualityLevel  (),
														  m_pcNalUnitParser->getUseBasePredFlag(),
														  m_pcPrefixSliceHeader
														  ) 
											);
	  ruiEndPos = pcBinDataAccessor->size(); //JVT-P031
      bDiscardable = false;//JVT-P031
      rbStartDecoding = true;//JVT-P031
	}
	break;
//prefix unit}}
  default:
    return Err::m_nERR;
    break;
  }

  m_uiNonRequiredPic = 0; //NonRequired JVT-Q066
  //ruiNonRequiredPic = 0;

  if(m_pcSliceHeader)
  {
	  m_uiCurrPicLayer = (m_pcSliceHeader->getLayerId() << 4) + m_pcSliceHeader->getQualityLevel();
	  if(m_uiCurrPicLayer == 0 || m_uiCurrPicLayer <= m_uiPrevPicLayer)
	  {
		  if(m_uiNonRequiredSeiReadFlag == 0 && m_pcNonRequiredSei)
		  {
			  m_pcNonRequiredSei->destroy();
			  m_pcNonRequiredSei = NULL;
		  }
		  m_uiNonRequiredSeiRead = m_uiNonRequiredSeiReadFlag;
		  m_uiNonRequiredSeiReadFlag = 0;
	  }
	  m_uiPrevPicLayer = m_uiCurrPicLayer;

	  if(m_uiNonRequiredSeiRead == 1)
	  {
		  for(UInt i = 0; i <= m_pcNonRequiredSei->getNumInfoEntriesMinus1(); i++)
		  {
			  if(m_pcNonRequiredSei->getEntryDependencyId(i))  // it should be changed to if(DenpendencyId == LayerId of the shown picture)
			  {
				  for(UInt j = 0; j <= m_pcNonRequiredSei->getNumNonRequiredPicsMinus1(i); j++)
				  {
					  if(m_pcSliceHeader->getLayerId() == m_pcNonRequiredSei->getNonRequiredPicDependencyId(i,j) &&
						  m_pcSliceHeader->getQualityLevel() == m_pcNonRequiredSei->getNonRequiredPicQulityLevel(i,j))  // it should be add something about FragmentFlag
					  {
						  m_uiNonRequiredPic = 1;  //NonRequired JVT-Q066
						//  ruiNonRequiredPic = 1;
						  ROTRS( m_apcMCTFDecoder[m_pcSliceHeader->getLayerId()]->getWaitForIdr() && !m_pcSliceHeader->isIdrNalUnit(), Err::m_nOK );
						  m_apcMCTFDecoder[m_pcSliceHeader->getLayerId()]->setWaitForIdr(false);
						  return Err::m_nOK;
					  }
				  }
			  }
		  }
	  }
#ifdef SHARP_AVC_REWRITE_OUTPUT
    if ((m_pcSliceHeader->getAVCRewriteFlag()))
    {
      m_avcRewriteFlag = true;
    }
#endif
  }
  return Err::m_nOK;
}

//JVT-P031
ErrVal
H264AVCDecoder::initPacket( BinDataAccessor*  pcBinDataAccessor)
{
  return m_pcNalUnitParser->initSODBNalUnit(pcBinDataAccessor);
}
//~JVT-P031

//JVT-S036 lsj start
ErrVal
H264AVCDecoder::initPacketSuffix( BinDataAccessor*  pcBinDataAccessor,
											UInt&             ruiNalUnitType
											, Bool            bPreParseHeader
											, Bool			      bConcatenated
											, Bool&           rbStartDecoding
											 ,SliceHeader     *pcSliceHeader
											  ,Bool&		  SuffixEnable
								)
{
  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 = NULL;
    rbStartDecoding = true; //JVT-P031

	if((m_pcNalUnitParser->getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE || m_pcNalUnitParser->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_SCALABLE)
		 && m_pcNalUnitParser->getLayerId() == 0 && m_pcNalUnitParser->getQualityLevel() == 0)
	{
		SuffixEnable = true;
	}
	else
	{
		SuffixEnable = false;
	}
    return Err::m_nOK;
  }


  //JVT-P031
//  Bool KeyPicFlag = false; //bug-fix suffix shenqiu
  getDecodedResolution(m_uiDecodedLayer);
  m_pcNalUnitParser->setDecodedLayer(m_uiDecodedLayer);
  //~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) ); //BUG_FIX_FT_01_2006_2 //FIX_FRAG_CAVLC
//bug-fix suffix shenqiu}}
  ruiNalUnitType = m_pcNalUnitParser->getNalUnitType();


//TMM_EC }}
  switch ( m_pcNalUnitParser->getNalUnitType() )
  {

  case NAL_UNIT_CODED_SLICE_SCALABLE:
  case NAL_UNIT_CODED_SLICE_IDR_SCALABLE:
    {
		if( m_pcNalUnitParser->getLayerId() == 0 && m_pcNalUnitParser->getQualityLevel() == 0)
		{
			RNOK( m_pcSliceReader->readSliceHeaderSuffix( m_pcNalUnitParser->getNalUnitType   (),
														  m_pcNalUnitParser->getNalRefIdc     (),
														  m_pcNalUnitParser->getLayerId		  (),
														  m_pcNalUnitParser->getQualityLevel  (),
                              m_pcNalUnitParser->getUseBasePredFlag(),
														  pcSliceHeader
														  )
											);
			SuffixEnable = true;
			return Err::m_nOK;
		}
		else
		{
			SuffixEnable = false;
			return Err::m_nOK;
		}

    }
    break;

  default:
	  {
		  SuffixEnable = false;
			return Err::m_nOK;
	  }
    break;
  }

  return Err::m_nOK;
}

//JVT-S036 lsj end

ErrVal
H264AVCDecoder::getBaseLayerPWTable( SliceHeader::PredWeightTable*& rpcPredWeightTable,
                                     UInt                           uiBaseLayerId,
                                     ListIdx                        eListIdx,
                                     Int                            iPoc )
{
  if( uiBaseLayerId || m_apcMCTFDecoder[uiBaseLayerId]->isActive() )
  {
    RNOK( m_apcMCTFDecoder[uiBaseLayerId]->getBaseLayerPWTable( rpcPredWeightTable, eListIdx, iPoc ) );
    return Err::m_nOK;
  }
  rpcPredWeightTable = &m_acLastPredWeightTable[eListIdx];
  return Err::m_nOK;
}

ErrVal
H264AVCDecoder::getBaseLayerUnit(UInt            uiBaseLayerId,
                                 Int             iPoc,
                                 DPBUnit*      &pcBaseDPBUnit)
{
  RNOK( m_apcMCTFDecoder[uiBaseLayerId]->getBaseLayerUnit( iPoc , pcBaseDPBUnit) );
  return Err::m_nOK;
}

ErrVal
H264AVCDecoder::getBaseLayerData( IntFrame*&      pcFrame,
                                  IntFrame*&      pcResidual,
                                  MbDataCtrl*&    pcMbDataCtrl,
                                  MbDataCtrl*&    pcMbDataCtrlEL,
                                  Bool&           rbConstrainedIPred,
                                  Bool&           rbSpatialScalability,
                                  UInt            uiLayerId,
                                  UInt            uiBaseLayerId,
                                  Int             iPoc,
                                  UInt            uiBaseQualityLevel) //JVT-T054
{
  if(uiBaseLayerId != 0 || !m_apcMCTFDecoder[uiBaseLayerId]->getAVCBased() ||
    (uiBaseQualityLevel != 0 && m_bCGSSNRInAU))

  {
    //===== base layer is scalable extension =====
      //--- get data ---
	  RNOK( m_apcMCTFDecoder[uiBaseLayerId]->getBaseLayerData( pcFrame,
	                                                         pcResidual,
	                                                         pcMbDataCtrl,
	                                                         pcMbDataCtrlEL,
	                                                         rbConstrainedIPred,
	                                                         rbSpatialScalability,
	                                                         iPoc ) );
  }
  else
  {
    //===== base layer is standard H.264/AVC =====
    FrameUnit*  pcFrameUnit = m_pcFrameMng->getReconstructedFrameUnit( iPoc );
    ROF( pcFrameUnit );

    pcFrame           = rbSpatialScalability ? m_pcFrameMng->getRefinementIntFrame2():
                                                 m_pcFrameMng->getRefinementIntFrame();

    pcResidual          = pcFrameUnit ->getResidual();
    pcMbDataCtrl        = pcFrameUnit ->getMbDataCtrl();
		pcMbDataCtrlEL      = m_pcBaseLayerCtrlEL;
    rbConstrainedIPred  = pcFrameUnit ->getContrainedIntraPred();
  }
  return Err::m_nOK;
}

ErrVal
H264AVCDecoder::getBaseLayerDataAvailability( IntFrame*&      pcFrame,
                                              IntFrame*&      pcResidual,
                                              MbDataCtrl*&    pcMbDataCtrl,
                                              Boo

⌨️ 快捷键说明

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