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

📄 extractor.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  printf("\n");
  printf(" target rate = %8.2lf kbit/s\n", (Double) uiTGRate                / dScale );
  printf(" output rate = %8.2lf kbit/s\n", (Double)uiOutRate                / dScale );
  printf("\n");
#endif

  return Err::m_nOK;
}


ErrVal
Extractor::xAnalyse( UInt    uiTargetLayer,
                    Double& rdFrameRate,
                    Bool&   rbQualityLayerPresent,
                    UInt    auiQLRate[],
                    Bool    bNoSpecialFirstFrame
                    )
{
  Bool                    bEOS          = false;
  BinData*                pcBinData     = 0;
  UInt                    uiDId         = 0;
  UInt                    uiTId         = 0;
  UInt                    uiQId         = 0;
  UInt                    uiPId         = 0;
  UInt                    uiPacketSize  = 0;
  UInt                    uiNumAVCPics  = 0;
  UInt&                   ruiBLRate     = auiQLRate[MAX_QLAYERS+1];
  UInt&                   ruiFGSAU0Rate = auiQLRate[MAX_QLAYERS  ];
  h264::SEI::SEIMessage*  pcScalableSei = 0;
  h264::PacketDescription cPacketDescription;
  UInt                    aauiTLRate[MAX_TLAYERS][MAX_QUALITY_LEVELS];

  //===== clear arrays =====
  ::memset( auiQLRate,  0x00, sizeof( UInt ) * ( MAX_QLAYERS + 2 ) );
  ::memset( aauiTLRate, 0x00, sizeof( UInt ) * ( MAX_TLAYERS * MAX_QUALITY_LEVELS ) );


  //===== initialize and read scalable SEI message =====
  {
    //----- init -----
    RNOK( m_pcH264AVCPacketAnalyzer ->init          () );
    //----- read first packet, which must contain the scalable SEI -----
    RNOK( m_pcReadBitstream         ->extractPacket ( pcBinData, bEOS ) );
    ROT ( bEOS );
    RNOK( m_pcH264AVCPacketAnalyzer ->process       ( pcBinData, cPacketDescription, pcScalableSei ) );
    ROF ( pcScalableSei );
    //----- get SEI parameters and delete SEI -----
    h264::SEI::ScalableSei* pcSSEI  = static_cast<h264::SEI::ScalableSei*>( pcScalableSei );
    rdFrameRate     = (Double)pcSSEI->getAvgFrmRate( pcSSEI->getNumLayersMinus1() ) / 256.0;
    delete pcScalableSei;
    pcScalableSei   = 0;
    //----- get packet size -----
    while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
    {
      RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
    }
    ruiBLRate       = 4 + pcBinData ->size();
    //----- release packet -----
    RNOK( m_pcReadBitstream         ->releasePacket ( pcBinData ) );
    pcBinData       = 0;
  }


  //===== MAIN LOOP OVER PACKETS =====
  while( ! bEOS )
  {
    //===== get packet =====
    RNOK  ( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
    if    ( bEOS )
    {
      RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
      pcBinData = NULL;
      continue;
    }

    //===== get packet description =====
    RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcScalableSei ) );
    ROT ( pcScalableSei );
    ROT ( cPacketDescription.ApplyToNext );


    //===== get packet size =====
    while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
    {
      RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
    }


    //==== get parameters =====
    {
      uiPacketSize  = 4 + pcBinData->size();
      uiDId         = cPacketDescription.Layer;
//prefix unit{{
      if(cPacketDescription.NalUnitType != NAL_UNIT_CODED_SLICE && cPacketDescription.NalUnitType != NAL_UNIT_CODED_SLICE_IDR)
        uiTId         = cPacketDescription.Level;
//prefix unit}}
      uiQId         = cPacketDescription.FGSLayer;
      uiPId         = cPacketDescription.uiPId;
    }
    ROT( uiDId > uiTargetLayer );
    ROF( uiPId < MAX_QLAYERS   );

    //===== store data =====
    if( uiDId < uiTargetLayer || uiQId == 0 )
    {
      ruiBLRate                 += uiPacketSize;
    }
    else if( uiQId == 1 && uiNumAVCPics == 1 && ! bNoSpecialFirstFrame )
    {
      ruiFGSAU0Rate             += uiPacketSize;
    }
    else
    {
      aauiTLRate[uiTId][uiQId]  += uiPacketSize;
      auiQLRate [uiPId]         += uiPacketSize;
      rbQualityLayerPresent      = rbQualityLayerPresent || uiPId != 0; 
    }

    //===== release packet =====
    if( pcBinData )
    {
      RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
      pcBinData = NULL;
    }
  } // end of while( ! bEOS )


  //===== get quality level automatically =====
  if( ! rbQualityLayerPresent )
  {
    auiQLRate[0] = 0;
    for( uiTId = 0; uiTId < MAX_TLAYERS;        uiTId++ )
      for( uiQId = 1; uiQId < MAX_QUALITY_LEVELS; uiQId++ )
      {
        auiQLRate[ MAX_QLAYERS - 1 - ( ( uiQId - 1 ) << 3 ) - uiTId ] = aauiTLRate[uiTId][uiQId];
      }
  }


  //===== accumulate rate =====
  for( uiQId = MAX_QLAYERS + 1; uiQId > 0; uiQId-- )
  {
    auiQLRate[uiQId-1] += auiQLRate[uiQId];
  }

  RNOK( m_pcH264AVCPacketAnalyzer->uninit() );

  //===== reset input file =====
  RNOKS( static_cast<ReadBitstreamFile*>( m_pcReadBitstream )->uninit() );
  RNOKS( static_cast<ReadBitstreamFile*>( m_pcReadBitstream )->init  ( m_pcExtractorParameter->getInFile() ) );

  return Err::m_nOK;
}


ErrVal
Extractor::xExtract( UInt    uiTargetLayer,
                    Bool    bQualityLayerPresent,
                    Int     iQualityLayer,
                    UInt&   ruiInLayerRate,
                    Bool    bNoSpecialFirstFrame )
{
  Bool                    bEOS          = false;
  BinData*                pcBinData     = 0;
  UInt                    uiDId         = 0;
  UInt                    uiTId         = 0;
  UInt                    uiQId         = 0;
  UInt                    uiPId         = 0;
  UInt                    uiPacketSize  = 0;
  UInt                    uiNumAVCPics  = 0;
  h264::SEI::SEIMessage*  pcScalableSei = 0;
  h264::PacketDescription cPacketDescription;


  //===== initialize and read scalable SEI message =====
  {
    //----- init -----
    RNOK( m_pcH264AVCPacketAnalyzer ->init          () );
    //----- read first packet, which must contain the scalable SEI -----
    RNOK( m_pcReadBitstream         ->extractPacket ( pcBinData, bEOS ) );
    ROT ( bEOS );
    RNOK( m_pcH264AVCPacketAnalyzer ->process       ( pcBinData, cPacketDescription, pcScalableSei ) );
    ROF ( pcScalableSei );
    //----- delete SEI -----
    delete pcScalableSei;
    pcScalableSei   = 0;
    //----- get packet size -----
    while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
    {
      RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
    }
    //----- write and release packet -----
    RNOK( m_pcWriteBitstream        ->writePacket   ( &m_cBinDataStartCode ) );
    RNOK( m_pcWriteBitstream        ->writePacket   ( pcBinData ) );
    RNOK( m_pcReadBitstream         ->releasePacket ( pcBinData ) );
    pcBinData       = 0;
  }


  //===== MAIN LOOP OVER PACKETS =====
  while( ! bEOS )
  {
    //===== get packet =====
    RNOK  ( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
    if    ( bEOS )
    {
      RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
      pcBinData = NULL;
      continue;
    }

    //===== get packet description =====
    RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcScalableSei ) );
    ROT ( pcScalableSei );
    ROT ( cPacketDescription.ApplyToNext );


    //===== get packet size =====
    while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
    {
      RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
    }


    //==== get parameters =====
    {
      uiPacketSize  = 4 + pcBinData->size();
      uiDId         = cPacketDescription.Layer;
//prefix unit{{
      if(cPacketDescription.NalUnitType != NAL_UNIT_CODED_SLICE && cPacketDescription.NalUnitType != NAL_UNIT_CODED_SLICE_IDR)
        uiTId         = cPacketDescription.Level;
//prefix unit}}
      uiQId         = cPacketDescription.FGSLayer;
      uiPId         = cPacketDescription.uiPId;

    }
    ROT( uiDId > uiTargetLayer );
    ROF( uiPId < MAX_QLAYERS   );


    //===== determine whether packet is kept =====
    Bool  bKeep = true;
    if(  uiDId == uiTargetLayer && uiQId > 0 )
    {
      //---- get quality layer when not present -----
      if( ! bQualityLayerPresent )
      {
        uiPId   = MAX_QLAYERS - 1 - ( ( uiQId - 1 ) << 3 ) - uiTId;
      }
      if( uiQId == 1 && uiNumAVCPics == 1 && ! bNoSpecialFirstFrame)
      {
        uiPId   = MAX_QLAYERS;
      }
      //---- check whether packet is discarded ----
      if( (Int)uiPId < iQualityLayer )
      {
        bKeep   = false;
      }
      else if( (Int)uiPId == iQualityLayer )
      {
        if( ruiInLayerRate >= uiPacketSize )
        {
          ruiInLayerRate -= uiPacketSize;
        }
        else
        {
          bKeep = false;
        }
      }
    }


    //===== write packet ====
    if( bKeep )
    {
      RNOK( m_pcWriteBitstream->writePacket( &m_cBinDataStartCode ) );
      RNOK( m_pcWriteBitstream->writePacket( pcBinData ) );
    }


    //===== release packet =====
    if( pcBinData )
    {
      RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
      pcBinData = NULL;
    }
  } // end of while( ! bEOS )


  //===== uninit =====
  RNOK( m_pcH264AVCPacketAnalyzer->uninit() );

  return Err::m_nOK;
}




