]> git.sesse.net Git - kdenlive/blobdiff - src/clipmanager.cpp
Fix crash on new project:
[kdenlive] / src / clipmanager.cpp
index d3669cadef5425fdd21162fcf951b1511c34a05e..ef169205cc8bce2388c01a430d3b4a7e200b6646 100644 (file)
@@ -26,6 +26,7 @@
 #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;
@@ -54,14 +58,25 @@ ClipManager::ClipManager(KdenliveDoc *doc) :
     connect(&m_modifiedTimer, SIGNAL(timeout()), this, SLOT(slotProcessModifiedClips()));
 
 #if KDE_IS_VERSION(4,5,0)
+    KImageCache::deleteCache("kdenlive-thumbs");
     pixmapCache = new KImageCache("kdenlive-thumbs", 1000000);
+    pixmapCache->setEvictionPolicy(KSharedDataCache::EvictOldest);
 #endif
 }
 
 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)
@@ -71,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();
@@ -83,6 +104,57 @@ void ClipManager::clear()
 #endif
 }
 
+void ClipManager::clearCache()
+{
+#if KDE_IS_VERSION(4,5,0)
+    pixmapCache->clear();
+#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()) {
@@ -249,7 +321,7 @@ void ClipManager::resetProducersList(const QList <Mlt::Producer *> prods, bool d
 {
     for (int i = 0; i < m_clipList.count(); i++) {
         if (m_clipList.at(i)->numReferences() > 0 || displayRatioChanged || fpsChanged) {
-            m_clipList.at(i)->deleteProducers(true);
+            m_clipList.at(i)->deleteProducers();
         }
     }
     QString id;