diff --git a/app/ModulesHandle.cpp b/app/ModulesHandle.cpp index ef4d3a0..7a4d21b 100644 --- a/app/ModulesHandle.cpp +++ b/app/ModulesHandle.cpp @@ -164,24 +164,23 @@ Void ModulesHandle::updateMenus() { m_arrayActions.at( i )->setEnabled( false ); } - m_arrayActions[DISABLE_ACT]->setEnabled( hasSubWindow ); - m_arrayActions[DISABLE_ALL_ACT]->setEnabled( hasSubWindow ); m_arrayActions[FORCE_NEW_WINDOW_ACT]->setEnabled( hasSubWindow ); + m_arrayActions[DISABLE_ALL_ACT]->setEnabled( m_pcPlaYUVerAppModuleIfList.size() > 0 ); + if( pcSubWindow ) { QList apcCurrentModule = pcSubWindow->getModuleArray(); + m_arrayActions[DISABLE_ACT]->setEnabled( apcCurrentModule.size() > 0 ); if( pcSubWindow->getDisplayModule() ) { m_arrayActions[APPLY_ALL_ACT]->setEnabled( true ); m_arrayActions[SWAP_FRAMES_ACT]->setEnabled( true ); - apcCurrentModule.append( pcSubWindow->getDisplayModule() ); } for( Int i = 0; i < apcCurrentModule.size(); i++ ) { currModuleAction = apcCurrentModule.at( i )->m_pcModuleAction; currModuleAction->setChecked( true ); } - } } @@ -315,6 +314,31 @@ Void ModulesHandle::enableModuleIf( PlaYUVerAppModuleIf *pcCurrModuleIf ) ModulesHandleOptDialog moduleOptDialog( m_pcParent, pcCurrModuleIf ); moduleOptDialog.runConfiguration(); } + + // Create Module + Bool moduleCreated = false; + if( pcCurrModuleIf->m_pcModule->m_iModuleAPI == MODULE_API_2 ) + { + std::vector apcFrameList; + for( UInt i = 0; i < pcCurrModuleIf->m_pcModule->m_uiNumberOfFrames; i++ ) + { + apcFrameList.push_back( pcCurrModuleIf->m_pcSubWindow[i]->getCurrFrame() ); + } + moduleCreated = pcCurrModuleIf->m_pcModule->create( apcFrameList ); + } + else if( pcCurrModuleIf->m_pcModule->m_iModuleAPI == MODULE_API_1 ) + { + pcCurrModuleIf->m_pcModule->create( pcCurrModuleIf->m_pcSubWindow[0]->getCurrFrame() ); + moduleCreated = true; + } + + if( !moduleCreated ) + { + qobject_cast( m_pcParent )->statusBar()->showMessage( "Error! Module cannot be applied", 2000 ); + destroyModuleIf( pcCurrModuleIf ); + return; + } + if( pcCurrModuleIf->m_pcModule->m_iModuleType == FRAME_PROCESSING_MODULE ) { if( ( pcCurrModuleIf->m_pcModule->m_uiModuleRequirements & MODULE_REQUIRES_NEW_WINDOW ) || bShowModulesNewWindow ) @@ -346,9 +370,6 @@ Void ModulesHandle::enableModuleIf( PlaYUVerAppModuleIf *pcCurrModuleIf ) qobject_cast( m_pcParent )->addDockWidget( Qt::RightDockWidgetArea, pcCurrModuleIf->m_pcDockWidget ); } - // Create Module - pcCurrModuleIf->m_pcModule->create( pcCurrModuleIf->m_pcSubWindow[0]->getCurrFrame() ); - // Associate module with subwindows if( !pcCurrModuleIf->m_pcDisplaySubWindow && !pcCurrModuleIf->m_pcModuleDock ) { diff --git a/app/ModulesHandle.h b/app/ModulesHandle.h index 4329111..498a281 100644 --- a/app/ModulesHandle.h +++ b/app/ModulesHandle.h @@ -82,7 +82,6 @@ private: QMenu* m_pcModulesMenu; QList m_pcModulesSubMenuList; - QList m_pcPlaYUVerModulesIfList; QList m_pcPlaYUVerAppModuleIfList; QVector m_arrayModulesActions; diff --git a/app/PlaYUVerAppModuleIf.cpp b/app/PlaYUVerAppModuleIf.cpp index 5145312..37ab439 100644 --- a/app/PlaYUVerAppModuleIf.cpp +++ b/app/PlaYUVerAppModuleIf.cpp @@ -47,37 +47,52 @@ PlaYUVerAppModuleIf::PlaYUVerAppModuleIf( QObject* parent, QAction* action, PlaY void PlaYUVerAppModuleIf::run() { + m_pcProcessedFrame = NULL; m_dMeasurementResult = 0; + std::vector apcFrameList; + for( UInt i = 0; i < m_pcModule->m_uiNumberOfFrames; i++ ) + { + apcFrameList.push_back( m_pcSubWindow[i]->getCurrFrame() ); + } + if( m_pcModule->m_iModuleType == FRAME_PROCESSING_MODULE ) { - switch( m_pcModule->m_uiNumberOfFrames ) + if( m_pcModule->m_iModuleAPI == MODULE_API_2 ) { - case MODULE_REQUIRES_ONE_FRAME: - m_pcProcessedFrame = m_pcModule->process( m_pcSubWindow[0]->getCurrFrame() ); - break; - case MODULE_REQUIRES_TWO_FRAMES: - m_pcProcessedFrame = m_pcModule->process( m_pcSubWindow[0]->getCurrFrame(), m_pcSubWindow[1]->getCurrFrame() ); - break; - case MODULE_REQUIRES_THREE_FRAMES: - m_pcProcessedFrame = m_pcModule->process( m_pcSubWindow[0]->getCurrFrame(), m_pcSubWindow[1]->getCurrFrame(), m_pcSubWindow[2]->getCurrFrame() ); - break; + m_pcProcessedFrame = m_pcModule->process( apcFrameList ); + } + else + { + switch( m_pcModule->m_uiNumberOfFrames ) + { + case MODULE_REQUIRES_ONE_FRAME: + m_pcProcessedFrame = m_pcModule->process( m_pcSubWindow[0]->getCurrFrame() ); + break; + case MODULE_REQUIRES_TWO_FRAMES: + m_pcProcessedFrame = m_pcModule->process( m_pcSubWindow[0]->getCurrFrame(), m_pcSubWindow[1]->getCurrFrame() ); + break; + } } } else if( m_pcModule->m_iModuleType == FRAME_MEASUREMENT_MODULE ) { - switch( m_pcModule->m_uiNumberOfFrames ) + if( m_pcModule->m_iModuleAPI == MODULE_API_2 ) { - case MODULE_REQUIRES_ONE_FRAME: - m_dMeasurementResult = m_pcModule->measure( m_pcSubWindow[0]->getCurrFrame() ); - break; - case MODULE_REQUIRES_TWO_FRAMES: - m_dMeasurementResult = m_pcModule->measure( m_pcSubWindow[0]->getCurrFrame(), m_pcSubWindow[1]->getCurrFrame() ); - break; - case MODULE_REQUIRES_THREE_FRAMES: - m_dMeasurementResult = m_pcModule->measure( m_pcSubWindow[0]->getCurrFrame(), m_pcSubWindow[1]->getCurrFrame(), m_pcSubWindow[2]->getCurrFrame() ); - break; + m_dMeasurementResult = m_pcModule->measure( apcFrameList ); + } + else + { + switch( m_pcModule->m_uiNumberOfFrames ) + { + case MODULE_REQUIRES_ONE_FRAME: + m_dMeasurementResult = m_pcModule->measure( m_pcSubWindow[0]->getCurrFrame() ); + break; + case MODULE_REQUIRES_TWO_FRAMES: + m_dMeasurementResult = m_pcModule->measure( m_pcSubWindow[0]->getCurrFrame(), m_pcSubWindow[1]->getCurrFrame() ); + break; + } } } else diff --git a/app/VideoSubWindow.h b/app/VideoSubWindow.h index d714614..0da9fd1 100644 --- a/app/VideoSubWindow.h +++ b/app/VideoSubWindow.h @@ -189,7 +189,11 @@ public: QList getModuleArray() { - return m_apcCurrentModule; + QList apcModulesArray; + if( m_pcCurrentDisplayModule ) + apcModulesArray.append( m_pcCurrentDisplayModule ); + apcModulesArray.append( m_apcCurrentModule ); + return apcModulesArray; } Void setTool( UInt uiTool ) diff --git a/modules/AbsoluteFrameDifference.cpp b/modules/AbsoluteFrameDifference.cpp index d0c1405..46130b0 100644 --- a/modules/AbsoluteFrameDifference.cpp +++ b/modules/AbsoluteFrameDifference.cpp @@ -31,6 +31,7 @@ namespace plaYUVer AbsoluteFrameDifference::AbsoluteFrameDifference() { /* Module Definition */ + m_iModuleAPI = MODULE_API_2; m_iModuleType = FRAME_PROCESSING_MODULE; m_pchModuleCategory = "Measurements"; m_pchModuleName = "AbsoluteFrameDifference"; @@ -40,13 +41,16 @@ AbsoluteFrameDifference::AbsoluteFrameDifference() m_pcFrameDifference = NULL; } -Void AbsoluteFrameDifference::create( PlaYUVerFrame* Input ) +Bool AbsoluteFrameDifference::create( std::vector apcFrameList ) { - m_pcFrameDifference = new PlaYUVerFrame( Input->getWidth(), Input->getHeight(), PlaYUVerFrame::GRAY ); + m_pcFrameDifference = new PlaYUVerFrame( apcFrameList[0]->getWidth(), apcFrameList[0]->getHeight(), PlaYUVerFrame::GRAY ); + return true; } -PlaYUVerFrame* AbsoluteFrameDifference::process( PlaYUVerFrame* Input1, PlaYUVerFrame* Input2 ) +PlaYUVerFrame* AbsoluteFrameDifference::process( std::vector apcFrameList ) { + PlaYUVerFrame* Input1 = apcFrameList[0]; + PlaYUVerFrame* Input2 = apcFrameList[1]; Pel* pInput1PelYUV = Input1->getPelBufferYUV()[0][0]; Pel* pInput2PelYUV = Input2->getPelBufferYUV()[0][0]; Pel* pOutputPelYUV = m_pcFrameDifference->getPelBufferYUV()[0][0]; diff --git a/modules/AbsoluteFrameDifference.h b/modules/AbsoluteFrameDifference.h index 6f4c543..434d61a 100644 --- a/modules/AbsoluteFrameDifference.h +++ b/modules/AbsoluteFrameDifference.h @@ -34,7 +34,7 @@ namespace plaYUVer class AbsoluteFrameDifference: public PlaYUVerModuleIf { - REGISTER_CLASS_FACTORY( AbsoluteFrameDifference ) +REGISTER_CLASS_FACTORY( AbsoluteFrameDifference ) private: PlaYUVerFrame* m_pcFrameDifference; @@ -44,8 +44,8 @@ public: virtual ~AbsoluteFrameDifference() { } - Void create( PlaYUVerFrame* Input ); - PlaYUVerFrame* process( PlaYUVerFrame* Input1, PlaYUVerFrame* Input2 ); + Bool create( std::vector apcFrameList ); + PlaYUVerFrame* process( std::vector apcFrameList ); Void destroy(); }; diff --git a/modules/DisparityStereoVar.cpp b/modules/DisparityStereoVar.cpp index 210bc17..424cdf9 100644 --- a/modules/DisparityStereoVar.cpp +++ b/modules/DisparityStereoVar.cpp @@ -32,6 +32,7 @@ namespace plaYUVer DisparityStereoVar::DisparityStereoVar() { /* Module Definition */ + m_iModuleAPI = MODULE_API_2; m_iModuleType = FRAME_PROCESSING_MODULE; m_pchModuleCategory = "Disparity"; m_pchModuleName = "StereoVar"; @@ -54,24 +55,27 @@ DisparityStereoVar::DisparityStereoVar() m_cStereoVar.flags = m_cStereoVar.USE_SMART_ID | m_cStereoVar.USE_AUTO_PARAMS | m_cStereoVar.USE_INITIAL_DISPARITY | m_cStereoVar.USE_MEDIAN_FILTERING; } -Void DisparityStereoVar::create( PlaYUVerFrame* InputFrame ) +Bool DisparityStereoVar::create( std::vector apcFrameList ) { - m_pcDisparityFrame = new PlaYUVerFrame( InputFrame->getWidth(), InputFrame->getHeight(), PlaYUVerFrame::GRAY ); - m_cStereoVar.minDisp = -( ( ( InputFrame->getWidth() / 8 ) + 15 ) & -16 ); + m_pcDisparityFrame = new PlaYUVerFrame( apcFrameList[0]->getWidth(), apcFrameList[0]->getHeight(), PlaYUVerFrame::GRAY ); + m_cStereoVar.minDisp = -( ( ( apcFrameList[0]->getWidth() / 8 ) + 15 ) & -16 ); + return true; } - -PlaYUVerFrame* DisparityStereoVar::process( PlaYUVerFrame* InputLeft, PlaYUVerFrame* InputRight ) +PlaYUVerFrame* DisparityStereoVar::process( std::vector apcFrameList ) { + PlaYUVerFrame* InputLeft = apcFrameList[0]; + PlaYUVerFrame* InputRight = apcFrameList[1]; + cv::Mat* leftImage; - InputLeft->getCvMat( (Void**)&leftImage ); + InputLeft->getCvMat( ( Void** )&leftImage ); cv::Mat* rightImage; - InputRight->getCvMat( (Void**)&rightImage ); + InputRight->getCvMat( ( Void** )&rightImage ); cv::Mat disparityImage, disparityImage8; - m_cStereoVar(*leftImage,*rightImage,disparityImage); - disparityImage.convertTo(disparityImage8,CV_8U); + m_cStereoVar( *leftImage, *rightImage, disparityImage ); + disparityImage.convertTo( disparityImage8, CV_8U ); - m_pcDisparityFrame->fromCvMat( (Void*)&disparityImage8); + m_pcDisparityFrame->fromCvMat( ( Void* )&disparityImage8 ); return m_pcDisparityFrame; } diff --git a/modules/DisparityStereoVar.h b/modules/DisparityStereoVar.h index 3c3b6be..3f7d3e1 100644 --- a/modules/DisparityStereoVar.h +++ b/modules/DisparityStereoVar.h @@ -47,8 +47,8 @@ public: { } - Void create( PlaYUVerFrame* InputFrame ); - PlaYUVerFrame* process( PlaYUVerFrame* InputLeft, PlaYUVerFrame* InputRight ); + Bool create( std::vector apcFrameList ); + PlaYUVerFrame* process( std::vector apcFrameList ); Void destroy(); }; diff --git a/modules/PlaYUVerModuleIf.h b/modules/PlaYUVerModuleIf.h index 527bbda..b6e31d1 100644 --- a/modules/PlaYUVerModuleIf.h +++ b/modules/PlaYUVerModuleIf.h @@ -29,6 +29,7 @@ #include "lib/PlaYUVerFrame.h" #include "lib/PlaYUVerStream.h" #include "lib/ProgramOptions.h" +#include namespace plaYUVer { @@ -38,6 +39,12 @@ public: \ static PlaYUVerModuleIf* Create() { return new X(); } \ void Delete() { delete this; } +enum // Module API +{ + MODULE_API_1, + MODULE_API_2, +}; + enum // Module type { FRAME_PROCESSING_MODULE, @@ -66,6 +73,7 @@ class PlaYUVerModuleIf { public: + Int m_iModuleAPI; Int m_iModuleType; const Char* m_pchModuleCategory; const Char* m_pchModuleName; @@ -77,6 +85,7 @@ public: PlaYUVerModuleIf() { + m_iModuleAPI = MODULE_API_1; } virtual ~PlaYUVerModuleIf() { @@ -90,7 +99,9 @@ public: virtual Void create( PlaYUVerFrame* ) { } - + virtual Bool create( std::vector apcFrameList ) + { + } virtual PlaYUVerFrame* process( PlaYUVerFrame* ) { return NULL; @@ -99,7 +110,7 @@ public: { return NULL; } - virtual PlaYUVerFrame* process( PlaYUVerFrame*, PlaYUVerFrame*, PlaYUVerFrame* ) + virtual PlaYUVerFrame* process( std::vector ) { return NULL; } @@ -112,7 +123,7 @@ public: { return 0; } - virtual Double measure( PlaYUVerFrame*, PlaYUVerFrame*, PlaYUVerFrame* ) + virtual Double measure( std::vector ) { return 0; } diff --git a/tools/PlaYUVerTools.cpp b/tools/PlaYUVerTools.cpp index 07a8f3b..906aad4 100644 --- a/tools/PlaYUVerTools.cpp +++ b/tools/PlaYUVerTools.cpp @@ -178,10 +178,25 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) return 2; } - m_pcCurrModuleIf->create( m_apcInputStreams[0]->getCurrFrame() ); - m_pcCurrModuleIf->m_cModuleOptions.scanArgv( argc, ( const Char** )argv ); + // Create Module + Bool moduleCreated = false; + std::vector apcFrameList; + for( UInt i = 0; i < m_pcCurrModuleIf->m_uiNumberOfFrames; i++ ) + { + apcFrameList.push_back( m_apcInputStreams[i]->getCurrFrame() ); + } + if( m_pcCurrModuleIf->m_iModuleAPI == MODULE_API_2 ) + { + moduleCreated = m_pcCurrModuleIf->create( apcFrameList ); + } + else if( m_pcCurrModuleIf->m_iModuleAPI == MODULE_API_1 ) + { + m_pcCurrModuleIf->create( m_apcInputStreams[0]->getCurrFrame() ); + moduleCreated = true; + } + if( m_pcCurrModuleIf->m_iModuleType == FRAME_PROCESSING_MODULE ) { // Check outputs @@ -191,7 +206,15 @@ Int PlaYUVerTools::Open( Int argc, Char *argv[] ) if( outputFileNames.size() == 1 ) { - PlaYUVerFrame* pcModFrame = applyFrameModule(); + PlaYUVerFrame* pcModFrame; + if( m_pcCurrModuleIf->m_iModuleAPI == MODULE_API_2 ) + { + pcModFrame = m_pcCurrModuleIf->process( apcFrameList ); + } + else + { + pcModFrame = applyFrameModule(); + } PlaYUVerStream* pcModStream = new PlaYUVerStream; if( !pcModStream->open( outputFileNames[0], pcModFrame->getWidth(), pcModFrame->getHeight(), pcModFrame->getPelFormat(), 8, 1, false ) ) { @@ -301,10 +324,6 @@ PlaYUVerFrame* PlaYUVerTools::applyFrameModule() case MODULE_REQUIRES_TWO_FRAMES: pcProcessedFrame = m_pcCurrModuleIf->process( m_apcInputStreams[0]->getCurrFrame(), m_apcInputStreams[1]->getCurrFrame() ); break; - case MODULE_REQUIRES_THREE_FRAMES: - pcProcessedFrame = m_pcCurrModuleIf->process( m_apcInputStreams[0]->getCurrFrame(), m_apcInputStreams[1]->getCurrFrame(), - m_apcInputStreams[2]->getCurrFrame() ); - break; } } return pcProcessedFrame; @@ -312,6 +331,7 @@ PlaYUVerFrame* PlaYUVerTools::applyFrameModule() Int PlaYUVerTools::ModuleOperation() { + std::vector apcFrameList; m_cCmdLineHandler.log( CommandLineHandle::INFO, " Applying Module %s/%s ...\n", m_pcCurrModuleIf->m_pchModuleCategory, m_pcCurrModuleIf->m_pchModuleName ); PlaYUVerFrame* pcProcessedFrame = NULL; @@ -326,26 +346,40 @@ Int PlaYUVerTools::ModuleOperation() for( UInt frame = 0; frame < m_uiNumberOfFrames; frame++ ) { - + apcFrameList.clear(); + for( UInt i = 0; i < m_pcCurrModuleIf->m_uiNumberOfFrames; i++ ) + { + apcFrameList.push_back( m_apcInputStreams[i]->getCurrFrame() ); + } if( m_pcCurrModuleIf->m_iModuleType == FRAME_PROCESSING_MODULE ) { - pcProcessedFrame = applyFrameModule(); + if( m_pcCurrModuleIf->m_iModuleAPI == MODULE_API_2 ) + { + pcProcessedFrame = m_pcCurrModuleIf->process( apcFrameList ); + } + else + { + pcProcessedFrame = applyFrameModule(); + } m_apcOutputStreams[0]->writeFrame( pcProcessedFrame ); } else if( m_pcCurrModuleIf->m_iModuleType == FRAME_MEASUREMENT_MODULE ) { - switch( m_pcCurrModuleIf->m_uiNumberOfFrames ) + if( m_pcCurrModuleIf->m_iModuleAPI == MODULE_API_2 ) { - case MODULE_REQUIRES_ONE_FRAME: - dMeasurementResult = m_pcCurrModuleIf->measure( m_apcInputStreams[0]->getCurrFrame() ); - break; - case MODULE_REQUIRES_TWO_FRAMES: - dMeasurementResult = m_pcCurrModuleIf->measure( m_apcInputStreams[0]->getCurrFrame(), m_apcInputStreams[1]->getCurrFrame() ); - break; - case MODULE_REQUIRES_THREE_FRAMES: - dMeasurementResult = m_pcCurrModuleIf->measure( m_apcInputStreams[0]->getCurrFrame(), m_apcInputStreams[1]->getCurrFrame(), - m_apcInputStreams[2]->getCurrFrame() ); - break; + dMeasurementResult = m_pcCurrModuleIf->measure( apcFrameList ); + } + else + { + switch( m_pcCurrModuleIf->m_uiNumberOfFrames ) + { + case MODULE_REQUIRES_ONE_FRAME: + dMeasurementResult = m_pcCurrModuleIf->measure( m_apcInputStreams[0]->getCurrFrame() ); + break; + case MODULE_REQUIRES_TWO_FRAMES: + dMeasurementResult = m_pcCurrModuleIf->measure( m_apcInputStreams[0]->getCurrFrame(), m_apcInputStreams[1]->getCurrFrame() ); + break; + } } m_cCmdLineHandler.log( CommandLineHandle::INFO, " %3d", frame ); m_cCmdLineHandler.log( CommandLineHandle::RESULT, " %8.3f \n", dMeasurementResult );