qualitylevelassigner.cpp

来自「SVC最新更新代码」· C++ 代码 · 共 1,704 行 · 第 1/5 页

CPP
1,704
字号
            dDistortionEnhDep  += log10( (Double)aaaauiDistortionDep[uiLayer][uiFGS  ][uiTLevel  ][uiCheckPicNum] );

            dDistortionBaseInd += log10( (Double)aaaauiDistortionInd[uiLayer][uiFGS-1][uiTLevel  ][uiCheckPicNum] );
            dDistortionEnhInd  += log10( (Double)aaaauiDistortionInd[uiLayer][uiFGS  ][uiTLevel  ][uiCheckPicNum] );
          }
          m_aaadDeltaDist[uiLayer][uiFGS][puiPic2FNum[uiPicNum]] = 0;
          m_aaadDeltaDist[uiLayer][uiFGS][puiPic2FNum[uiPicNum]]+= ( bDep ? dDistortionBaseDep - dDistortionEnhDep : 0 );
          m_aaadDeltaDist[uiLayer][uiFGS][puiPic2FNum[uiPicNum]]+= ( bInd ? dDistortionBaseInd - dDistortionEnhInd : 0 );
        }
      }
    }
  }
  printf("\n");


  //----- delete temporarily distortion arrays -----
  for( uiLayer  = 0;  uiLayer   <  m_uiNumLayers;              uiLayer  ++ )
  for( uiFGS    = 0;  uiFGS     <= m_auiNumFGSLayers[uiLayer]; uiFGS    ++ )
  for( uiTLevel = 0;  uiTLevel  <= m_auiNumTempLevel[uiLayer]; uiTLevel ++ )
  {
    delete [] aaaauiDistortionDep[uiLayer][uiFGS][uiTLevel];
    delete [] aaaauiDistortionInd[uiLayer][uiFGS][uiTLevel];
  }

  return Err::m_nOK;
}



ErrVal
QualityLevelAssigner::xInitRateValues()
{
  printf( "determine packet sizes ..." );

  Int64             i64StartPos     = 0;
  BinData*          pcBinData       = 0;
  SEI::SEIMessage*  pcScalableSEI   = 0;
  UInt              uiLastPrefixTL  = MSYS_UINT_MAX;
  PacketDescription cPacketDescription;
  UInt              auiFrameNum[MAX_LAYERS] = { MSYS_UINT_MAX, MSYS_UINT_MAX, MSYS_UINT_MAX, MSYS_UINT_MAX, MSYS_UINT_MAX, MSYS_UINT_MAX, MSYS_UINT_MAX, MSYS_UINT_MAX };

  //===== init =====
  RNOK( m_pcH264AVCPacketAnalyzer->init() );
  ReadBitstreamFile* pcReadBitStream = 0;
  RNOK( ReadBitstreamFile::create( pcReadBitStream ) );
  RNOK( pcReadBitStream->init( m_pcParameter->getInputBitStreamName() ) );


  //===== init values ======
  for( UInt uiLayer = 0; uiLayer <  m_uiNumLayers;               uiLayer ++ )
  for( UInt uiFGS   = 0; uiFGS   <= m_auiNumFGSLayers[uiLayer];  uiFGS   ++ )
  for( UInt uiFrame = 0; uiFrame <  m_auiNumFrames   [uiLayer];  uiFrame ++ )
  {
    m_aaauiPacketSize     [uiLayer][uiFGS][uiFrame] = 0;
    if( uiFGS == 0 )
    {
      m_aauiPicNumToFrmID [uiLayer]       [uiFrame] = MSYS_UINT_MAX;
    }
  }

  //===== loop over packets =====
  while( true )
  {
    //----- read packet -----
    Bool bEOS = false;
    RNOK( pcReadBitStream->extractPacket( pcBinData, bEOS ) );
    if( bEOS )
    {
      //manu.mathew@samsung : memory leak fix
      RNOK( pcReadBitStream->releasePacket( pcBinData ) );
      pcBinData = NULL;
      //--
      break;
    }

    //----- get packet description -----
    RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcScalableSEI ) );
    delete pcScalableSEI; pcScalableSEI = 0;

    //----- get packet size -----
    Int64 i64EndPos     = pcReadBitStream->getFilePos();
    UInt  uiPacketSize  = (UInt)( i64EndPos - i64StartPos );
    i64StartPos         = i64EndPos;

    //----- analyse packets -----
    if( ! cPacketDescription.ParameterSet && cPacketDescription.NalUnitType != NAL_UNIT_SEI )
    {
      if( cPacketDescription.NalUnitType == NAL_UNIT_CODED_SLICE_IDR || cPacketDescription.NalUnitType == NAL_UNIT_CODED_SLICE )
      {
        if( uiLastPrefixTL == MSYS_UINT_MAX )
        {
          fprintf( stderr, "\nMissing prefix NAL unit\n\n" );
          ROT(1);
        }
        cPacketDescription.Level = uiLastPrefixTL;
      }
      if( cPacketDescription.NalUnitType == 14 )
      {
        RNOK( pcReadBitStream->releasePacket( pcBinData ) );
        uiLastPrefixTL = cPacketDescription.Level;
        continue;
      }
      else
      {
        uiLastPrefixTL = MSYS_UINT_MAX;
      }

      if( cPacketDescription.FGSLayer == 0 && cPacketDescription.uiFirstMb == 0 )
      {
        auiFrameNum[cPacketDescription.Layer]++;
        {
          Bool  bSet        = false;
          UInt  uiTXLevel   = m_auiNumTempLevel[cPacketDescription.Layer] - cPacketDescription.Level;
          UInt  uiOffset    = ( 1 << uiTXLevel );
          UInt  uiStepSize  = ( uiOffset  << 1 );
          if( cPacketDescription.Level == 0 )
          {
            uiStepSize  = uiOffset;
            uiOffset    = 0;
          }
          for( UInt uiPicNum = uiOffset; uiPicNum < m_auiNumFrames[cPacketDescription.Layer] && !bSet; uiPicNum += uiStepSize )
          {
            if( m_aauiPicNumToFrmID[cPacketDescription.Layer][ uiPicNum ] == MSYS_UINT_MAX )
            {
              m_aauiPicNumToFrmID[cPacketDescription.Layer][ uiPicNum ] = auiFrameNum[cPacketDescription.Layer];
              bSet = true;
            }
          }
          ROF( bSet );
        }
      }
      m_aaauiPacketSize[cPacketDescription.Layer][cPacketDescription.FGSLayer][auiFrameNum[cPacketDescription.Layer]] += uiPacketSize;
    }
    else
    {
      uiLastPrefixTL = MSYS_UINT_MAX;
    }

    //----- delete bin data -----
    RNOK( pcReadBitStream->releasePacket( pcBinData ) );
  }


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

  printf("\n");
  return Err::m_nOK;
}



