Major changes on code
Remove Qt4 support Change include headers Change the include of QCustomPlot lib and updated code based on upstream
This commit is contained in:
66 files changed
+38551
-29387
No files matched your search
+5
-8
@@ -1,6 +1,5 @@
|
||||
---
|
||||
Language: Cpp
|
||||
# BasedOnStyle: Chromium
|
||||
ColumnLimit: 150
|
||||
AccessModifierOffset: -2
|
||||
AlignAfterOpenBracket: Align
|
||||
@@ -14,13 +13,12 @@ AllowShortBlocksOnASingleLine: true
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: Inline
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AllowShortLoopsOnASingleLine: true
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: true
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: true
|
||||
BinPackArguments: true
|
||||
BinPackParameters: false
|
||||
BinPackParameters: true
|
||||
BraceWrapping:
|
||||
AfterClass: false
|
||||
AfterControlStatement: false
|
||||
@@ -37,9 +35,8 @@ BreakBeforeBinaryOperators: None
|
||||
#BreakBeforeBraces: Attach
|
||||
BreakBeforeBraces: Allman
|
||||
BreakBeforeInheritanceComma: false
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializersBeforeComma: true
|
||||
BreakConstructorInitializersBeforeComma: true
|
||||
BreakBeforeTernaryOperators: false
|
||||
BreakConstructorInitializers: BeforeComma
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakStringLiterals: true
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
|
||||
+17
-43
@@ -4,43 +4,24 @@
|
||||
|
||||
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/external )
|
||||
|
||||
OPTION( USE_QT4 "Build with Qt4" OFF )
|
||||
OPTION( USE_QTDBUS "Build with QtDBus" ON )
|
||||
OPTION( USE_FERVOR "Add Fervor support" OFF )
|
||||
|
||||
#####################################################################################
|
||||
# Qt library
|
||||
######################################################################################
|
||||
ADD_SUBDIRECTORY( external )
|
||||
|
||||
IF( USE_QT4 )
|
||||
FIND_PACKAGE( Qt5 REQUIRED COMPONENTS Core Gui Widgets Concurrent )
|
||||
LIST(APPEND QT_LINKER_LIBS Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Concurrent )
|
||||
LIST(APPEND QT_MODULES Core Gui Widgets Concurrent )
|
||||
|
||||
FIND_PACKAGE( Qt4 REQUIRED COMPONENTS QtCore QtGui QtDBus QtNetwork QtWebKit )
|
||||
SET( USE_QTDBUS TRUE )
|
||||
IF( NOT QT4_FOUND )
|
||||
SET(USE_QT4 FALSE)
|
||||
ELSE()
|
||||
INCLUDE( ${QT_USE_FILE} )
|
||||
ADD_DEFINITIONS( ${QT_DEFINITIONS} )
|
||||
SET( QT_LINKER_LIBS ${QT_LIBRARIES} )
|
||||
IF( USE_QTDBUS )
|
||||
FIND_PACKAGE( Qt5DBus )
|
||||
SET_PACKAGE_PROPERTIES(Qt5DBus PROPERTIES DESCRIPTION "Support for Qt5 DBus messages between instances" TYPE OPTIONAL )
|
||||
IF( ${Qt5DBus_FOUND} )
|
||||
SET( USE_QTDBUS ${Qt5DBus_FOUND} ) # TODO: fix this stupid variable
|
||||
SET( USE_QTDBUS ${Qt5DBus_FOUND} PARENT_SCOPE)
|
||||
LIST(APPEND QT_LINKER_LIBS Qt5::DBus )
|
||||
LIST(APPEND QT_MODULES DBus )
|
||||
ENDIF()
|
||||
|
||||
ELSE()
|
||||
|
||||
FIND_PACKAGE( Qt5 REQUIRED COMPONENTS Core Gui Widgets PrintSupport Concurrent )
|
||||
LIST(APPEND QT_LINKER_LIBS Qt5::Core Qt5::Gui Qt5::Widgets Qt5::PrintSupport Qt5::Concurrent )
|
||||
LIST(APPEND QT_MODULES Core Gui Widgets PrintSupport Concurrent )
|
||||
|
||||
IF( USE_QTDBUS )
|
||||
FIND_PACKAGE( Qt5DBus )
|
||||
SET_PACKAGE_PROPERTIES(Qt5DBus PROPERTIES DESCRIPTION "Support for Qt5 DBus messages between instances" TYPE OPTIONAL )
|
||||
IF( ${Qt5DBus_FOUND} )
|
||||
SET( USE_QTDBUS ${Qt5DBus_FOUND} ) # TODO: fix this stupid variable
|
||||
SET( USE_QTDBUS ${Qt5DBus_FOUND} PARENT_SCOPE)
|
||||
LIST(APPEND QT_LINKER_LIBS Qt5::DBus )
|
||||
LIST(APPEND QT_MODULES DBus )
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
ENDIF()
|
||||
|
||||
set(plaYUVer_App_SRCS
|
||||
@@ -59,7 +40,7 @@ set(plaYUVer_App_SRCS
|
||||
QualityHandle.cpp
|
||||
QualityMeasurementSidebar.cpp
|
||||
PlotSubWindow.cpp
|
||||
external/qcustomplot.cpp
|
||||
external/qcustomplot/qcustomplot.cpp
|
||||
# Module Plugins
|
||||
ModulesHandle.cpp
|
||||
ModulesHandleOptDialog.cpp
|
||||
@@ -125,13 +106,8 @@ ENDIF()
|
||||
SET_PACKAGE_PROPERTIES(Fervor PROPERTIES URL "https://github.com/pypt/fervor" DESCRIPTION "Fervor lib includes check for updates feature" TYPE OPTIONAL )
|
||||
ADD_FEATURE_INFO(Fervor USE_FERVOR "Fervor lib includes check for updates feature.")
|
||||
|
||||
IF( USE_QT4 )
|
||||
QT4_WRAP_UI( PlaYUVer_App_UI_Wrap ${PlaYUVer_App_UI} )
|
||||
QT4_ADD_RESOURCES( PlaYUVer_App_RCC ${PlaYUVer_App_RCC} )
|
||||
ELSE()
|
||||
QT5_WRAP_UI( PlaYUVer_App_UI_Wrap ${PlaYUVer_App_UI} )
|
||||
QT5_ADD_RESOURCES( PlaYUVer_App_RCC ${PlaYUVer_App_RCC} )
|
||||
ENDIF()
|
||||
QT5_WRAP_UI( PlaYUVer_App_UI_Wrap ${PlaYUVer_App_UI} )
|
||||
QT5_ADD_RESOURCES( PlaYUVer_App_RCC ${PlaYUVer_App_RCC} )
|
||||
|
||||
# Instruct CMake to run moc automatically when needed.
|
||||
SET( CMAKE_AUTOMOC ON )
|
||||
@@ -154,11 +130,9 @@ ENDIF()
|
||||
|
||||
|
||||
ADD_EXECUTABLE( ${PROJECT_NAME} ${plaYUVer_App_SRCS} ${HEADERS_MOC_FILES} ${PlaYUVer_App_UI_Wrap} ${PlaYUVer_App_RCC} ${WINDOWS_RES_FILE} )
|
||||
TARGET_LINK_LIBRARIES( ${PROJECT_NAME} PlaYUVerLib PlaYUVerModules ${APP_LINKER_LIBS} ${QT_LINKER_LIBS} )
|
||||
TARGET_LINK_LIBRARIES( ${PROJECT_NAME} PlaYUVerLib PlaYUVerModules QCustomPlotLib ${APP_LINKER_LIBS} ${QT_LINKER_LIBS} )
|
||||
|
||||
IF( NOT USE_QT4 )
|
||||
QT5_USE_MODULES( ${PROJECT_NAME} ${QT_MODULES} )
|
||||
ENDIF()
|
||||
# QT5_USE_MODULES( ${PROJECT_NAME} ${QT_MODULES} )
|
||||
|
||||
INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin )
|
||||
INSTALL(FILES resources/playuver.desktop DESTINATION share/applications )
|
||||
|
||||
@@ -45,8 +45,7 @@ QDataStream& operator<<( QDataStream& out, const PlaYUVerStdResolutionVector& ar
|
||||
{
|
||||
PlaYUVerStdResolution d;
|
||||
out << array.size();
|
||||
for( Int i = 0; i < array.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < array.size(); i++ ) {
|
||||
d = array.at( i );
|
||||
out << QString::fromStdString( d.shortName ) << d.uiWidth << d.uiHeight;
|
||||
}
|
||||
@@ -59,8 +58,7 @@ QDataStream& operator>>( QDataStream& in, PlaYUVerStdResolutionVector& array )
|
||||
QString auxName;
|
||||
Int array_size;
|
||||
in >> array_size;
|
||||
for( Int i = 0; i < array_size; i++ )
|
||||
{
|
||||
for( Int i = 0; i < array_size; i++ ) {
|
||||
in >> auxName;
|
||||
d.shortName = auxName.toStdString();
|
||||
in >> d.uiWidth;
|
||||
@@ -142,8 +140,7 @@ ConfigureFormatDialog::ConfigureFormatDialog( QWidget* parent ) : QDialog( paren
|
||||
UInt uiWidth, uiHeight;
|
||||
|
||||
readSettings();
|
||||
for( Int i = 0; i < aRCustomFileFormats.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < aRCustomFileFormats.size(); i++ ) {
|
||||
Name = QString::fromStdString( aRCustomFileFormats[i].shortName );
|
||||
uiWidth = aRCustomFileFormats[i].uiWidth;
|
||||
uiHeight = aRCustomFileFormats[i].uiHeight;
|
||||
@@ -152,8 +149,7 @@ ConfigureFormatDialog::ConfigureFormatDialog( QWidget* parent ) : QDialog( paren
|
||||
}
|
||||
|
||||
std::vector<PlaYUVerStdResolution> listPlaYUVerStdResolution = PlaYUVerStream::stdResolutionSizes();
|
||||
for( UInt i = 0; i < listPlaYUVerStdResolution.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < listPlaYUVerStdResolution.size(); i++ ) {
|
||||
Name = QString::fromStdString( listPlaYUVerStdResolution[i].shortName );
|
||||
uiWidth = listPlaYUVerStdResolution[i].uiWidth;
|
||||
uiHeight = listPlaYUVerStdResolution[i].uiHeight;
|
||||
@@ -281,8 +277,7 @@ ConfigureFormatDialog::ConfigureFormatDialog( QWidget* parent ) : QDialog( paren
|
||||
m_comboBoxPixelFormat->setFont( normalFont );
|
||||
m_comboBoxPixelFormat->clear();
|
||||
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedColorSpacesListNames().size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedColorSpacesListNames().size(); i++ ) {
|
||||
m_comboBoxColorSpace->insertItem( i, PlaYUVerFrame::supportedColorSpacesListNames()[i].c_str() );
|
||||
}
|
||||
m_comboBoxColorSpace->setCurrentIndex( 1 );
|
||||
@@ -379,13 +374,8 @@ ConfigureFormatDialog::ConfigureFormatDialog( QWidget* parent ) : QDialog( paren
|
||||
setFixedSize( MainLayout->sizeHint() );
|
||||
}
|
||||
|
||||
Int ConfigureFormatDialog::runConfigureFormatDialog( const QString& Filename,
|
||||
UInt& rWidth,
|
||||
UInt& rHeight,
|
||||
Int& rInputFormat,
|
||||
UInt& rBits,
|
||||
Int& rEndianess,
|
||||
UInt& rFrameRate )
|
||||
Int ConfigureFormatDialog::runConfigureFormatDialog( const QString& Filename, UInt& rWidth, UInt& rHeight, Int& rInputFormat, UInt& rBits,
|
||||
Int& rEndianess, UInt& rFrameRate )
|
||||
{
|
||||
// Set default values
|
||||
// setWindowTitle( "Configure resolution for " + Filename );
|
||||
@@ -398,10 +388,8 @@ Int ConfigureFormatDialog::runConfigureFormatDialog( const QString& Filename,
|
||||
if( rInputFormat >= 0 )
|
||||
{
|
||||
String pelFmtName = PlaYUVerFrame::supportedPixelFormatListNames()[rInputFormat];
|
||||
for( UInt j = 0; j < PlaYUVerFrame::supportedColorSpacesListNames().size(); j++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames( j ).size(); i++ )
|
||||
{
|
||||
for( UInt j = 0; j < PlaYUVerFrame::supportedColorSpacesListNames().size(); j++ ) {
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames( j ).size(); i++ ) {
|
||||
if( pelFmtName == PlaYUVerFrame::supportedPixelFormatListNames( j )[i] )
|
||||
{
|
||||
colorSpace = j;
|
||||
@@ -425,8 +413,7 @@ Int ConfigureFormatDialog::runConfigureFormatDialog( const QString& Filename,
|
||||
}
|
||||
m_spinBoxFrameRate->setValue( rFrameRate );
|
||||
|
||||
for( Int i = 0; i < standardResolutionSizes.size() - 1; i++ )
|
||||
{
|
||||
for( Int i = 0; i < standardResolutionSizes.size() - 1; i++ ) {
|
||||
if( standardResolutionSizes.at( i ) == QSize( rWidth, rHeight ) )
|
||||
{
|
||||
m_comboBoxStandardResolution->setCurrentIndex( i );
|
||||
@@ -445,8 +432,7 @@ Int ConfigureFormatDialog::runConfigureFormatDialog( const QString& Filename,
|
||||
colorSpace = m_comboBoxColorSpace->currentIndex();
|
||||
sampling = m_comboBoxPixelFormat->currentIndex();
|
||||
String pelFmtName = PlaYUVerFrame::supportedPixelFormatListNames( colorSpace )[sampling];
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames().size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames().size(); i++ ) {
|
||||
if( pelFmtName == PlaYUVerFrame::supportedPixelFormatListNames()[i] )
|
||||
{
|
||||
rInputFormat = i;
|
||||
@@ -496,8 +482,7 @@ void ConfigureFormatDialog::slotResolutionChange()
|
||||
{
|
||||
m_comboBoxStandardResolution->blockSignals( true );
|
||||
Int newIdx = -1;
|
||||
for( Int i = 0; i < standardResolutionSizes.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < standardResolutionSizes.size(); i++ ) {
|
||||
if( standardResolutionSizes.at( i ) == QSize( m_spinBoxWidth->value(), m_spinBoxheight->value() ) )
|
||||
{
|
||||
newIdx = i;
|
||||
@@ -514,8 +499,7 @@ Void ConfigureFormatDialog::slotColorSpaceChange( Int idx )
|
||||
return;
|
||||
|
||||
m_comboBoxPixelFormat->clear();
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames( idx ).size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames( idx ).size(); i++ ) {
|
||||
m_comboBoxPixelFormat->insertItem( i, PlaYUVerFrame::supportedPixelFormatListNames( idx )[i].c_str() );
|
||||
}
|
||||
m_comboBoxPixelFormat->setCurrentIndex( 0 );
|
||||
|
||||
@@ -51,12 +51,7 @@ class ConfigureFormatDialog : public QDialog
|
||||
|
||||
public:
|
||||
ConfigureFormatDialog( QWidget* parent = 0 );
|
||||
Int runConfigureFormatDialog( const QString& Filename,
|
||||
UInt& rWidth,
|
||||
UInt& rHeight,
|
||||
Int& rInputFormat,
|
||||
UInt& rBits,
|
||||
Int& rEndianess,
|
||||
Int runConfigureFormatDialog( const QString& Filename, UInt& rWidth, UInt& rHeight, Int& rInputFormat, UInt& rBits, Int& rEndianess,
|
||||
UInt& rFrameRate );
|
||||
|
||||
Void readSettings();
|
||||
|
||||
@@ -28,10 +28,7 @@
|
||||
#include <QCheckBox>
|
||||
#include <QGroupBox>
|
||||
|
||||
DialogSubWindowSelector::DialogSubWindowSelector( QWidget* parent,
|
||||
PlaYUVerSubWindowHandle* windowManager,
|
||||
UInt uiCategory,
|
||||
Int minWindowsSelected,
|
||||
DialogSubWindowSelector::DialogSubWindowSelector( QWidget* parent, PlaYUVerSubWindowHandle* windowManager, UInt uiCategory, Int minWindowsSelected,
|
||||
Int maxWindowsSelected )
|
||||
: QDialog( parent )
|
||||
, m_uiCategory( uiCategory )
|
||||
@@ -87,8 +84,7 @@ DialogSubWindowSelector::DialogSubWindowSelector( QWidget* parent,
|
||||
QString currSubWindowName;
|
||||
QCheckBox* windowCheckBox;
|
||||
m_apcSubWindowList = m_pcMainWindowManager->findSubWindow( m_uiCategory );
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ ) {
|
||||
subWindow = m_apcSubWindowList.at( i );
|
||||
currSubWindowName = subWindow->getWindowName();
|
||||
windowCheckBox = new QCheckBox( currSubWindowName, this );
|
||||
@@ -112,8 +108,7 @@ Void DialogSubWindowSelector::updateSubWindowList()
|
||||
/**
|
||||
* Remove all check boxes
|
||||
*/
|
||||
for( Int i = 0; i < pcLayout->count(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < pcLayout->count(); i++ ) {
|
||||
pcLayoutItem = pcLayout->itemAt( i );
|
||||
if( pcLayoutItem )
|
||||
{
|
||||
@@ -122,8 +117,7 @@ Void DialogSubWindowSelector::updateSubWindowList()
|
||||
}
|
||||
}
|
||||
|
||||
for( Int i = 0; i < m_apcSelectedSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcSelectedSubWindowList.size(); i++ ) {
|
||||
iIdx = m_apcSubWindowList.indexOf( m_apcSelectedSubWindowList.at( i ) );
|
||||
if( iIdx >= 0 )
|
||||
{
|
||||
@@ -131,8 +125,7 @@ Void DialogSubWindowSelector::updateSubWindowList()
|
||||
m_pcGroupCheckBox->layout()->addWidget( windowCheckBox );
|
||||
}
|
||||
}
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ ) {
|
||||
if( !m_apcSelectedSubWindowList.contains( m_apcSubWindowList.at( i ) ) )
|
||||
m_pcGroupCheckBox->layout()->addWidget( m_apcWindowsListCheckBox.at( i ) );
|
||||
}
|
||||
@@ -179,8 +172,7 @@ Void DialogSubWindowSelector::update()
|
||||
}
|
||||
if( m_apcSelectedSubWindowList.size() >= m_iMaxSlectedWindows )
|
||||
{
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ ) {
|
||||
if( m_apcSelectedSubWindowList.contains( m_apcSubWindowList.at( i ) ) )
|
||||
{
|
||||
m_apcWindowsListCheckBox.at( i )->setEnabled( true );
|
||||
@@ -193,8 +185,7 @@ Void DialogSubWindowSelector::update()
|
||||
}
|
||||
else
|
||||
{
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ ) {
|
||||
m_apcWindowsListCheckBox.at( i )->setEnabled( true );
|
||||
}
|
||||
}
|
||||
@@ -222,8 +213,7 @@ Void DialogSubWindowSelector::toggleSubWindow( Int idx )
|
||||
Void DialogSubWindowSelector::addAllSubWindow()
|
||||
{
|
||||
m_apcSelectedSubWindowList.clear();
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ ) {
|
||||
m_apcWindowsListCheckBox.at( i )->setChecked( true );
|
||||
}
|
||||
update();
|
||||
@@ -231,8 +221,7 @@ Void DialogSubWindowSelector::addAllSubWindow()
|
||||
|
||||
Void DialogSubWindowSelector::removeAllSubWindow()
|
||||
{
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcWindowsListCheckBox.size(); i++ ) {
|
||||
m_apcWindowsListCheckBox.at( i )->setChecked( false );
|
||||
}
|
||||
m_apcSelectedSubWindowList.clear();
|
||||
|
||||
@@ -27,11 +27,7 @@
|
||||
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "config.h"
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include <QtCore>
|
||||
|
||||
#include <QVector>
|
||||
@@ -53,10 +49,7 @@ class DialogSubWindowSelector : public QDialog
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DialogSubWindowSelector( QWidget* parent,
|
||||
PlaYUVerSubWindowHandle* windowManager,
|
||||
UInt uiCategory,
|
||||
Int minWindowsSelected = 1,
|
||||
DialogSubWindowSelector( QWidget* parent, PlaYUVerSubWindowHandle* windowManager, UInt uiCategory, Int minWindowsSelected = 1,
|
||||
Int maxWindowsSelected = -1 );
|
||||
|
||||
Void selectSubWindow( SubWindowAbstract* subWindow );
|
||||
|
||||
+37
-46
@@ -43,24 +43,22 @@ FramePropertiesDock::FramePropertiesDock( QWidget* parent, Bool* pbMainPlaySwitc
|
||||
channelCB->addItem( tr( "Luminance" ) );
|
||||
channelCB->setItemIcon( 0, QIcon( ":/images/channel-luma.png" ) );
|
||||
|
||||
channelCB->setWhatsThis(
|
||||
tr( "<p>Select here the histogram channel to display:<p>"
|
||||
"<b>Luminance</b>: Display luminance (perceived brightness).<p>"
|
||||
"<b>Red</b>: Display the red image channel.<p>"
|
||||
"<b>Green</b>: Display the green image channel.<p>"
|
||||
"<b>Blue</b>: Display the blue image channel.<p>"
|
||||
"<b>Alpha</b>: Display the alpha image channel. "
|
||||
"This channel corresponds to the transparency value and "
|
||||
"is supported by some image formats such as PNG or TIFF.<p>"
|
||||
"<b>Colors</b>: Display all color channel values at "
|
||||
"the same time." ) );
|
||||
channelCB->setWhatsThis( tr( "<p>Select here the histogram channel to display:<p>"
|
||||
"<b>Luminance</b>: Display luminance (perceived brightness).<p>"
|
||||
"<b>Red</b>: Display the red image channel.<p>"
|
||||
"<b>Green</b>: Display the green image channel.<p>"
|
||||
"<b>Blue</b>: Display the blue image channel.<p>"
|
||||
"<b>Alpha</b>: Display the alpha image channel. "
|
||||
"This channel corresponds to the transparency value and "
|
||||
"is supported by some image formats such as PNG or TIFF.<p>"
|
||||
"<b>Colors</b>: Display all color channel values at "
|
||||
"the same time." ) );
|
||||
|
||||
QString scaleWhatsThis(
|
||||
tr( "<p>Select here the histogram scale.<p>"
|
||||
"If the image's maximal values are small, you can use the "
|
||||
"linear scale.<p>Logarithmic scale can be used when the maximal"
|
||||
" values are big; if it is used, all values (small and large) "
|
||||
"will be visible on the graph." ) );
|
||||
QString scaleWhatsThis( tr( "<p>Select here the histogram scale.<p>"
|
||||
"If the image's maximal values are small, you can use the "
|
||||
"linear scale.<p>Logarithmic scale can be used when the maximal"
|
||||
" values are big; if it is used, all values (small and large) "
|
||||
"will be visible on the graph." ) );
|
||||
|
||||
linHistoButton = new QPushButton;
|
||||
linHistoButton->setToolTip( tr( "Linear" ) );
|
||||
@@ -92,11 +90,10 @@ FramePropertiesDock::FramePropertiesDock( QWidget* parent, Bool* pbMainPlaySwitc
|
||||
colorsCB->hide();
|
||||
colorsLabel->hide();
|
||||
|
||||
QString regionWhatsThis(
|
||||
tr( "<p>Select here from which region the histogram will be computed:"
|
||||
"<p><b>Full Image</b>: Compute histogram using the full image."
|
||||
"<p><b>Selection</b>: Compute histogram using the current image "
|
||||
"selection." ) );
|
||||
QString regionWhatsThis( tr( "<p>Select here from which region the histogram will be computed:"
|
||||
"<p><b>Full Image</b>: Compute histogram using the full image."
|
||||
"<p><b>Selection</b>: Compute histogram using the current image "
|
||||
"selection." ) );
|
||||
|
||||
fullImageButton = new QPushButton;
|
||||
fullImageButton->setToolTip( tr( "Full Image" ) );
|
||||
@@ -133,9 +130,8 @@ FramePropertiesDock::FramePropertiesDock( QWidget* parent, Bool* pbMainPlaySwitc
|
||||
// -------------------------------------------------------------
|
||||
|
||||
histogramWidget = new HistogramWidget( 100, 100 );
|
||||
histogramWidget->setWhatsThis(
|
||||
tr( "<p>This is the histogram drawing of "
|
||||
"the selected image channel" ) );
|
||||
histogramWidget->setWhatsThis( tr( "<p>This is the histogram drawing of "
|
||||
"the selected image channel" ) );
|
||||
|
||||
QVBoxLayout* histogramLayout = new QVBoxLayout;
|
||||
histogramLayout->setSpacing( 1 );
|
||||
@@ -152,17 +148,15 @@ FramePropertiesDock::FramePropertiesDock( QWidget* parent, Bool* pbMainPlaySwitc
|
||||
minInterv->setRange( 0, 255 );
|
||||
minInterv->setSingleStep( 1 );
|
||||
minInterv->setValue( 0 );
|
||||
minInterv->setWhatsThis(
|
||||
tr( "<p>Select here the minimal intensity "
|
||||
"value of the histogram selection." ) );
|
||||
minInterv->setWhatsThis( tr( "<p>Select here the minimal intensity "
|
||||
"value of the histogram selection." ) );
|
||||
|
||||
maxInterv = new QSpinBox;
|
||||
maxInterv->setRange( 0, 255 );
|
||||
maxInterv->setSingleStep( 1 );
|
||||
maxInterv->setValue( 0 );
|
||||
minInterv->setWhatsThis(
|
||||
tr( "<p>Select here the maximal intensity value"
|
||||
" of the histogram selection." ) );
|
||||
minInterv->setWhatsThis( tr( "<p>Select here the maximal intensity value"
|
||||
" of the histogram selection." ) );
|
||||
|
||||
QHBoxLayout* rangeLayout = new QHBoxLayout;
|
||||
rangeLayout->addWidget( rangeSelectionLabel );
|
||||
@@ -227,10 +221,9 @@ FramePropertiesDock::FramePropertiesDock( QWidget* parent, Bool* pbMainPlaySwitc
|
||||
|
||||
QGroupBox* statisticsGroup = new QGroupBox( tr( "Statistics" ) );
|
||||
statisticsGroup->setLayout( statisticsLayout );
|
||||
statisticsGroup->setWhatsThis(
|
||||
tr( "<p>Here you can see the statistical results calculated from the "
|
||||
"selected histogram part. These values are available for all "
|
||||
"channels." ) );
|
||||
statisticsGroup->setWhatsThis( tr( "<p>Here you can see the statistical results calculated from the "
|
||||
"selected histogram part. These values are available for all "
|
||||
"channels." ) );
|
||||
|
||||
mainLayout->addWidget( statisticsGroup, 5, 0, 1, 4 );
|
||||
|
||||
@@ -318,11 +311,10 @@ Void FramePropertiesDock::setFrame( PlaYUVerFrame* pcFrame )
|
||||
colorsCB->addItem( "Green" );
|
||||
colorsCB->addItem( "Blue" );
|
||||
colorsCB->setEnabled( false );
|
||||
colorsCB->setWhatsThis(
|
||||
tr( "<p>Select here the main color displayed with Colors Channel mode:"
|
||||
"<p><b>Red</b>: Draw the Red image channel in the foreground.<p>"
|
||||
"<b>Green</b>: Draw the Green image channel in the foreground.<p>"
|
||||
"<b>Blue</b>: Draw the Blue image channel in the foreground.<p>" ) );
|
||||
colorsCB->setWhatsThis( tr( "<p>Select here the main color displayed with Colors Channel mode:"
|
||||
"<p><b>Red</b>: Draw the Red image channel in the foreground.<p>"
|
||||
"<b>Green</b>: Draw the Green image channel in the foreground.<p>"
|
||||
"<b>Blue</b>: Draw the Blue image channel in the foreground.<p>" ) );
|
||||
colorsCB->show();
|
||||
colorsLabel->show();
|
||||
}
|
||||
@@ -339,12 +331,11 @@ Void FramePropertiesDock::setFrame( PlaYUVerFrame* pcFrame )
|
||||
colorsCB->addItem( "Chroma U" );
|
||||
colorsCB->addItem( "Chroma V" );
|
||||
colorsCB->setEnabled( false );
|
||||
colorsCB->setWhatsThis(
|
||||
tr( "<p>Select here the main color displayed with Colors Channel mode:"
|
||||
"<p><b>Luminance</b>: DraupdateDataw the Luminance channel in the "
|
||||
"foreground.<p>"
|
||||
"<b>Chroma U</b>: Draw the Chroma U channel in the foreground.<p>"
|
||||
"<b>Chroma V</b>: Draw the Chroma V channel in the foreground.<p>" ) );
|
||||
colorsCB->setWhatsThis( tr( "<p>Select here the main color displayed with Colors Channel mode:"
|
||||
"<p><b>Luminance</b>: DraupdateDataw the Luminance channel in the "
|
||||
"foreground.<p>"
|
||||
"<b>Chroma U</b>: Draw the Chroma U channel in the foreground.<p>"
|
||||
"<b>Chroma V</b>: Draw the Chroma V channel in the foreground.<p>" ) );
|
||||
colorsCB->show();
|
||||
colorsLabel->show();
|
||||
}
|
||||
|
||||
@@ -27,12 +27,7 @@
|
||||
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "config.h"
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QWidget>
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include "HistogramWidget.h"
|
||||
#include "lib/PlaYUVerFrame.h"
|
||||
#include "lib/PlaYUVerStream.h"
|
||||
|
||||
+6
-12
@@ -70,13 +70,11 @@ void GridManager::drawGrid( QPixmap& image, const QRect& area, QPainter* painter
|
||||
{
|
||||
painter->setPen( mainPen );
|
||||
// Draw crosses or dots on intersections
|
||||
for( int x = offsetx; x <= area.right(); x += hSpacing )
|
||||
{
|
||||
for( int x = offsetx; x <= area.right(); x += hSpacing ) {
|
||||
if( x >= imageWidth )
|
||||
break;
|
||||
|
||||
for( int y = offsety; y <= area.bottom(); y += vSpacing )
|
||||
{
|
||||
for( int y = offsety; y <= area.bottom(); y += vSpacing ) {
|
||||
if( y >= imageHeight )
|
||||
break;
|
||||
|
||||
@@ -104,8 +102,7 @@ void GridManager::drawGrid( QPixmap& image, const QRect& area, QPainter* painter
|
||||
painter->setPen( mainPen );
|
||||
|
||||
// Draw vertical line
|
||||
for( int x = offsetx; x <= area.right(); x += hSpacing )
|
||||
{
|
||||
for( int x = offsetx; x <= area.right(); x += hSpacing ) {
|
||||
if( x >= imageWidth )
|
||||
break;
|
||||
|
||||
@@ -118,8 +115,7 @@ void GridManager::drawGrid( QPixmap& image, const QRect& area, QPainter* painter
|
||||
}
|
||||
}
|
||||
// Draw horizontal line
|
||||
for( int y = offsety; y <= area.bottom(); y += vSpacing )
|
||||
{
|
||||
for( int y = offsety; y <= area.bottom(); y += vSpacing ) {
|
||||
if( y >= imageHeight )
|
||||
break;
|
||||
|
||||
@@ -238,10 +234,8 @@ bool GridManager::isNear( int x, int y )
|
||||
int gy;
|
||||
|
||||
// In the worse case we have 4 points of the gride surrounding
|
||||
for( int j = 0; j < 2; j++ )
|
||||
{
|
||||
for( int i = 0; i < 2; i++ )
|
||||
{
|
||||
for( int j = 0; j < 2; j++ ) {
|
||||
for( int i = 0; i < 2; i++ ) {
|
||||
gx = (int)( multiPosX * hSpacing + i * hSpacing );
|
||||
gy = (int)( multiPosY * vSpacing + j * vSpacing );
|
||||
gridPoint.setX( gx );
|
||||
|
||||
@@ -554,8 +554,7 @@ Void HistogramWidget::paintEvent( QPaintEvent* )
|
||||
|
||||
// Drawing selection or all histogram values.
|
||||
|
||||
for( x = 0; x < wWidth; x++ )
|
||||
{
|
||||
for( x = 0; x < wWidth; x++ ) {
|
||||
double value = 0.0;
|
||||
double value_r = 0.0, value_g = 0.0, value_b = 0.0; // For all channels.
|
||||
int i, j;
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
#include "ModulesHandle.h"
|
||||
#include "PlaYUVerAppModuleIf.h"
|
||||
#include <QtGui>
|
||||
#include <QLabel>
|
||||
#include <QString>
|
||||
#include <QGridLayout>
|
||||
|
||||
|
||||
ModuleHandleDock::ModuleHandleDock( QWidget* parent, PlaYUVerAppModuleIf* moduleIf ) : QWidget( parent ), m_pcCurrModuleIf( moduleIf )
|
||||
{
|
||||
|
||||
@@ -27,12 +27,10 @@
|
||||
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "config.h"
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QWidget>
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include <QSize>
|
||||
|
||||
class QLabel;
|
||||
|
||||
class PlaYUVerAppModuleIf;
|
||||
|
||||
|
||||
+25
-49
@@ -74,9 +74,8 @@ Void ModulesHandle::createActions()
|
||||
connect( m_arrayActions[DISABLE_ALL_ACT], SIGNAL( triggered() ), this, SLOT( destroyAllModulesIf() ) );
|
||||
|
||||
m_arrayActions[FORCE_NEW_WINDOW_ACT] = new QAction( "Use New Window", parent() );
|
||||
m_arrayActions[FORCE_NEW_WINDOW_ACT]->setStatusTip(
|
||||
"Show module result in a new window. Some modules already force this "
|
||||
"feature" );
|
||||
m_arrayActions[FORCE_NEW_WINDOW_ACT]->setStatusTip( "Show module result in a new window. Some modules already force this "
|
||||
"feature" );
|
||||
m_arrayActions[FORCE_NEW_WINDOW_ACT]->setCheckable( true );
|
||||
}
|
||||
|
||||
@@ -94,8 +93,7 @@ Void ModulesHandle::buildMenu()
|
||||
QAction* currAction;
|
||||
QMenu* currSubMenu;
|
||||
|
||||
for( Int i = 0; i < m_arrayModulesActions.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_arrayModulesActions.size(); i++ ) {
|
||||
delete m_arrayModulesActions.at( i );
|
||||
}
|
||||
m_arrayModulesActions.clear();
|
||||
@@ -104,16 +102,14 @@ Void ModulesHandle::buildMenu()
|
||||
|
||||
PlaYUVerModuleFactoryMap& PlaYUVerModuleFactoryMap = PlaYUVerModuleFactory::Get()->getMap();
|
||||
PlaYUVerModuleFactoryMap::iterator it = PlaYUVerModuleFactoryMap.begin();
|
||||
for( ; it != PlaYUVerModuleFactoryMap.end(); ++it )
|
||||
{
|
||||
for( ; it != PlaYUVerModuleFactoryMap.end(); ++it ) {
|
||||
pcCurrModuleIf = it->second();
|
||||
ModuleIfInternalName = QString::fromLocal8Bit( it->first );
|
||||
|
||||
currSubMenu = NULL;
|
||||
if( pcCurrModuleIf->m_pchModuleCategory )
|
||||
{
|
||||
for( Int j = 0; j < m_pcModulesSubMenuList.size(); j++ )
|
||||
{
|
||||
for( Int j = 0; j < m_pcModulesSubMenuList.size(); j++ ) {
|
||||
if( m_pcModulesSubMenuList.at( j )->title() == QString( pcCurrModuleIf->m_pchModuleCategory ) )
|
||||
{
|
||||
currSubMenu = m_pcModulesSubMenuList.at( j );
|
||||
@@ -157,19 +153,16 @@ Void ModulesHandle::updateMenus()
|
||||
Bool hasSubWindow = pcSubWindow ? true : false;
|
||||
QAction* currModuleAction;
|
||||
|
||||
for( Int i = 0; i < m_arrayModulesActions.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_arrayModulesActions.size(); i++ ) {
|
||||
currModuleAction = m_arrayModulesActions.at( i );
|
||||
currModuleAction->setEnabled( hasSubWindow );
|
||||
currModuleAction->setChecked( false );
|
||||
}
|
||||
for( Int i = 0; i < m_pcModulesSubMenuList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_pcModulesSubMenuList.size(); i++ ) {
|
||||
m_pcModulesSubMenuList.at( i )->setEnabled( hasSubWindow );
|
||||
}
|
||||
|
||||
for( Int i = 0; i < m_arrayActions.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_arrayActions.size(); i++ ) {
|
||||
m_arrayActions.at( i )->setEnabled( false );
|
||||
}
|
||||
m_arrayActions[LOAD_EXTERNAL_ACT]->setEnabled( true );
|
||||
@@ -185,8 +178,7 @@ Void ModulesHandle::updateMenus()
|
||||
m_arrayActions[APPLY_ALL_ACT]->setEnabled( true );
|
||||
m_arrayActions[SWAP_FRAMES_ACT]->setEnabled( true );
|
||||
}
|
||||
for( Int i = 0; i < apcCurrentModule.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < apcCurrentModule.size(); i++ ) {
|
||||
currModuleAction = apcCurrentModule.at( i )->m_pcModuleAction;
|
||||
currModuleAction->setChecked( true );
|
||||
}
|
||||
@@ -242,8 +234,7 @@ Void ModulesHandle::loadExternalModule()
|
||||
filter << supported << formatsList << tr( "All Files (*)" );
|
||||
QStringList fileNames = QFileDialog::getOpenFileNames( m_pcParent, tr( "Open File" ), QString(), filter.join( ";;" ) );
|
||||
|
||||
for( Int i = 0; i < fileNames.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < fileNames.size(); i++ ) {
|
||||
bUpdate |= PlaYUVerModuleFactory::Get()->RegisterDl( fileNames.at( i ).toStdString().data() );
|
||||
}
|
||||
if( bUpdate )
|
||||
@@ -288,8 +279,7 @@ Void ModulesHandle::activateModule()
|
||||
|
||||
if( windowsList.size() == minNumFrames && windowsList.size() == maxNumFrames )
|
||||
{
|
||||
for( Int i = 0; i < windowsList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < windowsList.size(); i++ ) {
|
||||
videoSubWindowList.append( qobject_cast<VideoSubWindow*>( windowsList.at( i ) ) );
|
||||
}
|
||||
}
|
||||
@@ -297,8 +287,7 @@ Void ModulesHandle::activateModule()
|
||||
{
|
||||
if( windowsList.size() <= minNumFrames )
|
||||
{
|
||||
for( Int i = 0; i < windowsList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < windowsList.size(); i++ ) {
|
||||
dialogWindowsSelection.selectSubWindow( windowsList.at( i ) );
|
||||
}
|
||||
}
|
||||
@@ -310,8 +299,7 @@ Void ModulesHandle::activateModule()
|
||||
{
|
||||
VideoSubWindow* videoSubWindow;
|
||||
QList<SubWindowAbstract*> subWindowList = dialogWindowsSelection.getSelectedWindows();
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
videoSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
videoSubWindowList.append( videoSubWindow );
|
||||
}
|
||||
@@ -320,8 +308,7 @@ Void ModulesHandle::activateModule()
|
||||
if( pcCurrAppModuleIf->m_pcModule->m_iModuleAPI == MODULE_API_1 )
|
||||
{
|
||||
// Check for same fmt in more than one frame modules
|
||||
for( Int i = 1; i < videoSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 1; i < videoSubWindowList.size(); i++ ) {
|
||||
if( !videoSubWindowList.at( i )->getCurrFrame()->haveSameFmt( videoSubWindowList.at( 0 )->getCurrFrame() ) )
|
||||
{
|
||||
videoSubWindowList.clear();
|
||||
@@ -344,8 +331,7 @@ Void ModulesHandle::activateModule()
|
||||
return;
|
||||
}
|
||||
|
||||
for( Int i = 0; i < videoSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < videoSubWindowList.size(); i++ ) {
|
||||
pcCurrAppModuleIf->m_pcSubWindow[i] = videoSubWindowList.at( i );
|
||||
}
|
||||
|
||||
@@ -404,8 +390,7 @@ Void ModulesHandle::activateModule()
|
||||
{
|
||||
if( pcCurrAppModuleIf->m_pcDisplaySubWindow )
|
||||
pcCurrAppModuleIf->m_pcDisplaySubWindow->enableModule( pcCurrAppModuleIf );
|
||||
for( Int i = 0; i < videoSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < videoSubWindowList.size(); i++ ) {
|
||||
pcCurrAppModuleIf->m_pcSubWindow[i]->associateModule( pcCurrAppModuleIf );
|
||||
}
|
||||
}
|
||||
@@ -415,8 +400,7 @@ Void ModulesHandle::activateModule()
|
||||
if( pcCurrAppModuleIf->m_pcModule->m_iModuleAPI == MODULE_API_2 )
|
||||
{
|
||||
std::vector<PlaYUVerFrame*> apcFrameList;
|
||||
for( Int i = 0; i < videoSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < videoSubWindowList.size(); i++ ) {
|
||||
apcFrameList.push_back( pcCurrAppModuleIf->m_pcSubWindow[i]->getCurrFrame() );
|
||||
}
|
||||
moduleCreated = pcCurrAppModuleIf->m_pcModule->create( apcFrameList );
|
||||
@@ -476,8 +460,7 @@ Void ModulesHandle::destroyWindowModules()
|
||||
|
||||
Void ModulesHandle::destroyAllModulesIf()
|
||||
{
|
||||
for( Int i = 0; i < m_pcPlaYUVerAppModuleIfList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_pcPlaYUVerAppModuleIfList.size(); i++ ) {
|
||||
destroyModuleIf( m_pcPlaYUVerAppModuleIfList.at( i ) );
|
||||
}
|
||||
emit changed();
|
||||
@@ -485,8 +468,7 @@ Void ModulesHandle::destroyAllModulesIf()
|
||||
|
||||
Void ModulesHandle::applyModuleIf( QList<PlaYUVerAppModuleIf*> pcCurrModuleIfList, Bool isPlaying, Bool disableThreads )
|
||||
{
|
||||
for( Int i = 0; i < pcCurrModuleIfList.size() && !isPlaying; i++ )
|
||||
{
|
||||
for( Int i = 0; i < pcCurrModuleIfList.size() && !isPlaying; i++ ) {
|
||||
pcCurrModuleIfList.at( i )->apply( isPlaying, disableThreads );
|
||||
}
|
||||
}
|
||||
@@ -504,15 +486,13 @@ Void ModulesHandle::applyAllModuleIf( PlaYUVerAppModuleIf* pcCurrModuleIf )
|
||||
QStringList formatsList;
|
||||
std::vector<PlaYUVerSupportedFormat> supportedFmts = PlaYUVerStream::supportedWriteFormats();
|
||||
|
||||
for( UInt i = 0; i < supportedFmts.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < supportedFmts.size(); i++ ) {
|
||||
std::vector<String> arrayExt = supportedFmts[i].getExts();
|
||||
if( arrayExt.size() > 0 )
|
||||
{
|
||||
QString currFmt( QString::fromStdString( supportedFmts[i].formatName ) );
|
||||
currFmt.append( " (" );
|
||||
for( std::vector<String>::iterator e = arrayExt.begin(); e != arrayExt.end(); ++e )
|
||||
{
|
||||
for( std::vector<String>::iterator e = arrayExt.begin(); e != arrayExt.end(); ++e ) {
|
||||
supported.append( " *." );
|
||||
currFmt.append( "*." );
|
||||
supported.append( QString::fromStdString( *e ) );
|
||||
@@ -550,27 +530,23 @@ Void ModulesHandle::applyAllModuleIf( PlaYUVerAppModuleIf* pcCurrModuleIf )
|
||||
UInt numberOfWindows = pcCurrModuleIf->m_pcModule->m_uiNumberOfFrames;
|
||||
UInt64 currFrames = 0;
|
||||
UInt64 numberOfFrames = INT_MAX;
|
||||
for( UInt i = 0; i < numberOfWindows; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfWindows; i++ ) {
|
||||
currFrames = pcCurrModuleIf->m_pcSubWindow[i]->getInputStream()->getFrameNum();
|
||||
if( currFrames < numberOfFrames )
|
||||
numberOfFrames = currFrames;
|
||||
pcCurrModuleIf->m_pcSubWindow[i]->stop();
|
||||
}
|
||||
QApplication::setOverrideCursor( Qt::WaitCursor );
|
||||
for( UInt f = 1; f < numberOfFrames; f++ )
|
||||
{
|
||||
for( UInt f = 1; f < numberOfFrames; f++ ) {
|
||||
pcCurrModuleIf->apply( false, true );
|
||||
QCoreApplication::processEvents();
|
||||
pcCurrModuleIf->m_pcModuleStream->writeFrame( pcCurrModuleIf->m_pcProcessedFrame );
|
||||
for( UInt i = 0; i < numberOfWindows; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfWindows; i++ ) {
|
||||
pcCurrModuleIf->m_pcSubWindow[i]->play();
|
||||
pcCurrModuleIf->m_pcSubWindow[i]->playEvent();
|
||||
}
|
||||
}
|
||||
for( UInt i = 0; i < numberOfWindows; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfWindows; i++ ) {
|
||||
pcCurrModuleIf->m_pcSubWindow[i]->stop();
|
||||
}
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
@@ -30,11 +30,7 @@
|
||||
#include <iostream>
|
||||
|
||||
#include <QtCore>
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "PlaYUVerAppModuleIf.h"
|
||||
#include "lib/PlaYUVerFrame.h"
|
||||
|
||||
@@ -29,9 +29,13 @@
|
||||
#include <QVBoxLayout>
|
||||
#include <QVector>
|
||||
#include <QWidget>
|
||||
#include <QLineEdit>
|
||||
#include <QDialogButtonBox>
|
||||
|
||||
#include "lib/PlaYUVerOptions.h"
|
||||
|
||||
class QLineEdit;
|
||||
|
||||
class OpionConfiguration : public QWidget
|
||||
{
|
||||
public:
|
||||
@@ -86,8 +90,7 @@ ModulesHandleOptDialog::ModulesHandleOptDialog( QWidget* parent, PlaYUVerAppModu
|
||||
|
||||
QVBoxLayout* optionsLayout = new QVBoxLayout;
|
||||
OpionConfiguration* pcOption;
|
||||
for( PlaYUVerOptions::OptionsList::const_iterator it = moduleOptions.begin(); it != moduleOptions.end(); ++it )
|
||||
{
|
||||
for( PlaYUVerOptions::OptionsList::const_iterator it = moduleOptions.begin(); it != moduleOptions.end(); ++it ) {
|
||||
pcOption = new OpionConfiguration( ( *it )->opt );
|
||||
m_apcOptionList.append( pcOption );
|
||||
optionsLayout->addWidget( pcOption );
|
||||
@@ -120,8 +123,7 @@ Int ModulesHandleOptDialog::runConfiguration()
|
||||
String optionString;
|
||||
QString valueString( "" );
|
||||
|
||||
for( Int i = 0; i < m_apcOptionList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcOptionList.size(); i++ ) {
|
||||
valueString = m_apcOptionList.at( i )->getValue();
|
||||
if( !valueString.isEmpty() )
|
||||
{
|
||||
|
||||
+16
-32
@@ -112,14 +112,12 @@ Bool PlaYUVerApp::parseArgs( Int argc, Char* argv[] )
|
||||
}
|
||||
if( pcCmdParser.hasOpt( "input" ) )
|
||||
{
|
||||
for( UInt i = 1; i < m_apcInputs.size(); i++ )
|
||||
{
|
||||
for( UInt i = 1; i < m_apcInputs.size(); i++ ) {
|
||||
loadFile( QString::fromStdString( m_apcInputs[i] ) );
|
||||
}
|
||||
}
|
||||
std::list<const Char*>& argv_unhandled = pcCmdParser.getUnhandledArgs();
|
||||
for( std::list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++ )
|
||||
{
|
||||
for( std::list<const Char*>::const_iterator it = argv_unhandled.begin(); it != argv_unhandled.end(); it++ ) {
|
||||
loadFile( QString::fromStdString( *it ) );
|
||||
}
|
||||
m_pcWindowHandle->tileSubWindows();
|
||||
@@ -151,8 +149,7 @@ Void PlaYUVerApp::closeEvent( QCloseEvent* event )
|
||||
{
|
||||
case QMessageBox::Yes:
|
||||
mayCloseAll = true;
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
mayCloseAll &= subWindowList.at( i )->mayClose();
|
||||
}
|
||||
|
||||
@@ -257,15 +254,13 @@ QStringList PlaYUVerApp::showFileDialog( Bool bRead )
|
||||
else
|
||||
supportedFmts = PlaYUVerStream::supportedWriteFormats();
|
||||
|
||||
for( UInt i = 0; i < supportedFmts.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < supportedFmts.size(); i++ ) {
|
||||
std::vector<String> arrayExt = supportedFmts[i].getExts();
|
||||
if( arrayExt.size() > 0 )
|
||||
{
|
||||
QString currFmt( QString::fromStdString( supportedFmts[i].formatName ) );
|
||||
currFmt.append( " (" );
|
||||
for( std::vector<String>::iterator e = arrayExt.begin(); e != arrayExt.end(); ++e )
|
||||
{
|
||||
for( std::vector<String>::iterator e = arrayExt.begin(); e != arrayExt.end(); ++e ) {
|
||||
supported.append( " *." );
|
||||
currFmt.append( "*." );
|
||||
supported.append( QString::fromStdString( *e ) );
|
||||
@@ -287,8 +282,7 @@ QStringList PlaYUVerApp::showFileDialog( Bool bRead )
|
||||
Void PlaYUVerApp::open()
|
||||
{
|
||||
QStringList fileNameList = showFileDialog( true );
|
||||
for( Int i = 0; i < fileNameList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < fileNameList.size(); i++ ) {
|
||||
if( !fileNameList.at( i ).isEmpty() )
|
||||
{
|
||||
loadFile( fileNameList.at( i ) );
|
||||
@@ -380,11 +374,9 @@ Void PlaYUVerApp::reloadAll()
|
||||
SubWindowAbstract::MODULE_SUBWINDOW,
|
||||
};
|
||||
|
||||
for( UInt c = 0; c < 3; c++ )
|
||||
{
|
||||
for( UInt c = 0; c < 3; c++ ) {
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcWindowHandle->findSubWindow( windowCategoryOrder[c] );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
subWindowList.at( i )->refreshSubWindow();
|
||||
}
|
||||
}
|
||||
@@ -426,8 +418,7 @@ Void PlaYUVerApp::zoomToFitAll()
|
||||
{
|
||||
VideoSubWindow* videoSubWindow;
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcWindowHandle->findSubWindow( SubWindowAbstract::VIDEO_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
videoSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
videoSubWindow->zoomToFit();
|
||||
}
|
||||
@@ -492,8 +483,7 @@ VideoSubWindow* PlaYUVerApp::findVideoStreamSubWindow( const PlaYUVerSubWindowHa
|
||||
QString canonicalFilePath = QFileInfo( fileName ).canonicalFilePath();
|
||||
VideoSubWindow* pcSubWindow;
|
||||
QList<SubWindowAbstract*> subWindowList = windowManager->findSubWindow( SubWindowAbstract::VIDEO_STREAM_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
pcSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
if( pcSubWindow->getCurrentFileName() == canonicalFilePath )
|
||||
return qobject_cast<VideoSubWindow*>( pcSubWindow );
|
||||
@@ -603,8 +593,7 @@ Void PlaYUVerApp::createActions()
|
||||
// connect( m_arrayActions[OPEN_DEVICE_ACT], SIGNAL( triggered() ), this, SLOT( openDevice() ) );
|
||||
|
||||
m_arrayRecentFilesActions.resize( MAX_RECENT_FILES );
|
||||
for( Int i = 0; i < MAX_RECENT_FILES; i++ )
|
||||
{
|
||||
for( Int i = 0; i < MAX_RECENT_FILES; i++ ) {
|
||||
m_arrayRecentFilesActions[i] = new QAction( this );
|
||||
m_arrayRecentFilesActions[i]->setVisible( false );
|
||||
connect( m_arrayRecentFilesActions[i], SIGNAL( triggered() ), this, SLOT( openRecent() ) );
|
||||
@@ -719,8 +708,7 @@ Void PlaYUVerApp::createMenus()
|
||||
m_arrayMenu[FILE_MENU]->addAction( m_arrayActions[OPEN_ACT] );
|
||||
// m_arrayMenu[FILE_MENU]->addAction( m_arrayActions[OPEN_DEVICE_ACT] );
|
||||
m_arrayMenu[RECENT_MENU] = m_arrayMenu[FILE_MENU]->addMenu( tr( "Open Recent" ) );
|
||||
for( Int i = 0; i < MAX_RECENT_FILES; ++i )
|
||||
{
|
||||
for( Int i = 0; i < MAX_RECENT_FILES; ++i ) {
|
||||
m_arrayMenu[RECENT_MENU]->addAction( m_arrayRecentFilesActions[i] );
|
||||
}
|
||||
|
||||
@@ -827,8 +815,7 @@ Void PlaYUVerApp::addStreamInfoToRecentList( PlaYUVerStreamInfo streamInfo )
|
||||
if( idx >= 0 )
|
||||
m_aRecentFileStreamInfo.remove( idx );
|
||||
m_aRecentFileStreamInfo.prepend( streamInfo );
|
||||
while( m_aRecentFileStreamInfo.size() > MAX_RECENT_FILES )
|
||||
m_aRecentFileStreamInfo.remove( m_aRecentFileStreamInfo.size() - 1 );
|
||||
while( m_aRecentFileStreamInfo.size() > MAX_RECENT_FILES ) m_aRecentFileStreamInfo.remove( m_aRecentFileStreamInfo.size() - 1 );
|
||||
updateRecentFileActions();
|
||||
}
|
||||
|
||||
@@ -837,8 +824,7 @@ Void PlaYUVerApp::updateRecentFileActions()
|
||||
Int numRecentFiles = m_aRecentFileStreamInfo.size();
|
||||
numRecentFiles = qMin( numRecentFiles, MAX_RECENT_FILES );
|
||||
Int actionIdx = 0;
|
||||
while( actionIdx < numRecentFiles )
|
||||
{
|
||||
while( actionIdx < numRecentFiles ) {
|
||||
QString text = m_aRecentFileStreamInfo.at( actionIdx ).m_cFilename;
|
||||
m_arrayRecentFilesActions.at( actionIdx )->setText( QFileInfo( text ).fileName() );
|
||||
m_arrayRecentFilesActions.at( actionIdx )->setToolTip( "Open File " + text );
|
||||
@@ -847,8 +833,7 @@ Void PlaYUVerApp::updateRecentFileActions()
|
||||
m_arrayRecentFilesActions.at( actionIdx )->setVisible( true );
|
||||
actionIdx++;
|
||||
}
|
||||
while( actionIdx < MAX_RECENT_FILES )
|
||||
{
|
||||
while( actionIdx < MAX_RECENT_FILES ) {
|
||||
m_arrayRecentFilesActions.at( actionIdx )->setVisible( false );
|
||||
actionIdx++;
|
||||
}
|
||||
@@ -858,8 +843,7 @@ Void PlaYUVerApp::updateRecentFileActions()
|
||||
Void PlaYUVerApp::checkRecentFileActions()
|
||||
{
|
||||
Int i = 0;
|
||||
while( i < m_aRecentFileStreamInfo.size() )
|
||||
{
|
||||
while( i < m_aRecentFileStreamInfo.size() ) {
|
||||
if( !QFileInfo( m_aRecentFileStreamInfo.at( i ).m_cFilename ).exists() )
|
||||
{
|
||||
m_aRecentFileStreamInfo.remove( i );
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
#include "PlaYUVerAppModuleIf.h"
|
||||
#include "VideoSubWindow.h"
|
||||
#include "VideoSubWindow.h"
|
||||
#include <QApplication>
|
||||
#include <QAction>
|
||||
#include <QDockWidget>
|
||||
|
||||
PlaYUVerAppModuleIf::PlaYUVerAppModuleIf( QObject* parent, QAction* action, PlaYUVerModuleIf* module )
|
||||
: m_bIsRunning( false )
|
||||
@@ -38,8 +41,7 @@ PlaYUVerAppModuleIf::PlaYUVerAppModuleIf( QObject* parent, QAction* action, PlaY
|
||||
, m_dMeasurementResult( 0 )
|
||||
{
|
||||
setParent( parent );
|
||||
for( Int i = 0; i < MODULE_REQUIRES_MAX_NUM_FRAMES; i++ )
|
||||
{
|
||||
for( Int i = 0; i < MODULE_REQUIRES_MAX_NUM_FRAMES; i++ ) {
|
||||
m_pcSubWindow[i] = NULL;
|
||||
}
|
||||
}
|
||||
@@ -114,8 +116,7 @@ Void PlaYUVerAppModuleIf::run()
|
||||
m_bIsRunning = true;
|
||||
m_bSuccess = false;
|
||||
std::vector<PlaYUVerFrame*> apcFrameList;
|
||||
for( UInt i = 0; i < m_pcModule->m_uiNumberOfFrames; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < m_pcModule->m_uiNumberOfFrames; i++ ) {
|
||||
apcFrameList.push_back( m_pcSubWindow[i]->getCurrFrame() );
|
||||
}
|
||||
|
||||
@@ -184,8 +185,7 @@ Void PlaYUVerAppModuleIf::destroy()
|
||||
if( m_bIsRunning )
|
||||
{
|
||||
QApplication::setOverrideCursor( Qt::WaitCursor );
|
||||
while( m_bIsRunning )
|
||||
{
|
||||
while( m_bIsRunning ) {
|
||||
}
|
||||
QApplication::restoreOverrideCursor();
|
||||
}
|
||||
@@ -203,8 +203,7 @@ Void PlaYUVerAppModuleIf::destroy()
|
||||
m_pcDisplaySubWindow->closeSubWindow();
|
||||
m_pcDisplaySubWindow = NULL;
|
||||
|
||||
for( Int i = 0; i < MODULE_REQUIRES_MAX_NUM_FRAMES; i++ )
|
||||
{
|
||||
for( Int i = 0; i < MODULE_REQUIRES_MAX_NUM_FRAMES; i++ ) {
|
||||
if( m_pcSubWindow[i] )
|
||||
{
|
||||
m_pcSubWindow[i]->disableModule( this );
|
||||
|
||||
@@ -25,17 +25,19 @@
|
||||
#ifndef __PLAYUVERAPPMODULESIF_H__
|
||||
#define __PLAYUVERAPPMODULESIF_H__
|
||||
|
||||
#include "config.h"
|
||||
#include "ModuleHandleDock.h"
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "config.h"
|
||||
#include "lib/PlaYUVerFrame.h"
|
||||
#include "lib/PlaYUVerModuleIf.h"
|
||||
#include "lib/PlaYUVerStream.h"
|
||||
#include <QVector>
|
||||
#include <QEvent>
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
|
||||
class QAction;
|
||||
class QDockWidget;
|
||||
|
||||
//#define PLAYUVER_THREADED_MODULES
|
||||
|
||||
|
||||
@@ -113,12 +113,10 @@ Void PlaYUVerSubWindowHandle::resetWindowMode()
|
||||
{
|
||||
m_cMdiModeWindowPosition = m_pcApp->pos();
|
||||
m_cMdiModeWindowSize = m_pcApp->size();
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ ) {
|
||||
m_apcSubWindowList.at( i )->setParent( NULL );
|
||||
}
|
||||
for( Int i = 0; i < m_apcMdiSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcMdiSubWindowList.size(); i++ ) {
|
||||
disconnect( m_apcMdiSubWindowList.at( i ), SIGNAL( aboutToClose( PlaYUVerMdiSubWindow* ) ), this,
|
||||
SLOT( removeMdiSubWindow( PlaYUVerMdiSubWindow* ) ) );
|
||||
m_apcMdiSubWindowList.at( i )->close();
|
||||
@@ -141,8 +139,7 @@ Void PlaYUVerSubWindowHandle::setWindowMode( Int iWindowMode )
|
||||
|
||||
if( iWindowMode == DETACHEDSUBWINDOWMODE )
|
||||
{
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ ) {
|
||||
m_apcSubWindowList.at( i )->setParent( NULL );
|
||||
m_apcSubWindowList.at( i )->resize( m_apcSubWindowList.at( i )->sizeHint() );
|
||||
m_apcSubWindowList.at( i )->show();
|
||||
@@ -166,8 +163,7 @@ Void PlaYUVerSubWindowHandle::setWindowMode( Int iWindowMode )
|
||||
m_pcWindowManagerLayout = new QHBoxLayout( this );
|
||||
m_pcWindowManagerLayout->addWidget( m_pcMdiArea );
|
||||
setLayout( m_pcWindowManagerLayout );
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ ) {
|
||||
addMdiSubWindow( m_apcSubWindowList.at( i ) );
|
||||
m_apcSubWindowList.at( i )->resize( m_apcSubWindowList.at( i )->sizeHint() );
|
||||
}
|
||||
@@ -286,8 +282,7 @@ Void PlaYUVerSubWindowHandle::removeMdiSubWindow( PlaYUVerMdiSubWindow* window )
|
||||
|
||||
Void PlaYUVerSubWindowHandle::removeAllSubWindow()
|
||||
{
|
||||
while( m_apcSubWindowList.size() > 0 )
|
||||
{
|
||||
while( m_apcSubWindowList.size() > 0 ) {
|
||||
removeSubWindow( 0 );
|
||||
}
|
||||
}
|
||||
@@ -311,8 +306,7 @@ QList<SubWindowAbstract*> PlaYUVerSubWindowHandle::findSubWindow( const UInt uiC
|
||||
}
|
||||
else
|
||||
{
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ ) {
|
||||
if( m_apcSubWindowList.at( i )->getCategory() & uiCategory )
|
||||
apcSubWindowList.append( m_apcSubWindowList.at( i ) );
|
||||
}
|
||||
@@ -326,8 +320,7 @@ QList<SubWindowAbstract*> PlaYUVerSubWindowHandle::findSubWindow( const QString&
|
||||
QList<SubWindowAbstract*> apcSubWindowList;
|
||||
if( !windowName.isEmpty() )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
if( subWindowList.at( i )->getWindowName() == windowName )
|
||||
apcSubWindowList.append( subWindowList.at( i ) );
|
||||
}
|
||||
@@ -338,8 +331,7 @@ QList<SubWindowAbstract*> PlaYUVerSubWindowHandle::findSubWindow( const QString&
|
||||
SubWindowAbstract* PlaYUVerSubWindowHandle::findSubWindow( const SubWindowAbstract* subWindow ) const
|
||||
{
|
||||
QList<SubWindowAbstract*> subWindowList = findSubWindow();
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
if( subWindow == subWindowList.at( i ) )
|
||||
return subWindowList.at( i );
|
||||
}
|
||||
@@ -373,8 +365,7 @@ Void PlaYUVerSubWindowHandle::tileSubWindows()
|
||||
{
|
||||
QSize screenSize = QApplication::desktop()->availableGeometry().size();
|
||||
UInt minWindowsInRow = 1;
|
||||
while( ( screenSize.width() / minWindowsInRow ) > 500 )
|
||||
{
|
||||
while( ( screenSize.width() / minWindowsInRow ) > 500 ) {
|
||||
minWindowsInRow++;
|
||||
}
|
||||
m_pcApp->showNormal();
|
||||
@@ -394,8 +385,7 @@ Void PlaYUVerSubWindowHandle::tileSubWindows()
|
||||
if( numberOfWindows > minWindowsInRow )
|
||||
{
|
||||
numberTillingColumns = minWindowsInRow;
|
||||
for( Int i = numberOfWindows; i > 0; )
|
||||
{
|
||||
for( Int i = numberOfWindows; i > 0; ) {
|
||||
numberTillingRows = ( numberOfWindows + numberTillingColumns - 1 ) / numberTillingColumns;
|
||||
if( numberTillingColumns > numberTillingRows )
|
||||
{
|
||||
@@ -416,8 +406,7 @@ Void PlaYUVerSubWindowHandle::tileSubWindows()
|
||||
QSize totalWindowsSize( screenSize.width(), screenSize.height() - topLeftCornerWindow.y() );
|
||||
QSize windowsSize( totalWindowsSize.width() / numberTillingColumns, totalWindowsSize.height() / numberTillingRows );
|
||||
QPoint windowRelativePos;
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcSubWindowList.size(); i++ ) {
|
||||
windowRelativePos.setY( ( i / numberTillingColumns ) * windowsSize.height() );
|
||||
windowRelativePos.setX( ( i % numberTillingColumns ) * windowsSize.width() );
|
||||
m_apcSubWindowList.at( i )->resize( windowsSize );
|
||||
@@ -549,8 +538,7 @@ Void PlaYUVerSubWindowHandle::updateMenu()
|
||||
|
||||
m_arrayActions[SEPARATOR_ACT]->setVisible( number_windows > 0 );
|
||||
|
||||
for( Int i = 0; i < number_windows; ++i )
|
||||
{
|
||||
for( Int i = 0; i < number_windows; ++i ) {
|
||||
SubWindowAbstract* subWindow = m_apcSubWindowList.at( i );
|
||||
|
||||
QString text;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "PlotSubWindow.h"
|
||||
#include "qcustomplot.h"
|
||||
#include "external/qcustomplot/qcustomplot.h"
|
||||
|
||||
Void PlotSubWindow::definePlotColors()
|
||||
{
|
||||
|
||||
@@ -27,11 +27,7 @@
|
||||
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "config.h"
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include "SubWindowAbstract.h"
|
||||
|
||||
class QCustomPlot;
|
||||
|
||||
+10
-22
@@ -30,9 +30,7 @@
|
||||
#include "VideoSubWindow.h"
|
||||
#include "lib/LibMemory.h"
|
||||
#include <QtGui>
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include "QtConcurrent/qtconcurrentrun.h"
|
||||
#endif
|
||||
|
||||
QualityHandle::QualityHandle( QWidget* parent, PlaYUVerSubWindowHandle* windowManager ) : m_pcParet( parent ), m_pcMainWindowManager( windowManager )
|
||||
{
|
||||
@@ -48,8 +46,7 @@ Void QualityHandle::createActions()
|
||||
m_mapperQualityMetric = new QSignalMapper( this );
|
||||
|
||||
QAction* currAction;
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ ) {
|
||||
currAction = new QAction( PlaYUVerFrame::supportedQualityMetricsList()[i].c_str(), this );
|
||||
currAction->setCheckable( true );
|
||||
m_actionGroupQualityMetric->addAction( currAction );
|
||||
@@ -109,8 +106,7 @@ Void QualityHandle::updateMenus()
|
||||
{
|
||||
VideoSubWindow* pcVideoSubWindow;
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcMainWindowManager->findSubWindow( SubWindowAbstract::VIDEO_STREAM_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
pcVideoSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
if( pcVideoSubWindow->getRefSubWindow() == pcCurrentVideoSubWindow )
|
||||
{
|
||||
@@ -159,8 +155,7 @@ Void QualityHandle::measureQuality( QVector<VideoSubWindow*> apcWindowList )
|
||||
UInt64 numberOfFrames = INT_MAX;
|
||||
|
||||
//! Check reference window
|
||||
for( UInt i = 0; i < numberOfWindows; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfWindows; i++ ) {
|
||||
if( !apcWindowList.at( i )->getRefSubWindow() )
|
||||
{
|
||||
return;
|
||||
@@ -169,8 +164,7 @@ Void QualityHandle::measureQuality( QVector<VideoSubWindow*> apcWindowList )
|
||||
VideoSubWindow* pcReferenceWindow = apcWindowList.at( 0 )->getRefSubWindow();
|
||||
|
||||
numberOfFrames = pcReferenceWindow->getInputStream()->getFrameNum();
|
||||
for( UInt i = 0; i < numberOfWindows; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfWindows; i++ ) {
|
||||
currFrames = apcWindowList.at( i )->getInputStream()->getFrameNum();
|
||||
if( currFrames < numberOfFrames )
|
||||
numberOfFrames = currFrames;
|
||||
@@ -184,12 +178,10 @@ Void QualityHandle::measureQuality( QVector<VideoSubWindow*> apcWindowList )
|
||||
|
||||
PlaYUVerFrame* pcReferenceFrame;
|
||||
PlaYUVerFrame* pcCurrFrame;
|
||||
for( UInt f = 0; f < numberOfFrames; f++ )
|
||||
{
|
||||
for( UInt f = 0; f < numberOfFrames; f++ ) {
|
||||
padQualityValues[0].append( f );
|
||||
pcReferenceFrame = pcReferenceWindow->getCurrFrame();
|
||||
for( UInt i = 0; i < numberOfWindows; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfWindows; i++ ) {
|
||||
pcCurrFrame = apcWindowList.at( i )->getCurrFrame();
|
||||
padQualityValues[i + 1].append( pcCurrFrame->getQuality( m_iQualityMetricIdx, pcReferenceFrame, LUMA ) );
|
||||
apcWindowList.at( i )->seekRelativeEvent( true );
|
||||
@@ -197,8 +189,7 @@ Void QualityHandle::measureQuality( QVector<VideoSubWindow*> apcWindowList )
|
||||
pcReferenceWindow->seekRelativeEvent( true );
|
||||
pcProgressBar->incrementProgress( 1 );
|
||||
}
|
||||
for( UInt i = 0; i < numberOfWindows; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfWindows; i++ ) {
|
||||
apcWindowList.at( i )->stop();
|
||||
}
|
||||
pcReferenceWindow->stop();
|
||||
@@ -214,8 +205,7 @@ Void QualityHandle::measureQuality( QVector<VideoSubWindow*> apcWindowList )
|
||||
if( apcWindowList.size() > 1 )
|
||||
{
|
||||
QString key;
|
||||
for( UInt i = 0; i < numberOfWindows; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfWindows; i++ ) {
|
||||
key = apcWindowList.at( i )->getWindowName();
|
||||
pcPlotWindow->addPlot( padQualityValues[0], padQualityValues[i + 1], key );
|
||||
}
|
||||
@@ -246,8 +236,7 @@ Void QualityHandle::slotSelectCurrentAsReference()
|
||||
{
|
||||
VideoSubWindow* pcVideoSubWindow;
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcMainWindowManager->findSubWindow( SubWindowAbstract::VIDEO_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
pcVideoSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
if( pcVideoSubWindow != pcRefSubWindow )
|
||||
pcVideoSubWindow->setRefSubWindow( pcRefSubWindow );
|
||||
@@ -297,8 +286,7 @@ Void QualityHandle::slotPlotQualitySeveral()
|
||||
|
||||
VideoSubWindow* pcVideoSubWindow;
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcMainWindowManager->findSubWindow( SubWindowAbstract::VIDEO_STREAM_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
pcVideoSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
if( pcVideoSubWindow->getRefSubWindow() == pcRefSubWindow )
|
||||
{
|
||||
|
||||
@@ -28,11 +28,7 @@
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "config.h"
|
||||
#include <QtCore>
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include "QFuture"
|
||||
#include "QualityMeasurementSidebar.h"
|
||||
|
||||
|
||||
@@ -42,8 +42,7 @@ QualityMeasurementSidebar::QualityMeasurementSidebar( QWidget* parent, PlaYUVerS
|
||||
RecLabel->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
|
||||
|
||||
m_comboBoxMetric = new QComboBox;
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ ) {
|
||||
m_comboBoxMetric->insertItem( i, PlaYUVerFrame::supportedQualityMetricsList()[i].c_str() );
|
||||
}
|
||||
m_comboBoxMetric->setSizeAdjustPolicy( QComboBox::AdjustToContents );
|
||||
@@ -88,9 +87,8 @@ QualityMeasurementSidebar::QualityMeasurementSidebar( QWidget* parent, PlaYUVerS
|
||||
// QGroupBox *statisticsGroup = new QGroupBox( tr( "Quality" ) );
|
||||
QGroupBox* statisticsGroup = new QGroupBox;
|
||||
statisticsGroup->setLayout( qualityResultsLayout );
|
||||
statisticsGroup->setWhatsThis(
|
||||
tr( "<p>Here you can see the quality results calculated for the "
|
||||
"selected windows." ) );
|
||||
statisticsGroup->setWhatsThis( tr( "<p>Here you can see the quality results calculated for the "
|
||||
"selected windows." ) );
|
||||
|
||||
mainLayout->addWidget( statisticsGroup, 4, 0, 3, 3 );
|
||||
|
||||
@@ -128,8 +126,7 @@ Void QualityMeasurementSidebar::updateSubWindowList()
|
||||
|
||||
VideoSubWindow* pcVideoSubWindow;
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcMainWindowManager->findSubWindow( SubWindowAbstract::VIDEO_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
pcVideoSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
if( m_pcCurrentVideoSubWindow == pcVideoSubWindow )
|
||||
{
|
||||
@@ -189,13 +186,11 @@ Void QualityMeasurementSidebar::updateSidebarData()
|
||||
Double quality;
|
||||
QString value;
|
||||
UInt component = 0;
|
||||
for( ; component < currFrame->getNumberChannels(); component++ )
|
||||
{
|
||||
for( ; component < currFrame->getNumberChannels(); component++ ) {
|
||||
quality = currFrame->getQuality( m_comboBoxMetric->currentIndex(), refFrame, component );
|
||||
m_ppcLabelQualityValue[component]->setText( value.setNum( quality, 'f', 4 ) );
|
||||
}
|
||||
for( ; component < 3; component++ )
|
||||
{
|
||||
for( ; component < 3; component++ ) {
|
||||
quality = currFrame->getQuality( m_comboBoxMetric->currentIndex(), refFrame, component );
|
||||
m_ppcLabelQualityValue[component]->setText( zeroValue );
|
||||
}
|
||||
@@ -206,8 +201,7 @@ Void QualityMeasurementSidebar::updateSidebarData()
|
||||
m_comboBoxRef->setCurrentIndex( -1 );
|
||||
}
|
||||
}
|
||||
for( Int component = 0; component < 3; component++ )
|
||||
{
|
||||
for( Int component = 0; component < 3; component++ ) {
|
||||
m_ppcLabelQualityValue[component]->setText( zeroValue );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,12 +27,7 @@
|
||||
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "config.h"
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QWidget>
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include "HistogramWidget.h"
|
||||
#include "lib/PlaYUVerFrame.h"
|
||||
#include "lib/PlaYUVerStream.h"
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include "SeekStreamDialog.h"
|
||||
#include "lib/PlaYUVerStream.h"
|
||||
#include <QDialogButtonBox>
|
||||
#include <QGridLayout>
|
||||
#include <QLabel>
|
||||
#include <QSpinBox>
|
||||
|
||||
@@ -25,12 +25,14 @@
|
||||
#ifndef __SEEKSTREAMDIALOG_H__
|
||||
#define __SEEKSTREAMDIALOG_H__
|
||||
|
||||
#include "config.h"
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "PlaYUVerAppModuleIf.h"
|
||||
#include "config.h"
|
||||
#include <QDialog>
|
||||
#include <QVector>
|
||||
|
||||
class QSpinBox;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
+21
-43
@@ -46,9 +46,7 @@ VideoHandle::VideoHandle( QWidget* parent, PlaYUVerSubWindowHandle* windowManage
|
||||
m_pcCurrentVideoSubWindow = NULL;
|
||||
m_bIsPlaying = false;
|
||||
m_pcPlayingTimer = new QTimer;
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
m_pcPlayingTimer->setTimerType( Qt::PreciseTimer );
|
||||
#endif
|
||||
connect( m_pcPlayingTimer, SIGNAL( timeout() ), this, SLOT( playEvent() ) );
|
||||
m_acPlayingSubWindows.clear();
|
||||
}
|
||||
@@ -104,9 +102,8 @@ Void VideoHandle::createActions()
|
||||
m_arrayActions[VIDEO_ZOOM_LOCK_ACT]->setChecked( false );
|
||||
|
||||
m_arrayActions[VIDEO_LOCK_SELECTION_ACT] = new QAction( "Sync Play", this );
|
||||
m_arrayActions[VIDEO_LOCK_SELECTION_ACT]->setStatusTip(
|
||||
"Select which windows should be played synchronized. Press Ctrl while "
|
||||
"click to quickly to select all!" );
|
||||
m_arrayActions[VIDEO_LOCK_SELECTION_ACT]->setStatusTip( "Select which windows should be played synchronized. Press Ctrl while "
|
||||
"click to quickly to select all!" );
|
||||
connect( m_arrayActions[VIDEO_LOCK_SELECTION_ACT], SIGNAL( triggered() ), this, SLOT( videoSelectionButtonEvent() ) );
|
||||
|
||||
m_pcFrameSlider = new QSlider;
|
||||
@@ -411,8 +408,7 @@ Void VideoHandle::zoomToFactorAll( const Double scale, const QPoint center )
|
||||
|
||||
SubWindowAbstract* subWindow;
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcMainWindowManager->findSubWindow( SubWindowAbstract::VIDEO_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
subWindow = subWindowList.at( i );
|
||||
if( m_pcCurrentVideoSubWindow == subWindow )
|
||||
continue;
|
||||
@@ -448,8 +444,7 @@ Void VideoHandle::moveAllScrollBars( const QPoint offset )
|
||||
if( scrollBar->value() == scrollBar->minimum() && offset.y() < 0 )
|
||||
newOffset.setY( 0 );
|
||||
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
videoSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
if( m_pcCurrentVideoSubWindow == videoSubWindow )
|
||||
continue;
|
||||
@@ -469,8 +464,7 @@ UInt64 VideoHandle::getMaxFrameNumber()
|
||||
{
|
||||
if( m_acPlayingSubWindows.contains( m_pcCurrentVideoSubWindow ) )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
currFrames = m_acPlayingSubWindows.at( i )->getInputStream()->getFrameNum();
|
||||
if( currFrames < maxFrames )
|
||||
maxFrames = currFrames;
|
||||
@@ -487,8 +481,7 @@ UInt64 VideoHandle::getMaxFrameNumber()
|
||||
Void VideoHandle::setTimerStatus()
|
||||
{
|
||||
Bool status = false;
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
status |= m_acPlayingSubWindows.at( i )->isPlaying();
|
||||
}
|
||||
if( m_pcCurrentVideoSubWindow )
|
||||
@@ -539,8 +532,7 @@ Void VideoHandle::play()
|
||||
UInt timeInterval;
|
||||
if( m_acPlayingSubWindows.size() < 2 )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
m_acPlayingSubWindows.at( i )->pause();
|
||||
}
|
||||
m_acPlayingSubWindows.clear();
|
||||
@@ -548,8 +540,7 @@ Void VideoHandle::play()
|
||||
}
|
||||
if( m_acPlayingSubWindows.contains( m_pcCurrentVideoSubWindow ) )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
m_acPlayingSubWindows.at( i )->play();
|
||||
}
|
||||
frameRate = m_acPlayingSubWindows.at( 0 )->getInputStream()->getFrameRate();
|
||||
@@ -561,8 +552,7 @@ Void VideoHandle::play()
|
||||
{
|
||||
if( m_acPlayingSubWindows.contains( m_pcCurrentVideoSubWindow ) )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
m_acPlayingSubWindows.at( i )->pause();
|
||||
}
|
||||
}
|
||||
@@ -580,8 +570,7 @@ Void VideoHandle::stop()
|
||||
{
|
||||
if( m_acPlayingSubWindows.size() > 0 )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
m_acPlayingSubWindows.at( i )->stop();
|
||||
}
|
||||
m_acPlayingSubWindows.clear();
|
||||
@@ -608,8 +597,7 @@ Void VideoHandle::playEvent()
|
||||
#endif
|
||||
try
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
bEndOfSequence |= m_acPlayingSubWindows.at( i )->playEvent();
|
||||
}
|
||||
if( bEndOfSequence )
|
||||
@@ -617,8 +605,7 @@ Void VideoHandle::playEvent()
|
||||
if( !m_arrayActions[VIDEO_REPEAT_ACT]->isChecked() )
|
||||
stop();
|
||||
else
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
m_acPlayingSubWindows.at( i )->seekAbsoluteEvent( 0 );
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) m_acPlayingSubWindows.at( i )->seekAbsoluteEvent( 0 );
|
||||
}
|
||||
}
|
||||
catch( const char* msg )
|
||||
@@ -641,8 +628,7 @@ Void VideoHandle::seekEvent( Int direction )
|
||||
{
|
||||
if( !( ( UInt )( m_pcCurrentVideoSubWindow->getInputStream()->getCurrFrameNum() + 1 ) >= getMaxFrameNumber() && direction > 0 ) )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
m_acPlayingSubWindows.at( i )->seekRelativeEvent( direction > 0 ? true : false );
|
||||
}
|
||||
}
|
||||
@@ -668,8 +654,7 @@ Void VideoHandle::seekVideo()
|
||||
{
|
||||
if( m_acPlayingSubWindows.contains( m_pcCurrentVideoSubWindow ) )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
m_acPlayingSubWindows.at( i )->seekAbsoluteEvent( (UInt)newFrameNum );
|
||||
}
|
||||
}
|
||||
@@ -689,8 +674,7 @@ Void VideoHandle::seekSliderEvent( Int new_frame_num )
|
||||
{
|
||||
if( m_acPlayingSubWindows.contains( m_pcCurrentVideoSubWindow ) )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
m_acPlayingSubWindows.at( i )->seekAbsoluteEvent( (UInt)new_frame_num );
|
||||
}
|
||||
}
|
||||
@@ -711,8 +695,7 @@ Void VideoHandle::videoSelectionButtonEvent()
|
||||
if( keyModifiers & Qt::ControlModifier )
|
||||
{
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcMainWindowManager->findSubWindow( SubWindowAbstract::VIDEO_STREAM_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
videoSubWindow = qobject_cast<VideoSubWindow*>( subWindowList.at( i ) );
|
||||
m_acPlayingSubWindows.append( videoSubWindow );
|
||||
}
|
||||
@@ -721,8 +704,7 @@ Void VideoHandle::videoSelectionButtonEvent()
|
||||
{
|
||||
DialogSubWindowSelector dialogWindowsSelection( m_pcParet, m_pcMainWindowManager, SubWindowAbstract::VIDEO_STREAM_SUBWINDOW );
|
||||
QStringList cWindowListNames;
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
dialogWindowsSelection.selectSubWindow( m_acPlayingSubWindows.at( i ) );
|
||||
}
|
||||
if( dialogWindowsSelection.exec() == QDialog::Accepted )
|
||||
@@ -730,8 +712,7 @@ Void VideoHandle::videoSelectionButtonEvent()
|
||||
m_acPlayingSubWindows.clear();
|
||||
|
||||
QList<SubWindowAbstract*> selectedSubWindowList = dialogWindowsSelection.getSelectedWindows();
|
||||
for( Int i = 0; i < selectedSubWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < selectedSubWindowList.size(); i++ ) {
|
||||
videoSubWindow = qobject_cast<VideoSubWindow*>( selectedSubWindowList.at( i ) );
|
||||
m_acPlayingSubWindows.append( videoSubWindow );
|
||||
}
|
||||
@@ -751,8 +732,7 @@ Void VideoHandle::videoSelectionButtonEvent()
|
||||
}
|
||||
if( m_bIsPlaying )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_acPlayingSubWindows.size(); i++ ) {
|
||||
m_acPlayingSubWindows.at( i )->play();
|
||||
}
|
||||
}
|
||||
@@ -768,8 +748,7 @@ Void VideoHandle::setTool( Int tool )
|
||||
m_uiViewTool = tool;
|
||||
actionGroupTools->actions().at( m_uiViewTool )->setChecked( true );
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcMainWindowManager->findSubWindow( SubWindowAbstract::VIDEO_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
qobject_cast<VideoSubWindow*>( subWindowList.at( i ) )->getViewArea()->setTool( m_uiViewTool );
|
||||
}
|
||||
}
|
||||
@@ -777,8 +756,7 @@ Void VideoHandle::setTool( Int tool )
|
||||
Void VideoHandle::toggleGrid( Bool checked )
|
||||
{
|
||||
QList<SubWindowAbstract*> subWindowList = m_pcMainWindowManager->findSubWindow( SubWindowAbstract::VIDEO_SUBWINDOW );
|
||||
for( Int i = 0; i < subWindowList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < subWindowList.size(); i++ ) {
|
||||
qobject_cast<VideoSubWindow*>( subWindowList.at( i ) )->getViewArea()->setGridVisible( checked );
|
||||
}
|
||||
}
|
||||
+12
-29
@@ -28,9 +28,7 @@
|
||||
#include "SubWindowAbstract.h"
|
||||
#include <QScrollArea>
|
||||
#include <QStaticText>
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include "QtConcurrent/qtconcurrentrun.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \brief Functions to control data stream from stream information
|
||||
@@ -40,8 +38,7 @@ QDataStream& operator<<( QDataStream& out, const PlaYUVerStreamInfoVector& array
|
||||
{
|
||||
PlaYUVerStreamInfo d;
|
||||
out << array.size();
|
||||
for( Int i = 0; i < array.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < array.size(); i++ ) {
|
||||
d = array.at( i );
|
||||
out << d.m_cFilename << d.m_uiWidth << d.m_uiHeight << d.m_iPelFormat << d.m_uiBitsPelPixel << d.m_iEndianness << d.m_uiFrameRate
|
||||
<< d.m_uiFileSize;
|
||||
@@ -54,8 +51,7 @@ QDataStream& operator>>( QDataStream& in, PlaYUVerStreamInfoVector& array )
|
||||
PlaYUVerStreamInfo d;
|
||||
Int array_size;
|
||||
in >> array_size;
|
||||
for( Int i = 0; i < array_size; i++ )
|
||||
{
|
||||
for( Int i = 0; i < array_size; i++ ) {
|
||||
in >> d.m_cFilename;
|
||||
in >> d.m_uiWidth;
|
||||
in >> d.m_uiHeight;
|
||||
@@ -101,8 +97,7 @@ public:
|
||||
Void setInformationTopLeft( const QStringList& textLines )
|
||||
{
|
||||
m_cTopLeftTextList.clear();
|
||||
for( Int i = 0; i < textLines.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < textLines.size(); i++ ) {
|
||||
m_cTopLeftTextList.append( textLines.at( i ) );
|
||||
}
|
||||
}
|
||||
@@ -116,8 +111,7 @@ protected:
|
||||
if( !m_cTopLeftTextList.isEmpty() && size().width() > 300 )
|
||||
{
|
||||
QPoint topLeftCorner( 10, 10 );
|
||||
for( Int i = 0; i < m_cTopLeftTextList.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_cTopLeftTextList.size(); i++ ) {
|
||||
painter.drawStaticText( topLeftCorner, m_cTopLeftTextList.at( i ) );
|
||||
topLeftCorner += QPoint( 0, 15 );
|
||||
}
|
||||
@@ -385,8 +379,7 @@ Void VideoSubWindow::updateVideoWindowInfo()
|
||||
QStringList sourceWindowList;
|
||||
if( arraySubWindows.size() > 0 )
|
||||
{
|
||||
for( Int i = 0; i < arraySubWindows.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < arraySubWindows.size(); i++ ) {
|
||||
if( arraySubWindows.at( i )->getWindowName() != getWindowName() )
|
||||
{
|
||||
sourceWindowList.append( QString( "Input %1 - " + arraySubWindows.at( i )->getWindowName() ).arg( i + 1 ) );
|
||||
@@ -436,8 +429,7 @@ Bool VideoSubWindow::guessFormat( QString filename, UInt& rWidth, UInt& rHeight,
|
||||
bGuessed = false;
|
||||
// Guess pixel format
|
||||
QVector<String> formats_list = QVector<String>::fromStdVector( PlaYUVerFrame::supportedPixelFormatListNames() );
|
||||
for( Int i = 0; i < formats_list.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < formats_list.size(); i++ ) {
|
||||
if( FilenameShort.contains( formats_list.at( i ).c_str(), Qt::CaseInsensitive ) )
|
||||
{
|
||||
rInputFormat = i;
|
||||
@@ -449,8 +441,7 @@ Bool VideoSubWindow::guessFormat( QString filename, UInt& rWidth, UInt& rHeight,
|
||||
{
|
||||
// Guess resolution - match resolution name
|
||||
Int iMatch = -1;
|
||||
for( UInt i = 0; i < stdResList.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < stdResList.size(); i++ ) {
|
||||
if( FilenameShort.contains( QString::fromStdString( stdResList[i].shortName ) ) )
|
||||
{
|
||||
iMatch = i;
|
||||
@@ -462,7 +453,6 @@ Bool VideoSubWindow::guessFormat( QString filename, UInt& rWidth, UInt& rHeight,
|
||||
rHeight = stdResList[iMatch].uiHeight;
|
||||
}
|
||||
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
// Guess resolution - match %dx%d
|
||||
QRegularExpressionMatch resolutionMatch = QRegularExpression( "_\\d*x\\d*" ).match( FilenameShort );
|
||||
if( resolutionMatch.hasMatch() )
|
||||
@@ -479,7 +469,6 @@ Bool VideoSubWindow::guessFormat( QString filename, UInt& rWidth, UInt& rHeight,
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Guess resolution by file size
|
||||
@@ -493,8 +482,7 @@ Bool VideoSubWindow::guessFormat( QString filename, UInt& rWidth, UInt& rHeight,
|
||||
fclose( pF );
|
||||
|
||||
Int count = 0, module, frame_bytes, match;
|
||||
for( UInt i = 0; i < stdResList.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < stdResList.size(); i++ ) {
|
||||
frame_bytes = PlaYUVerFrame::getBytesPerFrame( stdResList[i].uiWidth, stdResList[i].uiHeight, rInputFormat, 8 );
|
||||
module = uiFileSize % frame_bytes;
|
||||
if( module == 0 )
|
||||
@@ -512,8 +500,7 @@ Bool VideoSubWindow::guessFormat( QString filename, UInt& rWidth, UInt& rHeight,
|
||||
}
|
||||
}
|
||||
|
||||
// Guess bits per pixel - match %dbpp
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
// Guess bits per pixel - match %dbpp
|
||||
QRegularExpressionMatch BppMatch = QRegularExpression( "_\\d*bpp" ).match( FilenameShort );
|
||||
if( BppMatch.hasMatch() )
|
||||
{
|
||||
@@ -526,7 +513,6 @@ Bool VideoSubWindow::guessFormat( QString filename, UInt& rWidth, UInt& rHeight,
|
||||
rBitsPerPixel = -1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Guess Endianness
|
||||
if( FilenameShort.contains( QStringLiteral( "be" ), Qt::CaseInsensitive ) )
|
||||
@@ -587,8 +573,7 @@ Void VideoSubWindow::disableModule( PlaYUVerAppModuleIf* pcModule )
|
||||
else
|
||||
{
|
||||
QList<PlaYUVerAppModuleIf*> apcCurrentModule = m_apcCurrentModule;
|
||||
for( Int i = 0; i < apcCurrentModule.size(); i++ )
|
||||
{
|
||||
for( Int i = 0; i < apcCurrentModule.size(); i++ ) {
|
||||
m_apcCurrentModule.removeOne( apcCurrentModule.at( i ) );
|
||||
ModulesHandle::destroyModuleIf( apcCurrentModule.at( i ) );
|
||||
bRefresh |= true;
|
||||
@@ -622,8 +607,7 @@ Bool VideoSubWindow::hasRunningModule()
|
||||
{
|
||||
bRet |= m_pcCurrentDisplayModule->isRunning();
|
||||
}
|
||||
for( Int i = 0; i < m_apcCurrentModule.size() && !bRet; i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcCurrentModule.size() && !bRet; i++ ) {
|
||||
bRet |= m_apcCurrentModule.at( i )->isRunning();
|
||||
}
|
||||
return bRet;
|
||||
@@ -658,8 +642,7 @@ Void VideoSubWindow::refreshFrameOperation()
|
||||
{
|
||||
m_cViewArea->setImage( m_pcCurrFrame );
|
||||
}
|
||||
for( Int i = 0; i < m_apcCurrentModule.size() && !m_bIsPlaying; i++ )
|
||||
{
|
||||
for( Int i = 0; i < m_apcCurrentModule.size() && !m_bIsPlaying; i++ ) {
|
||||
m_apcCurrentModule.at( i )->update();
|
||||
}
|
||||
}
|
||||
|
||||
+4
-8
@@ -492,10 +492,8 @@ Void ViewArea::paintEvent( QPaintEvent* event )
|
||||
QRect vr = windowToView( winRect );
|
||||
vr &= QRect( 0, 0, imageWidth, imageHeight );
|
||||
|
||||
for( Int i = vr.x(); i <= vr.right(); i++ )
|
||||
{
|
||||
for( Int j = vr.y(); j <= vr.bottom(); j++ )
|
||||
{
|
||||
for( Int i = vr.x(); i <= vr.right(); i++ ) {
|
||||
for( Int j = vr.y(); j <= vr.bottom(); j++ ) {
|
||||
QPoint pixelTopLeft( i, j );
|
||||
|
||||
QRect pixelRect( viewToWindow( pixelTopLeft ), QSize( m_dZoomFactor, m_dZoomFactor ) );
|
||||
@@ -548,16 +546,14 @@ Void ViewArea::paintEvent( QPaintEvent* event )
|
||||
paInter.setPen( mainPen );
|
||||
|
||||
// Draw vertical line
|
||||
for( Int x = vr.x(); x <= ( vr.right() + 1 ); x++ )
|
||||
{
|
||||
for( Int x = vr.x(); x <= ( vr.right() + 1 ); x++ ) {
|
||||
// Always draw the full line otherwise the line stippling
|
||||
// varies with the location of view area and we get glitchy
|
||||
// patterns.
|
||||
paInter.drawLine( viewToWindow( QPoint( x, 0 ) ), viewToWindow( QPoint( x, imageHeight ) ) );
|
||||
}
|
||||
// Draw horizontal line
|
||||
for( Int y = vr.y(); y <= ( vr.bottom() + 1 ); y++ )
|
||||
{
|
||||
for( Int y = vr.y(); y <= ( vr.bottom() + 1 ); y++ ) {
|
||||
paInter.drawLine( viewToWindow( QPoint( 0, y ) ), viewToWindow( QPoint( imageWidth, y ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,14 +22,10 @@
|
||||
* \brief Frame number widget
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <QtCore>
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include "WidgetFrameNumber.h"
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QString>
|
||||
|
||||
WidgetFrameNumber::WidgetFrameNumber( QWidget* parent ) : QWidget( parent )
|
||||
{
|
||||
|
||||
@@ -25,14 +25,11 @@
|
||||
#ifndef __WIDGETFRAMENUMBER_H__
|
||||
#define __WIDGETFRAMENUMBER_H__
|
||||
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "config.h"
|
||||
#include <QtCore>
|
||||
#if( QT_VERSION_PLAYUVER == 5 )
|
||||
#include <QtWidgets>
|
||||
#elif( QT_VERSION_PLAYUVER == 4 )
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include <QWidget>
|
||||
|
||||
class QLabel;
|
||||
|
||||
class WidgetFrameNumber : public QWidget
|
||||
{
|
||||
|
||||
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
###
|
||||
### CMakeLists for playuver app external component
|
||||
###
|
||||
|
||||
ADD_SUBDIRECTORY( qcustomplot )
|
||||
Vendored
-24665
File diff suppressed because it is too large.
Load diff
Vendored
-3831
File diff suppressed because it is too large.
Load diff
+20
@@ -0,0 +1,20 @@
|
||||
###
|
||||
### CMakeLists for qcustomplot
|
||||
###
|
||||
|
||||
FIND_PACKAGE( Qt5 REQUIRED COMPONENTS Core Gui Widgets PrintSupport )
|
||||
|
||||
set(qcustomplot_SRCS
|
||||
qcustomplot.cpp
|
||||
qcustomplot.h
|
||||
)
|
||||
|
||||
ADD_LIBRARY( QCustomPlotLib SHARED ${qcustomplot_SRCS} )
|
||||
TARGET_LINK_LIBRARIES( QCustomPlotLib
|
||||
Qt5::Core
|
||||
Qt5::Gui
|
||||
Qt5::Widgets
|
||||
Qt5::PrintSupport
|
||||
)
|
||||
|
||||
TARGET_INCLUDE_DIRECTORIES(QCustomPlotLib PUBLIC . )
|
||||
Vendored
+674
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
+555
@@ -0,0 +1,555 @@
|
||||
#### Version 2.0.0 released on 04.09.17 ####
|
||||
|
||||
Added major features:
|
||||
- Axis tick and tick label generation was completely refactored and is now handled in the QCPAxisTicker class (also see QCPAxis::setTicker). Available ticker subclasses for special uses cases:
|
||||
QCPAxisTicker, QCPAxisTickerFixed, QCPAxisTickerLog, QCPAxisTickerPi, QCPAxisTickerTime, QCPAxisTickerDateTime, QCPAxisTickerText
|
||||
- Data container is now based on QCPDataContainer template for unified data interface and significantly improved memory footprint and better performance for common use-cases, especially data adding/removing.
|
||||
- New data selection mechanism allows selection of single data points and data ranges for plottables. See special documentation page "data selection mechanism".
|
||||
- Rubber band/selection rect for data point selection and axis zooming is now available, see documentation of QCustomPlot::setSelectionRectMode and QCPSelectionRect. For this purpose, the new default
|
||||
layer "overlay" was introduced, which is now the top layer, and holds the QCustomPlot's QCPSelectionRect instance.
|
||||
- Data sharing between plottables of the same type (see setData methods taking a QSharedPointer)
|
||||
- OpenGL hardware acceleration is now available across all Qt versions (including Qt4) in a unified, simple interface, with QCustomPlot::setOpenGl (experimental)
|
||||
- QCPStatisticalBox can now display a series of statistical boxes instead of only a single one
|
||||
- New QCPErrorBars plottable allows attaching error bars to any one-dimensional plottable (QCPGraph has thus lost its own error-bar capability)
|
||||
- QCPColorMap now supports transparency via alpha in its color gradient stops, and via a dedicated cell-wise alpha map (see QCPColorMapData::setAlpha)
|
||||
- Layers may now be individually replotted (QCPLayer::replot), if the mode (QCPLayer::setMode) is set to lmBuffered. Mutually adjacent lmLogical layers share a single paint buffer to save resources.
|
||||
By default, the new topmost "overlay" layer which contains the selection rect is an lmBuffered layer. Updating the selection rect is thus very fast, independent of the plot contents.
|
||||
- QCPLayerable (and thus practically all objects in QCP) now have virtual methods to receive mouse press/move/release/doubleclick/wheel events. Before, only QCPLayoutElement provided them.
|
||||
this makes it much easier to subclass e.g. items and plottables to provide custom mouse interactions that were cumbersome and awkward with the simpler signal-based interface
|
||||
|
||||
Added minor features:
|
||||
- High-DPI support for Qt versions 5.0 and up, using device pixel ratio detected by Qt (can be changed manually via QCustomPlot::setBufferDevicePixelRatio).
|
||||
- QCPGraph and QCPCurve can now be configured to only display every n'th scatter symbol, see ::setScatterSkip() method
|
||||
- QCPFinancial allows to define bar width in absolute pixels and axis rect ratio, instead of only in plot key coordinates (see QCPFinancial::setWidthType)
|
||||
- Range dragging/zooming can now be configured to affect more than one axis per orientation (see new overloads of QCPAxisRect::setRangeDragAxes/setRangeZoomAxes)
|
||||
- Added QCPTextElement (replaces QCPPlotTitle) for general texts in layouts. Provides clicked and doubleClicked signals, as replacement for the removed QCustomPlot::titleClicked/titleDoubleClicked
|
||||
- Export functions (QCustomPlot::savePng etc.) now support specifying the resolution that will be written to the image file header. This improves operability with other tools which respect metadata.
|
||||
- Replots can now be queued to the next event loop iteration with replot(QCP::rpQueuedReplot). This way you can successively ask for a replot at multiple code locations without causing redundant replots
|
||||
- QCPAxisRect::zoom(...) allows to zoom to a specific rectangular region given in pixel coordinates, either affecting all axes or a specified subset of axes.
|
||||
- QCPRange::bounded returns a bounded range, trying to preserve its size. Works with rangeChanged signal to limit the allowed range (see rangeChanged doc)
|
||||
- Plottable rescaleValueAxis method (and getValueRange) now take parameter inKeyRange, which allows rescaling of the value axis only with respect to data in the currently visible key range
|
||||
- plottableClick and plottableDoubleClick signals now carry the clicked data point index as second parameter
|
||||
- Added QCPAxis::scaleRange overload without "center" argument, which scales around the current axis range center
|
||||
- Added QCPRange::expand/expanded overloads which take only one double parameter
|
||||
- Plottables addToLegend/removeFromLegend methods now have overloads that take any QCPLegend, to make working with non-default legends easier (legends that are not QCustomPlot::legend)
|
||||
- Added QCPStatisticalBox::setWhiskerAntialiased to allow controlling antialiasing state of whiskers independently of quartile box/median line
|
||||
- The virtual method QCPLayoutElement::layoutChanged() now allows subclasses to react on a move of the layout element between logical positions in the parent layout, or between layouts
|
||||
- QCPMarginGroup::commonMargin is now virtual, to facilitate subclassing of QCPMarginGroup
|
||||
- QCPGraph::getPreparedData is now virtual, and thus allows subclasses to easily generate own plotted data, e.g. on-the-fly.
|
||||
- Added QCPRange qDebug stream operator
|
||||
- QCPLayoutGrid (and thus QCPLegend) can now wrap rows or columns at specified row/column counts, see setFillOrder, setWrap and the new addElement overload which doesn't have row/column index
|
||||
Added minor features after beta:
|
||||
- QCPGraph fill now renders separate fill segments when there are gaps in the graph data (created by inserting NaN values)
|
||||
- fractional device pixel ratios are now used, if Qt version >= 5.6
|
||||
- Axes may now be dragged/zoomed individually by starting the drag/zoom on top of the axis (previously, this required additional code)
|
||||
- Manual minimum and maximum layout element sizes (setMinimumSize/setMaximumSize) can now affect the inner or the outer rect, see QCPLayoutElement::setSizeConstraintRect
|
||||
|
||||
Bugfixes [Also backported to 1.3.2]:
|
||||
- Fixed possible crash when having a QCPGraph with scatters only and a non-transparent main/fill brush of the graph
|
||||
- Fixed QCPItemPixmap not updating internally cached scaled pixmap if new pixmap set with same scaled dimensions
|
||||
- When using log axis scale and zooming out as far as possible (~1e-280..1e280), axis doesn't end up in (via mouse) unrecoverable range with strange axis ticks anymore
|
||||
- Axis tick label algorithm for beautifully typeset powers now checks whether "e" in tick label is actually part of a number before converting the exponent to superscript
|
||||
- Fixed QCustomPlot::moveLayer performing incorrect move and possible crash in certain situations
|
||||
- Fixed possible crash on QCustomPlot destruction due to wrong QObject-hierarchy. Only occurs if a QCPAxisRect is removed from the normal QCustomPlot destruction hierarchy by taking it out of its layout
|
||||
- Fixed possible freeze when data values become infinity after coord-to-pixel transformation (e.g. maximally zoomed out log axis), and line style is not solid (e.g. dashed) or phFastPolylines is disabled
|
||||
- Fixed a few missing enums in meta type system, by unifying usage of Q_ENUMS, Q_FLAGS and Q_DECLARE_METATYPE
|
||||
Bugfixes [Not in 1.3.2]:
|
||||
- Fixed QCPItemLine/QCPItemStraightLine not being selectable when defining coords are many orders of magnitude (>1e8) larger than currently viewed range
|
||||
- Fixed/worked around crash due to bug in QPainter::drawPixmap with very large negative x/y pixel coordinates, when drawing sparse pixmap scatters
|
||||
- Fixed possible (but unlikely) int overflow in adaptive sampling algorithm, that could cause plot artifacts when using extremely sparse data (with respect to current key axis range).
|
||||
- Fixed QCPBarsGroup bug which caused stPlotCoords spacing to be wrong with vertical key axes
|
||||
- A QCPBars axis rescale in the main window constructor (i.e. without well-defined plot size) now falls back to a datapoint-tight rescaling instead of doing nothing (because bar width can't be determined)
|
||||
- Improved QCPBars stacking when using bars with very large keys and key separation at limit of double precision
|
||||
Bugfixes after beta:
|
||||
- fixed QCPCurve vertex optimization algorithm not handling log axes correctly
|
||||
- upon removing the inner most axis, the offset of the new inner most axis (previously second axis) is now set to the value of the removed axis, instead of leaving a gap
|
||||
- QCPColorMap now has a default gradient (gpCold) again, instead of an empty and thus black gradient
|
||||
- doc: black QCPColorMap/QCPColorGradient documentation images fixed
|
||||
- scatter styles ssDiamond, ssTriangle and ssTriangleInverted now get proper filling with the specified brush
|
||||
- fixed click signals of plottable/axes/etc. not being emitted properly
|
||||
- fixed uninitialized scatterSkip on QCPCurve, leading to irregular default appearance of scatter skips
|
||||
- fixed device pixel ratio not being implemented correctly in cached tick labels
|
||||
- QCPLayoutElement::setMaximum/setMinimum now is with respect to the inner rect as intended (and documented), instead of the outer rect (and this can now be changed via setSizeConstraintRect)
|
||||
- fixed dllimport issue on template classes when compiling as shared library with MSVC
|
||||
|
||||
|
||||
Summary of backward incompatible changes:
|
||||
Plottable related:
|
||||
- Removed QCustomPlot::addPlottable, not needed anymore as plottables now automatically register in their constructor
|
||||
- Removed QCustomPlot::addItem, not needed anymore as items now automatically register in their constructor
|
||||
- QCPAbstractPlottable::addToLegend/removeFromLegend are not virtual anymore. If your plottable requires a custom legend item, add it to the legend manually.
|
||||
- setData/addData method overloads of plottables have changed to facilitate data sharing and new data container (see documentation)
|
||||
- plottableClick and plottableDoubleClick signals now carry the clicked data point index as second parameter, and the QMouseEvent parameter has moved to third.
|
||||
Check all your usages of those signals, because Qt's connect method only reports problems during runtime!
|
||||
- setSelectable now not only limits what can be selected by the user, but limits also any programmatic selection changes via setSelected.
|
||||
- enum QCPAbstractPlottable::SignDomain has changed namespace to QCP::SignDomain
|
||||
Axis related:
|
||||
- Removed QCPAxis::setAutoTicks, setAutoTickCount, setAutoTickLabels, setAutoTickStep, setAutoSubTicks, setTickLabelType, setDateTimeFormat, setDateTimeSpec,
|
||||
setTickStep, setTickVector, setTickVectorLabels, setSubTickCount in favor of new QCPAxisTicker-based interface
|
||||
- Added QCPAxis::setSubTicks to enable/disable subticks (manually controlling the subtick count needs subclassing of QCPAxisTicker, e.g. QCPAxisTickerText and QCPAxisTickerLog provide setSubTickCount)
|
||||
Item related:
|
||||
- Renamed QCPAbstractItem::rectSelectTest to rectDistance, to prevent confusion with new QCPAbstractPlottable1D::selectTestRect
|
||||
- Renamed QCPItemAnchor::pixelPoint to QCPItemAnchor::pixelPosition (also affects subclass QCPItemPosition)
|
||||
General:
|
||||
- Renamed QCustomPlot::RefreshPriority enums (parameter of the replot() method): rpImmediate to rpImmediateRefresh, rpQueued to rpQueuedRefresh, rpHint to rpRefreshHint
|
||||
- Renamed QCustomPlot::PlottingHint enum phForceRepaint to phImmediateRefresh
|
||||
- Removed QCPPlotTitle layout element (See new QCPTextElement for almost drop-in replacement)
|
||||
- Removed signals QCustomPlot::titleClicked/titleDoubleClicked, replaced by QCPTextElement signals clicked/doubleClicked.
|
||||
- QCustomPlot::savePdf has changed parameters from (fileName, bool noCosmeticPen, width, height,...) to (fileName, width, height, QCP::ExportPen exportPen,...)
|
||||
- Virtual methods QCPLayoutElement::mouseMoveEvent/mouseReleaseEvent (which are now introduced already in the superclass QCPLayerable) have gained an additional parameter const QPointF &startPos.
|
||||
If you have reimplemented these methods, make sure to update your function signatures, otherwise your reimplementations will likely be ignored by the compiler without warning
|
||||
- Creating a new QCPColorGradient without supplying a preset parameter in the constructor now creates an empty gradient, instead of loading the gpCold preset
|
||||
|
||||
Other:
|
||||
- Replaced usage of Qt's QVector2D with own QCPVector2D which uses double precision and offers some convenience functions
|
||||
- Extended relative range to which QCPItemLine/QCPItemStraightLine can be zoomed before vanishing from ~1e9 to ~1e16
|
||||
- Removed QCPItemStraightLine::distToStraightLine (replaced by QCPVector2D::distanceToStraightLine)
|
||||
- Removed QCPAbstractPlottable::distSqrToLine and QCPAbstractItem::distSqrToLine (replaced by QCPVector2D::distanceSquaredToLine)
|
||||
- Qt5.5 compatibility (If you use PDF export, test your outputs, as output dimensions might change when switching Qt versions -- QCP does not try to emulate previous Qt version behaviour here)
|
||||
- QCP now includes <QtPrintSupport/QtPrintSupport> instead of just <QtPrintSupport> because some users had problems with the latter. Please report if you now experience issues due to the new include.
|
||||
- QCPGraph can now use a brush (filled polygon under the graph data) without having a graph line (line style lsNone)
|
||||
- QCPFinancial is now two-colored (setTwoColored(true)) by default, and has green/red as default two-colored brushes and pens
|
||||
- Plottable pixelsToCoords/coordsToPixels methods are now public, and offer transformations from pixel to plot coordinates and vice versa, using the plottable's axes
|
||||
- Plottable getKeyRange/getValueRange methods are now public
|
||||
- QCPBarsGroup now always places the QCPBars that was added to the group first towards lower keys, independent of axis orientation or direction (the ordering used to flip with axis orientation)
|
||||
- Default focus policy for QCustomPlot is now Qt::ClickFocus, instead of Qt::NoFocus.
|
||||
- tweaked QCPLegend and QCPAbstractLegendItem margins: The items have by default zero own margins, and QCPLegend row- and column spacing was increased to compensate. Legend was made slightly denser by default.
|
||||
- Used doxygen version is now 1.8.12, and documentation/postprocessing-scripts were adapted accordingly. Expect minor issues and some warnings when using older doxygen.
|
||||
Other after beta:
|
||||
- Integrated OpenGL support (QCustomPlot::setOpenGl) is experimental for now, due the strong dependency on the system/graphics driver of the current implementation
|
||||
- fixed some plot title font sizes in the example projects that were too small due to switch to QCPTextElement
|
||||
- added missing override specifiers on reimplemented virtual methods
|
||||
- changed to more intuitive defaults for QCPSelectionDecorator scatter style (now doesn't define an own scatter pen by default)
|
||||
|
||||
#### Version 1.3.2 released on 22.12.15 ####
|
||||
|
||||
Bugfixes [Backported from 2.0.0 branch]:
|
||||
- Fixed possible crash when having a QCPGraph with scatters only and a non-transparent main/fill brush of the graph
|
||||
- Fixed QCPItemPixmap not updating internally cached scaled pixmap if new pixmap set with same scaled dimensions
|
||||
- When using log axis scale and zooming out as far as possible (~1e-280..1e280), axis doesn't end up in (via mouse) unrecoverable range with strange axis ticks anymore
|
||||
- Axis tick label algorithm for beautifully typeset powers now checks whether "e" in tick label is actually part of a number before converting the exponent to superscript
|
||||
- Fixed QCustomPlot::moveLayer performing incorrect move and possible crash in certain situations
|
||||
- Fixed possible crash on QCustomPlot destruction due to wrong QObject-hierarchy. Only occurs if a QCPAxisRect is removed from the normal QCustomPlot destruction hierarchy by taking it out of its layout
|
||||
- Fixed possible freeze when data values become infinity after coord-to-pixel transformation (e.g. maximally zoomed out log axis), and line style is not solid (e.g. dashed) or phFastPolylines is disabled
|
||||
|
||||
Other [Backported from 2.0.0 branch]:
|
||||
- A few documentation fixes/improvements
|
||||
- Qt5.5 compatibility (If you use PDF export, test your outputs, as output dimensions might change when switching Qt versions -- QCP does not try to emulate previous Qt version behaviour here)
|
||||
- QCP now includes <QtPrintSupport/QtPrintSupport> instead of just <QtPrintSupport> because some users had problems with the latter. Please report if you now experience issues due to the new include.
|
||||
|
||||
#### Version 1.3.1 released on 25.04.15 ####
|
||||
|
||||
Bugfixes:
|
||||
- Fixed bug that prevented automatic axis rescaling when some graphs/curves had only NaN data points
|
||||
- Improved QCPItemBracket selection boundaries, especially bsCurly and bsCalligraphic
|
||||
- Fixed bug of axis rect and colorscale background shifted downward by one logical pixel (visible in scaled png and pdf export)
|
||||
- Replot upon mouse release is now only performed if a selection change has actually happened (improves responsivity on particularly complex plots)
|
||||
- Fixed bug that allowed scatter-only graphs to be selected by clicking the non-existent line between scatters
|
||||
- Fixed crash when trying to select a scatter-only QCPGraph whose only points in the visible key range are at identical key coordinates and vertically off-screen, with adaptive sampling enabled
|
||||
- Fixed pdf export of QCPColorMap with enabled interpolation (didn't appear interpolated in pdf)
|
||||
- Reduced QCPColorMap jitter of internal cell boundaries for small sized maps when viewed with high zoom, by applying oversampling factors dependant on map size
|
||||
- Fixed bug of QCPColorMap::fill() not causing the buffered internal image map to be updated, and thus the change didn't become visible immediately
|
||||
- Axis labels with size set in pixels (setPixelSize) instead of points now correctly calculate the exponent's font size if beautifully typeset powers are enabled
|
||||
- Fixed QCPColorMap appearing at the wrong position for logarithmic axes and color map spanning larger ranges
|
||||
|
||||
Other:
|
||||
- Pdf export used to embed entire QCPColorMaps, potentially leading to large files. Now only the visible portion of the map is embedded in the pdf
|
||||
- Many documentation fixes and extensions, style modernization
|
||||
- Reduced documentation file size (and thus full package size) by automatically reducing image palettes during package build
|
||||
- Fixed MSVC warning message (at warning level 4) due to temporary QLists in some foreach statements
|
||||
|
||||
#### Version 1.3.0 released on 27.12.14 ####
|
||||
|
||||
Added features:
|
||||
- New plottable class QCPFinancial allows display of candlestick/ohlc data
|
||||
- New class QCPBarsGroup allows horizontal grouping of multiple QCPBars plottables
|
||||
- Added QCPBars feature allowing non-zero base values (see property QCPBars::setBaseValue)
|
||||
- Added QCPBars width type, for more flexible bar widths (see property QCPBars::setWidthType)
|
||||
- New QCPCurve optimization algorithm, fixes bug which caused line flicker at deep zoom into curve segment
|
||||
- Item positions can now have different position types and anchors for their x and y coordinates (QCPItemPosition::setTypeX/Y, setParentAnchorX/Y)
|
||||
- QCPGraph and QCPCurve can now display gaps in their lines, when inserting quiet NaNs as values (std::numeric_limits<double>::quiet_NaN())
|
||||
- QCPAxis now supports placing the tick labels inside the axis rect, for particularly space saving plots (QCPAxis::setTickLabelSide)
|
||||
Added features after beta:
|
||||
- Made code compatible with QT_NO_CAST_FROM_ASCII, QT_NO_CAST_TO_ASCII
|
||||
- Added compatibility with QT_NO_KEYWORDS after sending code files through a simple reg-ex script
|
||||
- Added possibility to inject own QCPAxis(-subclasses) via second, optional QCPAxisRect::addAxis parameter
|
||||
- Added parameter to QCPItemPixmap::setScaled to specify transformation mode
|
||||
|
||||
Bugfixes:
|
||||
- Fixed bug in QCPCurve rendering of very zoomed-in curves (via new optimization algorithm)
|
||||
- Fixed conflict with MSVC-specific keyword "interface" in text-document-integration example
|
||||
- Fixed QCPScatterStyle bug ignoring the specified pen in the custom scatter shape constructor
|
||||
- Fixed bug (possible crash) during QCustomPlot teardown, when a QCPLegend that has no parent layout (i.e. was removed from layout manually) gets deleted
|
||||
Bugfixes after beta:
|
||||
- Fixed bug of QCPColorMap/QCPColorGradient colors being off by one color sampling step (only noticeable in special cases)
|
||||
- Fixed bug of QCPGraph adaptive sampling on vertical key axis, causing staggered look
|
||||
- Fixed low (float) precision in QCPCurve optimization algorithm, by not using QVector2D anymore
|
||||
|
||||
Other:
|
||||
- Qt 5.3 and Qt 5.4 compatibility
|
||||
|
||||
#### Version 1.2.1 released on 07.04.14 ####
|
||||
|
||||
Bugfixes:
|
||||
- Fixed regression which garbled date-time tick labels on axes, if setTickLabelType is ltDateTime and setNumberFormat contains the "b" option
|
||||
|
||||
#### Version 1.2.0 released on 14.03.14 ####
|
||||
|
||||
Added features:
|
||||
- Adaptive Sampling for QCPGraph greatly improves performance for high data densities (see QCPGraph::setAdaptiveSampling)
|
||||
- QCPColorMap plottable with QCPColorScale layout element allows plotting of 2D color maps
|
||||
- QCustomPlot::savePdf now has additional optional parameters pdfCreator and pdfTitle to set according PDF metadata fields
|
||||
- QCustomPlot::replot now allows specifying whether the widget update is immediate (repaint) or queued (update)
|
||||
- QCPRange operators +, -, *, / with double operand for range shifting and scaling, and ==, != for range comparison
|
||||
- Layers now have a visibility property (QCPLayer::setVisible)
|
||||
- static functions QCPAxis::opposite and QCPAxis::orientation now offer more convenience when handling axis types
|
||||
- added notification signals for selectability change (selectableChanged) on all objects that have a selected/selectable property
|
||||
- added notification signal for QCPAxis scaleType property
|
||||
- added notification signal QCPLayerable::layerChanged
|
||||
|
||||
Bugfixes:
|
||||
- Fixed assert halt, when QCPAxis auto tick labels not disabled but nevertheless a custom non-number tick label ending in "e" given
|
||||
- Fixed painting glitches when QCustomPlot resized inside a QMdiArea or under certain conditions inside a QLayout
|
||||
- If changing QCPAxis::scaleType and thus causing range sanitizing and a range modification, rangeChanged wouldn't be emitted
|
||||
- Fixed documentation bug that caused indentation to be lost in code examples
|
||||
Bugfixes after beta:
|
||||
- Fixed bug that caused crash if clicked-on legend item is removed in mousePressEvent.
|
||||
- On some systems, font size defaults to -1, which used to cause a debug output in QCPAxisPainterPrivate::TickLabelDataQCP. Now it's checked before setting values based on the default font size.
|
||||
- When using multiple axes on one side, setting one to invisible didn't properly compress the freed space.
|
||||
- Fixed bug that allowed selection of plottables when clicking in the bottom or top margin of a QCPAxisRect (outside the inner rect)
|
||||
|
||||
Other:
|
||||
- In method QCPAbstractPlottable::getKeyRange/getValueRange, renamed parameter "validRange" to "foundRange", to better reflect its meaning (and contrast it from QCPRange::validRange)
|
||||
- QCPAxis low-level axis painting methods exported to QCPAxisPainterPrivate
|
||||
|
||||
#### Version 1.1.1 released on 09.12.13 ####
|
||||
|
||||
Bugfixes:
|
||||
- Fixed bug causing legends blocking input events from reaching underlying axis rect even if legend is invisible
|
||||
- Added missing Q_PROPERTY for QCPAxis::setDateTimeSpec
|
||||
- Fixed behaviour of QCPAxisRect::setupFullAxesBox (now transfers more properties from bottom/left to top/right axes and sets visibility of bottom/left axes to true)
|
||||
- Made sure PDF export doesn't default to grayscale output on some systems
|
||||
|
||||
Other:
|
||||
- Plotting hint QCP::phForceRepaint is now enabled on all systems (and not only on windows) by default
|
||||
- Documentation improvements
|
||||
|
||||
#### Version 1.1.0 released on 04.11.13 ####
|
||||
|
||||
Added features:
|
||||
- Added QCPRange::expand and QCPRange::expanded
|
||||
- Added QCPAxis::rescale to rescale axis to all associated plottables
|
||||
- Added QCPAxis::setDateTimeSpec/dateTimeSpec to allow axis labels either in UTC or local time
|
||||
- QCPAxis now additionally emits a rangeChanged signal overload that provides the old range as second parameter
|
||||
|
||||
Bugfixes:
|
||||
- Fixed QCustomPlot::rescaleAxes not rescaling properly if first plottable has an empty range
|
||||
- QCPGraph::rescaleAxes/rescaleKeyAxis/rescaleValueAxis are no longer virtual (never were in base class, was a mistake)
|
||||
- Fixed bugs in QCPAxis::items and QCPAxisRect::items not properly returning associated items and potentially stalling
|
||||
|
||||
Other:
|
||||
- Internal change from QWeakPointer to QPointer, thus got rid of deprecated Qt functionality
|
||||
- Qt5.1 and Qt5.2 (beta1) compatibility
|
||||
- Release packages now extract to single subdirectory and don't place multiple files in current working directory
|
||||
|
||||
#### Version 1.0.1 released on 05.09.13 ####
|
||||
|
||||
Bugfixes:
|
||||
- using define flag QCUSTOMPLOT_CHECK_DATA caused debug output when data was correct, instead of invalid (fixed QCP::isInvalidData)
|
||||
- documentation images are now properly shown when viewed with Qt Assistant
|
||||
- fixed various documentation mistakes
|
||||
|
||||
Other:
|
||||
- Adapted documentation style sheet to better match Qt5 documentation
|
||||
|
||||
#### Version 1.0.0 released on 01.08.13 ####
|
||||
|
||||
Quick Summary:
|
||||
- Layout system for multiple axis rects in one plot
|
||||
- Multiple axes per side
|
||||
- Qt5 compatibility
|
||||
- More flexible and consistent scatter configuration with QCPScatterStyle
|
||||
- Various interface cleanups/refactoring
|
||||
- Pixmap-cached axis labels for improved replot performance
|
||||
|
||||
Changes that break backward compatibility:
|
||||
- QCustomPlot::axisRect() changed meaning due to the extensive changes to how axes and axis rects are handled
|
||||
it now returns a pointer to a QCPAxisRect and takes an integer index as parameter.
|
||||
- QCPAxis constructor changed to now take QCPAxisRect* as parent
|
||||
- setAutoMargin, setMarginLeft/Right/Top/Bottom removed due to the axis rect changes (see QCPAxisRect::setMargins/setAutoMargins)
|
||||
- setAxisRect removed due to the axis rect changes
|
||||
- setAxisBackground(-Scaled/-ScaledMode) now moved to QCPAxisRect as setBackground(-Scaled/ScaledMode) (access via QCustomPlot::axisRects())
|
||||
- QCPLegend now is a QCPLayoutElement
|
||||
- QCPAbstractPlottable::drawLegendIcon parameter "rect" changed from QRect to QRectF
|
||||
- QCPAbstractLegendItem::draw second parameter removed (position/size now handled via QCPLayoutElement base class)
|
||||
- removed QCPLegend::setMargin/setMarginLeft/Right/Top/Bottom (now inherits the capability from QCPLayoutElement::setMargins)
|
||||
- removed QCPLegend::setMinimumSize (now inherits the capability from QCPLayoutElement::setMinimumSize)
|
||||
- removed enum QCPLegend::PositionStyle, QCPLegend::positionStyle/setPositionStyle/position/setPosition (replaced by capabilities of QCPLayoutInset)
|
||||
- QCPLegend transformed to work with new layout system (almost everything changed)
|
||||
- removed entire title interface: QCustomPlot::setTitle/setTitleFont/setTitleColor/setTitleSelected/setTitleSelectedFont/setTitleSelectedColor and
|
||||
the QCustomPlot::iSelectTitle interaction flag (all functionality is now given by the layout element "QCPPlotTitle" which can be added to the plot layout)
|
||||
- selectTest functions now take two additional parameters: bool onlySelectable and QVariant *details=0
|
||||
- selectTest functions now ignores visibility of objects and (if parameter onlySelectable is true) does not anymore ignore selectability of the object
|
||||
- moved QCustomPlot::Interaction/Interactions to QCP namespace as QCP::Interaction/Interactions
|
||||
- moved QCustomPlot::setupFullAxesBox() to QCPAxisRect::setupFullAxesBox. Now also accepts parameter to decide whether to connect opposite axis ranges
|
||||
- moved range dragging/zooming interface from QCustomPlot to QCPAxisRect (setRangeDrag, setRangeZoom, setRangeDragAxes, setRangeZoomAxes,...)
|
||||
- rangeDrag/Zoom is now set to Qt::Horizontal|Qt::Vertical instead of 0 by default, on the other hand, iRangeDrag/Zoom is unset in interactions by
|
||||
default (this makes enabling dragging/zooming easier by just adding the interaction flags)
|
||||
- QCPScatterStyle takes over everything related to handling scatters in all plottables
|
||||
- removed setScatterPen/Size on QCPGraph and QCPCurve, removed setOutlierPen/Size on QCPStatisticalBox (now handled via QCPScatterStyle)
|
||||
- modified setScatterStyle on QCPGraph and QCPCurve, and setOutlierStyle on QCPStatisticalBox, to take QCPScatterStyle
|
||||
- axis grid and subgrid are now reachable via the QCPGrid *QCPAxis::grid() method. (e.g. instead of xAxis->setGrid(true), write xAxis->grid()->setVisible(true))
|
||||
|
||||
Added features:
|
||||
- Axis tick labels are now pixmap-cached, thus increasing replot performance (in usual setups by about 24%). See plotting hint phCacheLabels which is set by default
|
||||
- Advanced layout system, including the classes QCPLayoutElement, QCPLayout, QCPLayoutGrid, QCPLayoutInset, QCPAxisRect
|
||||
- QCustomPlot::axisRects() returns all the axis rects in the QCustomPlot.
|
||||
- QCustomPlot::plotLayout() returns the top level layout (initially a QCPLayoutGrid with one QCPAxisRect inside)
|
||||
- QCPAxis now may have an offset to the axis rect (setOffset)
|
||||
- Multiple axes per QCPAxisRect side are now supported (see QCPAxisRect::addAxis)
|
||||
- QCustomPlot::toPixmap renders the plot into a pixmap and returns it
|
||||
- When setting tick label rotation to +90 or -90 degrees on a vertical axis, the labels are now centered vertically on the tick height
|
||||
(This allows space saving vertical tick labels by having the text direction parallel to the axis)
|
||||
- Substantially increased replot performance when using very large manual tick vectors (> 10000 ticks) via QCPAxis::setTickVector
|
||||
- QCPAxis and QCPAxisRect now allow easy access to all plottables(), graphs() and items() that are associated with them
|
||||
- Added QCustomPlot::hasItem method for consistency with plottable interface, hasPlottable
|
||||
- Added QCPAxisRect::setMinimumMargins as replacement for hardcoded minimum axis margin (15 px) when auto margin is enabled
|
||||
- Added Flags type QCPAxis::AxisTypes (from QCPAxis::AxisType), used in QCPAxisRect interface
|
||||
- Automatic margin calculation can now be enabled/disabled on a per-side basis, see QCPAxisRect::setAutoMargins
|
||||
- QCPAxisRect margins of multiple axis rects can be coupled via QCPMarginGroup
|
||||
- Added new default layers "background" and "legend" (QCPAxisRect draws its background on the "background" layer, QCPLegend is on the "legend" layer by default)
|
||||
- Custom scatter style via QCP::ssCustom and respective setCustomScatter functions that take a QPainterPath
|
||||
- Filled scatters via QCPScatterStyle::setBrush
|
||||
Added features after beta:
|
||||
- Added QCustomPlot::toPainter method, to allow rendering with existing painter
|
||||
- QCPItemEllipse now provides a center anchor
|
||||
|
||||
Bugfixes:
|
||||
- Fixed compile error on ARM
|
||||
- Wrong legend icons were displayed if using pixmaps for scatters that are smaller than the legend icon rect
|
||||
- Fixed clipping inaccuracy for rotated tick labels (were hidden too early, because the non-rotated bounding box was used)
|
||||
- Fixed bug that caused wrong clipping of axis ticks and subticks when the ticks were given manually by QCPAxis::setTickVector
|
||||
- Fixed Qt5 crash when dragging graph out of view (iterator out of bounds in QCPGraph::getVisibleDataBounds)
|
||||
- Fixed QCPItemText not scaling properly when using scaled raster export
|
||||
Bugfixes after beta:
|
||||
- Fixed bug that clipped the rightmost pixel column of tick labels when caching activated (only visible on windows for superscript exponents)
|
||||
- Restored compatibility to Qt4.6
|
||||
- Restored support for -no-RTTI compilation
|
||||
- Empty manual tick labels are handled more gracefully (no QPainter qDebug messages anymore)
|
||||
- Fixed type ambiguity in QCPLineEnding::draw causing compile error on ARM
|
||||
- Fixed bug of grid layouts not propagating the minimum size from their child elements to the parent layout correctly
|
||||
- Fixed bug of child elements (e.g. axis rects) of inset layouts not properly receiving mouse events
|
||||
|
||||
Other:
|
||||
- Opened up non-amalgamated project structure to public via git repository
|
||||
|
||||
#### Version released on 09.06.12 ####
|
||||
|
||||
Quick Summary:
|
||||
- Items (arrows, text,...)
|
||||
- Layers (easier control over rendering order)
|
||||
- New antialiasing system (Each objects controls own antialiasing with setAntialiased)
|
||||
- Performance Improvements
|
||||
- improved pixel-precise drawing
|
||||
- easier shared library creation/usage
|
||||
|
||||
Changes that (might) break backward compatibility:
|
||||
- enum QCPGraph::ScatterSymbol was moved to QCP namespace (now QCP::ScatterSymbol).
|
||||
This replace should fix your code: "QCPGraph::ss" -> "QCP::ss"
|
||||
- enum QCustomPlot::AntialiasedElement and flag QCustomPlot::AntialiasedElements was moved to QCP namespace
|
||||
This replace should fix your code: "QCustomPlot::ae" -> "QCP::ae"
|
||||
- the meaning of QCustomPlot::setAntialiasedElements has changed slightly: It is now an override to force elements to be antialiased. If you want to force
|
||||
elements to not be drawn antialiased, use the new setNotAntialiasedElements. If an element is mentioned in neither of those functions, it now controls
|
||||
its antialiasing itself via its "setAntialiased" function(s). (e.g. QCPAxis::setAntialiased(bool), QCPAbstractPlottable::setAntialiased(bool),
|
||||
QCPAbstractPlottable::setAntialiasedScatters(bool), etc.)
|
||||
- QCPAxis::setTickVector and QCPAxis::setTickVectorLabels no longer take a pointer but a const reference of the respective QVector as parameter.
|
||||
(handing over a pointer didn't give any noticeable performance benefits but was inconsistent with the rest of the interface)
|
||||
- Equally QCPAxis::tickVector and QCPAxis::tickVectorLabels don't return by pointer but by value now
|
||||
- QCustomPlot::savePngScaled was removed, its purpose is now included as optional parameter "scale" of savePng.
|
||||
- If you have derived from QCPAbstractPlottable: all selectTest functions now consistently take the argument "const QPointF &pos" which is the test point in pixel coordinates.
|
||||
(the argument there was "double key, double value" in plot coordinates, before).
|
||||
- QCPAbstractPlottable, QCPAxis and QCPLegend now inherit from QCPLayerable
|
||||
- If you have derived from QCPAbstractPlottable: the draw method signature has changed from "draw (..) const" to "draw (..)", i.e. the method
|
||||
is not const anymore. This allows the draw function of your plottable to perform buffering/caching operations, if necessary.
|
||||
|
||||
Added features:
|
||||
- Item system: QCPAbstractItem, QCPItemAnchor, QCPItemPosition, QCPLineEnding. Allows placing of lines, arrows, text, pixmaps etc.
|
||||
- New Items: QCPItemStraightLine, QCPItemLine, QCPItemCurve, QCPItemEllipse, QCPItemRect, QCPItemPixmap, QCPItemText, QCPItemBracket, QCPItemTracer
|
||||
- QCustomPlot::addItem/itemCount/item/removeItem/selectedItems
|
||||
- signals QCustomPlot::itemClicked/itemDoubleClicked
|
||||
- the QCustomPlot interactions property now includes iSelectItems (for selection of QCPAbstractItem)
|
||||
- QCPLineEnding. Represents the different styles a line/curve can end (e.g. different arrows, circle, square, bar, etc.), see e.g. QCPItemCurve::setHead
|
||||
- Layer system: QCPLayerable, QCPLayer. Allows more sophisticated control over drawing order and a kind of grouping.
|
||||
- QCPAbstractPlottable, QCPAbstractItem, QCPAxis, QCPGrid, QCPLegend are layerables and derive from QCPLayerable
|
||||
- QCustomPlot::addLayer/moveLayer/removeLayer/setCurrentLayer/layer/currentLayer/layerCount
|
||||
- Initially there are three layers: "grid", "main", and "axes". The "main" layer is initially empty and set as current layer, so new plottables/items are put there.
|
||||
- QCustomPlot::viewport now makes the previously inaccessible viewport rect read-only-accessible (needed that for item-interface)
|
||||
- PNG export now allows transparent background by calling QCustomPlot::setColor(Qt::transparent) before savePng
|
||||
- QCPStatisticalBox outlier symbols may now be all scatter symbols, not only hardcoded circles.
|
||||
- perfect precision of scatter symbol/error bar drawing and clipping in both antialiased and non-antialiased mode, by introducing QCPPainter
|
||||
that works around some QPainter bugs/inconveniences. Further, more complex symbols like ssCrossSquare used to look crooked, now they look good.
|
||||
- new antialiasing control system: Each drawing element now has its own "setAntialiased" function to control whether it is drawn antialiased.
|
||||
- QCustomPlot::setAntialiasedElements and QCustomPlot::setNotAntialiasedElements can be used to override the individual settings.
|
||||
- Subclasses of QCPAbstractPlottable can now use the convenience functions like applyFillAntialiasingHint or applyScattersAntialiasingHint to
|
||||
easily make their drawing code comply with the overall antialiasing system.
|
||||
- QCustomPlot::setNoAntialiasingOnDrag allows greatly improved performance and responsiveness by temporarily disabling all antialiasing while
|
||||
the user is dragging axis ranges
|
||||
- QCPGraph can now show scatter symbols at data points and hide its line (see QCPGraph::setScatterStyle, setScatterSize, setScatterPixmap, setLineStyle)
|
||||
- Grid drawing code was sourced out from QCPAxis to QCPGrid. QCPGrid is mainly an internal class and every QCPAxis owns one. The grid interface still
|
||||
works through QCPAxis and hasn't changed. The separation allows the grid to be drawn on a different layer as the axes, such that e.g. a graph can
|
||||
be above the grid but below the axes.
|
||||
- QCustomPlot::hasPlottable(plottable), returns whether the QCustomPlot contains the plottable
|
||||
- QCustomPlot::setPlottingHint/setPlottingHints, plotting hints control details about the plotting quality/speed
|
||||
- export to jpg and bmp added (QCustomPlot::saveJpg/saveBmp), as well as control over compression quality for png and jpg
|
||||
- multi-select-modifier may now be specified with QCustomPlot::setMultiSelectModifier and is not fixed to Ctrl anymore
|
||||
|
||||
Bugfixes:
|
||||
- fixed QCustomPlot ignores replot after it had size (0,0) even if size becomes valid again
|
||||
- on Windows, a repaint used to be delayed during dragging/zooming of a complex plot, until the drag operation was done.
|
||||
This was fixed, i.e. repaints are forced after a replot() call. See QCP::phForceRepaint and setPlottingHints.
|
||||
- when using the raster paintengine and exporting to scaled PNG, pen widths are now scaled correctly (QPainter bug workaround via QCPPainter)
|
||||
- PDF export now respects QCustomPlot background color (QCustomPlot::setColor), also Qt::transparent
|
||||
- fixed a bug on QCPBars and QCPStatisticalBox where auto-rescaling of axis would fail when all data is very small (< 1e-11)
|
||||
- fixed mouse event propagation bug that prevented range dragging from working on KDE (GNU/Linux)
|
||||
- fixed a compiler warning on 64-bit systems due to pointer cast to int instead of quintptr in a qDebug output
|
||||
|
||||
Other:
|
||||
- Added support for easier shared library creation (including examples for compiling and using QCustomPlot as shared library)
|
||||
- QCustomPlot now has the Qt::WA_OpaquePaintEvent widget attribute (gives slightly improved performance).
|
||||
- QCP::aeGraphs (enum QCP::AntialiasedElement, previously QCustomPlot::aeGraphs) has been marked deprecated since version 02.02.12 and
|
||||
was now removed. Use QCP::aePlottables instead.
|
||||
- optional performance-quality-tradeoff for solid graph lines (see QCustomPlot::setPlottingHints).
|
||||
- marked data classes and QCPRange as Q_MOVABLE_TYPE
|
||||
- replaced usage of own macro FUNCNAME with Qt macro Q_FUNC_INFO
|
||||
- QCustomPlot now returns a minimum size hint of 50*50
|
||||
|
||||
#### Version released on 31.03.12 ####
|
||||
|
||||
Changes that (might) break backward compatibility:
|
||||
- QCPAbstractLegendItem now inherits from QObject
|
||||
- mousePress, mouseMove and mouseRelease signals are now emitted before and not after any QCustomPlot processing (range dragging, selecting, etc.)
|
||||
|
||||
Added features:
|
||||
- Interaction system: now allows selecting of objects like plottables, axes, legend and plot title, see QCustomPlot::setInteractions documentation
|
||||
- Interaction system for plottables:
|
||||
- setSelectable, setSelected, setSelectedPen, setSelectedBrush, selectTest on QCPAbstractPlottable and all derived plottables
|
||||
- setSelectionTolerance on QCustomPlot
|
||||
- selectedPlottables and selectedGraphs on QCustomPlot (returns the list of currently selected plottables/graphs)
|
||||
- Interaction system for axes:
|
||||
- setSelectable, setSelected, setSelectedBasePen, setSelectedTickPen, setSelectedSubTickPen, setSelectedLabelFont, setSelectedTickLabelFont,
|
||||
setSelectedLabelColor, setSelectedTickLabelColor, selectTest on QCPAxis
|
||||
- selectedAxes on QCustomPlot (returns a list of the axes that currently have selected parts)
|
||||
- Interaction system for legend:
|
||||
- setSelectable, setSelected, setSelectedBorderPen, setSelectedIconBorderPen, setSelectedBrush, setSelectedFont, setSelectedTextColor, selectedItems on QCPLegend
|
||||
- setSelectedFont, setSelectedTextColor, setSelectable, setSelected on QCPAbstractLegendItem
|
||||
- selectedLegends on QCustomPlot
|
||||
- Interaction system for title:
|
||||
- setSelectedTitleFont, setSelectedTitleColor, setTitleSelected on QCustomPlot
|
||||
- new signals in accordance with the interaction system:
|
||||
- selectionChangedByUser on QCustomPlot
|
||||
- selectionChanged on QCPAbstractPlottable
|
||||
- selectionChanged on QCPAxis
|
||||
- selectionChanged on QCPLegend and QCPAbstractLegendItem
|
||||
- plottableClick, legendClick, axisClick, titleClick, plottableDoubleClick, legendDoubleClick, axisDoubleClick, titleDoubleClick on QCustomPlot
|
||||
- QCustomPlot::deselectAll (deselects everything, i.e. axes and plottables)
|
||||
- QCPAbstractPlottable::pixelsToCoords (inverse function to the already existing coordsToPixels function)
|
||||
- QCPRange::contains(double value)
|
||||
- QCPAxis::setLabelColor and setTickLabelColor
|
||||
- QCustomPlot::setTitleColor
|
||||
- QCustomPlot now emits beforeReplot and afterReplot signals. Note that it is safe to make two customPlots mutually call eachothers replot functions
|
||||
in one of these slots, it will not cause an infinite loop. (usefull for synchronizing axes ranges between two customPlots, because setRange alone doesn't replot)
|
||||
- If the Qt version is 4.7 or greater, the tick label strings in date-time-mode now support sub-second accuracy (e.g. with format like "hh:mm:ss.zzz").
|
||||
|
||||
Bugfixes:
|
||||
- tick labels/margins should no longer oscillate by one pixel when dragging range or replotting repeatedly while changing e.g. data. This
|
||||
was caused by a bug in Qt's QFontMetrics::boundingRect function when the font has an integer point size (probably some rounding problem).
|
||||
The fix hence consists of creating a temporary font (only for bounding-box calculation) which is 0.05pt larger and thus avoiding the
|
||||
jittering rounding outcome.
|
||||
- tick label, axis label and plot title colors used to be undefined. This was fixed by providing explicit color properties.
|
||||
|
||||
Other:
|
||||
- fixed some glitches in the documentation
|
||||
- QCustomPlot::replot and QCustomPlot::rescaleAxes are now slots
|
||||
|
||||
#### Version released on 02.02.12 ####
|
||||
|
||||
Changes that break backward compatibility:
|
||||
- renamed all secondary classes from QCustomPlot[...] to QCP[...]:
|
||||
QCustomPlotAxis -> QCPAxis
|
||||
QCustomPlotGraph -> QCPGraph
|
||||
QCustomPlotRange -> QCPRange
|
||||
QCustomPlotData -> QCPData
|
||||
QCustomPlotDataMap -> QCPDataMap
|
||||
QCustomPlotLegend -> QCPLegend
|
||||
QCustomPlotDataMapIterator -> QCPDataMapIterator
|
||||
QCustomPlotDataMutableMapIterator -> QCPDataMutableMapIterator
|
||||
A simple search and replace on all code files should make your code run again, e.g. consider the regex "QCustomPlot(?=[AGRDL])" -> "QCP".
|
||||
Make sure not to just replace "QCustomPlot" with "QCP" because the main class QCustomPlot hasn't changed to QCP.
|
||||
This change was necessary because class names became unhandy, pardon my bad naming decision in the beginning.
|
||||
- QCPAxis::tickLength() and QCPAxis::subTickLength() now each split into two functions for inward and outward ticks (tickLengthIn/tickLengthOut).
|
||||
- QCPLegend now uses QCPAbstractLegendItem to carry item data (before, the legend was passed QCPGraphs directly)
|
||||
- QCustomPlot::addGraph() now doesn't return the index of the created graph anymore, but a pointer to the created QCPGraph.
|
||||
- QCustomPlot::setAutoAddGraphToLegend is replaced by setAutoAddPlottableToLegend
|
||||
|
||||
Added features:
|
||||
- Reversed axis range with QCPAxis::setRangeReversed(bool)
|
||||
- Tick labels are now only drawn if not clipped by the viewport (widget border) on the sides (e.g. left and right on a horizontal axis).
|
||||
- Zerolines. Like grid lines only with a separate pen (QCPAxis::setZeroLinePen), at tick position zero.
|
||||
- Outward ticks. QCPAxis::setTickLength/setSubTickLength now accepts two arguments for inward and outward tick length. This doesn't break
|
||||
backward compatibility because the second argument (outward) has default value zero and thereby a call with one argument hasn't changed its meaning.
|
||||
- QCPGraph now inherits from QCPAbstractPlottable
|
||||
- QCustomPlot::addPlottable/plottable/removePlottable/clearPlottables added to interface with the new QCPAbstractPlottable-based system. The simpler interface
|
||||
which only acts on QCPGraphs (addGraph, graph, removeGraph, etc.) was adapted internally and is kept for backward compatibility and ease of use.
|
||||
- QCPLegend items for plottables (e.g. graphs) can automatically wrap their texts to fit the widths, see QCPLegend::setMinimumSize and QCPPlottableLegendItem::setTextWrap.
|
||||
- QCustomPlot::rescaleAxes. Adapts axis ranges to show all plottables/graphs, by calling QCPAbstractPlottable::rescaleAxes on all plottables in the plot.
|
||||
- QCPCurve. For plotting of parametric curves.
|
||||
- QCPBars. For plotting of bar charts.
|
||||
- QCPStatisticalBox. For statistical box plots.
|
||||
|
||||
Bugfixes:
|
||||
- Fixed QCustomPlot::removeGraph(int) not being able to remove graph index 0
|
||||
- made QCustomPlot::replot() abort painting when painter initialization fails (e.g. because width/height of QCustomPlot is zero)
|
||||
- The distance of the axis label from the axis ignored the tick label padding, this could have caused overlapping axis labels and tick labels
|
||||
- fixed memory leak in QCustomPlot (dtor didn't delete legend)
|
||||
- fixed bug that prevented QCPAxis::setRangeLower/Upper from setting the value to exactly 0.
|
||||
|
||||
Other:
|
||||
- Changed default error bar handle size (QCustomPlotGraph::setErrorBarSize) from 4 to 6.
|
||||
- Removed QCustomPlotDataFetcher. Was deprecated and not used class.
|
||||
- Extended documentation, especially class descriptions.
|
||||
|
||||
#### Version released on 15.01.12 ####
|
||||
|
||||
Changes that (might) break backward compatibility:
|
||||
- QCustomPlotGraph now inherits from QObject
|
||||
|
||||
Added features:
|
||||
- Added axis background pixmap (QCustomPlot::setAxisBackground, setAxisBackgroundScaled, setAxisBackgroundScaledMode)
|
||||
- Added width and height parameter on PDF export function QCustomPlot::savePdf(). This now allows PDF export to
|
||||
have arbitrary dimensions, independent of the current geometry of the QCustomPlot.
|
||||
- Added overload of QCustomPlot::removeGraph that takes QCustomPlotGraph* as parameter, instead the index of the graph
|
||||
- Added all enums to the Qt meta system via Q_ENUMS(). The enums can now be transformed
|
||||
to QString values easily with the Qt meta system, which makes saving state e.g. as XML
|
||||
significantly nicer.
|
||||
- added typedef QMapIterator<double,QCustomPlotData> QCustomPlotDataMapIterator
|
||||
and typedef QMutableMapIterator<double,QCustomPlotData> QCustomPlotDataMutableMapIterator
|
||||
for improved information hiding, when using iterators outside QCustomPlot code
|
||||
|
||||
Bugfixes:
|
||||
- Fixed savePngScaled. Axis/label drawing functions used to reset the painter transform
|
||||
and thereby break savePngScaled. Now they buffer the current transform and restore it afterwards.
|
||||
- Fixed some glitches in the doxygen comments (affects documentation only)
|
||||
|
||||
Other:
|
||||
- Changed the default tickLabelPadding of top axis from 3 to 6 pixels. Looks better.
|
||||
- Changed the default QCustomPlot::setAntialiasedElements setting: Graph fills are now antialiased
|
||||
by default. That's a bit slower, but makes fill borders look better.
|
||||
|
||||
#### Version released on 19.11.11 ####
|
||||
|
||||
Changes that break backward compatibility:
|
||||
- QCustomPlotAxis: tickFont and setTickFont renamed to tickLabelFont and setTickLabelFont (for naming consistency)
|
||||
|
||||
Other:
|
||||
- QCustomPlotAxis: Added rotated tick labels, see setTickLabelRotation
|
||||
|
||||
+30121
File diff suppressed because it is too large.
Load diff
+6662
File diff suppressed because it is too large.
Load diff
+5
-7
@@ -22,15 +22,15 @@
|
||||
* \brief main file
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ConfigureFormatDialog.h"
|
||||
#include "PlaYUVerApp.h"
|
||||
#include "PlaYUVerAppDefs.h"
|
||||
#include "VideoSubWindow.h"
|
||||
#include "config.h"
|
||||
#include <QApplication>
|
||||
#ifdef USE_QTDBUS
|
||||
#include "PlaYUVerAppAdaptor.h"
|
||||
#endif
|
||||
#include <QApplication>
|
||||
#ifdef USE_FERVOR
|
||||
#include "fvupdater.h"
|
||||
#endif
|
||||
@@ -60,8 +60,7 @@ int main( int argc, char* argv[] )
|
||||
{
|
||||
Bool force_new = false;
|
||||
QStringList filenameList;
|
||||
for( Int i = 1; i < argc; i++ )
|
||||
{
|
||||
for( Int i = 1; i < argc; i++ ) {
|
||||
filenameList.append( QFileInfo( QString( argv[i] ) ).absoluteFilePath() );
|
||||
}
|
||||
if( filenameList.isEmpty() )
|
||||
@@ -138,9 +137,8 @@ int main( int argc, char* argv[] )
|
||||
}
|
||||
|
||||
#ifdef USE_FERVOR
|
||||
FvUpdater::sharedUpdater()->SetFeedURL(
|
||||
"http://192.168.96.201/share/PlaYUVerProject/"
|
||||
"PlaYUVerUpdate-" UPDATE_CHANNEL ".xml" );
|
||||
FvUpdater::sharedUpdater()->SetFeedURL( "http://192.168.96.201/share/PlaYUVerProject/"
|
||||
"PlaYUVerUpdate-" UPDATE_CHANNEL ".xml" );
|
||||
FvUpdater::sharedUpdater()->SetDependencies( "ALL" );
|
||||
#endif
|
||||
|
||||
|
||||
-10
@@ -38,16 +38,6 @@
|
||||
/* CPU features */
|
||||
#cmakedefine USE_SSE
|
||||
|
||||
/* QT definition */
|
||||
#cmakedefine USE_QT4
|
||||
|
||||
#undef QT_VERSION_PLAYUVER
|
||||
#ifndef USE_QT4
|
||||
#define QT_VERSION_PLAYUVER 5
|
||||
#else
|
||||
#define QT_VERSION_PLAYUVER 4
|
||||
#endif
|
||||
|
||||
/* QtDBus */
|
||||
#cmakedefine USE_QTDBUS
|
||||
|
||||
|
||||
+4
-8
@@ -95,8 +95,7 @@ Int getMem2D( T*** array2D, Int dim0, Int dim1 )
|
||||
if( ( *( *array2D ) = (T*)xCallocMem( dim0 * dim1, sizeof( T ) ) ) == NULL )
|
||||
printf( "get_mem2Dint: array2D" );
|
||||
|
||||
for( i = 1; i < dim0; i++ )
|
||||
( *array2D )[i] = ( *array2D )[i - 1] + dim1;
|
||||
for( i = 1; i < dim0; i++ ) ( *array2D )[i] = ( *array2D )[i - 1] + dim1;
|
||||
|
||||
return dim0 * ( sizeof( T* ) + dim1 * sizeof( T ) );
|
||||
}
|
||||
@@ -111,8 +110,7 @@ Int getMem3D( T**** array3D, Int dim0, Int dim1, Int dim2 )
|
||||
|
||||
mem_size += getMem2D( *array3D, dim0 * dim1, dim2 );
|
||||
|
||||
for( i = 1; i < dim0; i++ )
|
||||
( *array3D )[i] = ( *array3D )[i - 1] + dim1;
|
||||
for( i = 1; i < dim0; i++ ) ( *array3D )[i] = ( *array3D )[i - 1] + dim1;
|
||||
|
||||
return mem_size;
|
||||
}
|
||||
@@ -127,8 +125,7 @@ Int getMem4D( T***** array4D, Int dim0, Int dim1, Int dim2, Int dim3 )
|
||||
|
||||
mem_size += getMem3D( *array4D, dim0 * dim1, dim2, dim3 );
|
||||
|
||||
for( i = 1; i < dim0; i++ )
|
||||
( *array4D )[i] = ( *array4D )[i - 1] + dim1;
|
||||
for( i = 1; i < dim0; i++ ) ( *array4D )[i] = ( *array4D )[i - 1] + dim1;
|
||||
|
||||
return mem_size;
|
||||
}
|
||||
@@ -143,8 +140,7 @@ Int getMem5D( T****** array5D, Int dim0, Int dim1, Int dim2, Int dim3, Int dim4
|
||||
|
||||
mem_size += getMem4D( *array5D, dim0 * dim1, dim2, dim3, dim4 );
|
||||
|
||||
for( i = 1; i < dim0; i++ )
|
||||
( *array5D )[i] = ( *array5D )[i - 1] + dim1;
|
||||
for( i = 1; i < dim0; i++ ) ( *array5D )[i] = ( *array5D )[i - 1] + dim1;
|
||||
|
||||
return mem_size;
|
||||
}
|
||||
|
||||
+52
-99
@@ -49,8 +49,7 @@ std::vector<String> PlaYUVerFrame::supportedColorSpacesListNames()
|
||||
std::vector<String> PlaYUVerFrame::supportedPixelFormatListNames()
|
||||
{
|
||||
std::vector<String> formatsList;
|
||||
for( Int i = 0; i < NUMBER_PEL_FORMATS; i++ )
|
||||
{
|
||||
for( Int i = 0; i < NUMBER_PEL_FORMATS; i++ ) {
|
||||
formatsList.push_back( g_PlaYUVerPixFmtDescriptorsList[i].name );
|
||||
}
|
||||
return formatsList;
|
||||
@@ -59,8 +58,7 @@ std::vector<String> PlaYUVerFrame::supportedPixelFormatListNames()
|
||||
std::vector<String> PlaYUVerFrame::supportedPixelFormatListNames( Int colorSpace )
|
||||
{
|
||||
std::vector<String> formatsList;
|
||||
for( Int i = 0; i < NUMBER_PEL_FORMATS; i++ )
|
||||
{
|
||||
for( Int i = 0; i < NUMBER_PEL_FORMATS; i++ ) {
|
||||
if( g_PlaYUVerPixFmtDescriptorsList[i].colorSpace == colorSpace )
|
||||
formatsList.push_back( g_PlaYUVerPixFmtDescriptorsList[i].name );
|
||||
}
|
||||
@@ -69,8 +67,7 @@ std::vector<String> PlaYUVerFrame::supportedPixelFormatListNames( Int colorSpace
|
||||
|
||||
Int PlaYUVerFrame::findPixelFormat( const String& name )
|
||||
{
|
||||
for( Int i = 0; i < NUMBER_PEL_FORMATS; i++ )
|
||||
{
|
||||
for( Int i = 0; i < NUMBER_PEL_FORMATS; i++ ) {
|
||||
if( g_PlaYUVerPixFmtDescriptorsList[i].name == name )
|
||||
return i;
|
||||
}
|
||||
@@ -92,8 +89,7 @@ static Int getImgMemory( Pel**** array3D, Int dim1, Int dim2, Int log2ChromaHeig
|
||||
total_mem_size += mem_size * sizeof( Pel );
|
||||
|
||||
// Luma
|
||||
for( i = 1; i < dim1; i++ )
|
||||
( *array3D )[0][i] = ( *array3D )[0][i - 1] + dim2;
|
||||
for( i = 1; i < dim1; i++ ) ( *array3D )[0][i] = ( *array3D )[0][i - 1] + dim2;
|
||||
|
||||
// Chroma
|
||||
( *array3D )[1][0] = ( *array3D )[0][0] + dim2 * dim1;
|
||||
@@ -101,12 +97,10 @@ static Int getImgMemory( Pel**** array3D, Int dim1, Int dim2, Int log2ChromaHeig
|
||||
dim1 = CHROMASHIFT( dim1, log2ChromaHeight );
|
||||
dim2 = CHROMASHIFT( dim2, log2ChromaWidth );
|
||||
|
||||
for( i = 1; i < dim1; i++ )
|
||||
( *array3D )[1][i] = ( *array3D )[1][i - 1] + dim2;
|
||||
for( i = 1; i < dim1; i++ ) ( *array3D )[1][i] = ( *array3D )[1][i - 1] + dim2;
|
||||
|
||||
( *array3D )[2][0] = ( *array3D )[1][0] + dim2 * dim1;
|
||||
for( i = 1; i < dim1; i++ )
|
||||
( *array3D )[2][i] = ( *array3D )[2][i - 1] + dim2;
|
||||
for( i = 1; i < dim1; i++ ) ( *array3D )[2][i] = ( *array3D )[2][i - 1] + dim2;
|
||||
|
||||
return total_mem_size;
|
||||
}
|
||||
@@ -425,13 +419,11 @@ Void PlaYUVerFrame::clear()
|
||||
Pel uiValue = 128;
|
||||
Int ratioH, ratioW;
|
||||
UInt i;
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ )
|
||||
{
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ ) {
|
||||
ratioW = ch > 0 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
ratioH = ch > 0 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
pPel = d->m_pppcInputPel[ch][0];
|
||||
for( i = 0; i < CHROMASHIFT( d->m_uiHeight, ratioH ) * CHROMASHIFT( d->m_uiWidth, ratioW ); i++ )
|
||||
{
|
||||
for( i = 0; i < CHROMASHIFT( d->m_uiHeight, ratioH ) * CHROMASHIFT( d->m_uiWidth, ratioW ); i++ ) {
|
||||
*pPel++ = uiValue;
|
||||
}
|
||||
}
|
||||
@@ -468,8 +460,7 @@ UChar* PlaYUVerFrame::getRGBBuffer()
|
||||
PlaYUVerPixel PlaYUVerFrame::getPixelValue( Int xPos, Int yPos )
|
||||
{
|
||||
PlaYUVerPixel PixelValue( d->m_pcPelFormat->colorSpace, d->m_uiHalfPelValue, d->m_uiHalfPelValue, d->m_uiHalfPelValue );
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ )
|
||||
{
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ ) {
|
||||
Int ratioH = ch > 0 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
Int ratioW = ch > 0 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
PixelValue[ch] = d->m_pppcInputPel[ch][( yPos >> ratioH )][( xPos >> ratioW )];
|
||||
@@ -480,8 +471,7 @@ PlaYUVerPixel PlaYUVerFrame::getPixelValue( Int xPos, Int yPos )
|
||||
PlaYUVerPixel PlaYUVerFrame::getPixelValue( Int xPos, Int yPos, PlaYUVerPixel::ColorSpace eColorSpace )
|
||||
{
|
||||
PlaYUVerPixel PixelValue( d->m_pcPelFormat->colorSpace );
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ )
|
||||
{
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ ) {
|
||||
Int ratioH = ch > 0 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
Int ratioW = ch > 0 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
PixelValue[ch] = d->m_pppcInputPel[ch][( yPos >> ratioH )][( xPos >> ratioW )];
|
||||
@@ -492,8 +482,7 @@ PlaYUVerPixel PlaYUVerFrame::getPixelValue( Int xPos, Int yPos, PlaYUVerPixel::C
|
||||
|
||||
Void PlaYUVerFrame::setPixelValue( Int xPos, Int yPos, PlaYUVerPixel pixel )
|
||||
{
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ )
|
||||
{
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ ) {
|
||||
Int ratioH = ch > 0 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
Int ratioW = ch > 0 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
d->m_pppcInputPel[ch][( yPos >> ratioH )][( xPos >> ratioW )] = pixel.Components()[ch];
|
||||
@@ -522,12 +511,10 @@ Void PlaYUVerFrame::copyFrom( const PlaYUVerFrame& other, UInt xPos, UInt yPos )
|
||||
if( haveSameFmt( other, MATCH_ALL ) )
|
||||
return;
|
||||
Pel*** pInput = other.getPelBufferYUV();
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ )
|
||||
{
|
||||
for( UInt ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ ) {
|
||||
Int ratioH = ch > 0 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
Int ratioW = ch > 0 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
for( UInt i = 0; i < CHROMASHIFT( d->m_uiHeight, ratioH ); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < CHROMASHIFT( d->m_uiHeight, ratioH ); i++ ) {
|
||||
memcpy( d->m_pppcInputPel[ch][i], &( pInput[ch][( yPos >> ratioH ) + i][( xPos >> ratioW )] ), ( d->m_uiWidth >> ratioW ) * sizeof( Pel ) );
|
||||
}
|
||||
}
|
||||
@@ -571,15 +558,13 @@ Void PlaYUVerFrame::frameFromBuffer( Byte* Buff, Int iEndianness )
|
||||
}
|
||||
|
||||
ppBuff[0] = Buff;
|
||||
for( i = 1; i < MAX_NUMBER_PLANES; i++ )
|
||||
{
|
||||
for( i = 1; i < MAX_NUMBER_PLANES; i++ ) {
|
||||
ratioW = i > 1 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
ratioH = i > 1 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
ppBuff[i] = ppBuff[i - 1] + CHROMASHIFT( d->m_uiHeight, ratioH ) * CHROMASHIFT( d->m_uiWidth, ratioW ) * bytesPixel;
|
||||
}
|
||||
|
||||
for( ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ )
|
||||
{
|
||||
for( ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ ) {
|
||||
ratioW = ch > 0 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
ratioH = ch > 0 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
step = d->m_pcPelFormat->comp[ch].step_minus1;
|
||||
@@ -587,11 +572,9 @@ Void PlaYUVerFrame::frameFromBuffer( Byte* Buff, Int iEndianness )
|
||||
pPel = d->m_pppcInputPel[ch][0];
|
||||
pTmpBuff = ppBuff[d->m_pcPelFormat->comp[ch].plane] + ( d->m_pcPelFormat->comp[ch].offset_plus1 - 1 );
|
||||
|
||||
for( i = 0; i < CHROMASHIFT( d->m_uiHeight, ratioH ) * CHROMASHIFT( d->m_uiWidth, ratioW ); i++ )
|
||||
{
|
||||
for( i = 0; i < CHROMASHIFT( d->m_uiHeight, ratioH ) * CHROMASHIFT( d->m_uiWidth, ratioW ); i++ ) {
|
||||
*pPel = 0;
|
||||
for( b = startByte; b != endByte; b += incByte )
|
||||
{
|
||||
for( b = startByte; b != endByte; b += incByte ) {
|
||||
*pPel += *pTmpBuff << ( b * 8 );
|
||||
pTmpBuff++;
|
||||
// Check max value and bound it to "maxval" to prevent segfault when
|
||||
@@ -629,15 +612,13 @@ Void PlaYUVerFrame::frameToBuffer( Byte* output_buffer, Int iEndianness )
|
||||
}
|
||||
|
||||
ppBuff[0] = output_buffer;
|
||||
for( Int i = 1; i < MAX_NUMBER_PLANES; i++ )
|
||||
{
|
||||
for( Int i = 1; i < MAX_NUMBER_PLANES; i++ ) {
|
||||
ratioW = i > 1 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
ratioH = i > 1 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
ppBuff[i] = ppBuff[i - 1] + CHROMASHIFT( d->m_uiHeight, ratioH ) * CHROMASHIFT( d->m_uiWidth, ratioW ) * bytesPixel;
|
||||
}
|
||||
|
||||
for( ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ )
|
||||
{
|
||||
for( ch = 0; ch < d->m_pcPelFormat->numberChannels; ch++ ) {
|
||||
ratioW = ch > 0 ? d->m_pcPelFormat->log2ChromaWidth : 0;
|
||||
ratioH = ch > 0 ? d->m_pcPelFormat->log2ChromaHeight : 0;
|
||||
step = d->m_pcPelFormat->comp[ch].step_minus1;
|
||||
@@ -645,10 +626,8 @@ Void PlaYUVerFrame::frameToBuffer( Byte* output_buffer, Int iEndianness )
|
||||
pTmpPel = d->m_pppcInputPel[ch][0];
|
||||
pTmpBuff = ppBuff[d->m_pcPelFormat->comp[ch].plane];
|
||||
|
||||
for( i = 0; i < CHROMASHIFT( d->m_uiHeight, ratioH ) * CHROMASHIFT( d->m_uiWidth, ratioW ); i++ )
|
||||
{
|
||||
for( b = startByte; b != endByte; b += incByte )
|
||||
{
|
||||
for( i = 0; i < CHROMASHIFT( d->m_uiHeight, ratioH ) * CHROMASHIFT( d->m_uiWidth, ratioW ); i++ ) {
|
||||
for( b = startByte; b != endByte; b += incByte ) {
|
||||
*pTmpBuff = *pTmpPel >> ( 8 * b );
|
||||
pTmpBuff++;
|
||||
}
|
||||
@@ -665,7 +644,9 @@ Void PlaYUVerFrame::fillRGBBuffer()
|
||||
iR = iY + ( ( 1436 * ( iV - 128 ) ) >> 10 ); \
|
||||
iG = iY - ( ( 352 * ( iU - 128 ) + 731 * ( iV - 128 ) ) >> 10 ); \
|
||||
iB = iY + ( ( 1812 * ( iU - 128 ) ) >> 10 ); \
|
||||
CLAMP_YUV2RGB( iR ) CLAMP_YUV2RGB( iG ) CLAMP_YUV2RGB( iB )
|
||||
CLAMP_YUV2RGB( iR ) \
|
||||
CLAMP_YUV2RGB( iG ) \
|
||||
CLAMP_YUV2RGB( iB )
|
||||
|
||||
if( d->m_bHasRGBPel )
|
||||
return;
|
||||
@@ -676,8 +657,7 @@ Void PlaYUVerFrame::fillRGBBuffer()
|
||||
{
|
||||
Pel* pY = d->m_pppcInputPel[LUMA][0];
|
||||
Int iY;
|
||||
for( UInt i = 0; i < d->m_uiHeight * d->m_uiWidth; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < d->m_uiHeight * d->m_uiWidth; i++ ) {
|
||||
iY = *pY++;
|
||||
iY >>= shiftBits;
|
||||
iR = iY;
|
||||
@@ -692,8 +672,7 @@ Void PlaYUVerFrame::fillRGBBuffer()
|
||||
Pel* pG = d->m_pppcInputPel[COLOR_G][0];
|
||||
Pel* pB = d->m_pppcInputPel[COLOR_B][0];
|
||||
|
||||
for( UInt i = 0; i < d->m_uiHeight * d->m_uiWidth; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < d->m_uiHeight * d->m_uiWidth; i++ ) {
|
||||
iR = *pR++;
|
||||
iG = *pG++;
|
||||
iB = *pB++;
|
||||
@@ -715,22 +694,18 @@ Void PlaYUVerFrame::fillRGBBuffer()
|
||||
|
||||
UInt y, x;
|
||||
Int i, j;
|
||||
for( y = 0; y<d->m_uiHeight>> d->m_pcPelFormat->log2ChromaHeight; y++ )
|
||||
{
|
||||
for( i = 0; i < 1 << d->m_pcPelFormat->log2ChromaHeight; i++ )
|
||||
{
|
||||
for( y = 0; y<d->m_uiHeight>> d->m_pcPelFormat->log2ChromaHeight; y++ ) {
|
||||
for( i = 0; i < 1 << d->m_pcPelFormat->log2ChromaHeight; i++ ) {
|
||||
pY = pLineY;
|
||||
pU = pLineU;
|
||||
pV = pLineV;
|
||||
pARGB = pARGBLine;
|
||||
for( x = 0; x<d->m_uiWidth>> d->m_pcPelFormat->log2ChromaWidth; x++ )
|
||||
{
|
||||
for( x = 0; x<d->m_uiWidth>> d->m_pcPelFormat->log2ChromaWidth; x++ ) {
|
||||
iU = *pU++;
|
||||
iU >>= shiftBits;
|
||||
iV = *pV++;
|
||||
iV >>= shiftBits;
|
||||
for( j = 0; j < ( 1 << d->m_pcPelFormat->log2ChromaWidth ); j++ )
|
||||
{
|
||||
for( j = 0; j < ( 1 << d->m_pcPelFormat->log2ChromaWidth ); j++ ) {
|
||||
iY = *pY++;
|
||||
iY >>= shiftBits;
|
||||
YUV2RGB( iY, iU, iV, iR, iG, iB );
|
||||
@@ -776,15 +751,12 @@ Void PlaYUVerFrame::calcHistogram()
|
||||
data[LUMA] = d->m_pppcInputPel[LUMA][0];
|
||||
data[CHROMA_U] = d->m_pppcInputPel[CHROMA_U][0];
|
||||
data[CHROMA_V] = d->m_pppcInputPel[CHROMA_V][0];
|
||||
for( i = 0; i < d->m_uiHeight * d->m_uiWidth; i++ )
|
||||
{
|
||||
for( i = 0; i < d->m_uiHeight * d->m_uiWidth; i++ ) {
|
||||
d->m_puiHistogram[*( data[LUMA] ) + LUMA * d->m_uiHistoSegments]++;
|
||||
data[LUMA] += 1;
|
||||
}
|
||||
for( i = 0; ( i < getChromaLength() ); i++ )
|
||||
{
|
||||
for( j = 1; j < numberChannels; j++ )
|
||||
{
|
||||
for( i = 0; ( i < getChromaLength() ); i++ ) {
|
||||
for( j = 1; j < numberChannels; j++ ) {
|
||||
d->m_puiHistogram[*( data[j] ) + j * d->m_uiHistoSegments]++;
|
||||
data[j] += 1;
|
||||
}
|
||||
@@ -798,10 +770,8 @@ Void PlaYUVerFrame::calcHistogram()
|
||||
data[COLOR_G] = d->m_pppcInputPel[COLOR_G][0];
|
||||
data[COLOR_B] = d->m_pppcInputPel[COLOR_B][0];
|
||||
|
||||
for( i = 0; ( i < d->m_uiHeight * d->m_uiWidth ); i++ )
|
||||
{
|
||||
for( j = 0; j < numberChannels; j++ )
|
||||
{
|
||||
for( i = 0; ( i < d->m_uiHeight * d->m_uiWidth ); i++ ) {
|
||||
for( j = 0; j < numberChannels; j++ ) {
|
||||
d->m_puiHistogram[*( data[j] ) + j * d->m_uiHistoSegments]++;
|
||||
}
|
||||
if( ( colorSpace == PlaYUVerPixel::COLOR_RGB || colorSpace == PlaYUVerPixel::COLOR_ARGB ) )
|
||||
@@ -810,8 +780,7 @@ Void PlaYUVerFrame::calcHistogram()
|
||||
luma = currPixel.ConvertPixel( PlaYUVerPixel::COLOR_YUV ).Y();
|
||||
d->m_puiHistogram[luma + j * d->m_uiHistoSegments]++;
|
||||
}
|
||||
for( j = 0; j < numberChannels; j++ )
|
||||
data[j] += 1;
|
||||
for( j = 0; j < numberChannels; j++ ) data[j] += 1;
|
||||
}
|
||||
}
|
||||
d->m_bHasHistogram = true;
|
||||
@@ -905,8 +874,7 @@ UInt PlaYUVerFrame::getMin( Int channel )
|
||||
|
||||
indexStart = histoChannel * d->m_uiHistoSegments;
|
||||
|
||||
for( value = 0; value <= d->m_uiHistoSegments; value++ )
|
||||
{
|
||||
for( value = 0; value <= d->m_uiHistoSegments; value++ ) {
|
||||
if( d->m_puiHistogram[indexStart + value] > 0 )
|
||||
{
|
||||
break;
|
||||
@@ -935,8 +903,7 @@ UInt PlaYUVerFrame::getMax( Int channel )
|
||||
|
||||
indexStart = histoChannel * d->m_uiHistoSegments;
|
||||
|
||||
for( value = d->m_uiHistoSegments - 1; value >= 0; value-- )
|
||||
{
|
||||
for( value = d->m_uiHistoSegments - 1; value >= 0; value-- ) {
|
||||
if( d->m_puiHistogram[indexStart + value] > 0 )
|
||||
{
|
||||
break;
|
||||
@@ -966,8 +933,7 @@ UInt PlaYUVerFrame::getCount( Int channel, UInt start, UInt end )
|
||||
|
||||
indexStart = histoChannel * d->m_uiHistoSegments;
|
||||
|
||||
for( i = start; i <= end; i++ )
|
||||
{
|
||||
for( i = start; i <= end; i++ ) {
|
||||
count += d->m_puiHistogram[indexStart + i];
|
||||
}
|
||||
return count;
|
||||
@@ -994,8 +960,7 @@ Double PlaYUVerFrame::getMean( Int channel, UInt start, UInt end )
|
||||
|
||||
indexStart = histoChannel * d->m_uiHistoSegments;
|
||||
|
||||
for( UInt i = start; i <= end; i++ )
|
||||
{
|
||||
for( UInt i = start; i <= end; i++ ) {
|
||||
mean += i * d->m_puiHistogram[indexStart + i];
|
||||
}
|
||||
|
||||
@@ -1032,8 +997,7 @@ Int PlaYUVerFrame::getMedian( Int channel, UInt start, UInt end )
|
||||
|
||||
count = getCount( channel, start, end );
|
||||
|
||||
for( UInt i = start; i <= end; i++ )
|
||||
{
|
||||
for( UInt i = start; i <= end; i++ ) {
|
||||
sum += d->m_puiHistogram[indexStart + i];
|
||||
if( sum * 2 > count )
|
||||
return i;
|
||||
@@ -1080,8 +1044,7 @@ Double PlaYUVerFrame::getStdDev( Int channel, UInt start, UInt end )
|
||||
|
||||
-----------------------*/
|
||||
|
||||
for( UInt i = start; i <= end; i++ )
|
||||
{
|
||||
for( UInt i = start; i <= end; i++ ) {
|
||||
dev += ( i * i ) * d->m_puiHistogram[indexStart + i];
|
||||
}
|
||||
|
||||
@@ -1130,8 +1093,7 @@ Double PlaYUVerFrame::getMaximum( Int channel )
|
||||
|
||||
indexStart = histoChannel * d->m_uiHistoSegments;
|
||||
|
||||
for( UInt x = 0; x < d->m_uiHistoSegments; x++ )
|
||||
{
|
||||
for( UInt x = 0; x < d->m_uiHistoSegments; x++ ) {
|
||||
if( d->m_puiHistogram[indexStart + x] > max )
|
||||
{
|
||||
max = d->m_puiHistogram[indexStart + x];
|
||||
@@ -1162,8 +1124,7 @@ Bool PlaYUVerFrame::toMat( cv::Mat& cvMat, Bool convertToGray )
|
||||
{
|
||||
fillRGBBuffer();
|
||||
UChar* pARGB = d->m_pcARGB32;
|
||||
for( UInt i = 0; i < d->m_uiWidth * d->m_uiHeight; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < d->m_uiWidth * d->m_uiHeight; i++ ) {
|
||||
*pCvPel++ = *pARGB++;
|
||||
*pCvPel++ = *pARGB++;
|
||||
*pCvPel++ = *pARGB++;
|
||||
@@ -1174,8 +1135,7 @@ Bool PlaYUVerFrame::toMat( cv::Mat& cvMat, Bool convertToGray )
|
||||
else if( convertToGray || d->m_pcPelFormat->colorSpace == PlaYUVerPixel::COLOR_GRAY )
|
||||
{
|
||||
Pel* pPel = d->m_pppcInputPel[LUMA][0];
|
||||
for( UInt i = 0; i < d->m_uiWidth * d->m_uiHeight; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < d->m_uiWidth * d->m_uiHeight; i++ ) {
|
||||
*pCvPel++ = *pPel++;
|
||||
}
|
||||
bRet = true;
|
||||
@@ -1220,8 +1180,7 @@ Bool PlaYUVerFrame::fromMat( cv::Mat& cvMat )
|
||||
Pel* pInputPelR = d->m_pppcInputPel[COLOR_R][0];
|
||||
Pel* pInputPelG = d->m_pppcInputPel[COLOR_G][0];
|
||||
Pel* pInputPelB = d->m_pppcInputPel[COLOR_B][0];
|
||||
for( UInt i = 0; i < d->m_uiHeight * d->m_uiWidth; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < d->m_uiHeight * d->m_uiWidth; i++ ) {
|
||||
*pInputPelB++ = *pCvPel++;
|
||||
*pInputPelG++ = *pCvPel++;
|
||||
*pInputPelR++ = *pCvPel++;
|
||||
@@ -1231,8 +1190,7 @@ Bool PlaYUVerFrame::fromMat( cv::Mat& cvMat )
|
||||
else
|
||||
{
|
||||
Pel* pPel = d->m_pppcInputPel[LUMA][0];
|
||||
for( UInt i = 0; i < d->m_uiWidth * d->m_uiHeight; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < d->m_uiWidth * d->m_uiHeight; i++ ) {
|
||||
*pPel++ = *pCvPel++;
|
||||
}
|
||||
bRet = true;
|
||||
@@ -1294,8 +1252,7 @@ Double PlaYUVerFrame::getMSE( PlaYUVerFrame* Org, Int component )
|
||||
numberOfPixels = getChromaLength();
|
||||
}
|
||||
|
||||
for( UInt i = 0; i < numberOfPixels; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfPixels; i++ ) {
|
||||
aux_pel_1 = *pPelYUV++;
|
||||
aux_pel_2 = *pOrgPelYUV++;
|
||||
diff = aux_pel_1 - aux_pel_2;
|
||||
@@ -1340,20 +1297,16 @@ float compute_ssim( Pel** refImg, Pel** encImg, Int width, Int height, Int win_w
|
||||
C1 = K1 * K1 * max_pix_value_sqd;
|
||||
C2 = K2 * K2 * max_pix_value_sqd;
|
||||
|
||||
for( j = 0; j <= height - win_height; j += overlapSize )
|
||||
{
|
||||
for( i = 0; i <= width - win_width; i += overlapSize )
|
||||
{
|
||||
for( j = 0; j <= height - win_height; j += overlapSize ) {
|
||||
for( i = 0; i <= width - win_width; i += overlapSize ) {
|
||||
imeanOrg = 0;
|
||||
imeanEnc = 0;
|
||||
ivarOrg = 0;
|
||||
ivarEnc = 0;
|
||||
icovOrgEnc = 0;
|
||||
|
||||
for( n = j; n < j + win_height; n++ )
|
||||
{
|
||||
for( m = i; m < i + win_width; m++ )
|
||||
{
|
||||
for( n = j; n < j + win_height; n++ ) {
|
||||
for( m = i; m < i + win_width; m++ ) {
|
||||
imeanOrg += refImg[n][m];
|
||||
imeanEnc += encImg[n][m];
|
||||
ivarOrg += refImg[n][m] * refImg[n][m];
|
||||
|
||||
+110
-108
@@ -199,111 +199,113 @@ Void fillARGB32bufferYUV420p( Pel*** in, UChar* out, UInt width, UInt height, UI
|
||||
}
|
||||
#endif
|
||||
|
||||
const PlaYUVerPixFmtDescriptor g_PlaYUVerPixFmtDescriptorsList[PlaYUVerFrame::NUMBER_PEL_FORMATS] = {{
|
||||
"YUV420p",
|
||||
PlaYUVerPixel::COLOR_YUV,
|
||||
3,
|
||||
3,
|
||||
1,
|
||||
1,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV420P ),
|
||||
{
|
||||
{0, 0, 1}, /* Y */
|
||||
{1, 0, 1}, /* U */
|
||||
{2, 0, 1}, /* V */
|
||||
},
|
||||
},
|
||||
{
|
||||
"YUV422p",
|
||||
PlaYUVerPixel::COLOR_YUV,
|
||||
3,
|
||||
3,
|
||||
1,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV422P ),
|
||||
{
|
||||
{0, 0, 1}, /* Y */
|
||||
{1, 0, 1}, /* U */
|
||||
{2, 0, 1}, /* V */
|
||||
},
|
||||
},
|
||||
{
|
||||
"YUV444p",
|
||||
PlaYUVerPixel::COLOR_YUV,
|
||||
3,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV444P ),
|
||||
{
|
||||
{0, 0, 1}, /* Y */
|
||||
{1, 0, 1}, /* U */
|
||||
{2, 0, 1}, /* V */
|
||||
},
|
||||
},
|
||||
{
|
||||
"YUYV422",
|
||||
PlaYUVerPixel::COLOR_YUV,
|
||||
3,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUYV422 ),
|
||||
{
|
||||
{0, 1, 1}, /* Y */
|
||||
{0, 3, 2}, /* U */
|
||||
{0, 3, 4}, /* V */
|
||||
},
|
||||
},
|
||||
{
|
||||
"GRAY",
|
||||
PlaYUVerPixel::COLOR_GRAY,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_GRAY8 ),
|
||||
{{0, 0, 1}}, /* Y */
|
||||
},
|
||||
{
|
||||
"RGBp",
|
||||
PlaYUVerPixel::COLOR_RGB,
|
||||
3,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_RGB24 ),
|
||||
{
|
||||
{0, 0, 1}, /* R */
|
||||
{1, 0, 1}, /* G */
|
||||
{2, 0, 1}, /* B */
|
||||
},
|
||||
},
|
||||
{
|
||||
"RGB",
|
||||
PlaYUVerPixel::COLOR_RGB,
|
||||
3,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_RGB24 ),
|
||||
{
|
||||
{0, 2, 1}, /* R */
|
||||
{0, 2, 2}, /* G */
|
||||
{0, 2, 3}, /* B */
|
||||
},
|
||||
},
|
||||
{
|
||||
"BGR",
|
||||
PlaYUVerPixel::COLOR_RGB,
|
||||
3,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_BGR24 ),
|
||||
{
|
||||
{0, 2, 3}, /* B */
|
||||
{0, 2, 2}, /* R */
|
||||
{0, 2, 1}, /* G */
|
||||
},
|
||||
}};
|
||||
const PlaYUVerPixFmtDescriptor g_PlaYUVerPixFmtDescriptorsList[PlaYUVerFrame::NUMBER_PEL_FORMATS] = {
|
||||
{
|
||||
"YUV420p",
|
||||
PlaYUVerPixel::COLOR_YUV,
|
||||
3,
|
||||
3,
|
||||
1,
|
||||
1,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV420P ),
|
||||
{
|
||||
{0, 0, 1}, /* Y */
|
||||
{1, 0, 1}, /* U */
|
||||
{2, 0, 1}, /* V */
|
||||
},
|
||||
},
|
||||
{
|
||||
"YUV422p",
|
||||
PlaYUVerPixel::COLOR_YUV,
|
||||
3,
|
||||
3,
|
||||
1,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV422P ),
|
||||
{
|
||||
{0, 0, 1}, /* Y */
|
||||
{1, 0, 1}, /* U */
|
||||
{2, 0, 1}, /* V */
|
||||
},
|
||||
},
|
||||
{
|
||||
"YUV444p",
|
||||
PlaYUVerPixel::COLOR_YUV,
|
||||
3,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUV444P ),
|
||||
{
|
||||
{0, 0, 1}, /* Y */
|
||||
{1, 0, 1}, /* U */
|
||||
{2, 0, 1}, /* V */
|
||||
},
|
||||
},
|
||||
{
|
||||
"YUYV422",
|
||||
PlaYUVerPixel::COLOR_YUV,
|
||||
3,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_YUYV422 ),
|
||||
{
|
||||
{0, 1, 1}, /* Y */
|
||||
{0, 3, 2}, /* U */
|
||||
{0, 3, 4}, /* V */
|
||||
},
|
||||
},
|
||||
{
|
||||
"GRAY",
|
||||
PlaYUVerPixel::COLOR_GRAY,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_GRAY8 ),
|
||||
{{0, 0, 1}}, /* Y */
|
||||
},
|
||||
{
|
||||
"RGBp",
|
||||
PlaYUVerPixel::COLOR_RGB,
|
||||
3,
|
||||
3,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_NONE ),
|
||||
{
|
||||
{0, 0, 1}, /* R */
|
||||
{1, 0, 1}, /* G */
|
||||
{2, 0, 1}, /* B */
|
||||
},
|
||||
},
|
||||
{
|
||||
"RGB",
|
||||
PlaYUVerPixel::COLOR_RGB,
|
||||
3,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_RGB24 ),
|
||||
{
|
||||
{0, 2, 1}, /* R */
|
||||
{0, 2, 2}, /* G */
|
||||
{0, 2, 3}, /* B */
|
||||
},
|
||||
},
|
||||
{
|
||||
"BGR",
|
||||
PlaYUVerPixel::COLOR_RGB,
|
||||
3,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
ADD_FFMPEG_PEL_FMT( AV_PIX_FMT_BGR24 ),
|
||||
{
|
||||
{0, 2, 3}, /* B */
|
||||
{0, 2, 1}, /* R */
|
||||
{0, 2, 2}, /* G */
|
||||
},
|
||||
},
|
||||
};
|
||||
+14
-28
@@ -227,8 +227,7 @@ PlaYUVerOptions::PlaYUVerOptions( const String& name )
|
||||
|
||||
PlaYUVerOptions::~PlaYUVerOptions()
|
||||
{
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); it++ )
|
||||
{
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); it++ ) {
|
||||
delete *it;
|
||||
}
|
||||
}
|
||||
@@ -245,8 +244,7 @@ OptionBase* PlaYUVerOptions::getOption( const String& optName )
|
||||
if( opt_it != opt_short_map.end() )
|
||||
{
|
||||
OptionsList opt_list = ( *opt_it ).second;
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); ++it )
|
||||
{
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); ++it ) {
|
||||
return ( *it )->opt;
|
||||
}
|
||||
}
|
||||
@@ -254,8 +252,7 @@ OptionBase* PlaYUVerOptions::getOption( const String& optName )
|
||||
if( opt_it != opt_long_map.end() )
|
||||
{
|
||||
OptionsList opt_list = ( *opt_it ).second;
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); ++it )
|
||||
{
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); ++it ) {
|
||||
return ( *it )->opt;
|
||||
}
|
||||
}
|
||||
@@ -291,8 +288,7 @@ void PlaYUVerOptions::addOption( OptionBase* opt )
|
||||
string& opt_string = opt->opt_string;
|
||||
|
||||
size_t opt_start = 0;
|
||||
for( size_t opt_end = 0; opt_end != string::npos; )
|
||||
{
|
||||
for( size_t opt_end = 0; opt_end != string::npos; ) {
|
||||
opt_end = opt_string.find_first_of( ',', opt_start );
|
||||
bool force_short = 0;
|
||||
if( opt_string[opt_start] == '-' )
|
||||
@@ -320,8 +316,7 @@ static void setOptions( PlaYUVerOptions::OptionsList& opt_list, const string& va
|
||||
{
|
||||
/* multiple options may be registered for the same name:
|
||||
* allow each to parse value */
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); ++it )
|
||||
{
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); ++it ) {
|
||||
( *it )->opt->parse( value );
|
||||
}
|
||||
}
|
||||
@@ -492,8 +487,7 @@ list<const Char*> PlaYUVerOptions::scanArgv( UInt argc, Char* argv[] )
|
||||
/* a list for anything that didn't get handled as an option */
|
||||
list<const Char*> non_option_arguments;
|
||||
|
||||
for( UInt i = 1; i < argc; i++ )
|
||||
{
|
||||
for( UInt i = 1; i < argc; i++ ) {
|
||||
if( argv[i][0] != '-' )
|
||||
{
|
||||
non_option_arguments.push_back( argv[i] );
|
||||
@@ -521,8 +515,7 @@ list<const Char*> PlaYUVerOptions::scanArgv( UInt argc, Char* argv[] )
|
||||
if( argv[i][2] == 0 )
|
||||
{
|
||||
/* a lone double dash ends option processing */
|
||||
while( ++i < argc )
|
||||
non_option_arguments.push_back( argv[i] );
|
||||
while( ++i < argc ) non_option_arguments.push_back( argv[i] );
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -535,8 +528,7 @@ list<const Char*> PlaYUVerOptions::scanArgv( UInt argc, Char* argv[] )
|
||||
|
||||
Void PlaYUVerOptions::parse( std::vector<String> args_array )
|
||||
{
|
||||
for( UInt i = 0; i < args_array.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < args_array.size(); i++ ) {
|
||||
i += parseLONG( args_array[i] );
|
||||
}
|
||||
return;
|
||||
@@ -580,8 +572,7 @@ Void PlaYUVerOptions::doHelp( ostream& out, UInt columns )
|
||||
const UInt pad_short = 3;
|
||||
/* first pass: work out the longest option name */
|
||||
UInt max_width = 0;
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); it++ )
|
||||
{
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); it++ ) {
|
||||
ostringstream line( ios_base::out );
|
||||
doHelpOpt( line, **it, pad_short );
|
||||
max_width = max( max_width, (UInt)line.tellp() );
|
||||
@@ -595,8 +586,7 @@ Void PlaYUVerOptions::doHelp( ostream& out, UInt columns )
|
||||
* - if the option text is longer than opt_width, place the help
|
||||
* text at opt_width on the next line.
|
||||
*/
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); it++ )
|
||||
{
|
||||
for( PlaYUVerOptions::OptionsList::iterator it = opt_list.begin(); it != opt_list.end(); it++ ) {
|
||||
ostringstream line( ios_base::out );
|
||||
line << " ";
|
||||
doHelpOpt( line, **it, pad_short );
|
||||
@@ -618,8 +608,7 @@ Void PlaYUVerOptions::doHelp( ostream& out, UInt columns )
|
||||
}
|
||||
/* split up the help text, taking into account new lines,
|
||||
* (add opt_width of padding to each new line) */
|
||||
for( size_t newline_pos = 0, cur_pos = 0; cur_pos != string::npos; currlength = 0 )
|
||||
{
|
||||
for( size_t newline_pos = 0, cur_pos = 0; cur_pos != string::npos; currlength = 0 ) {
|
||||
/* print any required padding space for vertical alignment */
|
||||
line << &( spaces[40 - opt_width + currlength] );
|
||||
newline_pos = opt_desc.find_first_of( '\n', newline_pos );
|
||||
@@ -684,8 +673,7 @@ Bool PlaYUVerOptions::checkListingOpts()
|
||||
if( hasOpt( "pel_fmts" ) )
|
||||
{
|
||||
printf( "PlaYUVer supported pixel formats: \n" );
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames().size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames().size(); i++ ) {
|
||||
printf( " %s\n", PlaYUVerFrame::supportedPixelFormatListNames()[i].c_str() );
|
||||
}
|
||||
bRet |= true;
|
||||
@@ -693,8 +681,7 @@ Bool PlaYUVerOptions::checkListingOpts()
|
||||
if( hasOpt( "quality_metrics" ) )
|
||||
{
|
||||
printf( "PlaYUVer supported quality metrics: \n" );
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ ) {
|
||||
printf( " %s\n", PlaYUVerFrame::supportedQualityMetricsList()[i].c_str() );
|
||||
}
|
||||
bRet |= true;
|
||||
@@ -730,8 +717,7 @@ Void PlaYUVerOptions::listModules()
|
||||
|
||||
Char ModuleNameString[40];
|
||||
|
||||
for( UInt i = 0; it != PlaYUVerModuleFactoryMap.end(); ++it, i++ )
|
||||
{
|
||||
for( UInt i = 0; it != PlaYUVerModuleFactoryMap.end(); ++it, i++ ) {
|
||||
printf( " " );
|
||||
printf( "%-30s", it->first );
|
||||
if( bDetailed )
|
||||
|
||||
+8
-16
@@ -51,8 +51,7 @@ private:
|
||||
public:
|
||||
PlaYUVerStreamBufferPrivate( UInt size, UInt width, UInt height, Int pelFormat, Int bitsPixel )
|
||||
{
|
||||
for( UInt i = 0; i < size; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < size; i++ ) {
|
||||
PlaYUVerFrame* pFrame = new PlaYUVerFrame( width, height, pelFormat, bitsPixel );
|
||||
m_apcFrameBuffer.push_back( pFrame );
|
||||
}
|
||||
@@ -61,16 +60,14 @@ public:
|
||||
|
||||
~PlaYUVerStreamBufferPrivate()
|
||||
{
|
||||
while( m_apcFrameBuffer.size() > 0 )
|
||||
{
|
||||
while( m_apcFrameBuffer.size() > 0 ) {
|
||||
delete m_apcFrameBuffer.back();
|
||||
m_apcFrameBuffer.pop_back();
|
||||
}
|
||||
}
|
||||
Void increase( UInt newSize )
|
||||
{
|
||||
for( UInt i = m_apcFrameBuffer.size(); i < newSize; i++ )
|
||||
{
|
||||
for( UInt i = m_apcFrameBuffer.size(); i < newSize; i++ ) {
|
||||
PlaYUVerFrame* pFrame = new PlaYUVerFrame( m_apcFrameBuffer.at( 0 ) );
|
||||
m_apcFrameBuffer.push_back( pFrame );
|
||||
}
|
||||
@@ -120,8 +117,7 @@ std::vector<String> PlaYUVerSupportedFormat::getExts()
|
||||
{
|
||||
std::vector<String> arrayExt;
|
||||
String::size_type prev_pos = 0, pos = 0;
|
||||
while( ( pos = formatExt.find( ',', pos ) ) != String::npos )
|
||||
{
|
||||
while( ( pos = formatExt.find( ',', pos ) ) != String::npos ) {
|
||||
String substring( formatExt.substr( prev_pos, pos - prev_pos ) );
|
||||
arrayExt.push_back( substring );
|
||||
prev_pos = ++pos;
|
||||
@@ -169,11 +165,9 @@ CreateStreamHandlerFn PlaYUVerStream::findStreamHandler( String strFilename, boo
|
||||
{
|
||||
supportedFmts = PlaYUVerStream::supportedWriteFormats();
|
||||
}
|
||||
for( UInt i = 0; i < supportedFmts.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < supportedFmts.size(); i++ ) {
|
||||
std::vector<String> arrayExt = supportedFmts[i].getExts();
|
||||
for( std::vector<String>::iterator e = arrayExt.begin(); e != arrayExt.end(); ++e )
|
||||
{
|
||||
for( std::vector<String>::iterator e = arrayExt.begin(); e != arrayExt.end(); ++e ) {
|
||||
if( currExt != "" && currExt == *e )
|
||||
{
|
||||
return supportedFmts[i].formatFct;
|
||||
@@ -227,8 +221,7 @@ Bool PlaYUVerStream::open( String filename, String resolution, String input_form
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames().size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedPixelFormatListNames().size(); i++ ) {
|
||||
if( lowercase( PlaYUVerFrame::supportedPixelFormatListNames()[i] ) == lowercase( input_format_name ) )
|
||||
{
|
||||
input_format = i;
|
||||
@@ -437,8 +430,7 @@ Void PlaYUVerStream::loadAll()
|
||||
}
|
||||
|
||||
seekInput( 0 );
|
||||
for( UInt i = 2; i < m_frameBuffer->size(); i++ )
|
||||
{
|
||||
for( UInt i = 2; i < m_frameBuffer->size(); i++ ) {
|
||||
readFrame( m_frameBuffer->frame( i ) );
|
||||
}
|
||||
m_bLoadAll = true;
|
||||
|
||||
@@ -194,8 +194,7 @@ Bool StreamHandlerLibav::openHandler( String strFilename, Bool bInput )
|
||||
}
|
||||
|
||||
m_iPixelFormat = PlaYUVerFrame::NO_FMT;
|
||||
for( Int i = 0; i < PlaYUVerFrame::NUMBER_PEL_FORMATS; i++ )
|
||||
{
|
||||
for( Int i = 0; i < PlaYUVerFrame::NUMBER_PEL_FORMATS; i++ ) {
|
||||
if( g_PlaYUVerPixFmtDescriptorsList[i].ffmpegPelFormat == auxPixFmt )
|
||||
{
|
||||
m_iPixelFormat = i;
|
||||
@@ -306,8 +305,7 @@ Bool StreamHandlerLibav::read( PlaYUVerFrame* pcFrame )
|
||||
Bool bReadPkt = false;
|
||||
Int iRet = 0;
|
||||
|
||||
while( !bGotFrame && !bErrors )
|
||||
{
|
||||
while( !bGotFrame && !bErrors ) {
|
||||
#ifdef FF_SEND_RECEIVE_API
|
||||
if( ( iRet = avcodec_receive_frame( m_cCodedCtx, m_cFrame ) ) < 0 )
|
||||
{
|
||||
|
||||
@@ -29,13 +29,12 @@ AbsoluteFrameDifference::AbsoluteFrameDifference()
|
||||
/* Module Definition */
|
||||
m_iModuleAPI = MODULE_API_2; // Use API version 2 (recommended).
|
||||
// See this example for details on the functions prototype
|
||||
m_iModuleType = FRAME_PROCESSING_MODULE; // Apply module to the frames or to
|
||||
// the whole sequence.
|
||||
m_pchModuleCategory = "Measurements"; // Category (sub-menu)
|
||||
m_pchModuleName = "AbsoluteFrameDifference"; // Name
|
||||
m_pchModuleTooltip =
|
||||
"Measure the absolute difference " // Description
|
||||
"between two images (Y plane), e. g., abs( Y1 - Y2 )";
|
||||
m_iModuleType = FRAME_PROCESSING_MODULE; // Apply module to the frames or to
|
||||
// the whole sequence.
|
||||
m_pchModuleCategory = "Measurements"; // Category (sub-menu)
|
||||
m_pchModuleName = "AbsoluteFrameDifference"; // Name
|
||||
m_pchModuleTooltip = "Measure the absolute difference " // Description
|
||||
"between two images (Y plane), e. g., abs( Y1 - Y2 )";
|
||||
m_uiNumberOfFrames = MODULE_REQUIRES_TWO_FRAMES; // Number of Frames required
|
||||
// (ONE_FRAME, TWO_FRAMES,
|
||||
// THREE_FRAMES)
|
||||
@@ -69,8 +68,7 @@ PlaYUVerFrame* AbsoluteFrameDifference::process( std::vector<PlaYUVerFrame*> apc
|
||||
Int aux_pel_1, aux_pel_2;
|
||||
|
||||
for( UInt y = 0; y < m_pcFrameDifference->getHeight(); y++ )
|
||||
for( UInt x = 0; x < m_pcFrameDifference->getWidth(); x++ )
|
||||
{
|
||||
for( UInt x = 0; x < m_pcFrameDifference->getWidth(); x++ ) {
|
||||
aux_pel_1 = *pInput1PelYUV++;
|
||||
aux_pel_2 = *pInput2PelYUV++;
|
||||
*pOutputPelYUV++ = abs( aux_pel_1 - aux_pel_2 );
|
||||
|
||||
@@ -32,9 +32,8 @@ DisparityStereoBM::DisparityStereoBM()
|
||||
m_iModuleType = FRAME_PROCESSING_MODULE;
|
||||
m_pchModuleCategory = "Stereo";
|
||||
m_pchModuleName = "Disparity-BM";
|
||||
m_pchModuleTooltip =
|
||||
"Measure the disparity between two images using the "
|
||||
"Stereo BM method (OpenCV)";
|
||||
m_pchModuleTooltip = "Measure the disparity between two images using the "
|
||||
"Stereo BM method (OpenCV)";
|
||||
m_uiNumberOfFrames = MODULE_REQUIRES_TWO_FRAMES;
|
||||
m_uiModuleRequirements = MODULE_REQUIRES_SKIP_WHILE_PLAY | MODULE_REQUIRES_NEW_WINDOW | MODULE_REQUIRES_OPTIONS;
|
||||
|
||||
|
||||
@@ -32,9 +32,8 @@ DisparityStereoSGBM::DisparityStereoSGBM()
|
||||
m_iModuleType = FRAME_PROCESSING_MODULE;
|
||||
m_pchModuleCategory = "Stereo";
|
||||
m_pchModuleName = "Disparity-SGBM";
|
||||
m_pchModuleTooltip =
|
||||
"Measure the disparity between two images using the "
|
||||
"Stereo SGBM method (OpenCV)";
|
||||
m_pchModuleTooltip = "Measure the disparity between two images using the "
|
||||
"Stereo SGBM method (OpenCV)";
|
||||
m_uiNumberOfFrames = MODULE_REQUIRES_TWO_FRAMES;
|
||||
m_uiModuleRequirements = MODULE_REQUIRES_SKIP_WHILE_PLAY | MODULE_REQUIRES_NEW_WINDOW | MODULE_REQUIRES_OPTIONS;
|
||||
|
||||
|
||||
@@ -32,9 +32,8 @@ DisparityStereoVar::DisparityStereoVar()
|
||||
m_iModuleType = FRAME_PROCESSING_MODULE;
|
||||
m_pchModuleCategory = "Disparity";
|
||||
m_pchModuleName = "StereoVar";
|
||||
m_pchModuleTooltip =
|
||||
"Measure the disparity between two images using the "
|
||||
"Stereo Var method (OpenCV)";
|
||||
m_pchModuleTooltip = "Measure the disparity between two images using the "
|
||||
"Stereo Var method (OpenCV)";
|
||||
m_uiNumberOfFrames = MODULE_REQUIRES_TWO_FRAMES;
|
||||
m_uiModuleRequirements = MODULE_REQUIRES_SKIP_WHILE_PLAY | MODULE_REQUIRES_NEW_WINDOW;
|
||||
|
||||
|
||||
@@ -57,14 +57,12 @@ PlaYUVerFrame* EightBitsSampling::process( std::vector<PlaYUVerFrame*> apcFrameL
|
||||
Pel* pPelSubSampled = m_pcSubSampledFrame->getPelBufferYUV()[0][0];
|
||||
Pel pelValue;
|
||||
|
||||
for( UInt i = 0; i < pcFrame->getHeight() * pcFrame->getWidth(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < pcFrame->getHeight() * pcFrame->getWidth(); i++ ) {
|
||||
pelValue = *pPelInput++;
|
||||
pelValue = pelValue >> uiShiftBits;
|
||||
*pPelSubSampled++ = pelValue;
|
||||
}
|
||||
for( UInt i = 0; i < pcFrame->getChromaLength() * 2; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < pcFrame->getChromaLength() * 2; i++ ) {
|
||||
pelValue = *pPelInput++;
|
||||
pelValue = pelValue >> uiShiftBits;
|
||||
*pPelSubSampled++ = pelValue;
|
||||
|
||||
@@ -52,8 +52,7 @@ PlaYUVerFrame* FrameBinarization::process( PlaYUVerFrame* frame )
|
||||
Pel* pPelInput = frame->getPelBufferYUV()[0][0];
|
||||
Pel* pPelBin = m_pcBinFrame->getPelBufferYUV()[0][0];
|
||||
for( UInt y = 0; y < frame->getHeight(); y++ )
|
||||
for( UInt x = 0; x < frame->getWidth(); x++ )
|
||||
{
|
||||
for( UInt x = 0; x < frame->getWidth(); x++ ) {
|
||||
*pPelBin++ = *pPelInput++ >= m_uiThreshold ? 255 : 0;
|
||||
}
|
||||
return m_pcBinFrame;
|
||||
|
||||
@@ -31,9 +31,8 @@ FrameDifference::FrameDifference()
|
||||
m_iModuleType = FRAME_PROCESSING_MODULE;
|
||||
m_pchModuleCategory = "Measurements";
|
||||
m_pchModuleName = "FrameDifference";
|
||||
m_pchModuleTooltip =
|
||||
"Measure the difference between two images (Y plane), "
|
||||
"Y1 - Y2, with max absolute diff of 128";
|
||||
m_pchModuleTooltip = "Measure the difference between two images (Y plane), "
|
||||
"Y1 - Y2, with max absolute diff of 128";
|
||||
m_uiModuleRequirements = MODULE_REQUIRES_NEW_WINDOW | MODULE_REQUIRES_OPTIONS;
|
||||
m_uiNumberOfFrames = MODULE_REQUIRES_TWO_FRAMES;
|
||||
|
||||
@@ -50,8 +49,7 @@ Bool FrameDifference::create( std::vector<PlaYUVerFrame*> apcFrameList )
|
||||
_BASIC_MODULE_API_2_CHECK_
|
||||
|
||||
UInt uiMaxBitsPixel = 0;
|
||||
for( UInt i = 0; i < apcFrameList.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < apcFrameList.size(); i++ ) {
|
||||
if( !apcFrameList[i]->haveSameFmt( apcFrameList[0], PlaYUVerFrame::MATCH_COLOR_SPACE | PlaYUVerFrame::MATCH_RESOLUTION ) )
|
||||
return false;
|
||||
if( apcFrameList[i]->getBitsPel() > uiMaxBitsPixel )
|
||||
@@ -81,8 +79,7 @@ PlaYUVerFrame* FrameDifference::process( std::vector<PlaYUVerFrame*> apcFrameLis
|
||||
Int diff = 0;
|
||||
|
||||
for( UInt y = 0; y < m_pcFrameDifference->getHeight(); y++ )
|
||||
for( UInt x = 0; x < m_pcFrameDifference->getWidth(); x++ )
|
||||
{
|
||||
for( UInt x = 0; x < m_pcFrameDifference->getWidth(); x++ ) {
|
||||
aux_pel_1 = *pInput1PelYUV++;
|
||||
aux_pel_2 = *pInput2PelYUV++;
|
||||
diff = aux_pel_1 - aux_pel_2;
|
||||
|
||||
@@ -47,8 +47,7 @@ Bool FrameMask::create( std::vector<PlaYUVerFrame*> apcFrameList )
|
||||
{
|
||||
_BASIC_MODULE_API_2_CHECK_
|
||||
|
||||
for( UInt i = 1; i < apcFrameList.size(); i++ )
|
||||
{
|
||||
for( UInt i = 1; i < apcFrameList.size(); i++ ) {
|
||||
if( !apcFrameList[i]->haveSameFmt( apcFrameList[0],
|
||||
PlaYUVerFrame::MATCH_COLOR_SPACE_IGNORE_GRAY | PlaYUVerFrame::MATCH_RESOLUTION | PlaYUVerFrame::MATCH_BITS ) )
|
||||
{
|
||||
@@ -90,10 +89,8 @@ PlaYUVerFrame* FrameMask::process( std::vector<PlaYUVerFrame*> apcFrameList )
|
||||
PlaYUVerPixel pixelMask;
|
||||
PlaYUVerPixel pixelOut;
|
||||
|
||||
for( UInt y = 0; y < m_pcFrameProcessed->getHeight(); y++ )
|
||||
{
|
||||
for( UInt x = 0; x < m_pcFrameProcessed->getWidth(); x++ )
|
||||
{
|
||||
for( UInt y = 0; y < m_pcFrameProcessed->getHeight(); y++ ) {
|
||||
for( UInt x = 0; x < m_pcFrameProcessed->getWidth(); x++ ) {
|
||||
pixelImg = InputFrame->getPixelValue( x, y );
|
||||
pixelMask = MaskFrame->getPixelValue( x, y );
|
||||
pixelOut = pixelImg * ( 10 - m_iWeight ) + pixelMask * m_iWeight;
|
||||
|
||||
+5
-10
@@ -66,12 +66,10 @@ PlaYUVerFrame* FrameShift::process( std::vector<PlaYUVerFrame*> apcFrameList )
|
||||
|
||||
m_pcProcessedFrame->clear();
|
||||
|
||||
for( UInt y = yStartOut, yIn = yStartIn; y < yEndOut; y++, yIn++ )
|
||||
{
|
||||
for( UInt y = yStartOut, yIn = yStartIn; y < yEndOut; y++, yIn++ ) {
|
||||
pPelInput = &( apcFrameList[0]->getPelBufferYUV()[LUMA][yIn][xStartIn] );
|
||||
pPelOut = &( m_pcProcessedFrame->getPelBufferYUV()[LUMA][y][xStartOut] );
|
||||
for( UInt x = xStartOut; x < xEndOut; x++ )
|
||||
{
|
||||
for( UInt x = xStartOut; x < xEndOut; x++ ) {
|
||||
*pPelOut = *pPelInput;
|
||||
pPelInput++;
|
||||
pPelOut++;
|
||||
@@ -89,14 +87,11 @@ PlaYUVerFrame* FrameShift::process( std::vector<PlaYUVerFrame*> apcFrameList )
|
||||
yStartIn = iShiftVerChroma >= 0 ? 0 : -iShiftVerChroma;
|
||||
yEndOut = iShiftVerChroma >= 0 ? m_pcProcessedFrame->getChromaHeight() : m_pcProcessedFrame->getChromaHeight() + iShiftVerChroma;
|
||||
|
||||
for( UInt c = 1; c < m_pcProcessedFrame->getNumberChannels(); c++ )
|
||||
{
|
||||
for( UInt y = yStartOut, yIn = yStartIn; y < yEndOut; y++, yIn++ )
|
||||
{
|
||||
for( UInt c = 1; c < m_pcProcessedFrame->getNumberChannels(); c++ ) {
|
||||
for( UInt y = yStartOut, yIn = yStartIn; y < yEndOut; y++, yIn++ ) {
|
||||
pPelInput = &( apcFrameList[0]->getPelBufferYUV()[c][yIn][xStartIn] );
|
||||
pPelOut = &( m_pcProcessedFrame->getPelBufferYUV()[c][y][xStartOut] );
|
||||
for( UInt x = xStartOut; x < xEndOut; x++ )
|
||||
{
|
||||
for( UInt x = xStartOut; x < xEndOut; x++ ) {
|
||||
*pPelOut = *pPelInput;
|
||||
pPelInput++;
|
||||
pPelOut++;
|
||||
|
||||
@@ -68,21 +68,18 @@ PlaYUVerFrame* InterFrameVariance::process( std::vector<PlaYUVerFrame*> apcFrame
|
||||
Pel** pInput = new Pel*[numFrames];
|
||||
Pel* pOutputPelYUV = m_pcFrameVariance->getPelBufferYUV()[0][0];
|
||||
|
||||
for( Int i = 0; i < numFrames; i++ )
|
||||
{
|
||||
for( Int i = 0; i < numFrames; i++ ) {
|
||||
pInput[i] = apcFrameList[i]->getPelBufferYUV()[0][0];
|
||||
}
|
||||
|
||||
Double maxVariance = 0;
|
||||
for( UInt y = 0; y < m_pcFrameVariance->getHeight(); y++ )
|
||||
for( UInt x = 0; x < m_pcFrameVariance->getWidth(); x++ )
|
||||
{
|
||||
for( UInt x = 0; x < m_pcFrameVariance->getWidth(); x++ ) {
|
||||
Int sum = 0;
|
||||
Int v = 0;
|
||||
m_pVariance[y][x] = 0;
|
||||
|
||||
for( Int i = 0; i < numFrames; i++ )
|
||||
{
|
||||
for( Int i = 0; i < numFrames; i++ ) {
|
||||
v = *pInput[i]++;
|
||||
sum += v;
|
||||
m_pVariance[y][x] += v * v;
|
||||
@@ -95,8 +92,7 @@ PlaYUVerFrame* InterFrameVariance::process( std::vector<PlaYUVerFrame*> apcFrame
|
||||
}
|
||||
|
||||
for( UInt y = 0; y < m_pcFrameVariance->getHeight(); y++ )
|
||||
for( UInt x = 0; x < m_pcFrameVariance->getWidth(); x++ )
|
||||
{
|
||||
for( UInt x = 0; x < m_pcFrameVariance->getWidth(); x++ ) {
|
||||
*pOutputPelYUV++ = m_pVariance[y][x] * 255 / maxVariance;
|
||||
}
|
||||
delete[] pInput;
|
||||
|
||||
@@ -49,8 +49,7 @@ Double LumaAverage::measure( PlaYUVerFrame* frame )
|
||||
Double average = 0;
|
||||
Pel* pPel = frame->getPelBufferYUV()[0][0];
|
||||
for( UInt y = 0; y < frame->getHeight(); y++ )
|
||||
for( UInt x = 0; x < frame->getWidth(); x++ )
|
||||
{
|
||||
for( UInt x = 0; x < frame->getWidth(); x++ ) {
|
||||
average += *pPel;
|
||||
pPel++;
|
||||
}
|
||||
|
||||
@@ -75,16 +75,12 @@ Void MeasureOpticalFlowDualTVL1::drawFlow()
|
||||
Mat cvMatAfter;
|
||||
m_pcFrameAfter->toMat( cvMatAfter, true );
|
||||
Scalar vectorColor( 255, 0, 0, 0 );
|
||||
for( int y = m_iStep / 2; y < m_cvFlow.rows; y += m_iStep )
|
||||
{
|
||||
for( int x = m_iStep / 2; x < m_cvFlow.cols; x += m_iStep )
|
||||
{
|
||||
for( int y = m_iStep / 2; y < m_cvFlow.rows; y += m_iStep ) {
|
||||
for( int x = m_iStep / 2; x < m_cvFlow.cols; x += m_iStep ) {
|
||||
Point2f u( 0, 0 );
|
||||
Double count = 0;
|
||||
for( int i = ( -m_iStep / 2 ); i < ( m_iStep / 2 ); i++ )
|
||||
{
|
||||
for( int j = ( -m_iStep / 2 ); j < ( m_iStep / 2 ); j++ )
|
||||
{
|
||||
for( int i = ( -m_iStep / 2 ); i < ( m_iStep / 2 ); i++ ) {
|
||||
for( int j = ( -m_iStep / 2 ); j < ( m_iStep / 2 ); j++ ) {
|
||||
if( isFlowCorrect( u ) )
|
||||
{
|
||||
u = u + m_cvFlow( y, x );
|
||||
@@ -105,15 +101,12 @@ Void MeasureOpticalFlowDualTVL1::drawFlow()
|
||||
|
||||
Void MeasureOpticalFlowDualTVL1::compensateFlow()
|
||||
{
|
||||
for( UInt c = 0; c < m_pcOutputFrame->getNumberChannels(); c++ )
|
||||
{
|
||||
for( UInt c = 0; c < m_pcOutputFrame->getNumberChannels(); c++ ) {
|
||||
Pel** pPelPrev = m_pcFramePrev->getPelBufferYUV()[c];
|
||||
Pel* pPelOut = m_pcOutputFrame->getPelBufferYUV()[c][0];
|
||||
|
||||
for( UInt y = 0; y < m_pcOutputFrame->getHeight( c ); y++ )
|
||||
{
|
||||
for( UInt x = 0; x < m_pcOutputFrame->getWidth( c ); x++ )
|
||||
{
|
||||
for( UInt y = 0; y < m_pcOutputFrame->getHeight( c ); y++ ) {
|
||||
for( UInt x = 0; x < m_pcOutputFrame->getWidth( c ); x++ ) {
|
||||
Point2f u = m_cvFlow( y, x );
|
||||
Point p( x + u.x, y + u.y );
|
||||
*pPelOut = pPelPrev[p.y][p.x];
|
||||
|
||||
+7
-14
@@ -79,16 +79,12 @@ Void OpticalFlowModule::drawFlow()
|
||||
Mat cvMatAfter;
|
||||
m_pcFrameAfter->toMat( cvMatAfter, true );
|
||||
Scalar vectorColor( 255, 0, 0, 0 );
|
||||
for( int y = m_iStep / 2; y < m_cvFlow.rows; y += m_iStep )
|
||||
{
|
||||
for( int x = m_iStep / 2; x < m_cvFlow.cols; x += m_iStep )
|
||||
{
|
||||
for( int y = m_iStep / 2; y < m_cvFlow.rows; y += m_iStep ) {
|
||||
for( int x = m_iStep / 2; x < m_cvFlow.cols; x += m_iStep ) {
|
||||
Point2f u( 0, 0 );
|
||||
Double count = 0;
|
||||
for( int i = ( -m_iStep / 2 ); i < ( m_iStep / 2 ); i++ )
|
||||
{
|
||||
for( int j = ( -m_iStep / 2 ); j < ( m_iStep / 2 ); j++ )
|
||||
{
|
||||
for( int i = ( -m_iStep / 2 ); i < ( m_iStep / 2 ); i++ ) {
|
||||
for( int j = ( -m_iStep / 2 ); j < ( m_iStep / 2 ); j++ ) {
|
||||
if( isFlowCorrect( u ) )
|
||||
{
|
||||
u = u + m_cvFlow( y, x );
|
||||
@@ -109,15 +105,12 @@ Void OpticalFlowModule::drawFlow()
|
||||
|
||||
Void OpticalFlowModule::compensateFlow()
|
||||
{
|
||||
for( UInt c = 0; c < m_pcOutputFrame->getNumberChannels(); c++ )
|
||||
{
|
||||
for( UInt c = 0; c < m_pcOutputFrame->getNumberChannels(); c++ ) {
|
||||
Pel** pPelPrev = m_pcFramePrev->getPelBufferYUV()[c];
|
||||
Pel* pPelOut = m_pcOutputFrame->getPelBufferYUV()[c][0];
|
||||
|
||||
for( UInt y = 0; y < m_pcOutputFrame->getHeight( c ); y++ )
|
||||
{
|
||||
for( UInt x = 0; x < m_pcOutputFrame->getWidth( c ); x++ )
|
||||
{
|
||||
for( UInt y = 0; y < m_pcOutputFrame->getHeight( c ); y++ ) {
|
||||
for( UInt x = 0; x < m_pcOutputFrame->getWidth( c ); x++ ) {
|
||||
Point2f u = m_cvFlow( y, x );
|
||||
Point p( x + u.x, y + u.y );
|
||||
*pPelOut = pPelPrev[p.y][p.x];
|
||||
|
||||
@@ -71,8 +71,7 @@ PlaYUVerModuleIf* PlaYUVerModuleFactory::CreateModule( const char* moduleName )
|
||||
{
|
||||
PlaYUVerModuleFactoryMap& PlaYUVerModuleFactoryMap = PlaYUVerModuleFactory::Get()->getMap();
|
||||
PlaYUVerModuleFactoryMap::iterator it = PlaYUVerModuleFactoryMap.begin();
|
||||
for( ; it != PlaYUVerModuleFactoryMap.end(); ++it )
|
||||
{
|
||||
for( ; it != PlaYUVerModuleFactoryMap.end(); ++it ) {
|
||||
if( !strcmp( it->first, moduleName ) )
|
||||
{
|
||||
return it->second();
|
||||
|
||||
@@ -48,13 +48,11 @@ PlaYUVerFrame* SetChromaHalfScale::process( PlaYUVerFrame* frame )
|
||||
Pel* pPelInput = frame->getPelBufferYUV()[LUMA][0];
|
||||
Pel* pPelOut = m_pcProcessedFrame->getPelBufferYUV()[0][0];
|
||||
Pel halfScaleValue = 1 << ( frame->getBitsPel() - 1 );
|
||||
for( UInt i = 0; i < frame->getHeight() * frame->getWidth(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < frame->getHeight() * frame->getWidth(); i++ ) {
|
||||
*pPelOut++ = *pPelInput++;
|
||||
}
|
||||
pPelInput = frame->getPelBufferYUV()[CHROMA_U][0];
|
||||
for( UInt i = 0; i < m_pcProcessedFrame->getChromaLength() * 2; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < m_pcProcessedFrame->getChromaLength() * 2; i++ ) {
|
||||
*pPelOut++ = halfScaleValue;
|
||||
}
|
||||
return m_pcProcessedFrame;
|
||||
|
||||
@@ -46,8 +46,7 @@ Bool WeightedPSNR::create( std::vector<PlaYUVerFrame*> apcFrameList )
|
||||
{
|
||||
_BASIC_MODULE_API_2_CHECK_
|
||||
|
||||
for( UInt i = 0; i < apcFrameList.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < apcFrameList.size(); i++ ) {
|
||||
if( !apcFrameList[i]->haveSameFmt( apcFrameList[0], PlaYUVerFrame::MATCH_RESOLUTION ) )
|
||||
return false;
|
||||
}
|
||||
@@ -55,8 +54,7 @@ Bool WeightedPSNR::create( std::vector<PlaYUVerFrame*> apcFrameList )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for( UInt i = 1; i < apcFrameList.size(); i++ )
|
||||
{
|
||||
for( UInt i = 1; i < apcFrameList.size(); i++ ) {
|
||||
if( !apcFrameList[i]->haveSameFmt( apcFrameList[1], PlaYUVerFrame::MATCH_COLOR_SPACE | PlaYUVerFrame::MATCH_BITS ) )
|
||||
return false;
|
||||
}
|
||||
@@ -84,8 +82,7 @@ Double measureWMSE( Int component, PlaYUVerFrame* Org, PlaYUVerFrame* Rec, PlaYU
|
||||
numberOfPixels = Rec->getChromaLength();
|
||||
}
|
||||
|
||||
for( UInt i = 0; i < numberOfPixels; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < numberOfPixels; i++ ) {
|
||||
aux_pel_mask = *pMaskPelYUV++;
|
||||
aux_pel_1 = *pRecPelYUV++;
|
||||
aux_pel_2 = *pOrgPelYUV++;
|
||||
|
||||
+30
-58
@@ -47,12 +47,10 @@ PlaYUVerTools::PlaYUVerTools()
|
||||
|
||||
PlaYUVerTools::~PlaYUVerTools()
|
||||
{
|
||||
for( UInt i = 0; i < m_apcInputStreams.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < m_apcInputStreams.size(); i++ ) {
|
||||
m_apcInputStreams[i]->close();
|
||||
}
|
||||
for( UInt i = 0; i < m_apcOutputStreams.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < m_apcOutputStreams.size(); i++ ) {
|
||||
m_apcOutputStreams[i]->close();
|
||||
}
|
||||
}
|
||||
@@ -74,8 +72,7 @@ Int PlaYUVerTools::openInputs()
|
||||
UInt uiEndianness = 0;
|
||||
|
||||
PlaYUVerStream* pcStream;
|
||||
for( UInt i = 0; i < inputFileNames.size() && i < MAX_NUMBER_INPUTS; i++ )
|
||||
{
|
||||
for( UInt i = 0; i < inputFileNames.size() && i < MAX_NUMBER_INPUTS; i++ ) {
|
||||
if( Opts().hasOpt( "size" ) )
|
||||
{
|
||||
resolutionString = GET_PARAM( m_strResolution, 0 );
|
||||
@@ -124,8 +121,7 @@ Int PlaYUVerTools::openInputs()
|
||||
}
|
||||
|
||||
m_uiNumberOfComponents = UINT_MAX;
|
||||
for( UInt i = 0; i < m_apcInputStreams.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < m_apcInputStreams.size(); i++ ) {
|
||||
m_uiNumberOfFrames = std::min( m_uiNumberOfFrames, m_apcInputStreams[i]->getFrameNum() );
|
||||
m_uiNumberOfComponents = std::min( m_uiNumberOfComponents, m_apcInputStreams[i]->getCurrFrame()->getNumberChannels() );
|
||||
}
|
||||
@@ -156,8 +152,7 @@ Int PlaYUVerTools::Open( Int argc, Char* argv[] )
|
||||
}
|
||||
Int64 currFrames = 0;
|
||||
Int64 numberOfFrames = LONG_MAX;
|
||||
for( UInt i = 0; i < m_apcInputStreams.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < m_apcInputStreams.size(); i++ ) {
|
||||
currFrames = m_apcInputStreams[i]->getFrameNum();
|
||||
if( currFrames < numberOfFrames )
|
||||
numberOfFrames = currFrames;
|
||||
@@ -172,9 +167,8 @@ Int PlaYUVerTools::Open( Int argc, Char* argv[] )
|
||||
m_pcOutputFileNames.push_back( m_strOutput );
|
||||
if( m_pcOutputFileNames.size() != m_apcInputStreams.size() )
|
||||
{
|
||||
log( LOG_ERROR,
|
||||
"Invalid number of outputs! Each input must have an "
|
||||
"output filename. " );
|
||||
log( LOG_ERROR, "Invalid number of outputs! Each input must have an "
|
||||
"output filename. " );
|
||||
return 2;
|
||||
}
|
||||
|
||||
@@ -192,8 +186,7 @@ Int PlaYUVerTools::Open( Int argc, Char* argv[] )
|
||||
}
|
||||
Int64 currFrames = 0;
|
||||
Int64 numberOfFrames = LONG_MAX;
|
||||
for( UInt i = 0; i < m_apcInputStreams.size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < m_apcInputStreams.size(); i++ ) {
|
||||
currFrames = m_apcInputStreams[i]->getFrameNum();
|
||||
if( currFrames < numberOfFrames )
|
||||
numberOfFrames = currFrames;
|
||||
@@ -225,9 +218,8 @@ Int PlaYUVerTools::Open( Int argc, Char* argv[] )
|
||||
|
||||
if( m_apcOutputStreams.size() != m_apcInputStreams.size() )
|
||||
{
|
||||
log( LOG_ERROR,
|
||||
"Invalid number of outputs! Each input must have an "
|
||||
"output filename. " );
|
||||
log( LOG_ERROR, "Invalid number of outputs! Each input must have an "
|
||||
"output filename. " );
|
||||
return 2;
|
||||
}
|
||||
|
||||
@@ -247,8 +239,7 @@ Int PlaYUVerTools::Open( Int argc, Char* argv[] )
|
||||
log( LOG_ERROR, "Invalid number of inputs! " );
|
||||
return 2;
|
||||
}
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ )
|
||||
{
|
||||
for( UInt i = 0; i < PlaYUVerFrame::supportedQualityMetricsList().size(); i++ ) {
|
||||
if( lowercase( PlaYUVerFrame::supportedQualityMetricsList()[i] ) == lowercase( qualityMetric ) )
|
||||
{
|
||||
m_uiQualityMetric = i;
|
||||
@@ -273,8 +264,7 @@ Int PlaYUVerTools::Open( Int argc, Char* argv[] )
|
||||
|
||||
PlaYUVerModuleFactoryMap& PlaYUVerModuleFactoryMap = PlaYUVerModuleFactory::Get()->getMap();
|
||||
PlaYUVerModuleFactoryMap::iterator it = PlaYUVerModuleFactoryMap.begin();
|
||||
for( UInt i = 0; it != PlaYUVerModuleFactoryMap.end(); ++it, i++ )
|
||||
{
|
||||
for( UInt i = 0; it != PlaYUVerModuleFactoryMap.end(); ++it, i++ ) {
|
||||
if( strcmp( it->first, moduleName.c_str() ) == 0 )
|
||||
{
|
||||
m_pcCurrModuleIf = it->second();
|
||||
@@ -298,8 +288,7 @@ Int PlaYUVerTools::Open( Int argc, Char* argv[] )
|
||||
// Create Module
|
||||
Bool moduleCreated = false;
|
||||
std::vector<PlaYUVerFrame*> apcFrameList;
|
||||
for( UInt i = 0; i < m_pcCurrModuleIf->m_uiNumberOfFrames; i++ )
|
||||
{
|
||||
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 )
|
||||
@@ -384,8 +373,7 @@ Int PlaYUVerTools::Close()
|
||||
Int PlaYUVerTools::SaveOperation()
|
||||
{
|
||||
Bool bRet = true;
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ )
|
||||
{
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) {
|
||||
bRet = m_apcInputStreams[s]->seekInput( m_iFrameNum );
|
||||
if( bRet == false )
|
||||
{
|
||||
@@ -400,8 +388,7 @@ Int PlaYUVerTools::RateReductionOperation()
|
||||
{
|
||||
Bool abEOF;
|
||||
log( LOG_INFO, "\n Reducing frame rate by a factor of %d ... ", m_iRateReductionFactor );
|
||||
for( UInt frame = 0; frame < m_uiNumberOfFrames; frame++ )
|
||||
{
|
||||
for( UInt frame = 0; frame < m_uiNumberOfFrames; frame++ ) {
|
||||
log( LOG_INFO, "\n Reading frame %d ... ", frame );
|
||||
if( ( frame % m_iRateReductionFactor ) == 0 )
|
||||
{
|
||||
@@ -448,10 +435,8 @@ Int PlaYUVerTools::QualityOperation()
|
||||
log( LOG_INFO, " Measuring Quality using %s ... \n", pchQualityMetricName );
|
||||
log( LOG_INFO, "# Frame ", pchQualityMetricName );
|
||||
|
||||
for( UInt s = 1; s < m_apcInputStreams.size(); s++ )
|
||||
{
|
||||
for( UInt c = 0; c < m_uiNumberOfComponents; c++ )
|
||||
{
|
||||
for( UInt s = 1; s < m_apcInputStreams.size(); s++ ) {
|
||||
for( UInt c = 0; c < m_uiNumberOfComponents; c++ ) {
|
||||
log( LOG_INFO, "%s_%d_%d ", pchQualityMetricName, s, c );
|
||||
}
|
||||
log( LOG_INFO, " " );
|
||||
@@ -459,25 +444,19 @@ Int PlaYUVerTools::QualityOperation()
|
||||
|
||||
log( LOG_INFO, "\n" );
|
||||
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ )
|
||||
{
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) {
|
||||
abEOF[s] = false;
|
||||
for( UInt c = 0; c < m_uiNumberOfComponents; c++ )
|
||||
{
|
||||
for( UInt c = 0; c < m_uiNumberOfComponents; c++ ) {
|
||||
adAverageQuality[s][c] = 0;
|
||||
}
|
||||
}
|
||||
for( UInt frame = 0; frame < m_uiNumberOfFrames; frame++ )
|
||||
{
|
||||
for( UInt frame = 0; frame < m_uiNumberOfFrames; frame++ ) {
|
||||
log( LOG_INFO, " %3d ", frame );
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ )
|
||||
apcCurrFrame[s] = m_apcInputStreams[s]->getCurrFrame();
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) apcCurrFrame[s] = m_apcInputStreams[s]->getCurrFrame();
|
||||
|
||||
for( UInt s = 1; s < m_apcInputStreams.size(); s++ )
|
||||
{
|
||||
for( UInt s = 1; s < m_apcInputStreams.size(); s++ ) {
|
||||
log( LOG_RESULT, " " );
|
||||
for( UInt c = 0; c < m_uiNumberOfComponents; c++ )
|
||||
{
|
||||
for( UInt c = 0; c < m_uiNumberOfComponents; c++ ) {
|
||||
dQuality = apcCurrFrame[s]->getQuality( m_uiQualityMetric, apcCurrFrame[0], c );
|
||||
adAverageQuality[s - 1][c] = ( adAverageQuality[s - 1][c] * Double( frame ) + dQuality ) / Double( frame + 1 );
|
||||
log( LOG_RESULT, metric_fmt.c_str(), dQuality );
|
||||
@@ -485,8 +464,7 @@ Int PlaYUVerTools::QualityOperation()
|
||||
log( LOG_RESULT, " " );
|
||||
}
|
||||
log( LOG_RESULT, "\n" );
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ )
|
||||
{
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) {
|
||||
abEOF[s] = m_apcInputStreams[s]->setNextFrame();
|
||||
if( !abEOF[s] )
|
||||
{
|
||||
@@ -495,10 +473,8 @@ Int PlaYUVerTools::QualityOperation()
|
||||
}
|
||||
}
|
||||
log( LOG_INFO, "\n Mean Values: \n " );
|
||||
for( UInt s = 0; s < m_apcInputStreams.size() - 1; s++ )
|
||||
{
|
||||
for( UInt c = 0; c < m_uiNumberOfComponents; c++ )
|
||||
{
|
||||
for( UInt s = 0; s < m_apcInputStreams.size() - 1; s++ ) {
|
||||
for( UInt c = 0; c < m_uiNumberOfComponents; c++ ) {
|
||||
log( LOG_INFO, metric_fmt.c_str(), adAverageQuality[s][c] );
|
||||
}
|
||||
log( LOG_RESULT, " " );
|
||||
@@ -527,16 +503,13 @@ Int PlaYUVerTools::ModuleOperation()
|
||||
Double dAveragedMeasurementResult = 0;
|
||||
Bool abEOF[MAX_NUMBER_INPUTS];
|
||||
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ )
|
||||
{
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) {
|
||||
abEOF[s] = false;
|
||||
}
|
||||
|
||||
for( UInt frame = 0; frame < m_uiNumberOfFrames; frame++ )
|
||||
{
|
||||
for( UInt frame = 0; frame < m_uiNumberOfFrames; frame++ ) {
|
||||
apcFrameList.clear();
|
||||
for( UInt i = 0; i < m_pcCurrModuleIf->m_uiNumberOfFrames; i++ )
|
||||
{
|
||||
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 )
|
||||
@@ -566,8 +539,7 @@ Int PlaYUVerTools::ModuleOperation()
|
||||
dAveragedMeasurementResult = ( dAveragedMeasurementResult * Double( frame ) + dMeasurementResult ) / Double( frame + 1 );
|
||||
}
|
||||
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ )
|
||||
{
|
||||
for( UInt s = 0; s < m_apcInputStreams.size(); s++ ) {
|
||||
abEOF[s] = m_apcInputStreams[s]->setNextFrame();
|
||||
if( !abEOF[s] )
|
||||
{
|
||||
|
||||
@@ -88,10 +88,9 @@ Int PlaYUVerToolsCmdParser::parseToolsArgs( Int argc, Char* argv[] )
|
||||
}
|
||||
else if( m_cOptions.hasOpt( "help" ) )
|
||||
{
|
||||
printf(
|
||||
"Usage: %s modules/quality/save [options] -input=input_file "
|
||||
"[--output=output_file]\n",
|
||||
argv[0] );
|
||||
printf( "Usage: %s modules/quality/save [options] -input=input_file "
|
||||
"[--output=output_file]\n",
|
||||
argv[0] );
|
||||
m_cOptions.doHelp( std::cout );
|
||||
iRet = 1;
|
||||
}
|
||||
@@ -105,8 +104,7 @@ Void PlaYUVerToolsCmdParser::listModuleHelp()
|
||||
|
||||
PlaYUVerModuleFactoryMap& PlaYUVerModuleFactoryMap = PlaYUVerModuleFactory::Get()->getMap();
|
||||
PlaYUVerModuleFactoryMap::iterator it = PlaYUVerModuleFactoryMap.begin();
|
||||
for( UInt i = 0; it != PlaYUVerModuleFactoryMap.end(); ++it, i++ )
|
||||
{
|
||||
for( UInt i = 0; it != PlaYUVerModuleFactoryMap.end(); ++it, i++ ) {
|
||||
if( strcmp( it->first, moduleName.c_str() ) == 0 )
|
||||
{
|
||||
pcCurrModuleIf = it->second();
|
||||
|
||||
Reference in new issue
Block a user