diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 38baca5..06e0a68 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,6 +34,9 @@ jobs: - name: Build without threads run: cmake -B ${{github.workspace}}/build -D CMAKE_C_COMPILER=gcc-10 -D CMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DUSE_WERROR=ON -DCALYP_MANAGED_RESOURCES=OFF -DCALYP_THREADED_MODULES=OFF; cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + - name: Build without threads + run: cmake -B ${{github.workspace}}/build -D CMAKE_C_COMPILER=gcc-10 -D CMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DUSE_WERROR=ON -DUSE_OPENCV=OFF -DUSE_FFMPEG=OFF; cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + check-tests: runs-on: ubuntu-latest steps: diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b4ab8e..956ab8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,7 +104,7 @@ SET(UPDATE_CHANNEL # #################################################################################################################################################### INCLUDE(FetchContent) -SET(FETCHCONTENT_BASE_DIR "${CMAKE_BINARY_DIR}/deps") +SET(FETCHCONTENT_BASE_DIR "${CMAKE_BINARY_DIR}/deps") # Doxygen IF(BUILD_DOC) @@ -118,24 +118,6 @@ SET_PACKAGE_PROPERTIES( TYPE OPTIONAL ) -# Type safe -FETCHCONTENT_DECLARE( - type_safe - GIT_REPOSITORY https://github.com/foonathan/type_safe - GIT_TAG v0.2.2 - SOURCE_DIR "${CMAKE_BINARY_DIR}/deps/type_safe" -) - -SET_PACKAGE_PROPERTIES( - type_safe PROPERTIES - URL "https://github.com/foonathan/type_safe" - DESCRIPTION "Zero overhead abstractions that use the C++ type system to prevent bugs." - TYPE REQUIRED -) -FETCHCONTENT_MAKEAVAILABLE(type_safe) -INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/deps/type_safe/include/ ${CMAKE_BINARY_DIR}/deps/type_safe/external/debug_assert/) -ADD_DEFINITIONS(-DTYPE_SAFE_ENABLE_ASSERTIONS=0 -DTYPE_SAFE_ENABLE_PRECONDITION_CHECKS=0 -DDEBUG_ASSERT_DISABLE) - # Catch2 and Google Tests IF(BUILD_TESTS) FETCHCONTENT_DECLARE(googletest URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip) @@ -175,7 +157,6 @@ IF(BUILD_TESTS) ) ENDIF() - # OpenCV OPTION(USE_OPENCV "Add OpenCV support" ON) IF(USE_OPENCV) diff --git a/app/CalypAppModuleIf.cpp b/app/CalypAppModuleIf.cpp index d7dadb8..200c48b 100644 --- a/app/CalypAppModuleIf.cpp +++ b/app/CalypAppModuleIf.cpp @@ -131,7 +131,7 @@ bool CalypAppModuleIf::apply( bool isPlaying, bool disableThreads ) } } - if( !( isPlaying && m_pcModule->m_uiModuleRequirements.is_set( ClpModuleFeature::SkipWhilePlaying ) ) ) + if( !( isPlaying && m_pcModule->has( ClpModuleFeature::SkipWhilePlaying ) ) ) { m_frameList.clear(); for( unsigned int i = 0; i < m_pcModule->m_uiNumberOfFrames; i++ ) diff --git a/app/CalypAppModuleIf.h b/app/CalypAppModuleIf.h index 6fe7bce..bea2a9f 100644 --- a/app/CalypAppModuleIf.h +++ b/app/CalypAppModuleIf.h @@ -81,12 +81,11 @@ public: auto getSubWindowList() const -> const std::vector& { return m_pcSubWindow; } CalypModuleIf* getModule() { return m_pcModule.get(); } - auto getModuleRequirements() const -> ClpModuleFeatures { return m_pcModule->m_uiModuleRequirements; } + auto hasFeature( ClpModuleFeature feature ) const -> bool { return m_pcModule->has( feature ); } std::string moduleInfo() const { return m_pcModule->moduleInfo(); } void update( bool isPlaying ); bool apply( bool isPlaying = false, bool disableThreads = false ); bool process(); - // void setPlaying( bool isPlaying ); bool isRunning() const; void show(); void disable(); diff --git a/app/ModuleSubWindow.cpp b/app/ModuleSubWindow.cpp index c9dca3c..1408238 100644 --- a/app/ModuleSubWindow.cpp +++ b/app/ModuleSubWindow.cpp @@ -69,7 +69,7 @@ void ModuleSubWindow::updateVideoWindowInfo() } } } - if( module_ptr->getModuleRequirements().is_set( ClpModuleFeature::HasInfo ) ) + if( module_ptr->hasFeature( ClpModuleFeature::HasInfo ) ) { QStringList list = QString::fromStdString( module_ptr->moduleInfo() ).split( '\n' ); windowInfoList.append( list ); diff --git a/app/ModulesHandle.cpp b/app/ModulesHandle.cpp index 6050b91..cf9bf07 100644 --- a/app/ModulesHandle.cpp +++ b/app/ModulesHandle.cpp @@ -283,7 +283,7 @@ void ModulesHandle::activateModule() { int minNumFrames = numberOfFrames; int maxNumFrames = numberOfFrames; - if( pcCurrAppModuleIf->m_pcModule->m_uiModuleRequirements.is_set( ClpModuleFeature::VariableNumOfFrames ) ) + if( pcCurrAppModuleIf->m_pcModule->has( ClpModuleFeature::VariableNumOfFrames ) ) { minNumFrames = numberOfFrames; maxNumFrames = 255; @@ -356,7 +356,7 @@ void ModulesHandle::activateModule() pcCurrAppModuleIf->m_pcSubWindow[i] = videoSubWindowList.at( i ); } - if( pcCurrAppModuleIf->m_pcModule->m_uiModuleRequirements.is_set( ClpModuleFeature::Options ) ) + if( pcCurrAppModuleIf->m_pcModule->has( ClpModuleFeature::Options ) ) { ModulesHandleOptDialog moduleOptDialog( m_pcParent, pcCurrAppModuleIf.get() ); if( moduleOptDialog.runConfiguration() == QDialog::Rejected ) @@ -373,7 +373,7 @@ void ModulesHandle::activateModule() if( pcCurrAppModuleIf->m_pcModule->m_iModuleType == ClpModuleType::FrameProcessing ) { - if( bShowModulesNewWindow || pcCurrAppModuleIf->m_pcModule->m_uiModuleRequirements.is_set( ClpModuleFeature::NewWindow ) ) + if( bShowModulesNewWindow || pcCurrAppModuleIf->m_pcModule->has( ClpModuleFeature::NewWindow ) ) { auto pcModuleSubWindow = new ModuleSubWindow( pcCurrAppModuleIf.get() ); pcModuleSubWindow->resetWindowName(); diff --git a/app/VideoStreamSubWindow.cpp b/app/VideoStreamSubWindow.cpp index f844c2c..704029c 100644 --- a/app/VideoStreamSubWindow.cpp +++ b/app/VideoStreamSubWindow.cpp @@ -121,7 +121,7 @@ void VideoStreamSubWindow::updateVideoWindowInfo() } } } - if( m_pcDisplayModule->getModuleRequirements() & ClpModuleFeature::HasInfo ) + if( m_pcDisplayModule->hasFeature( ClpModuleFeature::HasInfo ) ) { QStringList list = QString::fromStdString( m_pcDisplayModule->moduleInfo() ).split( '\n' ); windowInfoList.append( list ); diff --git a/app/VideoSubWindow.cpp b/app/VideoSubWindow.cpp index 4b8486c..95e97e7 100644 --- a/app/VideoSubWindow.cpp +++ b/app/VideoSubWindow.cpp @@ -156,7 +156,7 @@ void VideoSubWindow::keyPressEvent( QKeyEvent* event ) { if( m_pcDisplayModule ) { - if( m_pcDisplayModule->getModuleRequirements().is_set( ClpModuleFeature::KeysShortcuts ) ) + if( m_pcDisplayModule->hasFeature( ClpModuleFeature::KeysShortcuts ) ) { bool bRet = false; switch( event->key() ) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index c31049a..0fef6e8 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -22,7 +22,7 @@ SET(Calyp_Lib_Stream_SRCS SET(Calyp_Lib_OptionParser_SRCS CalypOptions.h CalypOptions.cpp) -SET(Calyp_Lib_Modules_SRCS CalypOptions.h CalypOptions.cpp) +SET(Calyp_Lib_Modules_SRCS CalypModuleIf.h CalypModuleIf.cpp) SET(Calyp_Lib_SRCS CalypLib.h CalypDefs.h ${Calyp_Lib_Frame_SRCS} ${Calyp_Lib_Stream_SRCS} ${Calyp_Lib_OptionParser_SRCS} ${Calyp_Lib_Modules_SRCS}) @@ -44,8 +44,6 @@ IF(USE_OPENCV) LIST(APPEND Calyp_Lib_SRCS StreamHandlerOpenCV.h) LIST(APPEND Calyp_Lib_SRCS StreamHandlerOpenCV.cpp) - LIST(APPEND Calyp_Lib_SRCS CalypOpenCVModuleIf.cpp) - LIST(APPEND CMAKE_CFG_LINKER_LIBSS ${OpenCV_LIBRARIES}) LIST(APPEND CMAKE_CFG_INCLUDE_DIRS ${OpenCV_INCLUDE_DIRS}) diff --git a/lib/CalypDefs.h b/lib/CalypDefs.h index af43923..b816545 100644 --- a/lib/CalypDefs.h +++ b/lib/CalypDefs.h @@ -20,7 +20,7 @@ /** * \file CalypDefs.h * \ingroup CalypLibGrp - * \brief Define basic types, new types and enumerations + * \brief Define basic types, new types and enumerations (private use only) */ #ifndef __CALYPDEFS_H__ diff --git a/lib/CalypOpenCVModuleIf.cpp b/lib/CalypModuleIf.cpp similarity index 71% rename from lib/CalypOpenCVModuleIf.cpp rename to lib/CalypModuleIf.cpp index 1defa0f..6c0af88 100644 --- a/lib/CalypOpenCVModuleIf.cpp +++ b/lib/CalypModuleIf.cpp @@ -22,16 +22,17 @@ * \brief Calyp modules interface for OpenCV */ -#include "CalypFrame.h" #include "CalypModuleIf.h" -// OpenCV #include +#include "CalypFrame.h" #include "PixelFormats.h" +#include "config.h" bool CalypOpenCVModuleIf::create( std::vector apcFrameList ) { +#ifdef USE_OPENCV _BASIC_MODULE_API_2_CHECK_ bool bRet = false; std::vector acMatList( apcFrameList.size() ); @@ -51,10 +52,14 @@ bool CalypOpenCVModuleIf::create( std::vector apcFrameList ) return false; } return bRet; +#else + return false; +#endif } CalypFrame* CalypOpenCVModuleIf::process( std::vector apcFrameList ) { +#ifdef USE_OPENCV m_pcOutputFrame->reset(); std::vector acMatList( apcFrameList.size() ); for( unsigned i = 0; i < apcFrameList.size(); i++ ) @@ -64,8 +69,35 @@ CalypFrame* CalypOpenCVModuleIf::process( std::vector apcFrameList Mat* cvOutput = process_using_opencv( acMatList ); m_pcOutputFrame->fromMat( *cvOutput ); return m_pcOutputFrame.get(); +#else + return nullptr; +#endif } void CalypOpenCVModuleIf::destroy() { } + +ClpModuleFeature operator|( ClpModuleFeature lhs, ClpModuleFeature rhs ) +{ + return static_cast( + static_cast>( lhs ) | + static_cast>( rhs ) ); +} + +ClpModuleFeature operator&( ClpModuleFeature lhs, ClpModuleFeature rhs ) +{ + return static_cast( + static_cast>( lhs ) & + static_cast>( rhs ) ); +} + +auto CalypModuleIf::getModuleLongName() -> const char* +{ + return m_pchModuleLongName ? m_pchModuleLongName : m_pchModuleName; +} + +auto CalypModuleIf::has( ClpModuleFeature feature ) -> bool +{ + return ( m_uiModuleRequirements & feature ) != ClpModuleFeature::None; +} diff --git a/lib/CalypModuleIf.h b/lib/CalypModuleIf.h index 6f4cf97..78912e3 100644 --- a/lib/CalypModuleIf.h +++ b/lib/CalypModuleIf.h @@ -35,7 +35,6 @@ */ #include -#include #include #include "CalypFrame.h" @@ -95,19 +94,18 @@ enum class ClpModuleType : std::uint8_t * Features/Requirements of a module * @see m_uiModuleRequirements */ -enum class ClpModuleFeature +enum class ClpModuleFeature : std::uint64_t { - None, - SkipWhilePlaying, - Options, - NewWindow, - KeysShortcuts, - VariableNumOfFrames, - HasInfo, - _flag_set_size + None = 0, + SkipWhilePlaying = 1, + Options = 2, + NewWindow = 4, + KeysShortcuts = 8, + VariableNumOfFrames = 16, + HasInfo = 32, }; -using ClpModuleFeatures = type_safe::flag_set; +auto operator|( ClpModuleFeature lhs, ClpModuleFeature rhs ) -> ClpModuleFeature; enum Module_Key_Supported { @@ -117,6 +115,8 @@ enum Module_Key_Supported MODULE_KEY_DOWN, }; +class CalypFrame; + /** * \class CalypModuleIf * \ingroup CalypLib Calyp_Modules @@ -134,10 +134,8 @@ public: virtual ~CalypModuleIf() = default; virtual void destroy(){}; - const char* getModuleLongName() - { - return m_pchModuleLongName ? m_pchModuleLongName : m_pchModuleName; - } + auto getModuleLongName() -> const char*; + auto has( ClpModuleFeature feature ) -> bool; /** * Module API version 1 @@ -175,7 +173,7 @@ public: //! Number of frames unsigned int m_uiNumberOfFrames{ 1 }; //! Features/Requirements - ClpModuleFeatures m_uiModuleRequirements{ ClpModuleFeature::None }; + ClpModuleFeature m_uiModuleRequirements{ ClpModuleFeature::None }; unsigned int m_iFrameBufferCount{ 0 }; @@ -197,7 +195,7 @@ class CalypOpenCVModuleIf : public CalypModuleIf using Mat = cv::Mat; public: - CalypOpenCVModuleIf() { m_bConvertToGray = false; }; + CalypOpenCVModuleIf() = default; virtual ~CalypOpenCVModuleIf() {} // Common API @@ -216,7 +214,7 @@ public: protected: // const char* m_pchPythonFunctionName; std::unique_ptr m_pcOutputFrame; - bool m_bConvertToGray; + bool m_bConvertToGray{ false }; }; using CalypModulePtr = std::unique_ptr; diff --git a/lib/CalypOptions.cpp b/lib/CalypOptions.cpp index fdcd2a7..fa584e3 100644 --- a/lib/CalypOptions.cpp +++ b/lib/CalypOptions.cpp @@ -38,12 +38,13 @@ #include "CalypOptions.h" -#include +#include #include #include #include #include "config.h" +#include "lib/CalypFrame.h" #include "lib/CalypModuleIf.h" struct ParseFailure : public std::exception diff --git a/lib/CalypOptions.h b/lib/CalypOptions.h index c56fca4..bb8a864 100644 --- a/lib/CalypOptions.h +++ b/lib/CalypOptions.h @@ -42,10 +42,10 @@ #include #include +#include +#include #include -#include "CalypDefs.h" - /** * \class CalypOptions * \ingroup CalypLibGrp diff --git a/modules/FilterComponent.h b/modules/FilterComponent.h index 7971b7e..2cb1ff7 100644 --- a/modules/FilterComponent.h +++ b/modules/FilterComponent.h @@ -26,6 +26,7 @@ #define __FILTERCOMPONENT_H__ // CalypLib +#include "lib/CalypFrame.h" #include "lib/CalypModuleIf.h" class FilterComponentModule : public CalypModuleIf diff --git a/modules/FrameDifference.cpp b/modules/FrameDifference.cpp index b4fa6f0..0cae434 100644 --- a/modules/FrameDifference.cpp +++ b/modules/FrameDifference.cpp @@ -24,6 +24,8 @@ #include "FrameDifference.h" +#include "lib/CalypFrame.h" + FrameDifference::FrameDifference() { /* Module Definition */ diff --git a/modules/FrameMask.cpp b/modules/FrameMask.cpp index 5bbf606..6705404 100644 --- a/modules/FrameMask.cpp +++ b/modules/FrameMask.cpp @@ -24,6 +24,8 @@ #include "FrameMask.h" +#include "lib/CalypFrame.h" + FrameMask::FrameMask() { /* Module Definition */ diff --git a/modules/InterFrameVariance.h b/modules/InterFrameVariance.h index 93f7110..013794a 100644 --- a/modules/InterFrameVariance.h +++ b/modules/InterFrameVariance.h @@ -26,6 +26,7 @@ #define __INTERFRAMEVARIANCE_H__ // CalypLib +#include "lib/CalypFrame.h" #include "lib/CalypModuleIf.h" class InterFrameVariance : public CalypModuleIf diff --git a/tools/CalypTools.cpp b/tools/CalypTools.cpp index d88a28e..29a80ca 100644 --- a/tools/CalypTools.cpp +++ b/tools/CalypTools.cpp @@ -319,7 +319,7 @@ int CalypTools::Open( int argc, char* argv[] ) return -1; } - if( m_pcCurrModuleIf->m_uiModuleRequirements & ClpModuleFeature::VariableNumOfFrames ) + if( m_pcCurrModuleIf->has( ClpModuleFeature::VariableNumOfFrames ) ) { m_pcCurrModuleIf->m_uiNumberOfFrames = m_apcInputStreams.size(); } diff --git a/tools/CalypToolsCmdParser.h b/tools/CalypToolsCmdParser.h index b50c601..82ab262 100644 --- a/tools/CalypToolsCmdParser.h +++ b/tools/CalypToolsCmdParser.h @@ -28,6 +28,7 @@ #include #include "config.h" +#include "lib/CalypDefs.h" #include "lib/CalypOptions.h" class CalypToolsCmdParser