]> git.sesse.net Git - kdenlive/blobdiff - src/clipmanager.cpp
Fix some avformat producer concurrency crashes
[kdenlive] / src / clipmanager.cpp
index d234abb20704bf1e72111198511302a1326ba686..0710fce51dcc85da8bbbfeadd4ddfa70a3acb5d2 100644 (file)
@@ -52,6 +52,12 @@ ClipManager::ClipManager(KdenliveDoc *doc) :
     connect(&m_fileWatcher, SIGNAL(deleted(const QString &)), this, SLOT(slotClipMissing(const QString &)));
     connect(&m_fileWatcher, SIGNAL(created(const QString &)), this, SLOT(slotClipAvailable(const QString &)));
     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()
@@ -60,6 +66,9 @@ ClipManager::~ClipManager()
     m_generatingAudioId.clear();
     qDeleteAll(m_clipList);
     m_clipList.clear();
+#if KDE_IS_VERSION(4,5,0)
+    delete pixmapCache;
+#endif
 }
 
 void ClipManager::clear()
@@ -71,6 +80,16 @@ void ClipManager::clear()
     m_clipList.clear();
     m_clipIdCounter = 1;
     m_folderIdCounter = 1;
+#if KDE_IS_VERSION(4,5,0)
+    pixmapCache->clear();
+#endif
+}
+
+void ClipManager::clearCache()
+{
+#if KDE_IS_VERSION(4,5,0)
+    pixmapCache->clear();
+#endif
 }
 
 void ClipManager::checkAudioThumbs()
@@ -215,10 +234,12 @@ const QList <DocClipBase *> ClipManager::getClipByResource(QString resource)
 {
     QList <DocClipBase *> list;
     QString clipResource;
+    QString proxyResource;
     for (int i = 0; i < m_clipList.count(); i++) {
         clipResource = m_clipList.at(i)->getProperty("resource");
+        proxyResource = m_clipList.at(i)->getProperty("proxy");
         if (clipResource.isEmpty()) clipResource = m_clipList.at(i)->getProperty("colour");
-        if (clipResource == resource) {
+        if (clipResource == resource || proxyResource == resource) {
             list.append(m_clipList.at(i));
         }
     }
@@ -233,11 +254,11 @@ void ClipManager::clearUnusedProducers()
     }
 }
 
-void ClipManager::resetProducersList(const QList <Mlt::Producer *> prods, bool displayRatioChanged)
+void ClipManager::resetProducersList(const QList <Mlt::Producer *> prods, bool displayRatioChanged, bool fpsChanged)
 {
     for (int i = 0; i < m_clipList.count(); i++) {
-        if (m_clipList.at(i)->numReferences() > 0) {
-            m_clipList.at(i)->deleteProducers(true);
+        if (m_clipList.at(i)->numReferences() > 0 || displayRatioChanged || fpsChanged) {
+            m_clipList.at(i)->deleteProducers();
         }
     }
     QString id;
@@ -246,13 +267,13 @@ void ClipManager::resetProducersList(const QList <Mlt::Producer *> prods, bool d
         if (id.contains('_')) id = id.section('_', 0, 0);
         DocClipBase *clip = getClipById(id);
         if (clip) {
-            clip->setProducer(prods.at(i));
+            clip->setProducer(prods.at(i), false, true);
         }
     }
-    emit checkAllClips(displayRatioChanged);
+    emit checkAllClips(displayRatioChanged, fpsChanged);
 }
 
-void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId)
+void ClipManager::slotAddClipList(const KUrl::List urls, const QString &group, const QString &groupId)
 {
     QUndoCommand *addClips = new QUndoCommand();
 
@@ -328,12 +349,12 @@ void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, co
     }
 }
 
-void ClipManager::slotAddClipFile(const KUrl url, const QString group, const QString &groupId)
+void ClipManager::slotAddClipFile(const KUrl &url, const QString &group, const QString &groupId)
 {
     slotAddClipList(KUrl::List(url), group, groupId);
 }
 
-void ClipManager::slotAddXmlClipFile(const QString name, const QDomElement xml, const QString group, const QString &groupId)
+void ClipManager::slotAddXmlClipFile(const QString &name, const QDomElement &xml, const QString &group, const QString &groupId)
 {
     QDomDocument doc;
     doc.appendChild(doc.importNode(xml, true));
@@ -350,7 +371,7 @@ void ClipManager::slotAddXmlClipFile(const QString name, const QDomElement xml,
     m_doc->commandStack()->push(command);
 }
 
-void ClipManager::slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId)
+void ClipManager::slotAddColorClipFile(const QString &name, const QString &color, QString duration, const QString &group, const QString &groupId)
 {
     QDomDocument doc;
     QDomElement prod = doc.createElement("producer");
@@ -371,10 +392,10 @@ void ClipManager::slotAddColorClipFile(const QString name, const QString color,
     m_doc->commandStack()->push(command);
 }
 
-void ClipManager::slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration,
+void ClipManager::slotAddSlideshowClipFile(const QString &name, const QString &path, int count, const QString &duration,
         const bool loop, const bool crop, const bool fade,
         const QString &luma_duration, const QString &luma_file, const int softness,
-        const QString &animation, QString group, const QString &groupId)
+        const QString &animation, const QString &group, const QString &groupId)
 {
     QDomDocument doc;
     QDomElement prod = doc.createElement("producer");
@@ -404,7 +425,7 @@ void ClipManager::slotAddSlideshowClipFile(const QString name, const QString pat
 
 
 
-void ClipManager::slotAddTextClipFile(const QString titleName, int out, const QString xml, const QString group, const QString &groupId)
+void ClipManager::slotAddTextClipFile(const QString &titleName, int out, const QString &xml, const QString &group, const QString &groupId)
 {
     QDomDocument doc;
     QDomElement prod = doc.createElement("producer");
@@ -426,7 +447,7 @@ void ClipManager::slotAddTextClipFile(const QString titleName, int out, const QS
     m_doc->commandStack()->push(command);
 }
 
-void ClipManager::slotAddTextTemplateClip(QString titleName, const KUrl path, const QString group, const QString &groupId)
+void ClipManager::slotAddTextTemplateClip(QString titleName, const KUrl &path, const QString &group, const QString &groupId)
 {
     QDomDocument doc;
     QDomElement prod = doc.createElement("producer");