]> git.sesse.net Git - kdenlive/blobdiff - src/clipmanager.cpp
Merge branch 'refs/heads/v0.8.2'
[kdenlive] / src / clipmanager.cpp
index 41df4c839f25b134488875227daf2a2b9d29ea57..a06874543bb3d5dbded0a5ea7c970fd28497b7b6 100644 (file)
@@ -19,7 +19,7 @@
 
 
 #include "clipmanager.h"
-#include "addclipcommand.h"
+#include "commands/addclipcommand.h"
 #include "kdenlivesettings.h"
 #include "docclipbase.h"
 #include "kdenlivedoc.h"
@@ -46,7 +46,8 @@ ClipManager::ClipManager(KdenliveDoc *doc) :
     m_audioThumbsQueue(),
     m_doc(doc),
     m_generatingAudioId(),
-    m_abortThumb(false)
+    m_abortThumb(false),
+    m_closing(false)
 {
     m_clipIdCounter = 1;
     m_folderIdCounter = 1;
@@ -65,11 +66,12 @@ 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_abortThumb = true;
-    m_thumbsThread.waitForFinished();
     m_audioThumbsQueue.clear();
     m_generatingAudioId.clear();
     m_thumbsMutex.lock();
@@ -84,11 +86,11 @@ ClipManager::~ClipManager()
 
 void ClipManager::clear()
 {
+    m_abortThumb = true;
+    m_thumbsThread.waitForFinished();
     m_thumbsMutex.lock();
     m_requestedThumbs.clear();
     m_thumbsMutex.unlock();
-    m_abortThumb = true;
-    m_thumbsThread.waitForFinished();
     m_abortThumb = false;
     m_folderList.clear();
     m_audioThumbsQueue.clear();
@@ -111,7 +113,6 @@ void ClipManager::clearCache()
 
 void ClipManager::requestThumbs(const QString id, QList <int> frames)
 {
-    kDebug()<<"// Request thbs: "<<id<<": "<<frames;
     m_thumbsMutex.lock();
     foreach (int frame, frames) {
         m_requestedThumbs.insertMulti(id, frame);
@@ -124,6 +125,7 @@ void ClipManager::requestThumbs(const QString id, QList <int> frames)
 
 void ClipManager::stopThumbs(const QString &id)
 {
+    if (m_requestedThumbs.isEmpty() || m_closing) return;
     m_abortThumb = true;
     m_thumbsThread.waitForFinished();
     m_thumbsMutex.lock();
@@ -137,12 +139,12 @@ void ClipManager::stopThumbs(const QString &id)
 
 void ClipManager::slotGetThumbs()
 {
-    QMap<QString, int>::const_iterator i = m_requestedThumbs.constBegin();
-    while (i != m_requestedThumbs.constEnd() && !m_abortThumb) {
-        const QString producerId = i.key();
+    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);
-        m_requestedThumbs.remove(producerId);
+        i = m_requestedThumbs.erase(i);
         m_thumbsMutex.unlock();
         qSort(values);
         DocClipBase *clip = getClipById(producerId);
@@ -150,14 +152,6 @@ void ClipManager::slotGetThumbs()
         while (!values.isEmpty() && clip->thumbProducer() && !m_abortThumb) {
             clip->thumbProducer()->getThumb(values.takeFirst());
         }
-        if (m_abortThumb) {
-            // keep the requested frames that were not processed
-            m_thumbsMutex.lock();
-            foreach (int frame, values)
-                m_requestedThumbs.insertMulti(producerId, frame);
-            m_thumbsMutex.unlock();
-        }
-        i = m_requestedThumbs.constBegin();
     }
 }
 
@@ -331,15 +325,24 @@ void ClipManager::resetProducersList(const QList <Mlt::Producer *> prods, bool d
         }
     }
     QString id;
+    Mlt::Producer *prod;
+    QStringList brokenClips;
     for (int i = 0; i < prods.count(); i++) {
-        id = prods.at(i)->get("id");
+        prod = prods.at(i);
+        id = prod->get("id");
         if (id.contains('_')) id = id.section('_', 0, 0);
         DocClipBase *clip = getClipById(id);
-        if (clip) {
-            clip->setProducer(prods.at(i), false, true);
+        QString markup = prod->get("markup");
+        if (prod->is_blank() || !prod->is_valid() || !markup.isEmpty()) {
+            // The clip is broken (missing proxy or source clip)
+            kDebug()<<"// WARNING, CLIP "<<id<<" Cannot be loaded";
+            brokenClips << id;
+        }
+        else if (clip) {
+            clip->setProducer(prod, false, true);
         }
     }
-    emit checkAllClips(displayRatioChanged, fpsChanged);
+    emit checkAllClips(displayRatioChanged, fpsChanged, brokenClips);
 }
 
 void ClipManager::slotAddClipList(const KUrl::List urls, const QString &group, const QString &groupId)