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

📄 scalableseimodifycode.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  // size
  {
    UInt uiTemp = uiSize;
    UInt uiByte = 0xFF;

    while( 0xFF == uiByte )
    {
      uiByte  = (0xFF > uiTemp) ? uiTemp : 0xff;
      uiTemp -= 0xFF;
      RNOK( WriteCode( uiByte, 8 ) );
    }
  }
  return Err::m_nOK;
}

ErrVal
ScalableSEIModifyCode::WriteAlignZero()
{
  return Write( 0, m_iValidBits & 0x7 );
}

ErrVal
ScalableSEIModifyCode::WriteTrailingBits()
{
  RNOK( WriteFlag( 1 ) );
  RNOK( WriteAlignZero() );
  return Err::m_nOK;
}

ErrVal
ScalableSEIModifyCode::flushBuffer()
{
  *m_pulStreamPacket = xSwap( m_ulCurrentBits );

  m_uiBitsWritten = (m_uiBitsWritten+7)/8;

  m_uiBitsWritten *= 8;

  return Err::m_nOK;
}

ErrVal
ScalableSEIModifyCode::ConvertRBSPToPayload( UChar* m_pucBuffer,
                                         UChar pulStreamPacket[],
                                      UInt& ruiBytesWritten,
                                      UInt  uiHeaderBytes )
{
  UInt uiZeroCount    = 0;
  UInt uiReadOffset   = uiHeaderBytes;
  UInt uiWriteOffset  = uiHeaderBytes;

  //===== NAL unit header =====
  for( UInt uiIndex = 0; uiIndex < uiHeaderBytes; uiIndex++ )
  {
    m_pucBuffer[uiIndex] = (UChar)pulStreamPacket[uiIndex];
  }

  //===== NAL unit payload =====
  for( ; uiReadOffset < ruiBytesWritten ; uiReadOffset++, uiWriteOffset++ )
  {
    if( 2 == uiZeroCount && 0 == ( pulStreamPacket[uiReadOffset] & 0xfc ) )
    {
      uiZeroCount                   = 0;
      m_pucBuffer[uiWriteOffset++]  = 0x03;
    }

    m_pucBuffer[uiWriteOffset] = (UChar)pulStreamPacket[uiReadOffset];

    if( 0 == pulStreamPacket[uiReadOffset] )
    {
      uiZeroCount++;
    }
    else
    {
      uiZeroCount = 0;
    }
  }
  if( ( 0x00 == m_pucBuffer[uiWriteOffset-1] ) && ( 0x00 == m_pucBuffer[uiWriteOffset-2] ) )
  {
    m_pucBuffer[uiWriteOffset++] = 0x03;
  }
  ruiBytesWritten = uiWriteOffset;

  return Err::m_nOK;
}




ErrVal
ScalableSEIModifyCode::SEICode( h264::SEI::ScalableSei* pcScalableSei, ScalableSEIModifyCode *pcScalableModifyCode )
{
  // JVT-U085 LMI
  pcScalableModifyCode->WriteFlag( pcScalableSei->getTlevelNestingFlag() );
  UInt uiNumScalableLayersMinus1 = pcScalableSei->getNumLayersMinus1();
  pcScalableModifyCode->WriteUVLC( uiNumScalableLayersMinus1 );
  for( UInt uiLayer = 0; uiLayer <= uiNumScalableLayersMinus1; uiLayer++ )
  {
    pcScalableModifyCode->WriteCode( pcScalableSei->getLayerId( uiLayer ), 8 );
//JVT-S036 lsj start
    pcScalableModifyCode->WriteCode( pcScalableSei->getSimplePriorityId( uiLayer ), 6 );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getDiscardableFlag( uiLayer ) );
    pcScalableModifyCode->WriteCode( pcScalableSei->getTemporalLevel( uiLayer ), 3 );
    pcScalableModifyCode->WriteCode( pcScalableSei->getDependencyId( uiLayer ), 3 );
    pcScalableModifyCode->WriteCode( pcScalableSei->getQualityLevel( uiLayer ), 2 );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getSubPicLayerFlag( uiLayer ) );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getSubRegionLayerFlag( uiLayer ) );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getIroiSliceDivisionInfoPresentFlag ( uiLayer ) );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getProfileLevelInfoPresentFlag( uiLayer ) );
