📄 scalablemodifycode.cpp
字号:
return Err::m_nOK;
}
ErrVal
ScalableModifyCode::flushBuffer()
{
*m_pulStreamPacket = xSwap( m_ulCurrentBits );
m_uiBitsWritten = (m_uiBitsWritten+7)/8;
m_uiBitsWritten *= 8;
return Err::m_nOK;
}
ErrVal
ScalableModifyCode::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
ScalableModifyCode::SEICode( h264::SEI::ScalableSei* pcScalableSei, ScalableModifyCode *pcScalableModifyCode )
{
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->WriteFlag( pcScalableSei->getFGSLayerFlag( uiLayer ) );
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 ) );
}
/* if( pcScalableSei->getDecodingDependencyInfoPresentFlag( uiLayer ) )
{
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 );
}
JVT-S036 lsj*/
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;
for( UInt j = 0; j < uiPicSizeInMbs; j++ )
{
pcScalableModifyCode->WriteUVLC( pcScalableSei->getSliceId( uiLayer, j ) );
}
*/
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++ )
{
//BUG_FIX liuhui 0603
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++ )
{
//BUG_FIX liuhui 0603
pcScalableModifyCode->WriteUVLC( pcScalableSei->getInitSPSIdDelta( uiLayer, ui ) );
//
}
pcScalableModifyCode->WriteUVLC( pcScalableSei->getNumInitPPSMinus1( uiLayer ) );
for( ui = 0; ui <= pcScalableSei->getNumInitPPSMinus1( uiLayer ); ui++ )
{
//BUG_FIX liuhui 0603
pcScalableModifyCode->WriteUVLC( pcScalableSei->getInitPPSIdDelta( uiLayer, ui ) );
//
}
}
else
{//JVT-S036 lsj
pcScalableModifyCode->WriteUVLC( pcScalableSei->getInitParameterSetsInfoSrcLayerIdDelta( uiLayer ) );
}
}// for
return Err::m_nOK;
}
//ErrVal
//ScalableModifyCode::Create( ScalableModifyCode* pcScalableModifyCode )
//{
// pcScalableModifyCode = new ScalableModifyCode;
//
// ROT( pcScalableModifyCode == NULL );
//
// return Err::m_nOK;
//}
//JVT-S080 LMI {
ErrVal
ScalableModifyCode::SEICode( h264::SEI::ScalableSeiLayersNotPresent* pcScalableSeiLayersNotPresent, ScalableModifyCode *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
ScalableModifyCode::SEICode ( h264::SEI::ScalableSeiDependencyChange* pcScalableSeiDependencyChange, ScalableModifyCode *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 + -