diff --git a/lib/PlaYUVerCmdParser.cpp b/lib/PlaYUVerCmdParser.cpp index 0d9c1c8..803f0c3 100644 --- a/lib/PlaYUVerCmdParser.cpp +++ b/lib/PlaYUVerCmdParser.cpp @@ -53,7 +53,7 @@ Void PlaYUVerCmdParser::Config( Int argc, Char *argv[] ) po::options_description PlaYUVerCmdParser::GetCommandOpts() { - po::options_description inputOpts( "Input" ); + po::options_description inputOpts( "InputOutput" ); inputOpts.add_options()/**/ ( "input,i", po::value >(), "input file" ) /**/ ( "output,o", po::value >(), "output file" ) /**/ @@ -64,6 +64,7 @@ po::options_description PlaYUVerCmdParser::GetCommandOpts() po::options_description commonOpts( "Common" ); commonOpts.add_options()/**/ + ( "quiet,q", "disable verbose" )/**/ ( "help", "produce help message" )/**/ ( "version", "show version and exit" ); commonOpts.add( inputOpts ); diff --git a/lib/PlaYUVerStream.cpp b/lib/PlaYUVerStream.cpp index 48fafec..901e598 100644 --- a/lib/PlaYUVerStream.cpp +++ b/lib/PlaYUVerStream.cpp @@ -390,7 +390,10 @@ Bool PlaYUVerStream::openFile() { return false; } - fseek( m_pFile, m_iCurrFrameNum >= 0 ? m_iCurrFrameNum : 0, SEEK_SET ); + if ( m_bIsInput ) + { + fseek( m_pFile, m_iCurrFrameNum >= 0 ? m_iCurrFrameNum : 0, SEEK_SET ); + } return true; } diff --git a/tools/CommandLineHandle.cpp b/tools/CommandLineHandle.cpp index 0c60759..22a79d2 100644 --- a/tools/CommandLineHandle.cpp +++ b/tools/CommandLineHandle.cpp @@ -23,6 +23,7 @@ */ #include +#include #include "CommandLineHandle.h" #include "lib/PlaYUVerFrame.h" #include "modules/PlaYUVerModuleIf.h" @@ -33,7 +34,7 @@ namespace plaYUVer CommandLineHandle::CommandLineHandle() { - + m_uiLogLevel = 0; } CommandLineHandle::~CommandLineHandle() @@ -41,6 +42,17 @@ CommandLineHandle::~CommandLineHandle() } +Void CommandLineHandle::log( UInt level, const char *fmt, ... ) +{ + if( level >= m_uiLogLevel ) + { + std::va_list args; + va_start( args, fmt ); + vfprintf( stdout, fmt, args ); + va_end( args ); + } +} + Int CommandLineHandle::parseToolsArgs() { Int iRet = 0; diff --git a/tools/CommandLineHandle.h b/tools/CommandLineHandle.h index 1fa6a35..bbfeba2 100644 --- a/tools/CommandLineHandle.h +++ b/tools/CommandLineHandle.h @@ -38,9 +38,37 @@ public: CommandLineHandle(); ~CommandLineHandle(); + enum LOG_LEVEL + { + INFO = 0, + WARNINGS = 1, + RESULT = 2, + ERROR = 3, + }; + Void setLogLevel( enum LOG_LEVEL level ) + { + m_uiLogLevel = level; + } + + /** + * Send the specified message to the log if the level is higher than or equal + * to the current LogLevel. By default, all logging messages are sent to + * stdout. + * + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * + * @note this function might not be safe in C++ (try to upgrade it) + */ + Void log( UInt level, const char *fmt, ... ); + Int parseToolsArgs(); Void listModules(); +private: + UInt m_uiLogLevel; }; } // NAMESPACE diff --git a/tools/PlaYUVerTools.cpp b/tools/PlaYUVerTools.cpp index d0ba086..c3a6b82 100644 --- a/tools/PlaYUVerTools.cpp +++ b/tools/PlaYUVerTools.cpp @@ -31,6 +31,7 @@ namespace plaYUVer PlaYUVerTools::PlaYUVerTools() { + m_bVerbose = true; m_uiOperation = INVALID_OPERATION; m_uiNumberOfFrames = -1; @@ -53,23 +54,28 @@ PlaYUVerTools::~PlaYUVerTools() Int PlaYUVerTools::openInputs() { + if( m_cCmdLineHandler.getOptionsMap().count( "quiet" ) ) + { + m_bVerbose = false; + m_cCmdLineHandler.setLogLevel( CommandLineHandle::RESULT ); + } /** * Create input streams */ - if( m_cCommandLineParser.getOptionsMap().count( "input" ) ) + if( m_cCmdLineHandler.getOptionsMap().count( "input" ) ) { std::string resolutionString( "" ); - if( m_cCommandLineParser.getOptionsMap().count( "size" ) ) + if( m_cCmdLineHandler.getOptionsMap().count( "size" ) ) { - resolutionString = m_cCommandLineParser.getOptionsMap()["size"].as(); + resolutionString = m_cCmdLineHandler.getOptionsMap()["size"].as(); } std::string fmtString( "yuv420p" ); - if( m_cCommandLineParser.getOptionsMap().count( "pel_fmt" ) ) + if( m_cCmdLineHandler.getOptionsMap().count( "pel_fmt" ) ) { - fmtString = m_cCommandLineParser.getOptionsMap()["pel_fmt"].as(); + fmtString = m_cCmdLineHandler.getOptionsMap()["pel_fmt"].as(); } - std::vector inputFileNames = m_cCommandLineParser.getOptionsMap()["input"].as >(); + std::vector inputFileNames = m_cCmdLineHandler.getOptionsMap()["input"].as >(); PlaYUVerStream* pcStream; for( UInt i = 0; i < inputFileNames.size(); i++ ) @@ -79,21 +85,21 @@ Int PlaYUVerTools::openInputs() { if( !pcStream->open( inputFileNames[i], resolutionString, fmtString, 1 ) ) { - printf( "Cannot open input stream %s! ", inputFileNames[i].c_str() ); + m_cCmdLineHandler.log( CommandLineHandle::ERROR, "Cannot open input stream %s! ", inputFileNames[i].c_str() ); return 2; } m_apcInputStreams.push_back( pcStream ); } catch( const char *msg ) { - printf( "Cannot open input stream %s with the following error: \n%s\n", inputFileNames[i].c_str(), msg ); + m_cCmdLineHandler.log( CommandLineHandle::ERROR, "Cannot open input stream %s with the following error: \n%s\n", inputFileNames[i].c_str(), msg ); return 2; } } m_uiNumberOfFrames = MAX_UINT; - if( m_cCommandLineParser.getOptionsMap().count( "frames" ) ) + if( m_cCmdLineHandler.getOptionsMap().count( "frames" ) ) { - m_uiNumberOfFrames = m_cCommandLineParser.getOptionsMap()["frames"].as(); + m_uiNumberOfFrames = m_cCmdLineHandler.getOptionsMap()["frames"].as(); } m_uiNumberOfComponents = MAX_UINT; @@ -110,7 +116,7 @@ Int PlaYUVerTools::openInputs() Int PlaYUVerTools::openOutputs() { - if( m_cCommandLineParser.getOptionsMap().count( "output" ) ) + if( m_cCmdLineHandler.getOptionsMap().count( "output" ) ) { } @@ -121,8 +127,8 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) { Int iRet = 0; - m_cCommandLineParser.Config( argc, argv ); - if( ( iRet = m_cCommandLineParser.parseToolsArgs() ) > 0 ) + m_cCmdLineHandler.Config( argc, argv ); + if( ( iRet = m_cCmdLineHandler.parseToolsArgs() ) > 0 ) { return iRet; } @@ -135,12 +141,12 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) /** * Check Quality operation */ - if( m_cCommandLineParser.getOptionsMap().count( "quality" ) ) + if( m_cCmdLineHandler.getOptionsMap().count( "quality" ) ) { - std::string qualityMetric = m_cCommandLineParser.getOptionsMap()["quality"].as(); + std::string qualityMetric = m_cCmdLineHandler.getOptionsMap()["quality"].as(); if( m_apcInputStreams.size() != 2 ) { - printf( "Invalid number of inputs! " ); + m_cCmdLineHandler.log( CommandLineHandle::ERROR, "Invalid number of inputs! " ); return 2; } for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ ) @@ -152,20 +158,20 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) } if( m_uiQualityMetric == -1 ) { - printf( "Invalid quality metric! " ); + m_cCmdLineHandler.log( CommandLineHandle::ERROR, "Invalid quality metric! " ); return 2; } m_uiOperation = QUALITY_OPERATION; m_fpProcess = &PlaYUVerTools::QualityOperation; - printf( "PlaYUVer Quality\n" ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, "PlaYUVer Quality\n" ); } /** * Check Module operation */ - if( m_cCommandLineParser.getOptionsMap().count( "module" ) ) + if( m_cCmdLineHandler.getOptionsMap().count( "module" ) ) { - std::string moduleName = m_cCommandLineParser.getOptionsMap()["module"].as(); + std::string moduleName = m_cCmdLineHandler.getOptionsMap()["module"].as(); PlaYUVerModuleFactoryMap& PlaYUVerModuleFactoryMap = PlaYUVerModuleFactory::Get()->getMap(); PlaYUVerModuleFactoryMap::iterator it = PlaYUVerModuleFactoryMap.begin(); @@ -180,7 +186,7 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) if( m_apcInputStreams.size() != m_pcCurrModuleIf->m_uiNumberOfFrames ) { - printf( "Invalid number of inputs! " ); + m_cCmdLineHandler.log( CommandLineHandle::ERROR, "Invalid number of inputs! " ); return 2; } @@ -190,8 +196,8 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) { // Check outputs std::vector outputFileNames; - if( m_cCommandLineParser.getOptionsMap().count( "output" ) ) - outputFileNames = m_cCommandLineParser.getOptionsMap()["output"].as >(); + if( m_cCmdLineHandler.getOptionsMap().count( "output" ) ) + outputFileNames = m_cCmdLineHandler.getOptionsMap()["output"].as >(); if( outputFileNames.size() == 1 ) { @@ -207,19 +213,19 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) } else { - printf( "One output is required! " ); + m_cCmdLineHandler.log( CommandLineHandle::ERROR, "One output is required! " ); return 2; } } m_uiOperation = MODULE_OPERATION; m_fpProcess = &PlaYUVerTools::ModuleOperation; - printf( "PlaYUVer Module\n" ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, "PlaYUVer Module\n" ); } if( m_uiOperation == INVALID_OPERATION ) { - printf( "No operation was selected! " ); + m_cCmdLineHandler.log( CommandLineHandle::ERROR, "No operation was selected! " ); return 2; } return iRet; @@ -243,7 +249,8 @@ Int PlaYUVerTools::QualityOperation() Double adAverageQuality[m_apcInputStreams.size() - 1][m_uiNumberOfComponents]; Double dQuality; - printf( " Measuring Quality using %s ... \n", PlaYUVerFrame::supportedQualityMetricsList()[m_uiQualityMetric].c_str() ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, " Measuring Quality using %s ... \n", + PlaYUVerFrame::supportedQualityMetricsList()[m_uiQualityMetric].c_str() ); for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) { @@ -255,21 +262,21 @@ Int PlaYUVerTools::QualityOperation() } for( UInt frame = 0; frame < m_uiNumberOfFrames; frame++ ) { - printf( " %3d", frame ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, " %3d", frame ); for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) apcCurrFrame[s] = m_apcInputStreams[s]->getCurrFrame(); for( UInt s = 1; s < m_apcInputStreams.size(); s++ ) { - printf( " " ); + m_cCmdLineHandler.log( CommandLineHandle::RESULT, " " ); for( UInt c = 0; c < m_uiNumberOfComponents; c++ ) { dQuality = apcCurrFrame[s]->getQuality( m_uiQualityMetric, apcCurrFrame[0], c ); adAverageQuality[s - 1][c] = ( adAverageQuality[s - 1][c] * Double( frame ) + dQuality ) / Double( frame + 1 ); - printf( " %5.3f", dQuality ); + m_cCmdLineHandler.log( CommandLineHandle::RESULT, " %5.3f", dQuality ); } } - printf( "\n" ); + m_cCmdLineHandler.log( CommandLineHandle::RESULT, "\n" ); for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) { abEOF[s] = m_apcInputStreams[s]->setNextFrame(); @@ -279,15 +286,15 @@ Int PlaYUVerTools::QualityOperation() } } } - printf( "\n Mean Values: \n " ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, "\n Mean Values: \n " ); for( UInt s = 0; s < m_apcInputStreams.size() - 1; s++ ) { for( UInt c = 0; c < m_uiNumberOfComponents; c++ ) { - printf( " %5.3f", adAverageQuality[s][c] ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, " %5.3f", adAverageQuality[s][c] ); } } - printf( "\n" ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, "\n" ); return 0; } @@ -311,7 +318,7 @@ PlaYUVerFrame* PlaYUVerTools::applyFrameModule() Int PlaYUVerTools::ModuleOperation() { - printf( " Applying Module %s/%s ... \n", m_pcCurrModuleIf->m_pchModuleCategory, m_pcCurrModuleIf->m_pchModuleName ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, " Applying Module %s/%s ...\n", m_pcCurrModuleIf->m_pchModuleCategory, m_pcCurrModuleIf->m_pchModuleName ); PlaYUVerFrame* pcProcessedFrame = NULL; Double dMeasurementResult = 0.0; @@ -329,7 +336,7 @@ Int PlaYUVerTools::ModuleOperation() if( m_pcCurrModuleIf->m_iModuleType == FRAME_PROCESSING_MODULE ) { pcProcessedFrame = applyFrameModule(); - m_apcInputStreams[0]->writeFrame( pcProcessedFrame ); + m_apcOutputStreams[0]->writeFrame( pcProcessedFrame ); } else if( m_pcCurrModuleIf->m_iModuleType == FRAME_MEASUREMENT_MODULE ) { @@ -342,7 +349,8 @@ Int PlaYUVerTools::ModuleOperation() dMeasurementResult = m_pcCurrModuleIf->measure( m_apcInputStreams[0]->getCurrFrame(), m_apcInputStreams[1]->getCurrFrame() ); break; } - printf( " %3d %8.3f \n", frame, dMeasurementResult ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, " %3d", frame ); + m_cCmdLineHandler.log( CommandLineHandle::RESULT, " %8.3f \n", dMeasurementResult ); dAveragedMeasurementResult = ( dAveragedMeasurementResult * Double( frame ) + dMeasurementResult ) / Double( frame + 1 ); } @@ -354,12 +362,11 @@ Int PlaYUVerTools::ModuleOperation() m_apcInputStreams[s]->readFrame(); } } - } if( m_pcCurrModuleIf->m_iModuleType == FRAME_MEASUREMENT_MODULE ) { - printf( "\n Mean Value: \n %8.3f\n", dAveragedMeasurementResult ); + m_cCmdLineHandler.log( CommandLineHandle::INFO, "\n Mean Value: \n %8.3f\n", dAveragedMeasurementResult ); } return 0; diff --git a/tools/PlaYUVerTools.h b/tools/PlaYUVerTools.h index 905b825..966e366 100644 --- a/tools/PlaYUVerTools.h +++ b/tools/PlaYUVerTools.h @@ -47,7 +47,8 @@ public: Int Close(); private: - CommandLineHandle m_cCommandLineParser; + CommandLineHandle m_cCmdLineHandler; + Bool m_bVerbose; UInt m_uiOperation; enum TOOLS_OPERATIONS_LIST diff --git a/tools/main.cpp b/tools/main.cpp index 4c31c20..cf3140a 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -39,19 +39,19 @@ int main( int argc, char *argv[] ) } if( iRet > 1 ) { - printf( "Exiting\n" ); + printf( "Exiting with error \n" ); return 1; } if( PlaYUVerToolsApp.Process() > 1 ) { - printf( "Exiting\n" ); + printf( "Exiting with error \n" ); return 1; } if( PlaYUVerToolsApp.Close() > 1 ) { - printf( "Exiting\n" ); + printf( "Exiting with error \n" ); return 1; }