//JVT-S036 lsj end
    pcScalableModifyCode->WriteFlag( pcScalableSei->getBitrateInfoPresentFlag( uiLayer ) );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getFrmRateInfoPresentFlag( uiLayer ) );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getFrmSizeInfoPresentFlag( uiLayer ) );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getLayerDependencyInfoPresentFlag( uiLayer ) );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getInitParameterSetsInfoPresentFlag( uiLayer ) );
    pcScalableModifyCode->WriteFlag( pcScalableSei->getExactInterlayerPredFlag( uiLayer ) ); //JVT-S036 lsj

    if( pcScalableSei->getProfileLevelInfoPresentFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteCode( pcScalableSei->getLayerProfileIdc( uiLayer ), 8 );
      pcScalableModifyCode->WriteFlag( pcScalableSei->getLayerConstraintSet0Flag( uiLayer ) );
      pcScalableModifyCode->WriteFlag( pcScalableSei->getLayerConstraintSet1Flag( uiLayer ) );
      pcScalableModifyCode->WriteFlag( pcScalableSei->getLayerConstraintSet2Flag( uiLayer ) );
      pcScalableModifyCode->WriteFlag( pcScalableSei->getLayerConstraintSet3Flag( uiLayer ) );
      pcScalableModifyCode->WriteCode( 0, 4 );
      pcScalableModifyCode->WriteCode( pcScalableSei->getLayerLevelIdc( uiLayer ), 8 );
    }
    else
    {//JVT-S036 lsj
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getProfileLevelInfoSrcLayerIdDelta( uiLayer ) );
    }

  // JVT-S036 lsj delete
    if( pcScalableSei->getBitrateInfoPresentFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteCode( pcScalableSei->getAvgBitrate( uiLayer ), 16 );
    //JVT-S036 lsj start
      pcScalableModifyCode->WriteCode( pcScalableSei->getMaxBitrateLayer( uiLayer ), 16 );
      pcScalableModifyCode->WriteCode( pcScalableSei->getMaxBitrateDecodedPicture( uiLayer ), 16 );
      pcScalableModifyCode->WriteCode( pcScalableSei->getMaxBitrateCalcWindow( uiLayer ), 16 );
    //JVT-S036 lsj end
    }

    if( pcScalableSei->getFrmRateInfoPresentFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteCode( pcScalableSei->getConstantFrmRateIdc( uiLayer ), 2 );
      pcScalableModifyCode->WriteCode( pcScalableSei->getAvgFrmRate( uiLayer ), 16 );
    }
    else
    {//JVT-S036 lsj
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getFrmRateInfoSrcLayerIdDelta( uiLayer ) );
    }

    if( pcScalableSei->getFrmSizeInfoPresentFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getFrmWidthInMbsMinus1( uiLayer ) );
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getFrmHeightInMbsMinus1( uiLayer ) );
    }
    else
    {//JVT-S036 lsj
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getFrmSizeInfoSrcLayerIdDelta( uiLayer ) );
    }

    if( pcScalableSei->getSubRegionLayerFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteCode( pcScalableSei->getBaseRegionLayerId( uiLayer ), 8 );
      pcScalableModifyCode->WriteFlag( pcScalableSei->getDynamicRectFlag( uiLayer ) );
      if( pcScalableSei->getDynamicRectFlag( uiLayer ) )
      {
        pcScalableModifyCode->WriteCode( pcScalableSei->getHorizontalOffset( uiLayer ), 16 );
        pcScalableModifyCode->WriteCode( pcScalableSei->getVerticalOffset( uiLayer ), 16 );
        pcScalableModifyCode->WriteCode( pcScalableSei->getRegionWidth( uiLayer ), 16 );
        pcScalableModifyCode->WriteCode( pcScalableSei->getRegionHeight( uiLayer ), 16 );
      }
    }
    else
    {//JVT-S036 lsj
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getSubRegionInfoSrcLayerIdDelta( uiLayer ) );
    }

  //JVT-S036 lsj start
    if( pcScalableSei->getSubPicLayerFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteCode( pcScalableSei->getRoiId( uiLayer ), 3 );
    }
    if( pcScalableSei->getIroiSliceDivisionInfoPresentFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteCode( pcScalableSei->getIroiSliceDivisionType( uiLayer ) , 2 );
      if( pcScalableSei->getIroiSliceDivisionType(uiLayer) == 0 )
      {
        pcScalableModifyCode->WriteUVLC( pcScalableSei->getGridSliceWidthInMbsMinus1( uiLayer ) );
        pcScalableModifyCode->WriteUVLC( pcScalableSei->getGridSliceHeightInMbsMinus1( uiLayer ) );
      }
      else if( pcScalableSei->getIroiSliceDivisionType(uiLayer) == 1 )
      {
        pcScalableModifyCode->WriteUVLC( pcScalableSei->getNumSliceMinus1( uiLayer ) );
        for (UInt nslice = 0; nslice <= pcScalableSei->getNumSliceMinus1( uiLayer ) ; nslice ++ )
        {
          pcScalableModifyCode->WriteUVLC( pcScalableSei->getFirstMbInSlice( uiLayer, nslice ) );
          pcScalableModifyCode->WriteUVLC( pcScalableSei->getSliceWidthInMbsMinus1( uiLayer, nslice ) );
          pcScalableModifyCode->WriteUVLC( pcScalableSei->getSliceHeightInMbsMinus1( uiLayer, nslice ) );
        }
      }
      else if( pcScalableSei->getIroiSliceDivisionType(uiLayer) == 2 )
      {
        // JVT-S054 (REPLACE) ->
        pcScalableModifyCode->WriteUVLC( pcScalableSei->getNumSliceMinus1( uiLayer ) );
        UInt uiFrameHeightInMb = pcScalableSei->getFrmHeightInMbsMinus1( uiLayer ) + 1;
        UInt uiFrameWidthInMb  = pcScalableSei->getFrmWidthInMbsMinus1( uiLayer ) + 1;
        UInt uiPicSizeInMbs = uiFrameHeightInMb * uiFrameWidthInMb;
        UInt uiWriteBits = ( UInt) ceil( log((Double)(pcScalableSei->getNumSliceMinus1( uiLayer ) + 1) ) / log(2.) );
        if (uiWriteBits == 0)
          uiWriteBits = 1;
        for( UInt j = 0; j < uiPicSizeInMbs; j++ )
        {
          pcScalableModifyCode->WriteCode( pcScalableSei->getSliceId( uiLayer, j ), uiWriteBits );
        }
        // JVT-S054 (REPLACE) <-
      }
    }
  //JVT-S036 lsj end

    if( pcScalableSei->getLayerDependencyInfoPresentFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getNumDirectlyDependentLayers( uiLayer ) );
      for( UInt ui = 0; ui < pcScalableSei->getNumDirectlyDependentLayers( uiLayer ); ui++ )
      {
        pcScalableModifyCode->WriteUVLC( pcScalableSei->getNumDirectlyDependentLayerIdDeltaMinus1(uiLayer, ui ) ); //JVT-S036 lsj
      }
    }
    else
    {//JVT-S036 lsj
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getLayerDependencyInfoSrcLayerIdDelta( uiLayer ) );
    }

    if( pcScalableSei->getInitParameterSetsInfoPresentFlag( uiLayer ) )
    {
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getNumInitSPSMinus1( uiLayer ) );
      UInt ui;
      for( ui = 0; ui <= pcScalableSei->getNumInitSPSMinus1( uiLayer ); ui++ )
      {
        pcScalableModifyCode->WriteUVLC( pcScalableSei->getInitSPSIdDelta( uiLayer, ui ) );
      //
      }
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getNumInitPPSMinus1( uiLayer ) );
      for( ui = 0; ui <= pcScalableSei->getNumInitPPSMinus1( uiLayer ); ui++ )
      {
        pcScalableModifyCode->WriteUVLC( pcScalableSei->getInitPPSIdDelta( uiLayer, ui ) );
      }
    }
    else
    {//JVT-S036 lsj
      pcScalableModifyCode->WriteUVLC( pcScalableSei->getInitParameterSetsInfoSrcLayerIdDelta( uiLayer ) );
    }

  }// for

  return Err::m_nOK;
}

