From 974fa27814931e875e0e050ca3b1f69937a69e23 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sat, 21 Feb 2015 18:10:08 +0000 Subject: [PATCH] Add a small program to test the command line interface using boost lib --- CMakeLists.txt | 4 +++ lib/CMakeLists.txt | 6 +++- lib/PlaYUVerCmdParser.cpp | 53 +++++++++++++++++++++++++++++ lib/PlaYUVerCmdParser.h | 42 +++++++++++++++++++++++ tools/CMakeLists.txt | 22 ++++++++++++ tools/main.cpp | 71 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 lib/PlaYUVerCmdParser.cpp create mode 100644 lib/PlaYUVerCmdParser.h create mode 100644 tools/CMakeLists.txt create mode 100644 tools/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c6557d..0bbb827 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,9 @@ ENDIF() # Dependencies ###################################################################################### +FIND_PACKAGE(Boost COMPONENTS program_options ) +SET_PACKAGE_PROPERTIES(Boost PROPERTIES URL "http://www.boost.org" DESCRIPTION "Boost library support" TYPE REQUIRED) + OPTION( USE_OPENCV "Add OpenCV support" ON ) IF( USE_OPENCV ) FIND_PACKAGE( OpenCV ) @@ -130,6 +133,7 @@ SET( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2" ) ADD_SUBDIRECTORY( lib ) ADD_SUBDIRECTORY( modules ) +ADD_SUBDIRECTORY( tools ) ADD_SUBDIRECTORY( app ) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 72eb6d6..3af29cd 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -4,6 +4,8 @@ INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/../ ) +INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIRS} ) + set(plaYUver_Lib_SRCS # Frame PlaYUVerFrame.cpp @@ -11,6 +13,8 @@ set(plaYUver_Lib_SRCS PlaYUVerFrameStats.cpp # Stream PlaYUVerStream.cpp + # Command Line Parser + PlaYUVerCmdParser.cpp ) IF( USE_FFMPEG ) @@ -38,7 +42,7 @@ CONFIGURE_FILE( PlaYUVerConfig.cmake.in ${CMAKE_BINARY_DIR}/PlaYUVerConfig.cmake ADD_LIBRARY( PlaYUVerLib STATIC ${plaYUver_Lib_SRCS} ) INCLUDE_DIRECTORIES( ${FFMPEG_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ) -TARGET_LINK_LIBRARIES( PlaYUVerLib ${FFMPEG_LIBRARIES} ${OpenCV_LIBRARIES} ) +TARGET_LINK_LIBRARIES( PlaYUVerLib ${FFMPEG_LIBRARIES} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES} ) INSTALL(FILES ${plaYUver_Lib_HEADERS} DESTINATION include ) # INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libPlaYUVerLib${CMAKE_STATIC_LIBRARY_SUFFIX} DESTINATION lib ) diff --git a/lib/PlaYUVerCmdParser.cpp b/lib/PlaYUVerCmdParser.cpp new file mode 100644 index 0000000..a261ff4 --- /dev/null +++ b/lib/PlaYUVerCmdParser.cpp @@ -0,0 +1,53 @@ +/* This file is a part of plaYUVer project + * Copyright (C) 2014-2015 by Luis Lucas (luisfrlucas@gmail.com) + * Joao Carreira (jfmcarreira@gmail.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * \file PlaYUVerCmdParser.cpp + * \brief Command parser + */ + +#include "config.h" +#include +#include +#include "PlaYUVerCmdParser.h" + +namespace plaYUVer +{ + +po::options_description PlaYUVerCmdParser::GetCommandOpts() +{ + po::options_description inputOpts( "Input" ); + inputOpts.add_options() + ( "input,i", po::value(), "input file" ) + ( "width,w", po::value(), "width" ) + ( "height,h", po::value(), "height" ); + + po::options_description operationOpts( "Operation" ); + operationOpts.add_options() + ( "module", po::value(), "select a module" ) + ( "quality", po::value(),"select a quality metric" ); + + po::options_description commonOpts( "Common" ); + commonOpts.add_options() + ( "help", "produce help message" ); + commonOpts.add( inputOpts ).add( operationOpts ); + return commonOpts; +} + +} // NAMESPACE diff --git a/lib/PlaYUVerCmdParser.h b/lib/PlaYUVerCmdParser.h new file mode 100644 index 0000000..7d83161 --- /dev/null +++ b/lib/PlaYUVerCmdParser.h @@ -0,0 +1,42 @@ +/* This file is a part of plaYUVer project + * Copyright (C) 2014-2015 by Luis Lucas (luisfrlucas@gmail.com) + * Joao Carreira (jfmcarreira@gmail.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * \file PlaYUVerCmdParser.h + * \brief Command parser + */ + +#include "PlaYUVerDefs.h" +#include +namespace po = boost::program_options; + +namespace plaYUVer +{ + +class PlaYUVerCmdParser +{ +public: + PlaYUVerCmdParser() {} ; + ~PlaYUVerCmdParser() {} ; + + static po::options_description GetCommandOpts(); + +}; + +} // NAMESPACE diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 0000000..e6dcc56 --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,22 @@ +### +### CMakeLists for playuver app component +### + +# This is hard way - please fix +INCLUDE_DIRECTORIES( + ${CMAKE_CURRENT_BINARY_DIR}/../ + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../ ) + +set(plaYUver_Tools_SRCS +# Main + main.cpp +) + +ADD_EXECUTABLE( ${PROJECT_NAME}Tools ${plaYUver_Tools_SRCS} ) + +TARGET_LINK_LIBRARIES( ${PROJECT_NAME}Tools PlaYUVerLib PlaYUVerModules ) + +INSTALL(TARGETS ${PROJECT_NAME}Tools DESTINATION bin ) + + diff --git a/tools/main.cpp b/tools/main.cpp new file mode 100644 index 0000000..7a659dd --- /dev/null +++ b/tools/main.cpp @@ -0,0 +1,71 @@ +/* This file is a part of plaYUVer project + * Copyright (C) 2014 by Luis Lucas (luisfrlucas@gmail.com) + * Joao Carreira (jfmcarreira@gmail.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** + * \file main.cpp + * \brief main file + */ + +#include +#include +#include + +using namespace plaYUVer; +using namespace std; + +int main( int argc, char *argv[] ) +{ + + try + { + + po::options_description toolsOpt; + toolsOpt.add( PlaYUVerCmdParser::GetCommandOpts() ); + po::variables_map vm; + po::store( po::parse_command_line( argc, argv, toolsOpt ), vm ); + po::notify( vm ); + + if( vm.count( "help" ) ) + { + cout << toolsOpt << "\n"; + return 0; + } + + if( vm.count( "compression" ) ) + { + cout << "Compression level was set to " << vm["compression"].as() << ".\n"; + } + else + { + cout << "Compression level was not set.\n"; + } + } + catch( exception& e ) + { + cerr << "error: " << e.what() << "\n"; + return 1; + } + catch( ... ) + { + cerr << "Exception of unknown type!\n"; + } + + PlaYUVerFrame pcFrameBuffer = new PlaYUVerFrame( 1024, 768, PlaYUVerFrame::YUV420p ); + return 0; +}