]> git.sesse.net Git - kdenlive/commitdiff
Make sure we don't load producers twice (fix recent regression)
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 23 Dec 2012 22:38:38 +0000 (23:38 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 23 Dec 2012 22:38:38 +0000 (23:38 +0100)
src/effectstack/effectstackview2.cpp
src/projectlist.cpp
src/renderer.cpp
src/renderer.h

index 52803e9d9402144265e3fc1d89a3e5342da20324..5b7610d4e40ec0eb65b83996fa3b05de37ec6dec 100644 (file)
@@ -106,7 +106,6 @@ void EffectStackView2::slotClipItemSelected(ClipItem* c)
 {
     if (c && !c->isEnabled()) return;
     if (c && c == m_clipref) {
-
     } else {
        if (m_clipref) disconnect(m_clipref, SIGNAL(updateRange()), this, SLOT(slotClipItemUpdate()));
         m_clipref = c;
index 35f02b11748f82df7696f7db2664a259ec127027..4ebdac8933b9a67e42945c846617b8ae688bc1fd 100644 (file)
@@ -2196,7 +2196,6 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
 {
     QString toReload;
     ProjectItem *item = getItemById(clipId);
-    int queue = m_render->processingItems();
     if (item && producer) {
         monitorItemEditing(false);
         DocClipBase *clip = item->referencedClip();
@@ -2209,6 +2208,7 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
         }
         item->setProperties(properties, metadata);
         clip->setProducer(producer, replace);
+       m_render->processingDone(clipId);
 
         // Proxy stuff
         QString size = properties.value("frame_size");
@@ -2248,7 +2248,11 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
         }
         if (!toReload.isEmpty())
             item->slotSetToolTip();
-    } else kDebug() << "////////  COULD NOT FIND CLIP TO UPDATE PRPS...";
+    } else {
+       kDebug() << "////////  COULD NOT FIND CLIP TO UPDATE PRPS...";
+       m_render->processingDone(clipId);
+    }
+    int queue = m_render->processingItems();
     if (queue == 0) {
         monitorItemEditing(true);
         if (item && m_thumbnailQueue.isEmpty()) {
index 85ee9276b531e4e094b15343a2853dfa6f2d4da3..e686eacf43c41b80b41637f4ecbfa61cfe564f09 100644 (file)
@@ -618,14 +618,24 @@ void Render::slotSplitView(bool doit)
 
 void Render::getFileProperties(const QDomElement &xml, const QString &clipId, int imageHeight, bool replaceProducer)
 {
+    // Make sure we don't request the info for same clip twice
+    m_infoMutex.lock();
+    if (m_processingClipId.contains(clipId)) {
+       m_infoMutex.unlock();
+       return;
+    }
+    for (int i = 0; i < m_requestList.count(); i++) {
+       if (m_requestList.at(i).clipId == clipId) {
+           // Clip is already queued
+           m_infoMutex.unlock();
+           return;
+       }
+    }
     requestClipInfo info;
     info.xml = xml;
     info.clipId = clipId;
     info.imageHeight = imageHeight;
     info.replaceProducer = replaceProducer;
-    // Make sure we don't request the info for same clip twice
-    m_infoMutex.lock();
-    m_requestList.removeAll(info);
     m_requestList.append(info);
     m_infoMutex.unlock();
     if (!m_infoThread.isRunning()) {
@@ -635,7 +645,7 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId, in
 
 void Render::forceProcessing(const QString &id)
 {
-    if (m_processingClipId == id) return;
+    if (m_processingClipId.contains(id)) return;
     QMutexLocker lock(&m_infoMutex);
     for (int i = 0; i < m_requestList.count(); i++) {
         requestClipInfo info = m_requestList.at(i);
@@ -653,21 +663,22 @@ void Render::forceProcessing(const QString &id)
 int Render::processingItems()
 {
     QMutexLocker lock(&m_infoMutex);
-    int count = m_requestList.count();
-    if (!m_processingClipId.isEmpty()) {
-        // one clip is currently processed
-        count++;
-    }
+    int count = m_requestList.count() + m_processingClipId.count();
     return count;
 }
 
+void Render::processingDone(const QString &id)
+{
+    QMutexLocker lock(&m_infoMutex);
+    m_processingClipId.removeAll(id);
+}
+
 bool Render::isProcessing(const QString &id)
 {
-    if (m_processingClipId == id) return true;
+    if (m_processingClipId.contains(id)) return true;
     QMutexLocker lock(&m_infoMutex);
     for (int i = 0; i < m_requestList.count(); i++) {
-        requestClipInfo info = m_requestList.at(i);
-        if (info.clipId == id) {
+        if (m_requestList.at(i).clipId == id) {
             return true;
         }
     }
@@ -681,7 +692,7 @@ void Render::processFileProperties()
     while (!m_requestList.isEmpty()) {
         m_infoMutex.lock();
         info = m_requestList.takeFirst();
-        m_processingClipId = info.clipId;
+        m_processingClipId.append(info.clipId);
         m_infoMutex.unlock();
 
         QString path;
@@ -732,7 +743,7 @@ void Render::processFileProperties()
 
         if (producer == NULL || producer->is_blank() || !producer->is_valid()) {
             kDebug() << " / / / / / / / / ERROR / / / / // CANNOT LOAD PRODUCER: "<<path;
-            m_processingClipId.clear();
+            m_processingClipId.removeAll(info.clipId);
             if (proxyProducer) {
                 // Proxy file is corrupted
                 emit removeInvalidProxy(info.clipId, false);
@@ -747,7 +758,7 @@ void Render::processFileProperties()
             producer->set("out", info.xml.attribute("proxy_out").toInt());
             if (producer->get_out() != info.xml.attribute("proxy_out").toInt()) {
                 // Proxy file length is different than original clip length, this will corrupt project so disable this proxy clip
-                m_processingClipId.clear();
+                m_processingClipId.removeAll(info.clipId);
                 emit removeInvalidProxy(info.clipId, true);
                 delete producer;
                 continue;
@@ -851,7 +862,6 @@ void Render::processFileProperties()
                 }
                 if (frame) delete frame;
             }
-            m_processingClipId.clear();
             emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer);
             continue;
         }
@@ -1074,10 +1084,8 @@ void Render::processFileProperties()
                 metadataPropertyMap[ name.section('.', 0, -2)] = value;
         }
         producer->seek(0);
-        m_processingClipId.clear();
         emit replyGetFileProperties(info.clipId, producer, filePropertyMap, metadataPropertyMap, info.replaceProducer);
     }
-    m_processingClipId.clear();
 }
 
 
index 4008a2c69bdf106e06230c4bc7c890575e71bbba..df5d7fec6ad2ca9f2ab08c313f1fd39a3db96583 100644 (file)
@@ -305,6 +305,8 @@ Q_OBJECT public:
     Mlt::Producer *getProducer();
     /** @brief Returns the number of clips to process (When requesting clip info). */
     int processingItems();
+    /** @brief Processing of this clip is over, producer was set on clip, remove from list. */
+    void processingDone(const QString &id);
     /** @brief Force processing of clip with selected id. */
     void forceProcessing(const QString &id);
     /** @brief Are we currently processing clip with selected id. */
@@ -381,8 +383,8 @@ private:
     void mltPasteEffects(Mlt::Producer *source, Mlt::Producer *dest);
     QMap<QString, QString> mltGetTransitionParamsFromXml(QDomElement xml);
     QMap<QString, Mlt::Producer *> m_slowmotionProducers;
-    /** @brief The id of the clip that is currently being loaded for info query */
-    QString m_processingClipId;
+    /** @brief The ids of the clips that are currently being loaded for info query */
+    QStringList m_processingClipId;
 
     /** @brief Build the MLT Consumer object with initial settings.
      *  @param profileName The MLT profile to use for the consumer */