ErrVal
QualityLevelAssigner::xGetNextValidPacket( BinData*&          rpcBinData,
                                           ReadBitstreamFile* pcReadBitStream,
                                           UInt               uiTopLayer,
                                           UInt               uiLayer,
                                           UInt               uiFGSLayer,
                                           UInt               uiLevel,
                                           Bool               bIndependent,
                                           Bool&              rbEOS,
                                           UInt*              auiFrameNum )
{
  Bool              bValid          = false;
  SEI::SEIMessage*  pcScalableSEI   = 0;
  static UInt       uiLastPrefixTL  = MSYS_UINT_MAX;
  PacketDescription cPacketDescription;

  while( !bValid )
  {
    //===== get next packet =====
    RNOK( pcReadBitStream->extractPacket( rpcBinData, rbEOS ) );
    if( rbEOS )
    {
      break;
    }

    //===== analyze packet =====
    RNOK( m_pcH264AVCPacketAnalyzer->process( rpcBinData, cPacketDescription, pcScalableSEI ) );
    delete pcScalableSEI; pcScalableSEI = 0;


    //===== check whether packet is required =====
    if( cPacketDescription.NalUnitType == NAL_UNIT_SEI )
    {
      uiLastPrefixTL  = MSYS_UINT_MAX;
      bValid          = true;
    }
		else if( cPacketDescription.NalUnitType == NAL_UNIT_SPS )
    {
      uiLastPrefixTL  = MSYS_UINT_MAX;
      bValid          = false;
      for( UInt ui = 0; ui <= uiTopLayer; ui++ )
      {
        if( m_auiSPSRequired[cPacketDescription.SPSid] & (1<<ui) )
        {
          bValid  = true;
          break;
        }
      }
    }
    else if( cPacketDescription.NalUnitType == NAL_UNIT_SUBSET_SPS )
    {
      uiLastPrefixTL  = MSYS_UINT_MAX;
      bValid          = false;
      for( UInt ui = 0; ui <= uiTopLayer; ui++ )
      {
        if( m_auiSubsetSPSRequired[cPacketDescription.SPSid] & (1<<ui) )
        {
          bValid  = true;
          break;
        }
      }
    }
    else if( cPacketDescription.NalUnitType == NAL_UNIT_PPS )
    {
      uiLastPrefixTL  = MSYS_UINT_MAX;
      bValid          = false;
      for( UInt ui = 0; ui <= uiTopLayer; ui++ )
      {
        if( m_auiPPSRequired[cPacketDescription.PPSid] & (1<<ui) )
        {
          bValid  = true;
          break;
        }
      }
    }
    else // slice data
    {
      if( cPacketDescription.NalUnitType == NAL_UNIT_CODED_SLICE_IDR || cPacketDescription.NalUnitType == NAL_UNIT_CODED_SLICE )
      {
        if( uiLastPrefixTL == MSYS_UINT_MAX )
        {
          fprintf( stderr, "\nMissing prefix NAL unit\n\n" );
          ROT(1);
        }
        cPacketDescription.Level = uiLastPrefixTL;
      }
      if( cPacketDescription.NalUnitType == 14 )
      {
        uiLastPrefixTL  = cPacketDescription.Level;
        bValid          = true;
        continue;
      }
      else
      {
        uiLastPrefixTL  = MSYS_UINT_MAX;
      }
      //===== update frame num =====
      if( ! cPacketDescription.FGSLayer && cPacketDescription.uiFirstMb == 0 )
      {
        auiFrameNum[cPacketDescription.Layer]++;
      }

      //===== get valid status =====
      //JVT-S043
      //For cPacketDescription.Layer > uiLayer,  only Base Quality Level(Discrete layer) is selected!
      //For cPacketDescription.Layer <= uiLayer, the algorithm selects the required FGS layers and Temporal Levels.
      //--
      if( bIndependent )
      {
        bValid      = ( cPacketDescription.Layer    <= uiLayer
                      //JVT-S043
                      || ( cPacketDescription.Layer  <= uiTopLayer && cPacketDescription.FGSLayer == 0 )
                      );
        if( cPacketDescription.Layer == uiLayer )
        {
          bValid    = ( cPacketDescription.Level    == uiLevel &&
                        cPacketDescription.FGSLayer <= uiFGSLayer ) || ( cPacketDescription.FGSLayer == 0 );
        }
      }
      else
      {
        bValid      = ( cPacketDescription.Layer <= uiLayer
                      //JVT-S043
                      || ( cPacketDescription.Layer  <= uiTopLayer && cPacketDescription.FGSLayer == 0 )
                      );
        if( cPacketDescription.Layer == uiLayer )
        {
          bValid    = ( cPacketDescription.FGSLayer <= uiFGSLayer );
          if( cPacketDescription.FGSLayer == uiFGSLayer )
          {
            bValid  = ( cPacketDescription.Level <= uiLevel );
          }
        }
      }

    }

    if( !bValid )
    {
      RNOK( pcReadBitStream->releasePacket( rpcBinData ) );
    }
  }

  return Err::m_nOK;
}

