From 0fe1cdce4890862aa54aba3239f64ebe695d73c7 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sun, 1 Jun 2014 04:14:53 +0100 Subject: [PATCH 01/13] Minor fixes in Modules handles and introduction of threads into each module The modules are applied inside a different thread in order to avoid lag in the main window while processing. This still need further testing A new flag is added to selected if the threads should be used in this purpose --- CMakeLists.txt | 13 +++--- config.h.in | 2 + source/app/ModulesHandle.cpp | 56 ++++++++++++++++---------- source/app/ModulesHandle.h | 2 + source/app/PlaYUVerModuleIf.cpp | 70 +++++++++++++++++++++++++++++++++ source/app/PlaYUVerModuleIf.h | 62 ++++++++++++++++++----------- source/app/SubWindowHandle.cpp | 13 +++++- source/app/plaYUVerApp.cpp | 3 +- 8 files changed, 169 insertions(+), 52 deletions(-) create mode 100644 source/app/PlaYUVerModuleIf.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ea744ae..8aaa4ed 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,11 +45,12 @@ SET( CMAKE_CXX_FLAGS "" ) ###################################################################################### # Variables ###################################################################################### -ADD_OPTION(USE_WERROR "Warnings as errors" OFF ) -ADD_OPTION(USE_QT4 "Build with QT4" OFF ) -ADD_OPTION(USE_OPENCV "Add OpenCV support" OFF ) -ADD_OPTION(USE_PIXFC "Add PIXFC support" OFF ) -ADD_OPTION(USE_FFMPEG "Add FFMPEG support" OFF ) +ADD_OPTION(PLAYUVER_WERROR "Warnings as errors" OFF ) +ADD_OPTION(PLAYUVER_THREADED_MODULES "Warnings as errors" ON ) +ADD_OPTION(USE_QT4 "Build with QT4" OFF ) +ADD_OPTION(USE_OPENCV "Add OpenCV support" OFF ) +ADD_OPTION(USE_PIXFC "Add PIXFC support" OFF ) +ADD_OPTION(USE_FFMPEG "Add FFMPEG support" OFF ) ###################################################################################### # Dependencies @@ -103,7 +104,7 @@ SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" ) SET( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g" ) SET( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3" ) -IF( USE_WERROR ) +IF( PLAYUVER_WERROR ) SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror" ) ENDIF() diff --git a/config.h.in b/config.h.in index b7bf1c6..13bc617 100644 --- a/config.h.in +++ b/config.h.in @@ -36,6 +36,8 @@ #define QT_VERSION_PLAYUVER 4 #endif +#cmakedefine PLAYUVER_THREADED_MODULES + /* OpenCV */ #cmakedefine USE_OPENCV diff --git a/source/app/ModulesHandle.cpp b/source/app/ModulesHandle.cpp index ce1f8af..f8c8a70 100644 --- a/source/app/ModulesHandle.cpp +++ b/source/app/ModulesHandle.cpp @@ -74,7 +74,6 @@ SubWindowHandle* ModulesHandle::processModuleHandlingOpt() else { destroyModuleIf( pcCurrModuleIf ); - return NULL; } } else @@ -154,6 +153,8 @@ SubWindowHandle* ModulesHandle::enableModuleIf( PlaYUVerModuleIf *pcCurrModuleIf { pcCurrModuleIf->m_pcSubWindow[i]->enableModule( pcCurrModuleIf ); } + applyModuleIf( pcCurrModuleIf, false ); + return interfaceChild; } @@ -186,32 +187,18 @@ Void ModulesHandle::destroyAllModulesIf() Bool ModulesHandle::applyModuleIf( PlaYUVerModuleIf *pcCurrModuleIf, Bool isPlaying ) { - PlaYUVerFrame* processedFrame = NULL; Bool bRet = false; if( !isPlaying || ( isPlaying && pcCurrModuleIf->m_cModuleDef.m_bApplyWhilePlaying ) ) { - switch( pcCurrModuleIf->m_cModuleDef.m_uiNumberOfFrames ) - { - case MODULE_REQUIRES_ONE_FRAME: - processedFrame = pcCurrModuleIf->process( pcCurrModuleIf->m_pcSubWindow[0]->getCurrFrame() ); - break; - case MODULE_REQUIRES_TWO_FRAMES: - processedFrame = pcCurrModuleIf->process( pcCurrModuleIf->m_pcSubWindow[0]->getCurrFrame(), pcCurrModuleIf->m_pcSubWindow[1]->getCurrFrame() ); - break; - case MODULE_REQUIRES_THREE_FRAMES: - processedFrame = pcCurrModuleIf->process( pcCurrModuleIf->m_pcSubWindow[0]->getCurrFrame(), pcCurrModuleIf->m_pcSubWindow[1]->getCurrFrame(), - pcCurrModuleIf->m_pcSubWindow[2]->getCurrFrame() ); - break; - } +#ifdef PLAYUVER_THREADED_MODULES + pcCurrModuleIf->start(); +#else + pcCurrModuleIf->run(); +#endif if( pcCurrModuleIf->m_pcDisplaySubWindow ) { - pcCurrModuleIf->m_pcDisplaySubWindow->setCurrFrame( processedFrame ); bRet = true; } - else - { - pcCurrModuleIf->m_pcSubWindow[0]->setCurrFrame( processedFrame ); - } } else { @@ -220,6 +207,21 @@ Bool ModulesHandle::applyModuleIf( PlaYUVerModuleIf *pcCurrModuleIf, Bool isPlay return bRet; } +Bool ModulesHandle::showModuleIf( PlaYUVerModuleIf *pcCurrModuleIf, PlaYUVerFrame* processedFrame ) +{ + Bool bRet = false; + if( pcCurrModuleIf->m_pcDisplaySubWindow ) + { + pcCurrModuleIf->m_pcDisplaySubWindow->setCurrFrame( processedFrame ); + bRet = true; + } + else + { + pcCurrModuleIf->m_pcSubWindow[0]->setCurrFrame( processedFrame ); + } + return bRet; +} + Void ModulesHandle::swapModulesWindowsIf( PlaYUVerModuleIf *pcCurrModuleIf ) { if( pcCurrModuleIf->m_cModuleDef.m_uiNumberOfFrames == MODULE_REQUIRES_TWO_FRAMES ) @@ -230,6 +232,19 @@ Void ModulesHandle::swapModulesWindowsIf( PlaYUVerModuleIf *pcCurrModuleIf ) } } +Void ModulesHandle::customEvent( QEvent *event ) +{ + if( !event ) + { + return; + } + PlaYUVerModuleIf::EventData *eventData = ( PlaYUVerModuleIf::EventData* )event; + if( eventData->m_bSuccess ) + { + showModuleIf( eventData->m_pcModule, eventData->m_pcProcessedFrame ); + } +} + QMenu* ModulesHandle::createMenus( QMenuBar *MainAppMenuBar ) { PlaYUVerModuleIf* pcCurrModuleIf; @@ -246,6 +261,7 @@ QMenu* ModulesHandle::createMenus( QMenuBar *MainAppMenuBar ) for( Int i = 0; i < m_pcPlaYUVerModules.size(); i++ ) { pcCurrModuleIf = m_pcPlaYUVerModules.at( i ); + pcCurrModuleIf->setParent( this ); currSubMenu = NULL; if( pcCurrModuleIf->m_cModuleDef.m_pchModuleCategory ) diff --git a/source/app/ModulesHandle.h b/source/app/ModulesHandle.h index d22e032..d363f58 100644 --- a/source/app/ModulesHandle.h +++ b/source/app/ModulesHandle.h @@ -58,6 +58,7 @@ public: static Void destroyModuleIf( PlaYUVerModuleIf* pcCurrModuleIf ); static Bool applyModuleIf( PlaYUVerModuleIf* pcCurrModuleIf, Bool isPlaying = false ); static Void swapModulesWindowsIf( PlaYUVerModuleIf *pcCurrModuleIf ); + static Bool showModuleIf( PlaYUVerModuleIf *pcCurrModuleIf, PlaYUVerFrame* processedFrame ); private: QWidget *m_pcParent; @@ -89,6 +90,7 @@ private: Void appendModule( PlaYUVerModuleIf* pcCurrModuleIf ); SubWindowHandle* enableModuleIf( PlaYUVerModuleIf* pcCurrModuleIf ); + Void customEvent( QEvent *event ); private Q_SLOTS: void selectModule( int index ); diff --git a/source/app/PlaYUVerModuleIf.cpp b/source/app/PlaYUVerModuleIf.cpp new file mode 100644 index 0000000..8d81381 --- /dev/null +++ b/source/app/PlaYUVerModuleIf.cpp @@ -0,0 +1,70 @@ +/* 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 PlaYUVerModuleIf.cpp + * \brief PlaYUVer modules interface + */ + +#include "PlaYUVerModuleIf.h" +#include "SubWindowHandle.h" + +namespace plaYUVer +{ + +PlaYUVerModuleIf::PlaYUVerModuleIf() : + m_pcAction( NULL ), + m_pcDisplaySubWindow( NULL ) +{ + for( Int i = 0; i < MAX_NUMBER_FRAMES; i++ ) + { + m_pcSubWindow[i] = NULL; + } +} + +void PlaYUVerModuleIf::run() +{ + PlaYUVerFrame* pcProcessedFrame; + switch( m_cModuleDef.m_uiNumberOfFrames ) + { + case MODULE_REQUIRES_ONE_FRAME: + pcProcessedFrame = process( m_pcSubWindow[0]->getCurrFrame() ); + break; + case MODULE_REQUIRES_TWO_FRAMES: + pcProcessedFrame = process( m_pcSubWindow[0]->getCurrFrame(), m_pcSubWindow[1]->getCurrFrame() ); + break; + case MODULE_REQUIRES_THREE_FRAMES: + pcProcessedFrame = process( m_pcSubWindow[0]->getCurrFrame(), m_pcSubWindow[1]->getCurrFrame(), m_pcSubWindow[2]->getCurrFrame() ); + break; + } + postProgress( true, pcProcessedFrame ); +} + +Void PlaYUVerModuleIf::postProgress( Bool success, PlaYUVerFrame* pcProcessedFrame ) +{ + EventData *eventData = new EventData(); + eventData->m_bSuccess = success; + eventData->m_pcProcessedFrame = pcProcessedFrame; + eventData->m_pcModule = this; + if( parent() ) + QCoreApplication::postEvent( parent(), eventData ); +} + +} // NAMESPACE + diff --git a/source/app/PlaYUVerModuleIf.h b/source/app/PlaYUVerModuleIf.h index 28ceb52..55327ca 100644 --- a/source/app/PlaYUVerModuleIf.h +++ b/source/app/PlaYUVerModuleIf.h @@ -31,13 +31,12 @@ #include #include "PlaYUVerFrame.h" -class QImage; class QAction; namespace plaYUVer { -enum __PlaYUVerModuleTypes +enum // Module type { FRAME_LEVEL_MODULE, VIDEO_LEVEL_MODULE, @@ -46,17 +45,15 @@ enum __PlaYUVerModuleTypes #define APPLY_WHILE_PLAYING true #define MAX_NUMBER_FRAMES 3 -enum __PlaYUVerModuleNumberOfFrames +enum // Number of frames { - // Number of frames MODULE_REQUIRES_ONE_FRAME = 1, MODULE_REQUIRES_TWO_FRAMES = 2, MODULE_REQUIRES_THREE_FRAMES = 3, }; -enum __PlaYUVerModuleRequirements +enum // Requirements { - // Requirements MODULE_REQUIRES_NOTHING = 0, MODULE_REQUIRES_NEW_WINDOW = 2, MODULE_REQUIRES_SIDEBAR = 4, @@ -72,7 +69,7 @@ enum __PlaYUVerModuleRequirements } \ } -typedef struct __PlaYUVerModuleDefinition +typedef struct { Int m_iModuleType; const Char* m_pchModuleCategory; @@ -86,36 +83,57 @@ typedef struct __PlaYUVerModuleDefinition class SubWindowHandle; class PlaYUVerModuleIf +#ifdef PLAYUVER_THREADED_MODULES + : QThread +#else + : QObject +#endif { friend class ModulesHandle; + private: QAction* m_pcAction; SubWindowHandle* m_pcSubWindow[MAX_NUMBER_FRAMES]; SubWindowHandle* m_pcDisplaySubWindow; PlaYUVerModuleDefinition m_cModuleDef; + + Void postProgress( Bool success, PlaYUVerFrame* pcProcessedFrame ); public: - PlaYUVerModuleIf() : - m_pcAction( NULL ), - m_pcDisplaySubWindow( NULL ) + class EventData: public QEvent { - for( Int i = 0; i < MAX_NUMBER_FRAMES; i++ ) + public: + EventData() : + QEvent( QEvent::User ) { - m_pcSubWindow[i] = NULL; + m_bSuccess = false; + m_pcProcessedFrame = NULL; + m_pcModule = NULL; } - } - virtual ~PlaYUVerModuleIf() { } + Bool m_bSuccess; + PlaYUVerFrame* m_pcProcessedFrame; + PlaYUVerModuleIf* m_pcModule; + }; - virtual Void create() { } - virtual Void create( PlaYUVerFrame* ) { } + PlaYUVerModuleIf(); + virtual ~PlaYUVerModuleIf() {} - virtual Void process() { } - virtual PlaYUVerFrame* process( PlaYUVerFrame* ) { return NULL; } - virtual PlaYUVerFrame* process( PlaYUVerFrame*, PlaYUVerFrame* ) { return NULL; } - virtual PlaYUVerFrame* process( PlaYUVerFrame*, PlaYUVerFrame*, PlaYUVerFrame* ) { return NULL; } - virtual Void destroy(){ } + virtual Void create() {} + virtual Void create( PlaYUVerFrame* ) {} - Void setModuleDefinition( PlaYUVerModuleDefinition def ) { m_cModuleDef = def; } + virtual Void process() {} + virtual PlaYUVerFrame* process( PlaYUVerFrame* ) { return NULL; } + virtual PlaYUVerFrame* process( PlaYUVerFrame*, PlaYUVerFrame* ) { return NULL; } + virtual PlaYUVerFrame* process( PlaYUVerFrame*, PlaYUVerFrame*, PlaYUVerFrame* ) { return NULL; } + + virtual Void destroy() { } + + //PlaYUVerFrame* getProcessedFrame() { return m_pcProcessedFrame; } + + Void setModuleDefinition( PlaYUVerModuleDefinition def ) { m_cModuleDef = def; } + +protected: + virtual void run(); }; } // NAMESPACE diff --git a/source/app/SubWindowHandle.cpp b/source/app/SubWindowHandle.cpp index 032d015..2198288 100644 --- a/source/app/SubWindowHandle.cpp +++ b/source/app/SubWindowHandle.cpp @@ -36,6 +36,7 @@ SubWindowHandle::SubWindowHandle( QWidget * parent ) : setAttribute( Qt::WA_DeleteOnClose ); setBackgroundRole( QPalette::Light ); + setVisible( false ); // Create a new scroll area inside the sub-window m_cScrollArea = new QScrollArea( this ); @@ -121,7 +122,7 @@ Void SubWindowHandle::enableModule( PlaYUVerModuleIf* select_module ) disableModule(); } m_pcCurrentModule = select_module; - refreshFrame(); + // refreshFrame(); } Void SubWindowHandle::disableModule() @@ -148,6 +149,13 @@ Void SubWindowHandle::setCurrFrame( PlaYUVerFrame* pcCurrFrame ) { m_pcCurrFrame = pcCurrFrame; m_cViewArea->setImage( m_pcCurrFrame ); + if( !isVisible() ) + { + show(); + resize( sizeHint() ); + zoomToFit(); + + } } Void SubWindowHandle::refreshFrame() @@ -390,7 +398,8 @@ QSize SubWindowHandle::sizeHint() const if( m_pcCurrFrame ) isize = QSize( m_pcCurrFrame->getWidth() + 50, m_pcCurrFrame->getHeight() + 50 ); else - isize = QSize( m_pCurrStream->getWidth() + 50, m_pCurrStream->getHeight() + 50 ); + if( m_pCurrStream ) + isize = QSize( m_pCurrStream->getWidth() + 50, m_pCurrStream->getHeight() + 50 ); // If the SubWindowHandle needs more space that the avaiable, we'll give // to the subwindow a reasonable size preserving the image aspect ratio. diff --git a/source/app/plaYUVerApp.cpp b/source/app/plaYUVerApp.cpp index d6c7e29..939fb38 100644 --- a/source/app/plaYUVerApp.cpp +++ b/source/app/plaYUVerApp.cpp @@ -245,8 +245,7 @@ Void plaYUVerApp::ModuleHandling( QAction *curr_action ) if( interfaceChild ) { mdiArea->addSubWindow( interfaceChild ); - interfaceChild->show(); - interfaceChild->zoomToFit(); + interfaceChild->getViewArea()->setTool( m_appTool ); } if( activeSubWindow() ) From 041bb3e110248fe3fc909b266cc2fa38529d6cf7 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sun, 1 Jun 2014 18:01:40 +0100 Subject: [PATCH 02/13] Minor bugfix in the seek slider and format button --- source/app/ModulesHandle.cpp | 1 - source/app/PlaYUVerModuleIf.h | 4 ++-- source/app/SubWindowHandle.cpp | 8 ++++---- source/app/SubWindowHandle.h | 2 +- source/app/plaYUVerApp.cpp | 7 ++++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/source/app/ModulesHandle.cpp b/source/app/ModulesHandle.cpp index f8c8a70..be50ec8 100644 --- a/source/app/ModulesHandle.cpp +++ b/source/app/ModulesHandle.cpp @@ -173,7 +173,6 @@ Void ModulesHandle::destroyModuleIf( PlaYUVerModuleIf *pcCurrModuleIf ) pcCurrModuleIf->m_pcSubWindow[i] = NULL; } } - pcCurrModuleIf->destroy(); } diff --git a/source/app/PlaYUVerModuleIf.h b/source/app/PlaYUVerModuleIf.h index 55327ca..9ba4c93 100644 --- a/source/app/PlaYUVerModuleIf.h +++ b/source/app/PlaYUVerModuleIf.h @@ -84,9 +84,9 @@ class SubWindowHandle; class PlaYUVerModuleIf #ifdef PLAYUVER_THREADED_MODULES - : QThread + : public QThread #else - : QObject + : public QObject #endif { friend class ModulesHandle; diff --git a/source/app/SubWindowHandle.cpp b/source/app/SubWindowHandle.cpp index 2198288..ae6d3ef 100644 --- a/source/app/SubWindowHandle.cpp +++ b/source/app/SubWindowHandle.cpp @@ -72,7 +72,7 @@ SubWindowHandle::~SubWindowHandle() delete m_pCurrStream; } -Bool SubWindowHandle::loadFile( const QString &fileName ) +Bool SubWindowHandle::loadFile( const QString &rcFilename, Bool bForceDialog ) { UInt Width = 0, Height = 0, FrameRate = 30; Int InputFormat = -1; @@ -84,7 +84,7 @@ Bool SubWindowHandle::loadFile( const QString &fileName ) m_pCurrStream->getFormat( Width, Height, InputFormat, FrameRate ); - if( m_pCurrStream->guessFormat( fileName, Width, Height, InputFormat, FrameRate ) ) + if( m_pCurrStream->guessFormat( rcFilename, Width, Height, InputFormat, FrameRate ) || bForceDialog ) { ConfigureFormatDialog formatDialog( this ); if( formatDialog.runConfigureFormatDialog( Width, Height, InputFormat, FrameRate ) == QDialog::Rejected ) @@ -94,7 +94,7 @@ Bool SubWindowHandle::loadFile( const QString &fileName ) } QApplication::setOverrideCursor( Qt::WaitCursor ); QApplication::restoreOverrideCursor(); - if( !m_pCurrStream->open( fileName, Width, Height, InputFormat, FrameRate ) ) + if( !m_pCurrStream->open( rcFilename, Width, Height, InputFormat, FrameRate ) ) { return false; } @@ -105,7 +105,7 @@ Bool SubWindowHandle::loadFile( const QString &fileName ) refreshFrame(); - m_cCurrFileName = fileName; + m_cCurrFileName = rcFilename; m_cWindowName = m_pCurrStream->getStreamInformationString(); setWindowTitle( m_cWindowName ); return true; diff --git a/source/app/SubWindowHandle.h b/source/app/SubWindowHandle.h index 93b2fa5..24d0e57 100644 --- a/source/app/SubWindowHandle.h +++ b/source/app/SubWindowHandle.h @@ -65,7 +65,7 @@ public: ~SubWindowHandle(); Bool mayClose(); - Bool loadFile( const QString &fileName ); + Bool loadFile( const QString &rcFilename, Bool bForceDialog = false ); Bool save(); Void play(); diff --git a/source/app/plaYUVerApp.cpp b/source/app/plaYUVerApp.cpp index 939fb38..ea1a5a3 100644 --- a/source/app/plaYUVerApp.cpp +++ b/source/app/plaYUVerApp.cpp @@ -213,7 +213,7 @@ Void plaYUVerApp::save() Void plaYUVerApp::format() { if( m_pcCurrentSubWindow ) - m_pcCurrentSubWindow->loadFile( m_pcCurrentSubWindow->currentFile() ); + m_pcCurrentSubWindow->loadFile( m_pcCurrentSubWindow->currentFile(), true ); } Void plaYUVerApp::closeActiveWindow() @@ -459,6 +459,7 @@ Void plaYUVerApp::playEvent() break; case -3: m_acPlayingSubWindows.at( i )->close(); + m_acPlayingSubWindows.remove( i ); break; case -4: m_acPlayingSubWindows.remove( i ); @@ -495,7 +496,7 @@ Void plaYUVerApp::updateTotalFrameNum( UInt total_frame_num ) m_pcTotalFrameNumLabel->setText( QString( tr( "%1" ) ).arg( total_frame_num ) ); } -Void plaYUVerApp::seekEvent( int direction ) +Void plaYUVerApp::seekEvent( Int direction ) { if( m_pcCurrentSubWindow ) { @@ -515,7 +516,7 @@ Void plaYUVerApp::seekEvent( int direction ) } } -Void plaYUVerApp::seekSliderEvent( int new_frame_num ) +Void plaYUVerApp::seekSliderEvent( Int new_frame_num ) { if( m_pcCurrentSubWindow ) { From e63e7388e6c10f42fd46d0fe740ac99b1677cbd7 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Tue, 10 Jun 2014 19:40:46 +0100 Subject: [PATCH 03/13] Fix wanings --- source/app/PlaYUVerModuleIf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/app/PlaYUVerModuleIf.cpp b/source/app/PlaYUVerModuleIf.cpp index 8d81381..c432393 100644 --- a/source/app/PlaYUVerModuleIf.cpp +++ b/source/app/PlaYUVerModuleIf.cpp @@ -40,7 +40,7 @@ PlaYUVerModuleIf::PlaYUVerModuleIf() : void PlaYUVerModuleIf::run() { - PlaYUVerFrame* pcProcessedFrame; + PlaYUVerFrame* pcProcessedFrame = NULL; switch( m_cModuleDef.m_uiNumberOfFrames ) { case MODULE_REQUIRES_ONE_FRAME: From ada8d6cf08684a33a54459d4e0beb68ce0d2440f Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Tue, 10 Jun 2014 20:05:02 +0100 Subject: [PATCH 04/13] Fix CPack variable --- cmake/Install.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 0966bcb..efc16c0 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -50,6 +50,7 @@ ENDIF() # Create deb package ###################################################################################### SET(CPACK_GENERATOR "DEB") +SET(CPACK_PACKAGE_NAME "plaYUVer") SET(CPACK_PACKAGE_VERSION_MAJOR ${PLAYUVER_VERSION_MAJOR}) SET(CPACK_PACKAGE_VERSION_MINOR ${PLAYUVER_VERSION_MINOR}) SET(CPACK_PACKAGE_VERSION_PATCH ${PLAYUVER_VERSION_PATH}) @@ -61,6 +62,10 @@ ENDIF() IF( USE_FFMPEG ) SET(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libavformat53,libcodec53,libavutil51") ENDIF() +IF( USE_OPENCV ) + SET(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}") +ENDIF() + SET(CPACK_PACKAGE_DESCRIPTION "plaYUVer is an open-source QT based raw video player") SET(CPACK_PACKAGE_CONTACT "Joao Carreira (jfmcarreira@gmail.com), Luis Lucas (luisfrlucas@gmail.com)") # set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/Debian/postinst") From 2e36fe5e4e473ccfdc6b427f376889ec3ae617c7 Mon Sep 17 00:00:00 2001 From: J Carreira Date: Tue, 10 Jun 2014 23:12:54 +0100 Subject: [PATCH 05/13] fix last commit --- cmake/Install.cmake | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 5a6feb0..c6a2aca 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -75,16 +75,5 @@ IF( USE_FFMPEG ) LIST(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS ",") LIST(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS "libavformat53 (>= 6:0.8.10~), libcodec53 (>= 6:0.8.3-1~), libavutil51 (>= 6:0.8.3-1~)") ENDIF() -<<<<<<< HEAD -IF( USE_OPENCV ) - SET(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}") -ENDIF() -SET(CPACK_PACKAGE_DESCRIPTION "plaYUVer is an open-source QT based raw video player") -SET(CPACK_PACKAGE_CONTACT "Joao Carreira (jfmcarreira@gmail.com), Luis Lucas (luisfrlucas@gmail.com)") -# set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/Debian/postinst") -======= - - ->>>>>>> master INCLUDE(CPack) From 1c3dd01a4657c86a9505dd5dc1c154a72e80d5a3 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Thu, 12 Jun 2014 10:30:30 +0100 Subject: [PATCH 06/13] merge with master --- cmake/Install.cmake | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index c6a2aca..fda5640 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -51,7 +51,9 @@ ENDIF() ###################################################################################### SET(CPACK_GENERATOR "DEB") -SET(CPACK_PACKAGE_NAME "plaYUVer") +SET(CPACK_PACKAGE_NAME "playuver") +SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "plaYUVer is an open-source QT based raw video player") +SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Joao Carreira (jfmcarreira@gmail.com), Luis Lucas (luisfrlucas@gmail.com)") SET(CPACK_PACKAGE_CONTACT "Joao Carreira (jfmcarreira@gmail.com), Luis Lucas (luisfrlucas@gmail.com)") SET(CPACK_PACKAGE_VERSION_MAJOR ${PLAYUVER_VERSION_MAJOR}) @@ -60,10 +62,6 @@ SET(CPACK_PACKAGE_VERSION_PATCH ${PLAYUVER_VERSION_PATH}) SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") -SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "plaYUVer is an open-source QT based raw video player") -SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Joao Carreira (jfmcarreira@gmail.com), Luis Lucas (luisfrlucas@gmail.com)") - - SET(CPACK_DEBIAN_PACKAGE_DEPENDS "") IF( USE_QT4 ) LIST(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS "libqtcore4 (>= 4:4.8.5~), libqtgui4 (>= 4:4.8.5~)" ) From e829fa03bf50c1dd51c9e7082b531090913a7e65 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Thu, 12 Jun 2014 13:18:44 +0100 Subject: [PATCH 07/13] Add option to load the entire file into memory --- source/app/InputStream.cpp | 67 +++++++++++++++++++++++++++++++++++--- source/app/InputStream.h | 3 ++ source/app/plaYUVerApp.cpp | 21 +++++++++++- source/app/plaYUVerApp.h | 2 ++ 4 files changed, 87 insertions(+), 6 deletions(-) diff --git a/source/app/InputStream.cpp b/source/app/InputStream.cpp index ebc10d3..0559ea1 100755 --- a/source/app/InputStream.cpp +++ b/source/app/InputStream.cpp @@ -41,6 +41,7 @@ namespace plaYUVer InputStream::InputStream() { m_bInit = false; + m_bLoadAll = false; m_iErrorStatus = 0; m_pFile = NULL; @@ -58,6 +59,7 @@ InputStream::InputStream() m_pcNextFrame = NULL; m_ppcFrameBuffer = NULL; m_uiFrameBufferSize = 2; + m_uiFrameBufferIndex = 0; m_uiAveragePlayInterval = 0; } @@ -145,6 +147,7 @@ Bool InputStream::open( QString filename, UInt width, UInt height, Int input_for return m_bInit; } + m_uiFrameBufferSize = 2; getMem1D( &m_ppcFrameBuffer, m_uiFrameBufferSize ); for( UInt i = 0; i < m_uiFrameBufferSize; i++ ) { @@ -192,6 +195,7 @@ Bool InputStream::open( QString filename, UInt width, UInt height, Int input_for m_cStreamInformationString.append( QFileInfo( m_cFilename ).fileName() ); seekInput( 0 ); + //loadAll(); m_cTimer.start(); m_uiAveragePlayInterval = 0; @@ -228,6 +232,7 @@ Void InputStream::close() << QString::number( 1000 / ( m_uiAveragePlayInterval + 1 ) ) << " fps"; + m_bLoadAll = false; m_bInit = false; } @@ -292,6 +297,41 @@ Bool InputStream::guessFormat( QString filename, UInt& rWidth, UInt& rHeight, In return bRet; } +Void InputStream::loadAll() +{ + if( m_ppcFrameBuffer ) + { + for( UInt i = 0; i < m_uiFrameBufferSize; i++ ) + { + if( m_ppcFrameBuffer[i] ) + delete m_ppcFrameBuffer[i]; + m_ppcFrameBuffer[i] = NULL; + } + freeMem1D( m_ppcFrameBuffer ); + m_ppcFrameBuffer = NULL; + } + m_uiFrameBufferSize = m_uiTotalFrameNum; + getMem1D( &m_ppcFrameBuffer, m_uiFrameBufferSize ); + for( UInt i = 0; i < m_uiFrameBufferSize; i++ ) + { + m_ppcFrameBuffer[i] = new PlaYUVerFrame( m_uiWidth, m_uiHeight, m_iPixelFormat ); + if( !m_ppcFrameBuffer[i] ) + { + close(); + } + } + m_uiFrameBufferIndex = 0; + m_pcCurrFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex]; + seekInput( 0 ); + for( UInt i = m_uiFrameBufferIndex+1; i < m_uiFrameBufferSize; i++ ) + { + readNextFrame(); + setNextFrame(); + } + m_bLoadAll = true; + seekInput( 0 ); +} + Void InputStream::getDuration( Int* duration_array ) { Int hours, mins, secs; @@ -326,6 +366,11 @@ Void InputStream::readNextFrame() return; } + if( m_bLoadAll ) + { + return; + } + #ifdef USE_FFMPEG if( m_cLibAvContext.getStatus() ) { @@ -364,8 +409,12 @@ Void InputStream::setNextFrame() { m_pcCurrFrame = m_pcNextFrame; m_iCurrFrameNum++; - m_pcNextFrame = m_ppcFrameBuffer[!m_uiFrameBufferIndex]; - m_uiFrameBufferIndex = !m_uiFrameBufferIndex; + m_uiFrameBufferIndex++; + if( m_uiFrameBufferIndex == m_uiFrameBufferSize ) + { + m_uiFrameBufferIndex = 0; + } + m_pcNextFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex]; } else { @@ -391,10 +440,18 @@ PlaYUVerFrame* InputStream::getCurrFrame() Void InputStream::seekInput( UInt64 new_frame_num ) { - if( !m_pFile ) + if( !m_pFile || new_frame_num < 0 || new_frame_num >= m_uiTotalFrameNum) return; - if( new_frame_num < 0 || new_frame_num >= m_uiTotalFrameNum ) + + m_iCurrFrameNum = new_frame_num - 1; + + if( m_bLoadAll ) + { + m_uiFrameBufferIndex = new_frame_num; + m_pcNextFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex]; + setNextFrame(); return; + } #ifdef USE_FFMPEG if( m_cLibAvContext.getStatus() ) { @@ -409,7 +466,7 @@ Void InputStream::seekInput( UInt64 new_frame_num ) } m_uiFrameBufferIndex = 0; m_pcCurrFrame = m_pcNextFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex]; - m_iCurrFrameNum = new_frame_num - 1; + readNextFrame(); setNextFrame(); if( m_uiTotalFrameNum > 1 ) diff --git a/source/app/InputStream.h b/source/app/InputStream.h index 721f99e..031a9c1 100755 --- a/source/app/InputStream.h +++ b/source/app/InputStream.h @@ -48,6 +48,7 @@ class InputStream private: Bool m_bInit; + Bool m_bLoadAll; Int m_iErrorStatus; #ifdef USE_FFMPEG @@ -109,6 +110,8 @@ public: Bool guessFormat( QString filename, UInt& rWidth, UInt& rHeight, Int& rInputFormat, UInt& rFrameRate ); Void getFormat( UInt& rWidth, UInt& rHeight, Int& rInputFormat, UInt& rFrameRate ); + Void loadAll(); + Void readNextFrame(); Bool writeFrame( const QString& filename ); diff --git a/source/app/plaYUVerApp.cpp b/source/app/plaYUVerApp.cpp index ea1a5a3..7dc87e0 100644 --- a/source/app/plaYUVerApp.cpp +++ b/source/app/plaYUVerApp.cpp @@ -164,8 +164,8 @@ Void plaYUVerApp::loadFile( QString fileName ) SubWindowHandle *interfaceChild = new SubWindowHandle( this ); //createSubWindow(); if( interfaceChild->loadFile( fileName ) ) { + statusBar()->showMessage( tr( "Loading file..." ) ); mdiArea->addSubWindow( interfaceChild ); - statusBar()->showMessage( tr( "File loaded" ), 2000 ); interfaceChild->show(); connect( interfaceChild->getViewArea(), SIGNAL( positionChanged(const QPoint &, PlaYUVerFrame *) ), this, SLOT( updatePixelValueStatusBar(const QPoint &, PlaYUVerFrame *) ) ); @@ -173,6 +173,7 @@ Void plaYUVerApp::loadFile( QString fileName ) interfaceChild->zoomToFit(); interfaceChild->getViewArea()->setTool( m_appTool ); + statusBar()->showMessage( tr( "File loaded" ), 2000 ); } else { @@ -216,6 +217,17 @@ Void plaYUVerApp::format() m_pcCurrentSubWindow->loadFile( m_pcCurrentSubWindow->currentFile(), true ); } +Void plaYUVerApp::loadAll() +{ + if( m_pcCurrentSubWindow ) + { + statusBar()->showMessage( tr( "Loading file into memory ..." ) ); + m_pcCurrentSubWindow->getInputStream()->loadAll(); + statusBar()->showMessage( tr( "File loaded" ), 2000 ); + } +} + + Void plaYUVerApp::closeActiveWindow() { SubWindowHandle *currSubWindow = activeSubWindow(); @@ -840,6 +852,11 @@ Void plaYUVerApp::createActions() m_arrayActions[SAVE_ACT]->setStatusTip( tr( "Save current frame" ) ); connect( m_arrayActions[SAVE_ACT], SIGNAL( triggered() ), this, SLOT( save() ) ); + m_arrayActions[LOAD_ALL_ACT] = new QAction( tr( "&Load All" ), this ); + //m_arrayActions[LOAD_ALL_ACT]->setIcon( QIcon( ":/images/configuredialog.png" ) ); + m_arrayActions[LOAD_ALL_ACT]->setStatusTip( tr( "Load sequence into memory (caution)" ) ); + connect( m_arrayActions[LOAD_ALL_ACT], SIGNAL( triggered() ), this, SLOT( loadAll() ) ); + m_arrayActions[FORMAT_ACT] = new QAction( tr( "&Format" ), this ); m_arrayActions[FORMAT_ACT]->setIcon( QIcon( ":/images/configuredialog.png" ) ); m_arrayActions[FORMAT_ACT]->setStatusTip( tr( "Open format dialog" ) ); @@ -1003,7 +1020,9 @@ Void plaYUVerApp::createMenus() m_arrayMenu[FILE_MENU] = menuBar()->addMenu( tr( "&File" ) ); m_arrayMenu[FILE_MENU]->addAction( m_arrayActions[OPEN_ACT] ); m_arrayMenu[FILE_MENU]->addAction( m_arrayActions[SAVE_ACT] ); + m_arrayMenu[FILE_MENU]->addSeparator(); m_arrayMenu[FILE_MENU]->addAction( m_arrayActions[FORMAT_ACT] ); + m_arrayMenu[FILE_MENU]->addAction( m_arrayActions[LOAD_ALL_ACT] ); m_arrayMenu[FILE_MENU]->addSeparator(); m_arrayMenu[FILE_MENU]->addAction( m_arrayActions[CLOSE_ACT] ); m_arrayMenu[FILE_MENU]->addAction( m_arrayActions[EXIT_ACT] ); diff --git a/source/app/plaYUVerApp.h b/source/app/plaYUVerApp.h index e61aa0c..d7f5236 100644 --- a/source/app/plaYUVerApp.h +++ b/source/app/plaYUVerApp.h @@ -59,6 +59,7 @@ private Q_SLOTS: void open(); void save(); void format(); + void loadAll(); void closeActiveWindow(); void closeAll(); @@ -192,6 +193,7 @@ private: OPEN_ACT = 0, SAVE_ACT, FORMAT_ACT, + LOAD_ALL_ACT, CLOSE_ACT, CLOSEALL_ACT, EXIT_ACT, From 944badc866f5dbe3369cdd5a86cd7f46291cd18d Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Fri, 13 Jun 2014 01:38:42 +0100 Subject: [PATCH 08/13] Add new resolutions --- CMakeLists.txt | 2 +- source/app/ConfigureFormatDialog.cpp | 4 ++-- source/app/ConfigureFormatDialog.h | 8 ++++++++ source/app/plaYUVerApp.cpp | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f0ee49..8ed599f 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ INCLUDE_DIRECTORIES( ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${SRC_DIR}/ FILE( GLOB SOURCES_FILES ${SRC_DIR}/app/*.cpp ${SRC_DIR}/lib/*.cpp ) FILE( GLOB FORMS_FILES ${UI_DIR}/*.ui ) -FILE( GLOB RESOURCES_FILES ${RSC_DIR}/*.qrc ) +FILE( GLOB RESOURCES_FILES ${RSC_DIR}/*.qrc ${RSC_DIR}/*.rc ) # must go before the project command SET(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE) diff --git a/source/app/ConfigureFormatDialog.cpp b/source/app/ConfigureFormatDialog.cpp index c0fbad4..4cea6b1 100755 --- a/source/app/ConfigureFormatDialog.cpp +++ b/source/app/ConfigureFormatDialog.cpp @@ -101,12 +101,12 @@ ConfigureFormatDialog::ConfigureFormatDialog( QWidget *parent ) : resolutionLabel->setText( "Resolution chosen" ); QLabel* widthLabel = new QLabel( "Width" ); m_spinBoxWidth = new QSpinBox(); - m_spinBoxWidth->setRange( 0, 7240 ); + m_spinBoxWidth->setRange( 0, 8192 ); m_spinBoxWidth->setValue( 0 ); QLabel* heightLabel = new QLabel( "Height" ); m_spinBoxheight = new QSpinBox(); - m_spinBoxheight->setRange( 0, 5432 ); + m_spinBoxheight->setRange( 0, 4608 ); m_spinBoxheight->setValue( 0 ); QLabel* pixelsLabel = new QLabel(); diff --git a/source/app/ConfigureFormatDialog.h b/source/app/ConfigureFormatDialog.h index 7fddcce..a4ea1f8 100755 --- a/source/app/ConfigureFormatDialog.h +++ b/source/app/ConfigureFormatDialog.h @@ -77,7 +77,15 @@ private: ADD_STANDARD_RESOLUTION( "VGA (640x480)", 640, 480 ); ADD_STANDARD_RESOLUTION( "XVGA (1024x768)", 1024, 768 ); ADD_STANDARD_RESOLUTION( "HD (1280x720)", 1280, 720 ); + ADD_STANDARD_RESOLUTION( "XVGA (1024x768)", 1024, 768 ); + ADD_STANDARD_RESOLUTION( "XVGA (1024x768)", 1024, 768 ); + ADD_STANDARD_RESOLUTION( "SXGA- (1280x900)", 1280, 900 ); + ADD_STANDARD_RESOLUTION( "SXGA (1280x1024)", 1280, 1024 ); + ADD_STANDARD_RESOLUTION( "WSXGA (1440x900)", 1440, 900 ); ADD_STANDARD_RESOLUTION( "Full HD (1920x1080)", 1920, 1080 ); + ADD_STANDARD_RESOLUTION( "WQXGA (2560x1600)", 2560, 1600 ); + ADD_STANDARD_RESOLUTION( "Ultra HD (3840x2160)", 3840, 2160 ); + ADD_STANDARD_RESOLUTION( "8K", 8192, 4608 ); } }; diff --git a/source/app/plaYUVerApp.cpp b/source/app/plaYUVerApp.cpp index 7dc87e0..4e9ae91 100644 --- a/source/app/plaYUVerApp.cpp +++ b/source/app/plaYUVerApp.cpp @@ -671,7 +671,7 @@ Void plaYUVerApp::updatePixelValueStatusBar( const QPoint & pos, PlaYUVerFrame* sPixelValue = curFrame->getPixelValue( pos, PlaYUVerFrame::COLOR_YUV ); strPixel = QString( "Y: %1 U: %2 V: %3" ).arg( sPixelValue.Luma ).arg( sPixelValue.ChromaU ).arg( sPixelValue.ChromaV ); strStatus.append( strPixel ); - statusBar()->showMessage( strStatus, 0 ); + statusBar()->showMessage( strStatus, 3000 ); } else { From 7e92064584efbd0564c654de04b7bfda9cf7fd87 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Fri, 13 Jun 2014 19:05:01 +0100 Subject: [PATCH 09/13] Fix standard resolution names --- source/app/ConfigureFormatDialog.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/app/ConfigureFormatDialog.h b/source/app/ConfigureFormatDialog.h index a4ea1f8..09b8536 100755 --- a/source/app/ConfigureFormatDialog.h +++ b/source/app/ConfigureFormatDialog.h @@ -75,10 +75,9 @@ private: { ADD_STANDARD_RESOLUTION( "CIF (352x288)", 352, 288 ); ADD_STANDARD_RESOLUTION( "VGA (640x480)", 640, 480 ); + ADD_STANDARD_RESOLUTION( "WVGA (832x480)", 832, 480 ); ADD_STANDARD_RESOLUTION( "XVGA (1024x768)", 1024, 768 ); ADD_STANDARD_RESOLUTION( "HD (1280x720)", 1280, 720 ); - ADD_STANDARD_RESOLUTION( "XVGA (1024x768)", 1024, 768 ); - ADD_STANDARD_RESOLUTION( "XVGA (1024x768)", 1024, 768 ); ADD_STANDARD_RESOLUTION( "SXGA- (1280x900)", 1280, 900 ); ADD_STANDARD_RESOLUTION( "SXGA (1280x1024)", 1280, 1024 ); ADD_STANDARD_RESOLUTION( "WSXGA (1440x900)", 1440, 900 ); From 5b7f931b83644da0f3b1df3ea99c14854a9ca728 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sat, 14 Jun 2014 21:11:18 +0100 Subject: [PATCH 10/13] Merge with master --- source/app/InputStream.cpp | 8 +++---- source/app/InputStream.h | 2 +- source/app/plaYUVerApp.cpp | 49 ++++++++++++++++++++++++++------------ source/app/plaYUVerApp.h | 4 ++-- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/source/app/InputStream.cpp b/source/app/InputStream.cpp index 0559ea1..039a3fd 100755 --- a/source/app/InputStream.cpp +++ b/source/app/InputStream.cpp @@ -194,6 +194,7 @@ Bool InputStream::open( QString filename, UInt width, UInt height, Int input_for m_cStreamInformationString.append( "] " ); m_cStreamInformationString.append( QFileInfo( m_cFilename ).fileName() ); + m_iCurrFrameNum = -1; seekInput( 0 ); //loadAll(); @@ -359,7 +360,7 @@ Void InputStream::readNextFrame() UInt64 bytes_read = 0; //m_cTimer.restart(); - if( m_iCurrFrameNum + 1 >= ( Int )m_uiTotalFrameNum ) + if( m_iCurrFrameNum + 1 >= (Int64)m_uiTotalFrameNum ) { m_iErrorStatus = LAST_FRAME; m_pcNextFrame = NULL; @@ -419,8 +420,7 @@ Void InputStream::setNextFrame() else { m_iErrorStatus = END_OF_SEQ; - m_iCurrFrameNum = 0; - seekInput( m_iCurrFrameNum ); + seekInput( 0 ); } } @@ -440,7 +440,7 @@ PlaYUVerFrame* InputStream::getCurrFrame() Void InputStream::seekInput( UInt64 new_frame_num ) { - if( !m_pFile || new_frame_num < 0 || new_frame_num >= m_uiTotalFrameNum) + if( !m_pFile || new_frame_num < 0 || new_frame_num >= m_uiTotalFrameNum || (Int64)new_frame_num == m_iCurrFrameNum ) return; m_iCurrFrameNum = new_frame_num - 1; diff --git a/source/app/InputStream.h b/source/app/InputStream.h index 031a9c1..02325cd 100755 --- a/source/app/InputStream.h +++ b/source/app/InputStream.h @@ -79,7 +79,7 @@ private: UInt m_uiHeight; UInt m_uiFrameRate; UInt64 m_uiTotalFrameNum; - Int m_iCurrFrameNum; + Int64 m_iCurrFrameNum; public: InputStream(); diff --git a/source/app/plaYUVerApp.cpp b/source/app/plaYUVerApp.cpp index 4e9ae91..6a9580e 100644 --- a/source/app/plaYUVerApp.cpp +++ b/source/app/plaYUVerApp.cpp @@ -103,10 +103,10 @@ Void plaYUVerApp::about() { QString about_message; about_message.append( "The plaYUVer is an open-source raw video player! " ); - about_message.append("Developed by "); - about_message.append("João Carreira "); - about_message.append("and "); - about_message.append("Luís Lucas"); + about_message.append( "Developed by " ); + about_message.append( "João Carreira " ); + about_message.append( "and " ); + about_message.append( "Luís Lucas" ); QMessageBox::about( this, "About plaYUVer", about_message ); } @@ -316,15 +316,25 @@ Void plaYUVerApp::updatePropertiesSelectedArea( QRect area ) // ----------------------- Playing Functions -------------------- -UInt plaYUVerApp::getMaxFrameNumber() +UInt64 plaYUVerApp::getMaxFrameNumber() { UInt currFrames; - UInt maxFrames = INT_MAX; - for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) + UInt64 maxFrames = INT_MAX; + if( m_pcCurrentSubWindow ) { - currFrames = m_acPlayingSubWindows.at( i )->getInputStream()->getFrameNum(); - if( currFrames < maxFrames ) - maxFrames = currFrames; + if( m_acPlayingSubWindows.contains( m_pcCurrentSubWindow ) ) + { + for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) + { + currFrames = m_acPlayingSubWindows.at( i )->getInputStream()->getFrameNum(); + if( currFrames < maxFrames ) + maxFrames = currFrames; + } + } + else + { + maxFrames = m_pcCurrentSubWindow->getInputStream()->getFrameNum(); + } } return maxFrames; } @@ -385,7 +395,7 @@ Void plaYUVerApp::play() { m_acPlayingSubWindows.append( m_pcCurrentSubWindow ); m_pcCurrentSubWindow->seekAbsoluteEvent( m_acPlayingSubWindows.at( 0 )->getInputStream()->getCurrFrameNum() ); - m_pcFrameSlider->setMaximum( getMaxFrameNumber() - 1 ); + updateTotalFrameNum(); } m_pcCurrentSubWindow->play(); } @@ -447,6 +457,7 @@ Void plaYUVerApp::stop() seekSliderEvent( 0 ); } } + updateTotalFrameNum(); } Void plaYUVerApp::playEvent() @@ -468,6 +479,13 @@ Void plaYUVerApp::playEvent() updateFrameProperties(); return; } + else + { + for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) + { + m_acPlayingSubWindows.at( i )->seekAbsoluteEvent( 0 ); + } + } break; case -3: m_acPlayingSubWindows.at( i )->close(); @@ -498,11 +516,12 @@ Void plaYUVerApp::updateCurrFrameNum() m_pcCurrFrameNumLabel->setText( "1" ); } } -Void plaYUVerApp::updateTotalFrameNum( UInt total_frame_num ) +Void plaYUVerApp::updateTotalFrameNum() { - if( m_pcCurrentSubWindow && m_pcCurrentSubWindow->getInputStream() && total_frame_num == 1 ) + UInt64 total_frame_num = 1; + if( m_pcCurrentSubWindow && m_pcCurrentSubWindow->getInputStream() ) { - total_frame_num = m_pcCurrentSubWindow->getInputStream()->getFrameNum(); + total_frame_num = getMaxFrameNumber(); } m_pcFrameSlider->setMaximum( total_frame_num - 1 ); m_pcTotalFrameNumLabel->setText( QString( tr( "%1" ) ).arg( total_frame_num ) ); @@ -1151,7 +1170,7 @@ Void plaYUVerApp::writeSettings() settings.setMainWindowPos( pos() ); settings.setMainWindowSize( size() ); settings.setLastOpenPath( m_cLastOpenPath ); - settings.setSelectedTool( (Int)m_appTool ); + settings.setSelectedTool( ( Int )m_appTool ); settings.setPlayingSettings( m_arrayActions[VIDEO_LOOP_ACT]->isChecked(), m_arrayActions[VIDEO_LOCK_ACT]->isChecked() ); } diff --git a/source/app/plaYUVerApp.h b/source/app/plaYUVerApp.h index d7f5236..b8d5f4f 100644 --- a/source/app/plaYUVerApp.h +++ b/source/app/plaYUVerApp.h @@ -122,11 +122,11 @@ private: Void zoomToFitAll(); //! Playing functions - UInt getMaxFrameNumber(); + UInt64 getMaxFrameNumber(); Void startPlay(); Void setTimerStatus(); Void updateCurrFrameNum(); - Void updateTotalFrameNum( UInt total_frame_num = 1 ); + Void updateTotalFrameNum(); Void updateMenus(); Void updateStreamProperties(); From 7d9806e3331ee9b83653c69d2f95be377bd3badf Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sun, 15 Jun 2014 11:28:02 +0100 Subject: [PATCH 11/13] Change toolbar variables and change behaviour of play controls toolbar --- source/app/plaYUVerApp.cpp | 55 ++++++++++++++++++++++---------------- source/app/plaYUVerApp.h | 11 +++++--- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/source/app/plaYUVerApp.cpp b/source/app/plaYUVerApp.cpp index 6a9580e..0efbbf5 100644 --- a/source/app/plaYUVerApp.cpp +++ b/source/app/plaYUVerApp.cpp @@ -227,7 +227,6 @@ Void plaYUVerApp::loadAll() } } - Void plaYUVerApp::closeActiveWindow() { SubWindowHandle *currSubWindow = activeSubWindow(); @@ -970,7 +969,7 @@ Void plaYUVerApp::createActions() m_pcFrameSlider = new QSlider; m_pcFrameSlider->setOrientation( Qt::Horizontal ); m_pcFrameSlider->setMaximumWidth( 100 ); - m_pcFrameSlider->setMaximumWidth( 300 ); + m_pcFrameSlider->setMaximumWidth( /* 300 */ 2000 ); m_pcFrameSlider->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ) ); m_pcFrameSlider->setEnabled( false ); connect( m_pcFrameSlider, SIGNAL( sliderMoved(int) ), this, SLOT( seekSliderEvent(int) ) ); @@ -1093,36 +1092,46 @@ Void plaYUVerApp::createMenus() Void plaYUVerApp::createToolBars() { - toolbarFile = addToolBar( tr( "File" ) ); - toolbarFile->addAction( m_arrayActions[OPEN_ACT] ); - toolbarFile->addAction( m_arrayActions[SAVE_ACT] ); - toolbarFile->addAction( m_arrayActions[FORMAT_ACT] ); - toolbarFile->addAction( m_arrayActions[CLOSE_ACT] ); + m_arrayToolBars.resize( TOTAL_TOOLBAR ); - toolbarView = addToolBar( tr( "Zoom" ) ); - toolbarView->addAction( m_arrayActions[ZOOM_IN_ACT] ); - toolbarView->addAction( m_arrayActions[ZOOM_OUT_ACT] ); - toolbarView->addAction( m_arrayActions[ZOOM_NORMAL_ACT] ); - toolbarView->addAction( m_arrayActions[ZOOM_FIT_ACT] ); + m_arrayToolBars[FILE_TOOLBAR] = new QToolBar( tr( "File" ) ); + m_arrayToolBars[FILE_TOOLBAR]->addAction( m_arrayActions[OPEN_ACT] ); + m_arrayToolBars[FILE_TOOLBAR]->addAction( m_arrayActions[SAVE_ACT] ); + m_arrayToolBars[FILE_TOOLBAR]->addAction( m_arrayActions[FORMAT_ACT] ); + m_arrayToolBars[FILE_TOOLBAR]->addAction( m_arrayActions[CLOSE_ACT] ); - toolbarVideo = addToolBar( tr( "Video" ) ); - toolbarVideo->addAction( m_arrayActions[PLAY_ACT] ); - toolbarVideo->addAction( m_arrayActions[PAUSE_ACT] ); - toolbarVideo->addAction( m_arrayActions[STOP_ACT] ); - toolbarVideo->addAction( m_arrayActions[VIDEO_BACKWARD_ACT] ); - toolbarVideo->addWidget( m_pcFrameSlider ); - toolbarVideo->addAction( m_arrayActions[VIDEO_FORWARD_ACT] ); + m_arrayToolBars[FILE_TOOLBAR]->setMovable( false ); + addToolBar( Qt::TopToolBarArea, m_arrayToolBars[FILE_TOOLBAR] ); - toolbarVideo->addWidget( new QLabel ); + m_arrayToolBars[VIEW_TOOLBAR] = new QToolBar( tr( "View" ) ); + m_arrayToolBars[VIEW_TOOLBAR]->addAction( m_arrayActions[ZOOM_IN_ACT] ); + m_arrayToolBars[VIEW_TOOLBAR]->addAction( m_arrayActions[ZOOM_OUT_ACT] ); + m_arrayToolBars[VIEW_TOOLBAR]->addAction( m_arrayActions[ZOOM_NORMAL_ACT] ); + m_arrayToolBars[VIEW_TOOLBAR]->addAction( m_arrayActions[ZOOM_FIT_ACT] ); + + m_arrayToolBars[FILE_TOOLBAR]->setMovable( false ); + addToolBar( Qt::TopToolBarArea, m_arrayToolBars[VIEW_TOOLBAR] ); + + m_arrayToolBars[VIDEO_TOOLBAR] = new QToolBar( tr( "Video" ) ); + m_arrayToolBars[VIDEO_TOOLBAR]->setAllowedAreas( Qt::BottomToolBarArea ); + m_arrayToolBars[VIDEO_TOOLBAR]->addAction( m_arrayActions[PLAY_ACT] ); + m_arrayToolBars[VIDEO_TOOLBAR]->addAction( m_arrayActions[PAUSE_ACT] ); + m_arrayToolBars[VIDEO_TOOLBAR]->addAction( m_arrayActions[STOP_ACT] ); + m_arrayToolBars[VIDEO_TOOLBAR]->addAction( m_arrayActions[VIDEO_BACKWARD_ACT] ); + m_arrayToolBars[VIDEO_TOOLBAR]->addWidget( m_pcFrameSlider ); + m_arrayToolBars[VIDEO_TOOLBAR]->addAction( m_arrayActions[VIDEO_FORWARD_ACT] ); + m_arrayToolBars[VIDEO_TOOLBAR]->addWidget( new QLabel ); m_pcCurrFrameNumLabel = new QLabel; m_pcCurrFrameNumLabel->setText( "-" ); - toolbarVideo->addWidget( m_pcCurrFrameNumLabel ); + m_arrayToolBars[VIDEO_TOOLBAR]->addWidget( m_pcCurrFrameNumLabel ); QLabel *forwardslash = new QLabel; forwardslash->setText( "/" ); - toolbarVideo->addWidget( forwardslash ); + m_arrayToolBars[VIDEO_TOOLBAR]->addWidget( forwardslash ); m_pcTotalFrameNumLabel = new QLabel; m_pcTotalFrameNumLabel->setText( "-" ); - toolbarVideo->addWidget( m_pcTotalFrameNumLabel ); + m_arrayToolBars[VIDEO_TOOLBAR]->addWidget( m_pcTotalFrameNumLabel ); + + addToolBar( Qt::BottomToolBarArea, m_arrayToolBars[VIDEO_TOOLBAR] ); } Void plaYUVerApp::createDockWidgets() diff --git a/source/app/plaYUVerApp.h b/source/app/plaYUVerApp.h index b8d5f4f..e1465cb 100644 --- a/source/app/plaYUVerApp.h +++ b/source/app/plaYUVerApp.h @@ -184,9 +184,14 @@ private: StreamPropertiesSideBar* m_pcStreamProperties; FramePropertiesSideBar* m_pcFrameProperties; - QToolBar *toolbarFile; - QToolBar *toolbarView; - QToolBar *toolbarVideo; + enum TOOLBAR_LIST + { + FILE_TOOLBAR = 0, + VIEW_TOOLBAR, + VIDEO_TOOLBAR, + TOTAL_TOOLBAR, + }; + QVector m_arrayToolBars; enum APP_ACTION_LIST { From 0f14073f84a1db8daecda38a9a1b5280a31330f6 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sun, 15 Jun 2014 12:02:58 +0100 Subject: [PATCH 12/13] bug fix when loading the sequence in memory --- source/app/InputStream.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/app/InputStream.cpp b/source/app/InputStream.cpp index 039a3fd..bd4ef0e 100755 --- a/source/app/InputStream.cpp +++ b/source/app/InputStream.cpp @@ -300,6 +300,9 @@ Bool InputStream::guessFormat( QString filename, UInt& rWidth, UInt& rHeight, In Void InputStream::loadAll() { + if( m_bLoadAll ) + return; + if( m_ppcFrameBuffer ) { for( UInt i = 0; i < m_uiFrameBufferSize; i++ ) @@ -323,8 +326,9 @@ Void InputStream::loadAll() } m_uiFrameBufferIndex = 0; m_pcCurrFrame = m_ppcFrameBuffer[m_uiFrameBufferIndex]; + m_iCurrFrameNum = -1; seekInput( 0 ); - for( UInt i = m_uiFrameBufferIndex+1; i < m_uiFrameBufferSize; i++ ) + for( UInt i = 0; i < m_uiFrameBufferSize-1; i++ ) { readNextFrame(); setNextFrame(); From 47f940c31274fe4a72808c35cc615ada5921f090 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Sun, 15 Jun 2014 12:49:12 +0100 Subject: [PATCH 13/13] merge with master --- cmake/Install.cmake | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index fda5640..4e235c1 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -59,19 +59,33 @@ SET(CPACK_PACKAGE_CONTACT "Joao Carreira (jfmcarreira@gmail.com), Luis Lucas (lu SET(CPACK_PACKAGE_VERSION_MAJOR ${PLAYUVER_VERSION_MAJOR}) SET(CPACK_PACKAGE_VERSION_MINOR ${PLAYUVER_VERSION_MINOR}) SET(CPACK_PACKAGE_VERSION_PATCH ${PLAYUVER_VERSION_PATH}) +SET(CPACK_PACKAGE_VERSION "${PLAYUVER_VERSION_MAJOR}.${PLAYUVER_VERSION_MINOR}.${PLAYUVER_VERSION_PATH}") SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") - SET(CPACK_DEBIAN_PACKAGE_DEPENDS "") IF( USE_QT4 ) LIST(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS "libqtcore4 (>= 4:4.8.5~), libqtgui4 (>= 4:4.8.5~)" ) + SET( APPEND_VERSION "${APPEND_VERSION}_wQT4" ) ELSE() LIST(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5core5a, libqt5gui5, libqt5widgets5") + SET( APPEND_VERSION "${APPEND_VERSION}_wQT5" ) ENDIF() IF( USE_FFMPEG ) LIST(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS ",") LIST(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS "libavformat53 (>= 6:0.8.10~), libcodec53 (>= 6:0.8.3-1~), libavutil51 (>= 6:0.8.3-1~)") + SET( APPEND_VERSION "${APPEND_VERSION}_wFFmpeg" ) ENDIF() +IF( USE_OPENCV ) + SET( APPEND_VERSION "${APPEND_VERSION}_wOpenCV" ) +ENDIF() + +IF(UNIX) + EXECUTE_PROCESS(COMMAND "date" "+%Y%m%d" OUTPUT_VARIABLE DAY) + string(STRIP ${DAY} DAY) +ENDIF(UNIX) + +SET( CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}${APPEND_VERSION}-Linux-${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}-${DAY}" ) + INCLUDE(CPack)