From: Jean-Baptiste Mardelle Date: Sun, 23 Dec 2012 22:38:38 +0000 (+0100) Subject: Make sure we don't load producers twice (fix recent regression) X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=1bf89e5af6d8411b1942b131b7bb5f192a082c8d;p=kdenlive Make sure we don't load producers twice (fix recent regression) --- diff --git a/src/effectstack/effectstackview2.cpp b/src/effectstack/effectstackview2.cpp index 52803e9d..5b7610d4 100644 --- a/src/effectstack/effectstackview2.cpp +++ b/src/effectstack/effectstackview2.cpp @@ -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; diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 35f02b11..4ebdac89 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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()) { diff --git a/src/renderer.cpp b/src/renderer.cpp index 85ee9276..e686eacf 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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: "<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(); } diff --git a/src/renderer.h b/src/renderer.h index 4008a2c6..df5d7fec 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -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 mltGetTransitionParamsFromXml(QDomElement xml); QMap 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 */