]> git.sesse.net Git - kdenlive/blobdiff - src/clipmanager.cpp
Merge branch 'master' into buildsystem
[kdenlive] / src / clipmanager.cpp
index 0710fce51dcc85da8bbbfeadd4ddfa70a3acb5d2..4c7db5873a2d4e05f9e2ac422abeb005ab01699a 100644 (file)
 
 
 #include "clipmanager.h"
-#include "addclipcommand.h"
+#include "commands/addclipcommand.h"
 #include "kdenlivesettings.h"
 #include "docclipbase.h"
 #include "kdenlivedoc.h"
 #include "abstractclipitem.h"
 #include "abstractgroupitem.h"
 #include "titledocument.h"
+#include "kthumb.h"
 
 #include <mlt++/Mlt.h>
 
@@ -36,6 +37,7 @@
 #include <kio/netaccess.h>
 
 #include <QGraphicsItemGroup>
+#include <QtConcurrentRun>
 
 #include <KFileMetaInfo>
 
@@ -43,7 +45,9 @@ ClipManager::ClipManager(KdenliveDoc *doc) :
     QObject(),
     m_audioThumbsQueue(),
     m_doc(doc),
-    m_generatingAudioId()
+    m_generatingAudioId(),
+    m_abortThumb(false),
+    m_closing(false)
 {
     m_clipIdCounter = 1;
     m_folderIdCounter = 1;
@@ -62,8 +66,17 @@ ClipManager::ClipManager(KdenliveDoc *doc) :
 
 ClipManager::~ClipManager()
 {
+    m_closing = true;
+    m_abortThumb = true;
+    m_thumbsThread.waitForFinished();
+    m_thumbsMutex.lock();
+    m_requestedThumbs.clear();
+    m_thumbsMutex.unlock();
     m_audioThumbsQueue.clear();
     m_generatingAudioId.clear();
+    m_thumbsMutex.lock();
+    m_requestedThumbs.clear();
+    m_thumbsMutex.unlock();
     qDeleteAll(m_clipList);
     m_clipList.clear();
 #if KDE_IS_VERSION(4,5,0)
@@ -73,6 +86,12 @@ ClipManager::~ClipManager()
 
 void ClipManager::clear()
 {
+    m_abortThumb = true;
+    m_thumbsThread.waitForFinished();
+    m_thumbsMutex.lock();
+    m_requestedThumbs.clear();
+    m_thumbsMutex.unlock();
+    m_abortThumb = false;
     m_folderList.clear();
     m_audioThumbsQueue.clear();
     m_modifiedClips.clear();
@@ -92,6 +111,50 @@ void ClipManager::clearCache()
 #endif
 }
 
+void ClipManager::requestThumbs(const QString id, QList <int> frames)
+{
+    m_thumbsMutex.lock();
+    foreach (int frame, frames) {
+        m_requestedThumbs.insertMulti(id, frame);
+    }
+    m_thumbsMutex.unlock();
+    if (!m_thumbsThread.isRunning() && !m_abortThumb) {
+        m_thumbsThread = QtConcurrent::run(this, &ClipManager::slotGetThumbs);
+    }
+}
+
+void ClipManager::stopThumbs(const QString &id)
+{
+    if (m_requestedThumbs.isEmpty() || m_closing) return;
+    m_abortThumb = true;
+    m_thumbsThread.waitForFinished();
+    m_thumbsMutex.lock();
+    m_requestedThumbs.remove(id);
+    m_thumbsMutex.unlock();
+    m_abortThumb = false;
+    if (!m_thumbsThread.isRunning()) {
+        m_thumbsThread = QtConcurrent::run(this, &ClipManager::slotGetThumbs);
+    }
+}
+
+void ClipManager::slotGetThumbs()
+{
+    QMap<QString, int>::iterator i = m_requestedThumbs.begin();
+    while (i != m_requestedThumbs.end() && !m_abortThumb) {
+        QString producerId = i.key();
+        m_thumbsMutex.lock();
+        QList<int> values = m_requestedThumbs.values(producerId);
+        i = m_requestedThumbs.erase(i);
+        m_thumbsMutex.unlock();
+        qSort(values);
+        DocClipBase *clip = getClipById(producerId);
+        if (!clip) continue;
+        while (!values.isEmpty() && clip->thumbProducer() && !m_abortThumb) {
+            clip->thumbProducer()->getThumb(values.takeFirst());
+        }
+    }
+}
+
 void ClipManager::checkAudioThumbs()
 {
     if (!KdenliveSettings::audiothumbnails()) {