From cea720f8e9b2228720ff3fdbc03f29e0ce117d4d Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sat, 29 May 2021 03:08:56 +0100 Subject: [PATCH] Improve the use of separate threads for each module FramePropertiesDock now copies an instance of the CalypFrame that is always kept valid until updated --- app/CalypAppModuleIf.cpp | 4 +-- app/CalypAppModuleIf.h | 5 ++-- app/VideoSubWindow.cpp | 3 ++- app/docks/FramePropertiesDock.cpp | 44 ++++++++++++------------------- app/docks/FramePropertiesDock.h | 9 ++++--- app/widgets/HistogramWidget.cpp | 4 +-- 6 files changed, 31 insertions(+), 38 deletions(-) diff --git a/app/CalypAppModuleIf.cpp b/app/CalypAppModuleIf.cpp index 61899c1..050c045 100644 --- a/app/CalypAppModuleIf.cpp +++ b/app/CalypAppModuleIf.cpp @@ -48,7 +48,7 @@ CalypAppModuleIf::CalypAppModuleIf( QObject* parent, QAction* action, CalypModul } } -void CalypAppModuleIf::update() +void CalypAppModuleIf::update( bool isPlaying ) { if( m_pcDisplaySubWindow ) { @@ -56,7 +56,7 @@ void CalypAppModuleIf::update() } else { - apply(); + apply( isPlaying ); } } diff --git a/app/CalypAppModuleIf.h b/app/CalypAppModuleIf.h index 7d0d49a..9bedd76 100644 --- a/app/CalypAppModuleIf.h +++ b/app/CalypAppModuleIf.h @@ -30,13 +30,14 @@ #include #include +#include "config.h" + #ifdef CALYP_THREADED_MODULES #include #endif #include "CommonDefs.h" #include "ModuleHandleDock.h" -#include "config.h" #include "lib/CalypFrame.h" #include "lib/CalypModuleIf.h" #include "lib/CalypStream.h" @@ -105,7 +106,7 @@ public: CalypModuleIf* getModule() { return m_pcModule; } unsigned int getModuleRequirements() { return m_pcModule->m_uiModuleRequirements; } ClpString moduleInfo() { return m_pcModule->moduleInfo(); } - void update(); + void update( bool isPlaying ); bool apply( bool isPlaying = false, bool disableThreads = false ); bool isRunning(); void show(); diff --git a/app/VideoSubWindow.cpp b/app/VideoSubWindow.cpp index 6e62879..3b5beee 100644 --- a/app/VideoSubWindow.cpp +++ b/app/VideoSubWindow.cpp @@ -703,6 +703,7 @@ bool VideoSubWindow::hasRunningModule() void VideoSubWindow::setFillWindow( bool bFlag ) { m_pcVideoInfo->setBusyWindow( bFlag ); + m_pcVideoInfo->repaint(); } void VideoSubWindow::setCurrFrame( CalypFrame* pcCurrFrame ) @@ -731,7 +732,7 @@ void VideoSubWindow::refreshFrameOperation() } for( int i = 0; i < m_apcCurrentModule.size(); i++ ) { - m_apcCurrentModule.at( i )->update(); + m_apcCurrentModule.at( i )->update( m_bIsPlaying ); } } diff --git a/app/docks/FramePropertiesDock.cpp b/app/docks/FramePropertiesDock.cpp index 280d4fa..8a671b8 100644 --- a/app/docks/FramePropertiesDock.cpp +++ b/app/docks/FramePropertiesDock.cpp @@ -28,12 +28,12 @@ #include #include +#include "lib/CalypStream.h" + FramePropertiesDock::FramePropertiesDock( QWidget* parent, bool* pbMainPlaySwitch ) - : QWidget( parent ), m_pbIsPlaying( pbMainPlaySwitch ) + : QWidget( parent ), m_pbIsPlaying( pbMainPlaySwitch ), m_bHasFrame( false ) { // -------------- Variables definition -------------- - m_pcFrame = NULL; - m_pcSelectedFrame = NULL; m_iLastFrameType = -1; // Histogram area ----------------------------------------------------- @@ -278,13 +278,8 @@ QSize FramePropertiesDock::sizeHint() const void FramePropertiesDock::reset() { - m_pcFrame = NULL; + m_bHasFrame = false; m_cSelectionArea = QRect(); - if( m_pcSelectedFrame ) - { - delete m_pcSelectedFrame; - m_pcSelectedFrame = NULL; - } m_iLastFrameType = -1; @@ -364,35 +359,30 @@ void FramePropertiesDock::setFrame( CalypFrame* pcFrame ) } } setEnabled( true ); - if( m_pcFrame || !( *m_pbIsPlaying ) ) + if( pcFrame && !( *m_pbIsPlaying ) ) { - m_pcFrame = pcFrame; + m_bHasFrame = true; + m_cFrame = CalypFrame( pcFrame ); updateDataHistogram(); } } void FramePropertiesDock::setSelection( const QRect& selectionArea ) { - if( m_pcFrame ) + if( m_bHasFrame ) { bool bSelectionChanged = !( selectionArea.size() == m_cSelectionArea.size() ); - m_cSelectionArea = selectionArea; if( selectionArea.isValid() ) { + m_cSelectionArea = selectionArea; histogramWidget->stopHistogramComputation(); - /* - * Allocate a new image for the selection - * or just copy information + * Crop selection from frame */ if( bSelectionChanged ) { - if( m_pcSelectedFrame ) - { - delete m_pcSelectedFrame; - } - m_pcSelectedFrame = new CalypFrame( m_pcFrame, selectionArea.x(), selectionArea.y(), selectionArea.width(), - selectionArea.height() ); + m_cSelectedFrame = CalypFrame( m_cFrame, selectionArea.x(), selectionArea.y(), selectionArea.width(), + selectionArea.height() ); } updateDataHistogram(); selectionImageButton->click(); @@ -409,13 +399,13 @@ void FramePropertiesDock::setSelection( const QRect& selectionArea ) void FramePropertiesDock::updateDataHistogram() { - if( m_pcFrame && isVisible() ) + if( m_bHasFrame && isVisible() ) { if( !*m_pbIsPlaying ) { - if( m_pcSelectedFrame ) + if( m_cSelectionArea.isValid() ) { - m_pcSelectedFrame->copyFrom( m_pcFrame, m_cSelectionArea.x(), m_cSelectionArea.y() ); + m_cSelectedFrame = CalypFrame( m_cFrame, m_cSelectionArea.x(), m_cSelectionArea.y(), m_cSelectionArea.width(), m_cSelectionArea.height() ); fullImageButton->show(); selectionImageButton->show(); } @@ -424,7 +414,7 @@ void FramePropertiesDock::updateDataHistogram() fullImageButton->hide(); selectionImageButton->hide(); } - histogramWidget->updateData( m_pcFrame, m_pcSelectedFrame ); + histogramWidget->updateData( &m_cFrame, m_cSelectionArea.isValid() ? &m_cSelectedFrame : nullptr ); } else { @@ -523,7 +513,7 @@ void FramePropertiesDock::slotRefreshOptions( int range ) void FramePropertiesDock::slotHistogramComputationFailed() { - m_pcFrame = NULL; + m_bHasFrame = false; } void FramePropertiesDock::slotChannelChanged( int index ) diff --git a/app/docks/FramePropertiesDock.h b/app/docks/FramePropertiesDock.h index 7b61e7c..ae54d6a 100644 --- a/app/docks/FramePropertiesDock.h +++ b/app/docks/FramePropertiesDock.h @@ -31,7 +31,8 @@ #include "HistogramWidget.h" #include "config.h" #include "lib/CalypFrame.h" -#include "lib/CalypStream.h" + +class CalypStream; class FramePropertiesDock : public QWidget { @@ -48,10 +49,10 @@ public: void stopHistogram(); private: - CalypFrame* m_pcFrame; - CalypFrame* m_pcSelectedFrame; + CalypFrame m_cFrame; + CalypFrame m_cSelectedFrame; int m_iLastFrameType; - + bool m_bHasFrame; bool* m_pbIsPlaying; QComboBox* channelCB; diff --git a/app/widgets/HistogramWidget.cpp b/app/widgets/HistogramWidget.cpp index 42fe565..64b7013 100644 --- a/app/widgets/HistogramWidget.cpp +++ b/app/widgets/HistogramWidget.cpp @@ -53,8 +53,8 @@ public: void setup( CalypFrame* frame ) { m_pcFrame = frame; - // run(); - start(); + run(); + //start(); } void run() {