diff --git a/lib/PlaYUVerCmdParser.cpp b/lib/PlaYUVerCmdParser.cpp index b93e8f7..41759fe 100644 --- a/lib/PlaYUVerCmdParser.cpp +++ b/lib/PlaYUVerCmdParser.cpp @@ -66,11 +66,6 @@ Bool PlaYUVerCmdParser::parse() // m_cParserOptions.setDefaults(); m_aUnhandledArgs = m_cParserOptions.scanArgv( m_iArgc, ( const Char** )m_ppArgv ); - // for( std::list::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++ ) - // { - // fprintf( stderr, "Unhandled argument ignored: `%s'\n", *it ); - // } - if( checkListingOpts() ) { return false; diff --git a/lib/PlaYUVerProgramOptions.cpp b/lib/PlaYUVerProgramOptions.cpp index 00c4730..a7ee257 100644 --- a/lib/PlaYUVerProgramOptions.cpp +++ b/lib/PlaYUVerProgramOptions.cpp @@ -1,7 +1,7 @@ /* The copyright in this software is being made available under the BSD * License, included below. This software may be subject to other third party * and contributor rights, including patent rights, and no such rights are - * granted under this license. + * granted under this license. * * Copyright (c) 2010-2014, ITU/ISO/IEC * All rights reserved. @@ -94,6 +94,11 @@ OptionBase* Options::getOption( const std::string& optName ) return NULL; } +Bool Options::hasOpt( const std::string& optName ) +{ + return getOption( optName )->count() > 0 ? true : false; +} + void Options::addOption( OptionBase *opt ) { Option* names = new Option(); diff --git a/lib/PlaYUVerProgramOptions.h b/lib/PlaYUVerProgramOptions.h index b3e1721..b1ce0b9 100644 --- a/lib/PlaYUVerProgramOptions.h +++ b/lib/PlaYUVerProgramOptions.h @@ -1,7 +1,7 @@ /* The copyright in this software is being made available under the BSD * License, included below. This software may be subject to other third party * and contributor rights, including patent rights, and no such rights are - * granted under this license. + * granted under this license. * * Copyright (c) 2010-2014, ITU/ISO/IEC * All rights reserved. @@ -171,8 +171,43 @@ inline void StandardOpt::parse( const std::string& arg ) arg_count++; } -/* string parsing is specialized -- copy the whole string, not just the - * first word */ +template<> +inline void StandardOpt< std::vector >::parse( const std::string& arg ) +{ + UInt aux_opt_storage; + std::istringstream arg_ss( arg, std::istringstream::in ); + arg_ss.exceptions( std::ios::failbit ); + try + { + arg_ss >> aux_opt_storage; + opt_storage.push_back( aux_opt_storage ); + } + catch( ... ) + { + throw ParseFailure( opt_string, arg ); + } + arg_count++; +} + +template<> +inline void StandardOpt< std::vector >::parse( const std::string& arg ) +{ + Int aux_opt_storage; + std::istringstream arg_ss( arg, std::istringstream::in ); + arg_ss.exceptions( std::ios::failbit ); + try + { + arg_ss >> aux_opt_storage; + opt_storage.push_back( aux_opt_storage ); + } + catch( ... ) + { + throw ParseFailure( opt_string, arg ); + } + arg_count++; +} + +/* string parsing is specialized */ template<> inline void StandardOpt::parse( const std::string& arg ) { @@ -180,8 +215,7 @@ inline void StandardOpt::parse( const std::string& arg ) arg_count++; } -/* string parsing is specialized -- copy the whole string, not just the - * first word */ +/* string vector parsing is specialized */ template<> inline void StandardOpt >::parse( const std::string& arg ) { @@ -259,6 +293,8 @@ public: return opt_list; } + Bool hasOpt( const std::string& optName ); + void addOption( OptionBase *opt ); private: diff --git a/tools/PlaYUVerTools.cpp b/tools/PlaYUVerTools.cpp index a5844ce..e485e6a 100644 --- a/tools/PlaYUVerTools.cpp +++ b/tools/PlaYUVerTools.cpp @@ -54,46 +54,49 @@ PlaYUVerTools::~PlaYUVerTools() } } +#define GET_PARAM( X , i ) X[X.size() > i ? i : X.size() - 1] + + Int PlaYUVerTools::openInputs() { /** * Create input streams */ - if( m_cCmdLineHandler.Opts()["input"]->count() ) + if( m_cCmdLineHandler.Opts().hasOpt( "input" ) ) { - std::string resolutionString( "" ); - if( m_cCmdLineHandler.Opts()["size"]->count() ) - { - resolutionString = m_cCmdLineHandler.m_strResolution; - } - std::string fmtString( "yuv420p" ); - if( m_cCmdLineHandler.Opts()["pel_fmt"]->count() ) - { - fmtString = m_cCmdLineHandler.m_strPelFmt; - } - UInt uiBitPerPixel = 8; - if( m_cCmdLineHandler.Opts()["bits_pel"]->count() ) - { - uiBitPerPixel = m_cCmdLineHandler.m_uiBitsPerPixel; - } - UInt uiEndianness = 0; - if( m_cCmdLineHandler.Opts()["endianness"]->count() ) - { - if( m_cCmdLineHandler.m_strEndianness == "big" ) - { - uiEndianness = 0; - } - if( m_cCmdLineHandler.m_strEndianness == "little" ) - { - uiEndianness = 1; - } - } - std::vector inputFileNames = m_cCmdLineHandler.m_apcInputs; + std::string resolutionString( "" ); + std::string fmtString( "yuv420p" ); + UInt uiBitPerPixel = 8; + UInt uiEndianness = 0; + PlaYUVerStream* pcStream; for( UInt i = 0; i < inputFileNames.size() && i < MAX_NUMBER_INPUTS; i++ ) { + if( m_cCmdLineHandler.Opts().hasOpt( "size" ) ) + { + resolutionString = GET_PARAM( m_cCmdLineHandler.m_strResolution, 0 ); + } + if( m_cCmdLineHandler.Opts().hasOpt( "pel_fmt" ) ) + { + fmtString = GET_PARAM( m_cCmdLineHandler.m_strPelFmt, i ); + } + if( m_cCmdLineHandler.Opts().hasOpt( "bits_pel" ) ) + { + uiBitPerPixel = GET_PARAM( m_cCmdLineHandler.m_uiBitsPerPixel, i ); + } + if( m_cCmdLineHandler.Opts().hasOpt( "endianness" ) ) + { + if( GET_PARAM( m_cCmdLineHandler.m_strEndianness, i ) == "big" ) + { + uiEndianness = 0; + } + if( GET_PARAM( m_cCmdLineHandler.m_strEndianness, i ) == "little" ) + { + uiEndianness = 1; + } + } pcStream = new PlaYUVerStream; try { @@ -113,7 +116,7 @@ Int PlaYUVerTools::openInputs() } m_uiNumberOfFrames = MAX_UINT; - if( m_cCmdLineHandler.Opts()["frames"]->count() ) + if( m_cCmdLineHandler.Opts().hasOpt( "frames" ) ) { m_uiNumberOfFrames = m_cCmdLineHandler.m_iFrames; } @@ -144,7 +147,7 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) return 2; } - if( m_cCmdLineHandler.Opts()["save"]->count() ) + if( m_cCmdLineHandler.Opts().hasOpt( "save" ) ) { if( m_apcInputStreams.size() == 0 ) { @@ -165,7 +168,7 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) m_cCmdLineHandler.log( LOG_ERROR, "Invalid frame number! Use --frame option " ); return 2; } - if( m_cCmdLineHandler.Opts()["output"]->count() ) + if( m_cCmdLineHandler.Opts().hasOpt( "output" ) ) m_pcOutputFileNames.push_back( m_cCmdLineHandler.m_strOutput ); if( m_pcOutputFileNames.size() != m_apcInputStreams.size() ) { @@ -181,7 +184,7 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) /** * Check Quality operation */ - if( m_cCmdLineHandler.Opts()["quality"]->count() ) + if( m_cCmdLineHandler.Opts().hasOpt( "quality" ) ) { std::string qualityMetric = m_cCmdLineHandler.m_strQualityMetric; if( m_apcInputStreams.size() < 2 ) @@ -209,7 +212,7 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) /** * Check Module operation */ - if( m_cCmdLineHandler.Opts()["module"]->count() ) + if( m_cCmdLineHandler.Opts().hasOpt( "module" ) ) { std::string moduleName = m_cCmdLineHandler.m_strModule; @@ -263,7 +266,7 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) { // Check outputs std::vector outputFileNames; - if( m_cCmdLineHandler.Opts()["output"]->count() ) + if( m_cCmdLineHandler.Opts().hasOpt( "output" ) ) outputFileNames.push_back( m_cCmdLineHandler.m_strOutput ); if( outputFileNames.size() == 1 ) @@ -343,20 +346,20 @@ Int PlaYUVerTools::QualityOperation() std::string metric_fmt = " "; switch( m_uiQualityMetric ) { - case PlaYUVerFrame::PSNR_METRIC: - //"PSNR_0_0" - metric_fmt += " %6.3f "; - break; - case PlaYUVerFrame::SSIM_METRIC: - //"SSIM_0_0" - metric_fmt += " %6.4f "; - break; - case PlaYUVerFrame::MSE_METRIC: - //"MSE_0_0" - metric_fmt += "%7.2f"; - break; - default: - metric_fmt += " %6.3f "; + case PlaYUVerFrame::PSNR_METRIC: + //"PSNR_0_0" + metric_fmt += " %6.3f "; + break; + case PlaYUVerFrame::SSIM_METRIC: + //"SSIM_0_0" + metric_fmt += " %6.4f "; + break; + case PlaYUVerFrame::MSE_METRIC: + //"MSE_0_0" + metric_fmt += "%7.2f"; + break; + default: + metric_fmt += " %6.3f "; } metric_fmt += " "; diff --git a/tools/PlaYUVerToolsCmdParser.cpp b/tools/PlaYUVerToolsCmdParser.cpp index bd09dfe..c9a9225 100644 --- a/tools/PlaYUVerToolsCmdParser.cpp +++ b/tools/PlaYUVerToolsCmdParser.cpp @@ -37,7 +37,6 @@ PlaYUVerToolsCmdParser::PlaYUVerToolsCmdParser() { m_uiLogLevel = 0; m_bQuiet = false; - m_strPelFmt = std::string( "YUV420p" ); m_iFrames = -1; } @@ -69,7 +68,7 @@ Int PlaYUVerToolsCmdParser::parseToolsArgs( Int argc, Char *argv[] ) //( "input,i", m_strInput, "input file" ) /**/ ( "output,o", m_strOutput, "output file" ) /**/ ( "size,s", m_strResolution, "size (WxH)" ) /**/ - ( "pel_fmt", m_strPelFmt, "pixel format" ) /**/ + ( "pel_fmt,p", m_strPelFmt, "pixel format" ) /**/ ( "bits_pel", m_uiBitsPerPixel, "bits per pixel" ) /**/ ( "endianness", m_strEndianness, "File endianness (big, little)" ) /**/ ( "frames,f", m_iFrames, "number of frames to parse" ); @@ -90,19 +89,19 @@ Int PlaYUVerToolsCmdParser::parseToolsArgs( Int argc, Char *argv[] ) m_uiLogLevel = LOG_RESULT; } - if( Opts()["module"]->count() && Opts()["help"]->count() ) + if( Opts().hasOpt("module") && Opts().hasOpt("help") ) { listModuleHelp(); iRet = 1; } - else if( Opts()["help"]->count() ) + else if( Opts().hasOpt("help") ) { printf( "Usage: %s modules/quality/save [options] -input=input_file [--output=output_file]\n", argv[0] ); Opts().doHelp( std::cout ); iRet = 1; } - if( Opts()["module_list"]->count() || Opts()["module_list_full"]->count() ) + if( Opts().hasOpt("module_list") || Opts().hasOpt("module_list_full") ) { listModules(); iRet = 1; @@ -114,7 +113,7 @@ Void PlaYUVerToolsCmdParser::listModules() { Bool bDetailed = false; - if( Opts()["module_list_full"]->count() ) + if( Opts().hasOpt("module_list_full") ) bDetailed = true; PlaYUVerModuleIf* pcCurrModuleIf; diff --git a/tools/PlaYUVerToolsCmdParser.h b/tools/PlaYUVerToolsCmdParser.h index 8a61bb1..92bb8c2 100644 --- a/tools/PlaYUVerToolsCmdParser.h +++ b/tools/PlaYUVerToolsCmdParser.h @@ -72,22 +72,22 @@ private: Bool m_bShowHelp; Bool m_bShowVersion; Bool m_bQuiet; + std::vector m_apcInputs; - std::string m_strInput; + std::vector m_strResolution; + std::vector m_strPelFmt; + std::vector m_uiBitsPerPixel; + std::vector m_strEndianness; std::string m_strOutput; - std::string m_strResolution; - std::string m_strPelFmt; - UInt m_uiBitsPerPixel; - std::string m_strEndianness; - UInt m_uiEndianness; - Bool m_bListPelFmts; Int64 m_iFrames; - Bool m_bListQuality; std::string m_strQualityMetric; - Bool m_bListModules; std::string m_strModule; + Bool m_bListPelFmts; + Bool m_bListQuality; + Bool m_bListModules; + Void listModules(); Void listModuleHelp();