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

📄 sequencestructure.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 4 页
字号:
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 + -