// Keep ROI NAL ICU/ETRI DS
Int Extractor::CurNalKeepingNeed(h264::PacketDescription cPacketDescription
                 , const ExtractorParameter::Point& rcExtPoint)
{
  Bool bIsDataNal = false;
  if (
    (1 <= cPacketDescription.NalUnitType && cPacketDescription.NalUnitType <= 5)
    || (cPacketDescription.NalUnitType == 20 || cPacketDescription.NalUnitType == 21)
    )
  {
    bIsDataNal    = true;
  }


  Int iExtactionROINum    =   m_pcExtractorParameter->getExtractedNumROI();
  Bool      bROIFlag      =   m_pcExtractorParameter->getROIFlag();

  int keepingNAL = -1;
  if( bROIFlag == true && bIsDataNal == true )
  {
    for(int i=0; i<iExtactionROINum; i++)
    {
      Int SG_ID =-1;
      for(int sg_id=0;sg_id<8;sg_id++)
      {
        if(cPacketDescription.uiFirstMb == m_pcH264AVCPacketAnalyzer->uiaAddrFirstMBofROIs[cPacketDescription.PPSid][sg_id])
        {
          SG_ID=sg_id;
          break;
        }
      } // end for check sg (until 8)

      Int iROI_ID = getROI_ID(cPacketDescription.Layer,SG_ID);
      if(iROI_ID !=-1 &&rcExtPoint.uiROI[i] ==iROI_ID )
      {
        keepingNAL = 1;
      }
      if( keepingNAL == 1 )
        break;
    }  // end for
  }  // end if (bROIFlag == true.. )

  else
    return true;


  return (keepingNAL == 1);
}

ErrVal
Extractor::xExtractPoints()
{
  UInt  uiNumInput    = 0;
  UInt  uiNumK

⌨️ 快捷键说明

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