//JVT-S080 LMI {
ErrVal
ScalableSEIModifyCode::SEICode( h264::SEI::ScalableSeiLayersNotPresent* pcScalableSeiLayersNotPresent, ScalableSEIModifyCode *pcScalableModifyCode )
{
  UInt uiNumScalableLayers = pcScalableSeiLayersNotPresent->getNumLayers();
  UInt uiLayer;
  pcScalableModifyCode->WriteUVLC( uiNumScalableLayers );
  for( uiLayer = 0; uiLayer < uiNumScalableLayers; uiLayer++ )
  {
    pcScalableModifyCode->WriteCode( pcScalableSeiLayersNotPresent->getLayerId( uiLayer ), 8);
  }
  return Err::m_nOK;
}

ErrVal
ScalableSEIModifyCode::SEICode  ( h264::SEI::ScalableSeiDependencyChange* pcScalableSeiDependencyChange, ScalableSEIModifyCode *pcScalableModifyCode )
{
  UInt uiNumScalableLayersMinus1 = pcScalableSeiDependencyChange->getNumLayersMinus1();
     UInt uiLayer, uiDirectLayer;
  pcScalableModifyCode->WriteUVLC( uiNumScalableLayersMinus1 );
  for( uiLayer = 0; uiLayer <= uiNumScalableLayersMinus1; uiLayer++ )
  {
    pcScalableModifyCode->WriteCode( pcScalableSeiDependencyChange->getLayerId( uiLayer ), 8);
    pcScalableModifyCode->WriteFlag( pcScalableSeiDependencyChange->getLayerDependencyInfoPresentFlag( uiLayer ) );
    if ( pcScalableSeiDependencyChange->getLayerDependencyInfoPresentFlag( uiLayer ) )
    {
          pcScalableModifyCode->WriteUVLC( pcScalableSeiDependencyChange->getNumDirectDependentLayers( uiLayer ) );
      for ( uiDirectLayer = 0; uiDirectLayer < pcScalableSeiDependencyChange->getNumDirectDependentLayers( uiLayer ); uiDirectLayer++)
              pcScalableModifyCode->WriteUVLC(pcScalableSeiDependencyChange->getDirectDependentLayerIdDeltaMinus1( uiLayer, uiDirectLayer ));
    }
    else
             pcScalableModifyCode->WriteUVLC(pcScalableSeiDependencyChange->getLayerDependencyInfoSrcLayerIdDeltaMinus1( uiLayer ) );
  }
  return Err::m_nOK;
}
//JVT-S080 LMI }

⌨️ 快捷键说明

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