]> git.sesse.net Git - kdenlive/commitdiff
Fix broken producer incorrectly handled when using proxy, corrupting project:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 5 Jul 2011 14:55:27 +0000 (14:55 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 5 Jul 2011 14:55:27 +0000 (14:55 +0000)
http://kdenlive.org/mantis/view.php?id=2214

svn path=/trunk/kdenlive/; revision=5764

src/clipmanager.cpp
src/trackview.cpp
src/trackview.h

index 2a4187d63cd74b30d460f35070d9c9c7789d7f2b..79937949469b4c89cd5ee6425414e897ffade440 100644 (file)
@@ -225,10 +225,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));
         }
     }
index a1783fc5ddc95b729d66fb8d06662ba15151cf31..31de534abcdc6209c72f20bfb4344ec20083a628 100644 (file)
@@ -271,7 +271,7 @@ void TrackView::parseDocument(QDomDocument doc)
                 m_doc->switchTrackAudio(i - 1, true);
             }
 
-            trackduration = slotAddProjectTrack(pos, p, m_doc->isTrackLocked(i - 1));
+            trackduration = slotAddProjectTrack(pos, p, m_doc->isTrackLocked(i - 1), producers);
             pos--;
             //kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration;
             if (trackduration > duration) duration = trackduration;
@@ -591,7 +591,7 @@ void TrackView::adjustTrackHeaders()
     }
 }
 
-int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked)
+int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked, QDomNodeList producers)
 {
     // parse track
     int position = 0;
@@ -635,18 +635,37 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked)
                     QDomDocument doc;
                     QDomElement producerXml = doc.createElement("producer");
                     doc.appendChild(producerXml);
-                    producerXml.setAttribute("colour", "0xff0000ff");
-                    producerXml.setAttribute("mlt_service", "colour");
-                    producerXml.setAttribute("length", "15000");
-                    producerXml.setAttribute("name", "INVALID");
-                    producerXml.setAttribute("type", COLOR);
-                    producerXml.setAttribute("id", id);
-                    clip = new DocClipBase(m_doc->clipManager(), doc.documentElement(), id);
-                    xml.insertBefore(producerXml, QDomNode());
-                    nodeindex++;
-                    m_doc->clipManager()->addClip(clip);
-
-                    m_documentErrors.append(i18n("Broken clip producer %1", id) + '\n');
+                    bool foundMltProd = false;
+                    for (int i = 0; i < producers.count(); i++) {
+                        QDomElement prod = producers.at(i).toElement();
+                        if (prod.attribute("id") == id) {
+                            QString service = EffectsList::property(prod, "mlt_service");
+                            QString type = EffectsList::property(prod, "mlt_type");
+                            QString resource = EffectsList::property(prod, "resource");
+                            QString length = EffectsList::property(prod, "length");
+                            producerXml.setAttribute("mlt_service", service);
+                            producerXml.setAttribute("mlt_type", type);
+                            producerXml.setAttribute("resource", resource);
+                            producerXml.setAttribute("duration", length);
+                            if (service == "colour") producerXml.setAttribute("type", COLOR);
+                            else if (service == "qimage" || service == "pixbuf") producerXml.setAttribute("type", IMAGE);
+                            else if (service == "kdenlivetitle") producerXml.setAttribute("type", TEXT);
+                            else producerXml.setAttribute("type", AV);
+                            clip = new DocClipBase(m_doc->clipManager(), doc.documentElement(), id);
+                            m_doc->clipManager()->addClip(clip);
+                            m_documentErrors.append(i18n("Broken clip producer %1, recreated base clip: %2", id, resource) + '\n');
+                            foundMltProd = true;
+                            break;
+                        }
+                    }
+                    if (!foundMltProd) {
+                        // Cannot recover, replace with blank
+                        int duration = elem.attribute("out").toInt() - elem.attribute("in").toInt();
+                        elem.setAttribute("length", duration);
+                        elem.setTagName("blank");
+                        m_documentErrors.append(i18n("Broken clip producer %1, removed from project", id) + '\n');
+                    }
+
                 } else {
                     // Found correct producer
                     m_documentErrors.append(i18n("Replaced wrong clip producer %1 with %2", id, clip->getId()) + '\n');
index 1a5b55b94e1e8e6d28bdc1cbafd3091e10fb1416..24fcabbfe7ea4a90dc9d08d02d227e35ddb27e93 100644 (file)
@@ -99,7 +99,7 @@ private:
     int m_verticalZoom;
     QString m_documentErrors;
     void parseDocument(QDomDocument doc);
-    int slotAddProjectTrack(int ix, QDomElement xml, bool locked);
+    int slotAddProjectTrack(int ix, QDomElement xml, bool locked, QDomNodeList producers);
     DocClipBase *getMissingProducer(const QString id) const;
     void adjustTrackHeaders();
     void slotAddProjectEffects(QDomNodeList effects, QDomElement parentNode, ClipItem *clip, int trackIndex);