From 6a95ea70e8434b1ea36d910cec2d958aa92e73c1 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 5 Jul 2011 14:55:27 +0000 Subject: [PATCH] Fix broken producer incorrectly handled when using proxy, corrupting project: http://kdenlive.org/mantis/view.php?id=2214 svn path=/trunk/kdenlive/; revision=5764 --- src/clipmanager.cpp | 4 +++- src/trackview.cpp | 47 +++++++++++++++++++++++++++++++-------------- src/trackview.h | 2 +- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index 2a4187d6..79937949 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -225,10 +225,12 @@ const QList ClipManager::getClipByResource(QString resource) { QList 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)); } } diff --git a/src/trackview.cpp b/src/trackview.cpp index a1783fc5..31de534a 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -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'); diff --git a/src/trackview.h b/src/trackview.h index 1a5b55b9..24fcabbf 100644 --- a/src/trackview.h +++ b/src/trackview.h @@ -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); -- 2.39.2