This message is intended mainly toward Kdenlive packagers. We recently got feedback from latest release users that this version is unusable [1] [2] [3], freezing as soon as one switches between monitors. I backported the fix from master in commits 858a85 and 7dc004. Is the patch way acceptable or should we release a new version (not aligned with KDE Apps, how to name it then)?
Sorry for our mistakes :( Vincent. [1] https://bugs.kde.org/show_bug.cgi?id53936 [2] https://bugs.kde.org/show_bug.cgi?id54045 [3] https://forum.kde.org/viewtopic.php?f&5&t8860
From 858a85523f1f9bbd3db5e8398cfebc63ea56c653 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle <[email protected]> Date: Sat, 19 Sep 2015 21:16:06 +0200 Subject: [PATCH 1/2] Fix freeze on monitor --- src/monitor/glwidget.cpp | 14 +++++++++++++- src/monitor/glwidget.h | 3 +++ src/monitor/monitor.cpp | 6 ++++++ src/monitor/monitor.h | 1 + src/monitor/monitormanager.cpp | 8 +++++++- src/monitor/monitormanager.h | 2 ++ 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/monitor/glwidget.cpp b/src/monitor/glwidget.cpp index 9796cdf..17e9901 100644 --- a/src/monitor/glwidget.cpp +++ b/src/monitor/glwidget.cpp @@ -575,6 +575,7 @@ static void onThreadCreate(mlt_properties owner, GLWidget* self, Q_UNUSED(priority) self->clearFrameRenderer(); self->createThread(thread, function, data); + self->lockMonitor(); } static void onThreadJoin(mlt_properties owner, GLWidget* self, RenderThread* thread) @@ -582,11 +583,12 @@ static void onThreadJoin(mlt_properties owner, GLWidget* self, RenderThread* thr Q_UNUSED(owner) Q_UNUSED(self) if (thread) { - //self->clearFrameRenderer(); thread->quit(); thread->wait(); delete thread; } + self->clearFrameRenderer(); + self->releaseMonitor(); } void GLWidget::startGlsl() @@ -613,6 +615,16 @@ static void onThreadStarted(mlt_properties owner, GLWidget* self) self->startGlsl(); } +void GLWidget::releaseMonitor() +{ + emit lockMonitor(false); +} + +void GLWidget::lockMonitor() +{ + emit lockMonitor(true); +} + void GLWidget::clearFrameRenderer() { /*if (m_consumer) m_consumer->purge(); diff --git a/src/monitor/glwidget.h b/src/monitor/glwidget.h index b6f7921..dd812a7 100644 --- a/src/monitor/glwidget.h +++ b/src/monitor/glwidget.h @@ -90,6 +90,8 @@ public: Mlt::Profile *profile(); void resetProfile(MltVideoProfile profile); void reloadProfile(Mlt::Profile &profile); + void lockMonitor(); + void releaseMonitor(); protected: void mouseReleaseEvent(QMouseEvent * event); @@ -127,6 +129,7 @@ signals: void analyseFrame(QImage); void audioSamplesSignal(const audioShortVector&,int,int,int); void showContextMenu(const QPoint); + void lockMonitor(bool); private: QRect m_rect; diff --git a/src/monitor/monitor.cpp b/src/monitor/monitor.cpp index 43f92d2..03cf686 100644 --- a/src/monitor/monitor.cpp +++ b/src/monitor/monitor.cpp @@ -103,6 +103,7 @@ Monitor::Monitor(Kdenlive::MonitorId id, MonitorManager *manager, QWidget *paren connect(m_glMonitor, SIGNAL(switchFullScreen(bool)), this, SLOT(slotSwitchFullScreen(bool))); connect(m_glMonitor, SIGNAL(zoomChanged()), this, SLOT(setZoom())); connect(m_glMonitor, SIGNAL(effectChanged(QRect)), this, SIGNAL(effectChanged(QRect))); + connect(m_glMonitor, SIGNAL(lockMonitor(bool)), this, SLOT(slotLockMonitor(bool)), Qt::DirectConnection); if (KdenliveSettings::displayMonitorInfo()) { // Load monitor overlay qml @@ -262,6 +263,11 @@ QAction *Monitor::recAction() return NULL; } +void Monitor::slotLockMonitor(bool lock) +{ + m_monitorManager->lockMonitor(m_id, lock); +} + void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu, QAction *loopClip) { m_contextMenu = new QMenu(this); diff --git a/src/monitor/monitor.h b/src/monitor/monitor.h index 72efa02..a273683 100644 --- a/src/monitor/monitor.h +++ b/src/monitor/monitor.h @@ -198,6 +198,7 @@ private slots: void slotSeekToKeyFrame(); /** @brief Display a non blocking error message to user **/ void warningMessage(const QString &text); + void slotLockMonitor(bool lock); public slots: void slotOpenDvdFile(const QString &); diff --git a/src/monitor/monitormanager.cpp b/src/monitor/monitormanager.cpp index 1511ae1..b9a5e25 100644 --- a/src/monitor/monitormanager.cpp +++ b/src/monitor/monitormanager.cpp @@ -101,15 +101,21 @@ void MonitorManager::setConsumerProperty(const QString &name, const QString &val if (m_projectMonitor) m_projectMonitor->render->setConsumerProperty(name, value); } +void MonitorManager::lockMonitor(Kdenlive::MonitorId name, bool lock) +{ + if (lock) m_refreshMutex.lock(); + else m_refreshMutex.unlock(); +} + bool MonitorManager::activateMonitor(Kdenlive::MonitorId name, bool forceRefresh) { - QMutexLocker locker(&m_refreshMutex); if (m_clipMonitor == NULL || m_projectMonitor == NULL) return false; if (m_activeMonitor && m_activeMonitor->id() == name) { if (forceRefresh) m_activeMonitor->start(); return false; } + QMutexLocker locker(&m_switchMutex); m_activeMonitor = NULL; for (int i = 0; i < m_monitorsList.count(); ++i) { if (m_monitorsList.at(i)->id() == name) { diff --git a/src/monitor/monitormanager.h b/src/monitor/monitormanager.h index 9f6f777..f7192eb 100644 --- a/src/monitor/monitormanager.h +++ b/src/monitor/monitormanager.h @@ -66,6 +66,7 @@ public: QAction *getAction(QString name); Monitor *clipMonitor(); Monitor *projectMonitor(); + void lockMonitor(Kdenlive::MonitorId name, bool); public slots: @@ -112,6 +113,7 @@ private slots: private: /** @brief Make sure 2 monitors cannot be activated simultaneously*/ QMutex m_refreshMutex; + QMutex m_switchMutex; /** @brief Sets up all the actions and attaches them to the collection of MainWindow. */ void setupActions(); KdenliveDoc *m_document; -- 2.6.1 From 7dc00432d2a76e7f7eceb4448016f5908d88619e Mon Sep 17 00:00:00 2001 From: Vincent Pinon <[email protected]> Date: Fri, 23 Oct 2015 02:31:02 +0200 Subject: [PATCH 2/2] brace mistake in packporting patch --- src/monitor/glwidget.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/monitor/glwidget.cpp b/src/monitor/glwidget.cpp index 17e9901..92afd32 100644 --- a/src/monitor/glwidget.cpp +++ b/src/monitor/glwidget.cpp @@ -581,14 +581,13 @@ static void onThreadCreate(mlt_properties owner, GLWidget* self, static void onThreadJoin(mlt_properties owner, GLWidget* self, RenderThread* thread) { Q_UNUSED(owner) - Q_UNUSED(self) if (thread) { thread->quit(); thread->wait(); delete thread; + self->clearFrameRenderer(); + self->releaseMonitor(); } - self->clearFrameRenderer(); - self->releaseMonitor(); } void GLWidget::startGlsl() -- 2.6.1
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ kdenlive mailing list [email protected] https://mail.kde.org/mailman/listinfo/kdenlive
