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

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
kdenlive mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kdenlive

Reply via email to