Changeset 608 in 3DVCSoftware for trunk/source/Lib/TAppCommon


Ignore:
Timestamp:
1 Sep 2013, 22:47:26 (11 years ago)
Author:
tech
Message:

Merged DEV-2.0-dev0@604.

Location:
trunk/source/Lib/TAppCommon
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TAppCommon/TAppComCamPara.cpp

    r296 r608  
    4949#include <functional>
    5050#include <string>
    51 
     51#if H_3D
    5252
    5353
     
    5858  AOF( radShiftParams == NULL && raiShiftParams == NULL && radLUT == NULL && raiLUT == NULL );
    5959
    60   uiNumberSourceViews = Max( 1, uiNumberSourceViews );
    61   uiNumberTargetViews = Max( 1, uiNumberTargetViews );
     60  uiNumberSourceViews = std::max( (UInt) 1, uiNumberSourceViews );
     61  uiNumberTargetViews = std::max( (UInt) 1, uiNumberTargetViews );
    6262
    6363  radShiftParams = new Double** [ uiNumberSourceViews ];
     
    611611}
    612612
    613 
    614613Void
    615614TAppComCamPara::xGetGeometryData( Int iView, UInt uiFrame, Double& rdFocalLength, Double& rdPosition, Double& rdCameraShift, Bool& rbInterpolated )
    616615{
    617616  UInt uiFoundLine = -1;
     617#if H_3D_FIX_REN_WARNING
     618  if ( !xGetCameraDataRow( iView, uiFrame, uiFoundLine ) && xIsIn( m_aiSortedBaseViews, iView ))
     619#else 
    618620  if ( !xGetCameraDataRow( iView, uiFrame, uiFoundLine ) )
     621#endif
    619622  {
    620623    AOT( m_aadCameraParameters[ uiFoundLine ].size() < 6 );
     
    632635    Int  iDummy;
    633636
     637#if H_3D_FIX_REN_WARNING
     638    if( !xGetLeftRightView( iView, m_aiSortedBaseViews, iLeftView, iRightView, iDummy, iDummy ) ||
     639#else
    634640    if( !xGetLeftRightView( iView, m_aiViewsInCfgFile, iLeftView, iRightView, iDummy, iDummy ) ||
     641#endif
    635642         xGetCameraDataRow( iLeftView,  uiFrame, uiLeftViewLine  )                             ||
    636643         xGetCameraDataRow( iRightView, uiFrame, uiRightViewLine )
    637644      )
    638645    {
     646#if H_3D_FIX_REN_WARNING
     647      std::cerr << "No left or no right base view next to view " << (Double)iView / m_dViewNumPrec << " for Frame " << uiFrame << " given in CameraParameterFile" << std::endl;
     648#else
    639649      std::cerr << "No Left or no Right View next to View " << (Double)iView / m_dViewNumPrec << " for Frame " << uiFrame << " given in CameraParameterFile" << std::endl;
     650#endif
    640651      AOT(true);
    641652      exit( EXIT_FAILURE );
     
    841852  Int     iLog2DivLuma   = m_uiBitDepthForLUT + m_uiCamParsCodedPrecision + 1 - m_iLog2Precision;   AOF( iLog2DivLuma > 0 );
    842853  Int     iLog2DivChroma = iLog2DivLuma + 1;
     854
    843855  Double  dMaxDispDev    = 0.0;
    844856  Double  dMaxRndDispDvL = 0.0;
    845857  Double  dMaxRndDispDvC = 0.0;
     858
    846859  for( UInt uiSourceView = 0; uiSourceView < uiNumberSourceViews; uiSourceView++ )
    847860  {
     
    892905
    893906        // maximum deviation
    894         dMaxDispDev     = Max( dMaxDispDev,    fabs( Double( (Int) iTestScale   ) - dShiftLuma * Double( 1 << iLog2DivLuma ) ) / Double( 1 << iLog2DivLuma ) );
    895         dMaxRndDispDvL  = Max( dMaxRndDispDvL, fabs( Double( (Int) iShiftLuma   ) - dShiftLuma   ) );
    896         dMaxRndDispDvC  = Max( dMaxRndDispDvC, fabs( Double( (Int) iShiftChroma ) - dShiftChroma ) );
     907#if H_3D_REN_MAX_DEV_OUT
     908        m_dMaxShiftDeviation = std::max( m_dMaxShiftDeviation, fabs( Double( (Int) iShiftLuma   ) - dShiftLuma   ) / Double( 1 << m_iLog2Precision ) );       
     909#endif
     910        dMaxDispDev     = std::max( dMaxDispDev,    fabs( Double( (Int) iTestScale   ) - dShiftLuma * Double( 1 << iLog2DivLuma ) ) / Double( 1 << iLog2DivLuma ) );
     911        dMaxRndDispDvL  = std::max( dMaxRndDispDvL, fabs( Double( (Int) iShiftLuma   ) - dShiftLuma   ) );
     912        dMaxRndDispDvC  = std::max( dMaxRndDispDvC, fabs( Double( (Int) iShiftChroma ) - dShiftChroma ) );
    897913      }
    898914
     
    965981  //--- determine (virtual) camera parameter shift between view order index 1 and base view (view order index 0) ---
    966982  Double        dCamPosShift, dPicPosShift;
    967   Int           iMinVOI       = (1<<30);
    968983  Int           iMinAbsVOI    = (1<<30);
    969984  Int           iMinAbsVOIId  = 0;
     
    973988    if( iAbsVOI < iMinAbsVOI )
    974989    {
    975       iMinVOI      = m_aiViewOrderIndex[ iBaseId ];
    976990      iMinAbsVOI   = iAbsVOI;
    977991      iMinAbsVOIId = iBaseId;
     
    980994  AOF( iMinAbsVOIId != 0 && iMinAbsVOI != 0 );
    981995  xGetCameraShifts( 0, iMinAbsVOIId, m_uiFirstFrameId, dCamPosShift, dPicPosShift );
    982   Double  dCamPosShiftVOI01     = dCamPosShift / Double( iMinVOI );
    983996
    984997  //--- determine maximum absolute camera position shift, precision, and base scale ---
     
    9911004      dCamPosShift        = ( dCamPosShift < 0.0                ? -dCamPosShift : dCamPosShift       );
    9921005      dMaxAbsCamPosShift  = ( dCamPosShift > dMaxAbsCamPosShift ?  dCamPosShift : dMaxAbsCamPosShift );
    993     }
    994   }
    995   Int     iPrecision  = 0;
    996 #if 0 // enabling this lines might be reasonable, but produces different results for the 2 view and 3 view test cases
    997   Double  dEpsilon    = 1e-15;
    998   Double  dAbsCamPosShiftVOI01  = ( dCamPosShiftVOI01 < 0.0 ? -dCamPosShiftVOI01 : dCamPosShiftVOI01 );
    999   Double  dShiftRatio = dMaxAbsCamPosShift / dAbsCamPosShiftVOI01 - dEpsilon;
    1000   for( ; (Double)( 1 << iPrecision ) < dShiftRatio; iPrecision++ );
    1001 #endif
    1002   Int     iPrecShift  = iPrecision + PDM_INTER_CALC_SHIFT + PDM_VIRT_DEPTH_PRECISION - 2;
    1003   AOF(    iPrecShift  < PDM_INTERNAL_CALC_BIT_DEPTH );
    1004   Int     iScaleVOI01 = 1 << iPrecShift;
    1005   m_iPdmPrecision     = iPrecision;
    1006 
    1007   //--- loop over target views ---
    1008   for( Int iTargetId = 1; iTargetId < m_iNumberOfBaseViews; iTargetId++ )
    1009   {
    1010     // set scale and offset parameters for other views
    1011     for( Int iBaseId = 0; iBaseId < iTargetId; iBaseId++ )
    1012     {
    1013       xGetCameraShifts( (UInt)iBaseId, (UInt)iTargetId, m_uiFirstFrameId, dCamPosShift, dPicPosShift );
    1014       Double  dScale      = Double( iScaleVOI01 ) * dCamPosShiftVOI01 / dCamPosShift;
    1015       Int     iDiv        = m_aiViewOrderIndex[ iTargetId ] - m_aiViewOrderIndex[ iBaseId ];
    1016       Int     iAdd        = ( iDiv > 0 ? iDiv / 2 : -iDiv / 2 );
    1017       Int     iScalePred  = ( iScaleVOI01 + iAdd ) / iDiv;
    1018       Double  dFactor     = dScale / (Double)iScalePred * pow( 2.0, PDM_LOG4_SCALE_DENOMINATOR );
    1019       Int     iNominator  = (Int)floor( dFactor + .5 );
    1020       Int     iNomDelta   = iNominator - ( 1 << PDM_LOG4_SCALE_DENOMINATOR );
    1021       Int     iScale      = Int( ( (Int64)iNominator * (Int64)iScalePred + (Int64)( ( 1 << PDM_LOG4_SCALE_DENOMINATOR ) >> 1 ) ) >> PDM_LOG4_SCALE_DENOMINATOR );
    1022       Double  dOffset     = -dPicPosShift * Double( iScale ) * pow( 2.0, 2 - PDM_OFFSET_SHIFT );
    1023       Int     iOffset     = (Int)floor( dOffset + .5 );
    1024 
    1025       m_aaiPdmScaleNomDelta [ iTargetId ][ iBaseId ]  = iNomDelta;
    1026       m_aaiPdmOffset        [ iTargetId ][ iBaseId ]  = iOffset;
    10271006    }
    10281007  }
     
    10501029  m_aaiScaleAndOffsetSet      = 0;
    10511030
    1052   m_iPdmPrecision             = 0;
    1053   m_aaiPdmScaleNomDelta       = 0;
    1054   m_aaiPdmOffset              = 0;
    1055 
    10561031  m_adBaseViewShiftParameter  = 0;
    10571032  m_aiBaseViewShiftParameter  = 0;
     
    10671042  m_bCamParsCodedPrecSet      = false;
    10681043
     1044#if H_3D_REN_MAX_DEV_OUT
     1045  m_dMaxShiftDeviation        = -1;
     1046#endif
    10691047
    10701048}
     
    10781056  xDeleteArray( m_aiBaseViewShiftLUT,        m_iNumberOfBaseViews, m_iNumberOfBaseViews,  2 );
    10791057
    1080   xDeleteArray( m_adSynthViewShiftParameter, m_iNumberOfBaseViews, Max(1,m_iNumberOfSynthViews));
    1081   xDeleteArray( m_aiSynthViewShiftParameter, m_iNumberOfBaseViews, Max(1,m_iNumberOfSynthViews));
    1082   xDeleteArray( m_adSynthViewShiftLUT,       m_iNumberOfBaseViews, Max(1,m_iNumberOfSynthViews), 2 );
    1083   xDeleteArray( m_aiSynthViewShiftLUT,       m_iNumberOfBaseViews, Max(1,m_iNumberOfSynthViews), 2 );
     1058  xDeleteArray( m_adSynthViewShiftParameter, m_iNumberOfBaseViews, std::max((Int) 1 ,m_iNumberOfSynthViews));
     1059  xDeleteArray( m_aiSynthViewShiftParameter, m_iNumberOfBaseViews, std::max((Int) 1 ,m_iNumberOfSynthViews));
     1060  xDeleteArray( m_adSynthViewShiftLUT,       m_iNumberOfBaseViews, std::max((Int) 1 ,m_iNumberOfSynthViews), 2 );
     1061  xDeleteArray( m_aiSynthViewShiftLUT,       m_iNumberOfBaseViews, std::max( (Int)1 ,m_iNumberOfSynthViews), 2 );
    10841062
    10851063  xDeleteArray( m_aaiCodedScale,             m_iNumberOfBaseViews );
     
    10871065  xDeleteArray( m_aaiScaleAndOffsetSet,      m_iNumberOfBaseViews );
    10881066
    1089   xDeleteArray( m_aaiPdmScaleNomDelta,       m_iNumberOfBaseViews );
    1090   xDeleteArray( m_aaiPdmOffset,              m_iNumberOfBaseViews );
    10911067}
    10921068
     
    11061082
    11071083    Int iViewOrderIdx  = (Int)( m_aadCameraParameters[ uiRow ][ 1 ] );
    1108     iMinViewOrderIdx   = Min( iViewOrderIdx, iMinViewOrderIdx );
     1084    iMinViewOrderIdx   = std::min( iViewOrderIdx, iMinViewOrderIdx );
    11091085
    11101086    aiViewOrderIdx     .push_back( iViewOrderIdx );
     
    11211097    m_aiBaseId2SortedId.push_back( iCurBaseView );
    11221098    m_aiBaseSortedId2Id.push_back( iCurBaseView );
    1123 
    11241099  }
    11251100
     
    11981173    if( m_aiViewsInCfgFile.size() < 2 )
    11991174    {
    1200     std::cerr << "Failed reading config file" << std::endl;
     1175      std::cerr << "Failed reading config file" << std::endl;
    12011176      std::cerr << "At least two views must be given" << std::endl;
    12021177      exit( EXIT_FAILURE );
     
    13321307  xInit2dArray  ( (UInt)m_iNumberOfBaseViews, (UInt)m_iNumberOfBaseViews,  m_aaiScaleAndOffsetSet, 0 );
    13331308
    1334   xCreate2dArray( (UInt)m_iNumberOfBaseViews, (UInt)m_iNumberOfBaseViews,  m_aaiPdmScaleNomDelta     );
    1335   xCreate2dArray( (UInt)m_iNumberOfBaseViews, (UInt)m_iNumberOfBaseViews,  m_aaiPdmOffset            );
    1336 
    1337   //===== init disparity to virtual depth conversion parameters =====
    1338   xSetPdmConversionParams();
    1339 
    13401309  //===== init arrays for first frame =====
    13411310  xSetShiftParametersAndLUT( m_uiFirstFrameId );
     
    13691338      else
    13701339      {
    1371       for( UInt uiFrame = m_uiFirstFrameId; uiFrame <= m_uiLastFrameId; uiFrame++ )
    1372       {
    1373         Bool bInterpolatedCur;
    1374         xGetGeometryData( m_aiBaseViews[ uiBaseView ], uiFrame, dDummy, dDummy, dDummy, bInterpolatedCur );
    1375         xGetZNearZFar   ( m_aiBaseViews[ uiBaseView ], uiFrame, dDummy, dDummy );
    1376 
    1377         if( bInterpolatedCur )
     1340        for( UInt uiFrame = m_uiFirstFrameId; uiFrame <= m_uiLastFrameId; uiFrame++ )
    13781341        {
    1379           std::cerr << "Error: CameraParameters for BaseView " << (Double)m_aiBaseViews[ uiBaseView ] / m_dViewNumPrec << " and Frame " << uiFrame << " not defined. "  << std::endl;
    1380           exit( EXIT_FAILURE );
     1342          Bool bInterpolatedCur;
     1343          xGetGeometryData( m_aiBaseViews[ uiBaseView ], uiFrame, dDummy, dDummy, dDummy, bInterpolatedCur );
     1344          xGetZNearZFar   ( m_aiBaseViews[ uiBaseView ], uiFrame, dDummy, dDummy );
     1345
     1346          if( bInterpolatedCur )
     1347          {
     1348            std::cerr << "Error: CameraParameters for BaseView " << (Double)m_aiBaseViews[ uiBaseView ] / m_dViewNumPrec << " and Frame " << uiFrame << " not defined. "  << std::endl;
     1349            exit( EXIT_FAILURE );
     1350          }
    13811351        }
    13821352      }
    1383 
    1384       }
    1385     }
    1386 
     1353    }
     1354#if H_3D_FIX_REN_WARNING
     1355    Bool bIgnoreFirst = true;     
     1356    for( UInt uiERView = 0; uiERView < m_aiSynthViews.size() && !m_bSetupFromCoded; uiERView++ )
     1357    {
     1358      if ( xIsIn(m_aiViewsInCfgFile, m_aiSynthViews[ uiERView ] ) )
     1359      {
     1360        if ( bIgnoreFirst )
     1361        {
     1362          std::cout << "Ignoring CameraParameterFile entries for virtual view(s): " ;
     1363          //GT: Integer precision virtual view camera parameters are always interpolated from coded views camera parameters.
     1364          bIgnoreFirst = false;
     1365        }
     1366        std::cout << (Double)m_aiSynthViews[ uiERView ] / m_dViewNumPrec << " " ;
     1367      }
     1368    }
     1369    if ( !bIgnoreFirst )
     1370    {
     1371      std::cout << std::endl;
     1372    }
     1373#endif
     1374
     1375    Bool bInterpolateFirst = true;
     1376    Bool bAnyInterpolated  = false;
    13871377    for( UInt uiERView = 0; uiERView < m_aiSynthViews.size() && !m_bSetupFromCoded; uiERView++ )
    13881378    {
     
    13941384        bInterpolated |= bInterpolatedCur;
    13951385      }
     1386     
    13961387      if( bInterpolated )
    13971388      {
    1398         std::cout << "Interpolating Camera Parameters for View " << (Double)m_aiSynthViews[ uiERView ] / m_dViewNumPrec << std::endl;
    1399       }
    1400     }
     1389        bAnyInterpolated = true;
     1390        if ( bInterpolateFirst )
     1391        {
     1392#if H_3D_FIX_REN_WARNING                       
     1393          std::cout << "Interpolating camera parameters      for virtual view(s): " ;
     1394#else
     1395          std::cout << "Interpolating Camera Parameters for View(s) " ;
     1396#endif
     1397            bInterpolateFirst = false;
     1398        }         
     1399        std::cout << (Double)m_aiSynthViews[ uiERView ] / m_dViewNumPrec << " " ;
     1400      }
     1401    }
     1402    if ( bAnyInterpolated )
     1403      std::cout << std::endl;
    14011404  }
    14021405
     
    14331436}
    14341437
    1435 #if SAIT_VSO_EST_A0033
    1436 Void
    1437 TAppComCamPara::xSetDispCoeff( UInt uiFrameId, Int iViewIdx )
     1438#if H_3D_VSO
     1439Void
     1440TAppComCamPara::setDispCoeff( UInt uiFrameId, Int iViewIdx )
    14381441{
    14391442  UInt uiFrame = m_uiFirstFrameId + uiFrameId;
     
    14531456    xGetZNearZFar   ( iSourceViewNum, uiFrame, dZN1, dZF1 );
    14541457
    1455     dBaseLine = ( Max( dPos[0], Max( dPos[1], dPos[2] ) ) - Min( dPos[0], Min( dPos[1], dPos[2] ) ) ) / 2.0;
     1458    dBaseLine = ( std::max( dPos[0], std::max( dPos[1], dPos[2] ) ) - std::min( dPos[0], std::min( dPos[1], dPos[2] ) ) ) / 2.0;
    14561459  }
    14571460  else if( m_iNumberOfBaseViews == 2 )
     
    14651468    dBaseLine = dPos[0] - dPos[1];
    14661469  }
    1467 
    14681470
    14691471  m_dDispCoeff = fabs( dFL1 * ( dBaseLine / 2.0 ) / 255.0 * ( 1.0/dZN1 - 1.0/dZF1 ) );
     
    14951497  return bExist;
    14961498}
     1499
     1500#if H_3D_FIX_REN_WARNING
     1501Bool
     1502  TAppComCamPara::xIsIn( std::vector<Int>& rVec, Int iElem)
     1503{
     1504  Bool bFound = false;
     1505  for (Int idx = 0; idx < rVec.size() && !bFound; idx++)
     1506  {
     1507    bFound = bFound || rVec[idx] == iElem;
     1508  }
     1509  return bFound;
     1510}
     1511#endif
    14971512
    14981513Int TAppComCamPara::getRelDistLeft( Int iSynthViewIdx, Int iLeftViewIdx, Int iRightViewIdx )
     
    15101525  return xGetViewId(m_aiRelSynthViewsNum, iRelNum );
    15111526}
     1527#endif
  • trunk/source/Lib/TAppCommon/TAppComCamPara.h

    r296 r608  
    6666  Bool                m_bSetupFromCoded;                      ///< setup from coded parameter file
    6767  Bool                m_bCamParsCodedPrecSet;                 ///< Coded Cam Para precision set for current frame;
    68 
    69 #if SAIT_VSO_EST_A0033
     68 
     69#if H_3D_REN_MAX_DEV_OUT
     70  Double              m_dMaxShiftDeviation;                   ///< Maximum deviation of shifts with integer precision compare to double precision
     71#endif
     72  //SAIT_VSO_EST_A0033
    7073  Double              m_dDispCoeff;
    71 #endif
    7274
    7375  // view lists
     
    9092  Int**               m_aaiScaleAndOffsetSet;                 ///< array indicating whether scale and offset have been set
    9193
    92   // parameters for virtual depth map generation
    93   Int                 m_iPdmPrecision;                        ///< additional precision for disparity - virtual depth conversion
    94   Int**               m_aaiPdmScaleNomDelta;                  ///< [TargetView][RefView] delta for nominator of scale factor
    95   Int**               m_aaiPdmOffset;                         ///< [TargetView][RefView] offset parameter
    96 
    9794  // scale and offset parameters
    9895  Double***           m_adBaseViewShiftParameter;             ///< ShiftParameters between BaseViews e.g. [2][1][0] shift scale from view 2 to view 1; [2][1][1] shift offset from view 2 to view 1
     
    132129  Void  xSetupBaseViewsFromCoded  ();
    133130  Void  xSetupBaseViews           ( Char* pchBaseViewNumbers, UInt uiNumBaseViews );
     131#if H_3D_FIX_REN_WARNING
     132  Bool  xIsIn                     ( std::vector<Int>& rVec, Int iNumber);
     133#endif
     134
    134135
    135136  // functions for getting and setting scales and offsets
     
    182183
    183184  Int                 synthRelNum2Idx           ( Int iRelNum );
    184   Bool getLeftRightBaseView( Int iSynthViewIdx, Int &riLeftViewIdx, Int &riRightViewIdx, Int &riRelDistToLeft, Bool& rbIsBaseView );
     185  Bool                getLeftRightBaseView      ( Int iSynthViewIdx, Int &riLeftViewIdx, Int &riRightViewIdx, Int &riRelDistToLeft, Bool& rbIsBaseView );
    185186  Int                 getRelDistLeft            ( Int iSynthViewIdx, Int   iLeftViewIdx, Int iRightViewIdx );
    186187  UInt                getCurFrameId             ()  { return m_iCurrentFrameId;   }
    187188  static Void         convertNumberString       ( Char* pchViewNumberString, std::vector<Int>& raiViewNumbers, Double dViewNumPrec );
    188 
    189 #if SAIT_VSO_EST_A0033
    190   Void xSetDispCoeff( UInt uiStartFrameId, Int iViewIdx );
    191   Double getDispCoeff() { return m_dDispCoeff; }
     189#if H_3D_REN_MAX_DEV_OUT
     190  Double              getMaxShiftDeviation      () { return m_dMaxShiftDeviation; };
     191#endif
     192
     193#if H_3D_VSO
     194  // SAIT_VSO_EST_A033
     195  Void                setDispCoeff              ( UInt uiStartFrameId, Int iViewIdx );
     196  Double              getDispCoeff              () { return m_dDispCoeff; }
    192197#endif
    193198
     
    215220  Int**               getCodedScale             ()  { return m_aaiCodedScale;           }
    216221  Int**               getCodedOffset            ()  { return m_aaiCodedOffset;          }
    217 
    218   // parameters for virtual depth map generation
    219   Int                 getPdmPrecision           ()  { return m_iPdmPrecision;           }
    220   Int**               getPdmScaleNomDelta       ()  { return m_aaiPdmScaleNomDelta;     }
    221   Int**               getPdmOffset              ()  { return m_aaiPdmOffset;            }
    222 };
    223 
    224 
     222};
    225223
    226224
  • trunk/source/Lib/TAppCommon/program_options_lite.cpp

    r56 r608  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2013, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    3939#include <map>
    4040#include "program_options_lite.h"
    41 
     41#include  "../TLibCommon/TypeDef.h"
    4242using namespace std;
    4343
     
    146146      for(Options::NamesPtrList::iterator it = opts.opt_list.begin(); it != opts.opt_list.end(); it++)
    147147      {
     148#if H_MV
     149        if  ( (*it)->opt->opt_duplicate ) continue;
     150#endif
    148151        ostringstream line(ios_base::out);
    149152        doHelpOpt(line, **it, pad_short);
     
    161164      for(Options::NamesPtrList::iterator it = opts.opt_list.begin(); it != opts.opt_list.end(); it++)
    162165      {
     166#if H_MV
     167        if  ( (*it)->opt->opt_duplicate ) continue;
     168#endif
    163169        ostringstream line(ios_base::out);
    164170        line << "  ";
     
    192198            newline_pos++;
    193199            line << opt_desc.substr(cur_pos, newline_pos - cur_pos);
    194             cur_pos = newline_pos = newline_pos;
     200            cur_pos = newline_pos;
    195201            continue;
    196202          }
  • trunk/source/Lib/TAppCommon/program_options_lite.h

    r56 r608  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2013, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    3434#include <sstream>
    3535#include <string>
    36 #include <vector>
    3736#include <list>
    3837#include <map>
    39 #include <stdlib.h>
     38#include  "../TLibCommon/TypeDef.h"
     39
     40#if H_MV
     41#include <vector>
    4042#include <errno.h>
    4143#include <cstring>
    42 #include <math.h>
    4344
    4445#ifdef WIN32
    4546#define strdup _strdup
    4647#endif
    47 
     48#endif
    4849//! \ingroup TAppCommon
    4950//! \{
     
    5657    struct Options;
    5758   
     59    struct ParseFailure : public std::exception
     60    {
     61      ParseFailure(std::string arg0, std::string val0) throw()
     62      : arg(arg0), val(val0)
     63      {}
     64
     65      ~ParseFailure() throw() {};
     66
     67      std::string arg;
     68      std::string val;
     69
     70      const char* what() const throw() { return "Option Parse Failure"; }
     71    };
     72
    5873    void doHelp(std::ostream& out, Options& opts, unsigned columns = 80);
    5974    unsigned parseGNU(Options& opts, unsigned argc, const char* argv[]);
     
    7186    struct OptionBase
    7287    {
     88#if H_MV     
     89      OptionBase(const std::string& name, const std::string& desc, bool duplicate = false)
     90        : opt_string(name), opt_desc(desc), opt_duplicate(duplicate)
     91#else
    7392      OptionBase(const std::string& name, const std::string& desc)
    7493      : opt_string(name), opt_desc(desc)
     94#endif
    7595      {};
    7696     
     
    84104      std::string opt_string;
    85105      std::string opt_desc;
     106#if H_MV
     107      bool        opt_duplicate;
     108#endif
    86109    };
    87110   
     
    90113    struct Option : public OptionBase
    91114    {
     115#if H_MV
     116      Option(const std::string& name, T& storage, T default_val, const std::string& desc, bool duplicate = false)
     117        : OptionBase(name, desc, duplicate), opt_storage(storage), opt_default_val(default_val)
     118#else
    92119      Option(const std::string& name, T& storage, T default_val, const std::string& desc)
    93120      : OptionBase(name, desc), opt_storage(storage), opt_default_val(default_val)
     121#endif
    94122      {}
    95123     
     
    111139    {
    112140      std::istringstream arg_ss (arg,std::istringstream::in);
    113       arg_ss >> opt_storage;
     141      arg_ss.exceptions(std::ios::failbit);
     142      try
     143      {
     144        arg_ss >> opt_storage;
     145      }
     146      catch (...)
     147      {
     148        throw ParseFailure(opt_string, arg);
     149      }
    114150    }
    115151   
     
    122158      opt_storage = arg;
    123159    }
    124    
     160
     161#if H_MV   
    125162    template<>
    126163    inline void
     
    258295      }
    259296    }
    260 
     297#endif
    261298    /** Option class for argument handling using a user provided function */
    262299    struct OptionFunc : public OptionBase
     
    333370      }
    334371     
     372#if H_MV
    335373      template<typename T>
    336374      OptionSpecific&
     
    338376      {
    339377        std::string cNameBuffer;
    340         std::string cDescriptionBuffer;
     378        std::string cDescBuffer;
    341379
    342380        cNameBuffer       .resize( name.size() + 10 );
    343         cDescriptionBuffer.resize( desc.size() + 10 );
     381        cDescBuffer.resize( desc.size() + 10 );
    344382
    345383        storage.resize(uiMaxNum);
    346384        for ( unsigned int uiK = 0; uiK < uiMaxNum; uiK++ )
    347385        {
     386          Bool duplicate = (uiK != 0);
    348387          // isn't there are sprintf function for string??
    349388          sprintf((char*) cNameBuffer.c_str()       ,name.c_str(),uiK,uiK);
    350           sprintf((char*) cDescriptionBuffer.c_str(),desc.c_str(),uiK,uiK);
    351 
    352           parent.addOption(new Option<T>( cNameBuffer, (storage[uiK]), default_val, cDescriptionBuffer ));
     389
     390          if ( !duplicate )
     391          {         
     392            sprintf((char*) cDescBuffer.c_str(),desc.c_str(),uiK,uiK);
     393          }
     394
     395          cNameBuffer.resize( std::strlen(cNameBuffer.c_str()) ); 
     396          cDescBuffer.resize( std::strlen(cDescBuffer.c_str()) );
     397         
     398
     399          parent.addOption(new Option<T>( cNameBuffer, (storage[uiK]), default_val, cDescBuffer, duplicate ));
    353400        }
    354401
    355402        return *this;
    356403      }
    357 
     404#endif
    358405      /**
    359406       * Add option described by name to the parent Options list,
Note: See TracChangeset for help on using the changeset viewer.