ErrVal
QualityLevelAssigner::xGetDistortion( UInt&         ruiDistortion,
                                      const UChar*  pucReconstruction,
                                      const UChar*  pucReference,
                                      UInt          uiHeight,
                                      UInt          uiWidth,
                                      UInt          uiStride )
{
  ruiDistortion = 0;
  for( UInt y = 0; y < uiHeight; y++ )
  {
    for( UInt x = 0; x < uiWidth; x++ )
    {
      Int iDiff      = ( pucReconstruction[x] - pucReference[x] );
      ruiDistortion += (UInt)( iDiff * iDiff );
    }
    pucReconstruction += uiStride;
    pucReference      += uiStride;
  }
  return Err::m_nOK;
}





ErrVal
QualityLevelAssigner::xInitDistortion( UInt*  auiDistortion,
                                       UInt   uiTopLayer,
                                       UInt   uiLayer,
                                       UInt   uiFGSLayer,
                                       UInt   uiLevel,
                                       Bool   bIndependent )
{
  ROT( m_pcParameter->getOriginalFileName( uiTopLayer ).empty() );

  if( uiLevel == MSYS_UINT_MAX )
    printf( "determine distortion (layer %d - FGS %d - base layer  ) ...", uiLayer, uiFGSLayer );
  else
    printf( "determine distortion (layer %d - FGS %d - lev%2d - %s ) ...", uiLayer, uiFGSLayer, uiLevel, bIndependent?"ind":"dep" );

⌨️ 快捷键说明

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