📄 sequencestructure.cpp
字号:
ErrVal
FormattedStringParser::separatString( const String& rcString,
String& rcFDString,
String& rcMmcoString,
String& rcRplrStringL0,
String& rcRplrStringL1 )
{
UInt uiMPos = rcString.find_first_of( "M" );
UInt uiR1Pos = rcString.find_first_of( "R" );
UInt uiR2Pos = rcString.find_last_of ( "R" );
UInt uiSize = rcString.size();
if( String::npos == uiMPos ) // MMCO commands are not present
{
rcMmcoString = "";
if( String::npos == uiR1Pos )
{
rcFDString = rcString;
rcRplrStringL0 = "";
rcRplrStringL1 = "";
}
else
{
rcFDString = rcString.substr( 0, uiR1Pos );
if( uiR1Pos == uiR2Pos )
{
rcRplrStringL0 = rcString.substr( uiR1Pos, uiSize - uiR1Pos );
rcRplrStringL1 = "";
}
else
{
rcRplrStringL0 = rcString.substr( uiR1Pos, uiR2Pos - uiR1Pos );
rcRplrStringL1 = rcString.substr( uiR2Pos, uiSize - uiR2Pos );
}
}
}
else
{
if( String::npos == uiR1Pos )
{
rcFDString = rcString.substr( 0, uiMPos );
rcMmcoString = rcString.substr( uiMPos, uiSize - uiMPos );
rcRplrStringL0 = "";
rcRplrStringL1 = "";
}
else
{
if( uiMPos < uiR1Pos )
{
rcFDString = rcString.substr( 0, uiMPos );
rcMmcoString = rcString.substr( uiMPos, uiR1Pos - uiMPos );
if( uiR1Pos == uiR2Pos )
{
rcRplrStringL0 = rcString.substr( uiR1Pos, uiSize - uiR1Pos );
rcRplrStringL1 = "";
}
else
{
rcRplrStringL0 = rcString.substr( uiR1Pos, uiR2Pos - uiR1Pos );
rcRplrStringL1 = rcString.substr( uiR2Pos, uiSize - uiR2Pos );
}
}
else
{
rcFDString = rcString.substr( 0, uiR1Pos );
if( uiR1Pos == uiR2Pos )
{
rcRplrStringL0 = rcString.substr( uiR1Pos, uiMPos - uiR1Pos );
rcRplrStringL1 = "";
rcMmcoString = rcString.substr( uiMPos, uiSize - uiMPos );
}
else
{
if( uiMPos < uiR2Pos )
{
rcRplrStringL0 = rcString.substr( uiR1Pos, uiMPos - uiR1Pos );
rcMmcoString = rcString.substr( uiMPos, uiR2Pos - uiMPos );
rcRplrStringL1 = rcString.substr( uiR2Pos, uiSize - uiR2Pos );
}
else
{
rcRplrStringL0 = rcString.substr( uiR1Pos, uiR2Pos - uiR1Pos );
rcRplrStringL1 = rcString.substr( uiR2Pos, uiMPos - uiR2Pos );
rcMmcoString = rcString.substr( uiMPos, uiSize - uiMPos );
}
}
}
}
}
if( rcRplrStringL0.size() == 1 )
{
rcRplrStringL0 = "";
}
if( rcRplrStringL1.size() == 1 )
{
rcRplrStringL1 = "";
}
return Err::m_nOK;
}
ErrVal
FormattedStringParser::extractFrameDescription( const String& rcString,
UChar& rucType,
UInt& ruiIncrement,
Bool& rbKeyPicture,
UInt& ruiLayer)
{
UInt uiKeyPos = rcString.find_first_of( "K" );
UInt uiLayerPos = rcString.find_first_of( "L" );
String cKeyString;
String cLayerString;
String cFrameString;
//===== separate strings =====
if( uiLayerPos == String::npos )
{
if( uiKeyPos == String::npos )
{
cFrameString = rcString;
cKeyString = "";
cLayerString = "";
}
else
{
cFrameString = rcString.substr( 0, uiKeyPos );
cKeyString = rcString.substr( uiKeyPos, rcString.size() - uiKeyPos );
cLayerString = "";
}
}
else if( uiKeyPos == String::npos )
{
cFrameString = rcString.substr( 0, uiLayerPos );
cLayerString = rcString.substr( uiLayerPos, rcString.size() - uiLayerPos );
cKeyString = "";
}
else if( uiKeyPos < uiLayerPos )
{
cFrameString = rcString.substr( 0, uiKeyPos );
cKeyString = rcString.substr( uiKeyPos, uiLayerPos - uiKeyPos );
cLayerString = rcString.substr( uiLayerPos, rcString.size() - uiLayerPos );
}
else
{
cFrameString = rcString.substr( 0, uiLayerPos );
cLayerString = rcString.substr( uiLayerPos, uiKeyPos - uiLayerPos );
cKeyString = rcString.substr( uiKeyPos, rcString.size() - uiKeyPos );
}
//===== check frame string =====
ROFS ( cFrameString.find_first_of ( sm_cSetOfTypes ) == 0 ); // first character must be a type
ROFS ( cFrameString.find_first_of ( sm_cSetOfDigits ) == 1 ); // second character must be a digit
ROFS ( cFrameString.find_last_not_of( sm_cSetOfDigits ) == 0 ); // all other characters must be digits
//===== check layer string =====
if( ! cLayerString.empty() )
{
ROFS( cLayerString.find_first_of ( sm_cSetOfDigits ) == 1 ); // second character must be a digit
ROFS( cLayerString.find_last_not_of( sm_cSetOfDigits ) == 0 ); // all other characters must be digits
}
//===== check key string =====
if( ! cKeyString.empty() )
{
ROFS( cKeyString.size() == 1 ); // single character string
}
//===== assign parameters =====
rucType = cFrameString[0];
ruiIncrement = atoi( cFrameString.c_str() + 1 );
rbKeyPicture = ( ! cKeyString.empty() );
ruiLayer = ( cLayerString.empty() ? 0 : atoi( cLayerString.c_str() + 1 ) );
return Err::m_nOK;
}
ErrVal
FormattedStringParser::extractRplr( const String& rcString,
RplrBuffer& rcRplrBuf)
{
//--- check if string is correct ---
ROFS( rcString.find_first_of( "R" ) == 0 );
UInt uiSize = rcString.size();
UInt uiNext = 0;
for( UInt nBuf = 0, nPos = 1; nPos < uiSize; nPos = uiNext, nBuf++ )
{
uiNext = min( (UInt)rcString.find_first_of ( "L+-", nPos +1 ), uiSize);
String cString = rcString.substr ( nPos, uiNext-nPos );
RNOK( extractSingleRplrCommand( cString, rcRplrBuf.get( nBuf ) ) );
}
return Err::m_nOK;
}
ErrVal
FormattedStringParser::extractMmco( const String& rcString,
MmcoBuffer& rcMmcoBuf )
{
//--- check if string is correct ---
ROFS( rcString.find_first_of ( "M" ) == 0 );
UInt uiSize = rcString.size();
UInt uiNext = 0;
for( UInt nBuf = 0, nPos = 1; nPos < uiSize; nPos = uiNext, nBuf++ )
{
uiNext = min( (UInt) rcString.find_first_of( "LNE", nPos +1 ), uiSize);
String cString = rcString.substr ( nPos, uiNext-nPos );
RNOK( extractSingleMmcoCommand( cString, rcMmcoBuf.get( nBuf ) ) );
}
return Err::m_nOK;
}
ErrVal
FormattedStringParser::extractSingleRplrCommand( const String& rcString,
Rplr& rcRplr )
{
//--- check if string is correct ---
ROFS( rcString.find_first_of ( "L+-" ) == 0 );
Char cCommand = rcString[0];
ROFS( 1 == rcString.find_first_of ( sm_cSetOfDigits ) );
ROFS( 0 == rcString.find_last_not_of( sm_cSetOfDigits ) );
UInt uiNum = atoi( rcString.c_str() + 1 );
if( cCommand == 'L' )
{
rcRplr = Rplr( RPLR_LONG, uiNum );
return Err::m_nOK;
}
else if( cCommand == '+' )
{
rcRplr = Rplr( RPLR_POS, uiNum );
return Err::m_nOK;
}
else if( cCommand == '-' )
{
rcRplr = Rplr( RPLR_NEG, uiNum );
return Err::m_nOK;
}
AF();
return Err::m_nERR;
}
ErrVal
FormattedStringParser::extractSingleMmcoCommand( const String& rcString,
Mmco& rcMmco )
{
//--- check if string is correct ---
ROFS( rcString.find_first_of( "LNE" ) == 0 );
UInt uiSize = rcString.size();
Char cCommand1 = rcString[0];
if( cCommand1 == 'L' )
{
UInt uiEnd = rcString.find_first_of( "+-$:" );
ROTS( uiEnd == String::npos );
String cString = rcString.substr( 1, uiEnd-1 );
ROTS( 0 != cString.find_first_of ( sm_cSetOfDigits ) );
ROTS( String::npos != cString.find_last_not_of( sm_cSetOfDigits ) );
UInt uiLtId = atoi( cString.c_str() );
Char cCommand2 = rcString[uiEnd];
if( cCommand2 == '+' )
{
rcMmco = Mmco( MMCO_SET_LONG_TERM, uiLtId );
return Err::m_nOK;
}
else if( cCommand2 == '-' )
{
rcMmco = Mmco( MMCO_LONG_TERM_UNUSED, uiLtId );
return Err::m_nOK;
}
else if( cCommand2 == '$' )
{
rcMmco = Mmco( MMCO_MAX_LONG_TERM_IDX, uiLtId );
return Err::m_nOK;
}
else if( cCommand2 == ':' )
{
String cString2 = rcString.substr( uiEnd+1, uiSize );
ROTS( 0 != cString2.find_first_of ( sm_cSetOfDigits ) );
ROTS( String::npos != cString2.find_last_not_of( sm_cSetOfDigits ) );
UInt uiStId = atoi( cString2.c_str() );
rcMmco = Mmco( MMCO_ASSIGN_LONG_TERM, uiLtId, uiStId );
return Err::m_nOK;
}
else
{
AF();
return Err::m_nERR;
}
}
else if( cCommand1 == 'N' )
{
ROFS( 1 == rcString.find_first_of ( sm_cSetOfDigits ) );
ROFS( 0 == rcString.find_last_not_of( sm_cSetOfDigits ) );
UInt uiNum = atoi( rcString.c_str() + 1 );
rcMmco = Mmco( MMCO_SHORT_TERM_UNUSED, uiNum );
return Err::m_nOK;
}
else if( cCommand1 == 'E' )
{
rcMmco = Mmco( MMCO_RESET );
return Err::m_nOK;
}
AF();
return Err::m_nERR;
}
Bool
FormattedStringParser::isFrameSequencePart( const String& rcString )
{
return ( rcString.find( '*', 1 ) == String::npos );
}
ErrVal
FormattedStringParser::extractRepetitions( const String& rcString,
String& rcNoRepString,
UInt& ruiNumberOfRepetitions )
{
if( rcString[0] != '*' )
{
ruiNumberOfRepetitions = 1;
rcNoRepString = rcString;
}
else
{
UInt uiLastPos = rcString.length () - 1;
UInt uiOpenPos = rcString.find ( '{' );
UInt uiClosePos = rcString.rfind ( '}' );
ROTS( uiOpenPos == String::npos );
ROFS( uiClosePos == uiLastPos );
rcNoRepString = rcString.substr( uiOpenPos+1, uiClosePos-uiOpenPos-1 );
String cNStr = rcString.substr( 1, uiOpenPos - 1 );
if( uiOpenPos==2 && cNStr[0]=='n' )
{
ruiNumberOfRepetitions = MSYS_UINT_MAX;
}
else
{
ROFS( cNStr.find_first_not_of( sm_cSetOfDigits ) == String::npos );
ruiNumberOfRepetitions = atoi( cNStr.c_str() );
}
}
return Err::m_nOK;
}
ErrVal
FormattedStringParser::getNumberOfFrames( const String& rcString,
UInt& ruiNumberOfFrames )
{
UInt uiPos = rcString.find_first_of( sm_cSetOfTypes );
ruiNumberOfFrames = 0;
while( uiPos != String::npos )
{
ruiNumberOfFrames++;
uiPos = rcString.find_first_of( sm_cSetOfTypes, uiPos+1 );
}
return Err::m_nOK;
}
ErrVal
FormattedStringParser::extractNextFrameDescription( const String& rcString,
String& rcFDString,
UInt& ruiStartPos )
{
ROTS( ruiStartPos >= rcString.length() - 1 );
UInt uiEndPos = rcString.find_first_of( sm_cSetOfTypes, ruiStartPos + 1 );
rcFDString = rcString.substr ( ruiStartPos, uiEndPos - ruiStartPos );
ruiStartPos = uiEndPos;
return Err::m_nOK;
}
ErrVal
FormattedStringParser::getNumberOfParts( const String& rcString,
UInt& ruiNumberOfParts )
{
UInt uiPos = rcString.find_first_of( sm_cSetOfPartStart );
ruiNumberOfParts = 0;
while( uiPos != String::npos )
{
ruiNumberOfParts++;
if( rcString[uiPos] == '*' )
{
UInt uiEndPos = rcString.find( '{', uiPos+1 );
UInt uiOpenBrackets = 1;
ROTS( uiEndPos == String::npos );
while( uiOpenBrackets )
{
uiEndPos = rcString.find_first_of( "{}", uiEndPos+1 );
ROTS( uiEndPos == String::npos );
if( rcString[uiEndPos] == '{' ) uiOpenBrackets++;
else uiOpenBrackets--;
}
uiPos = rcString.find_first_of( sm_cSetOfPartStart, uiEndPos + 1 );
}
else
{
uiPos = rcString.find( '*', uiPos+1 );
}
}
return Err::m_nOK;
}
ErrVal
FormattedStringParser::extractPart( const String& rcString,
String& rcPartString,
UInt& ruiStartPos )
{
ROTS( ruiStartPos >= rcString.length() - 1 );
UInt uiNextStartPos;
if( rcString[ruiStartPos] == '*' )
{
UInt uiEndPos = rcString.find( '{', ruiStartPos+1 );
UInt uiOpenBrackets = 1;
ROTS( uiEndPos == String::npos );
while( uiOpenBrackets )
{
uiEndPos = rcString.find_first_of( "{}", uiEndPos+1 );
ROTS( uiEndPos == String::npos );
if( rcString[uiEndPos] == '{' ) uiOpenBrackets++;
else uiOpenBrackets--;
}
uiNextStartPos = rcString.find_first_of( sm_cSetOfPartStart, uiEndPos + 1 );
}
else
{
uiNextStartPos = rcString.find( '*', ruiStartPos+1 );
}
rcPartString = rcString.substr( ruiStartPos, uiNextStartPos - ruiStartPos );
ruiStartPos = uiNextStartPos;
return Err::m_nOK;
}
//================================= FormattedStringParser : end ===================================
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -