📄 mvcscalablemodifycode.cpp
字号:
ErrVal
MVCScalableModifyCode::Write( UInt uiBits, UInt uiNumberOfBits )
{
m_uiBitsWritten += uiNumberOfBits;
if( (Int)uiNumberOfBits < m_iValidBits) // one word
{
m_iValidBits -= uiNumberOfBits;
m_ulCurrentBits |= uiBits << m_iValidBits;
return Err::m_nOK;
}
ROT( 0 == m_uiDWordsLeft );
m_uiDWordsLeft--;
UInt uiShift = uiNumberOfBits - m_iValidBits;
// add the last bits
m_ulCurrentBits |= uiBits >> uiShift;
*m_pulStreamPacket++ = xSwap( m_ulCurrentBits );
// note: there is a problem with left shift with 32
m_iValidBits = 32 - uiShift;
m_ulCurrentBits = uiBits << m_iValidBits;
if( 0 == uiShift )
{
m_ulCurrentBits = 0;
}
return Err::m_nOK;
}
ErrVal
MVCScalableModifyCode::WritePayloadHeader( enum h264::SEI::MessageType eType, UInt uiSize )
{
//type
{
UInt uiTemp = eType;
UInt uiByte = 0xFF;
while( 0xFF == uiByte )
{
uiByte = (0xFF > uiTemp) ? uiTemp : 0xff;
uiTemp -= 0xFF;
RNOK( WriteCode( uiByte, 8 ) );
}
}
// 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
MVCScalableModifyCode::WriteAlignZero()
{
return Write( 0, m_iValidBits & 0x7 );
}
ErrVal
MVCScalableModifyCode::WriteTrailingBits()
{
RNOK( WriteFlag( 1 ) );
RNOK( WriteAlignZero() );
return Err::m_nOK;
}
ErrVal
MVCScalableModifyCode::flushBuffer()
{
*m_pulStreamPacket = xSwap( m_ulCurrentBits );
m_uiBitsWritten = (m_uiBitsWritten+7)/8;
m_uiBitsWritten *= 8;
return Err::m_nOK;
}
ErrVal
MVCScalableModifyCode::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
MVCScalableModifyCode::SEICode( h264::SEI::ViewScalabilityInfoSei* pcViewScalInfoSei, MVCScalableModifyCode *pcScalableModifyCode )
{
UInt uiNumOperationPointsMinus1 = pcViewScalInfoSei->getNumOperationPointsMinus1();
pcScalableModifyCode->WriteUVLC( uiNumOperationPointsMinus1 );
for( UInt uiOpId = 0; uiOpId <= uiNumOperationPointsMinus1; uiOpId++ )
{
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getOperationPointId( uiOpId ) );
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getPriorityId( uiOpId ), 5 );
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getTemporalId( uiOpId ), 3 );
UInt uiNumActiveViewsMinus1 = pcViewScalInfoSei->getNumActiveViewsMinus1( uiOpId );
pcScalableModifyCode->WriteUVLC( uiNumActiveViewsMinus1 );
for( UInt j = 0; j <= uiNumActiveViewsMinus1; j++ )
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getViewId( uiOpId, j ) );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getProfileLevelInfoPresentFlag( uiOpId ) );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getBitRateInfoPresentFlag( uiOpId ) );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getFrmRateInfoPresentFlag( uiOpId ) );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpDependencyInfoPresentFlag( uiOpId ) );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getInitParameterSetsInfoPresentFlag( uiOpId ) );
if( pcViewScalInfoSei->getProfileLevelInfoPresentFlag( uiOpId ) )
{
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getOpProfileIdc( uiOpId ), 8 );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpConstraintSet0Flag( uiOpId ) );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpConstraintSet1Flag( uiOpId ) );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpConstraintSet2Flag( uiOpId ) );
pcScalableModifyCode->WriteFlag( pcViewScalInfoSei->getOpConstraintSet3Flag( uiOpId ) );
pcScalableModifyCode->WriteCode( 0, 4 );
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getOpLevelIdc( uiOpId ), 8 );
}
else
{
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getProfileLevelInfoSrcOpIdDelta( uiOpId ) );
}
if( pcViewScalInfoSei->getBitRateInfoPresentFlag( uiOpId ) )
{
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getAvgBitrate( uiOpId ), 16 );
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getMaxBitrate( uiOpId ), 16 );
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getMaxBitrateCalcWindow( uiOpId ), 16 );
}
if( pcViewScalInfoSei->getFrmRateInfoPresentFlag( uiOpId ) )
{
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getConstantFrmRateIdc( uiOpId ), 2 );
pcScalableModifyCode->WriteCode( pcViewScalInfoSei->getAvgFrmRate( uiOpId ), 16 );
}
else
{
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getFrmRateInfoSrcOpIdDela( uiOpId ) );
}
if( pcViewScalInfoSei->getOpDependencyInfoPresentFlag( uiOpId ) )
{
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getNumDirectlyDependentOps( uiOpId ) );
for( UInt j = 0; j < pcViewScalInfoSei->getNumDirectlyDependentOps( uiOpId ); j++ )
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getDirectlyDependentOpIdDeltaMinus1( uiOpId, j ) );
}
else
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getOpDependencyInfoSrcOpIdDelta( uiOpId ) );
if( pcViewScalInfoSei->getInitParameterSetsInfoPresentFlag( uiOpId ) )
{
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getNumInitSeqParameterSetMinus1( uiOpId ) );
for( UInt j = 0; j <= pcViewScalInfoSei->getNumInitSeqParameterSetMinus1( uiOpId ); j++ )
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getInitSeqParameterSetIdDelta( uiOpId, j ) );
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getNumInitPicParameterSetMinus1( uiOpId ) );
for( UInt j = 0; j <= pcViewScalInfoSei->getNumInitPicParameterSetMinus1( uiOpId ); j++ )
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getInitPicParameterSetIdDelta( uiOpId, j ) );
}
else
pcScalableModifyCode->WriteUVLC( pcViewScalInfoSei->getInitParameterSetsInfoSrcOpIdDelta( uiOpId ) );
}// for
return Err::m_nOK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -