From: <j-...@us...> - 2011-07-06 01:42:46
|
Revision: 5767 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5767&view=rev Author: j-b-m Date: 2011-07-06 01:42:39 +0000 (Wed, 06 Jul 2011) Log Message: ----------- Fix recently introduced project corruption with special characters in clip name / path, and fix project recovery with broken producers Modified Paths: -------------- trunk/kdenlive/src/docclipbase.cpp trunk/kdenlive/src/trackview.cpp trunk/kdenlive/src/trackview.h Modified: trunk/kdenlive/src/docclipbase.cpp =================================================================== --- trunk/kdenlive/src/docclipbase.cpp 2011-07-06 00:12:50 UTC (rev 5766) +++ trunk/kdenlive/src/docclipbase.cpp 2011-07-06 01:42:39 UTC (rev 5767) @@ -619,7 +619,7 @@ Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source) { Mlt::Producer *result = NULL; - QString url = source->get("resource"); + QString url = QString::fromUtf8(source->get("resource")); if (KIO::NetAccess::exists(KUrl(url), KIO::NetAccess::SourceSide, 0)) { char *tmp = qstrdup(url.toUtf8().constData()); result = new Mlt::Producer(*source->profile(), tmp); @@ -637,6 +637,7 @@ result->set("bgcolour", "0xff0000ff"); result->set("pad", "10"); } + return result; } Mlt::Properties props(result->get_properties()); Mlt::Properties src_props(source->get_properties()); Modified: trunk/kdenlive/src/trackview.cpp =================================================================== --- trunk/kdenlive/src/trackview.cpp 2011-07-06 00:12:50 UTC (rev 5766) +++ trunk/kdenlive/src/trackview.cpp 2011-07-06 01:42:39 UTC (rev 5767) @@ -189,6 +189,7 @@ { //int cursorPos = 0; m_documentErrors.clear(); + m_replacementProducerIds.clear(); //kDebug() << "//// DOCUMENT: " << doc.toString(); /*QDomNode props = doc.elementsByTagName("properties").item(0); @@ -595,6 +596,7 @@ { // parse track int position = 0; + QMap <QString, QString> producerReplacementIds; QDomNodeList children = xml.childNodes(); for (int nodeindex = 0; nodeindex < children.count(); nodeindex++) { QDomNode n = children.item(nodeindex); @@ -612,6 +614,11 @@ continue; } QString idString = elem.attribute("producer"); + if (producerReplacementIds.contains(idString)) { + // replace id + elem.setAttribute("producer", producerReplacementIds.value(idString)); + idString = elem.attribute("producer"); + } QString id = idString; double speed = 1.0; int strobe = 1; @@ -629,8 +636,55 @@ kWarning() << "CANNOT INSERT CLIP " << id; QString docRoot = m_doc->toXml().documentElement().attribute("root"); if (!docRoot.endsWith('/')) docRoot.append('/'); - clip = getMissingProducer(id); - if (!clip) { + clip = getMissingProducer(idString); + if (clip) { + // We found the original producer in Kdenlive's producers + // Found correct producer + m_documentErrors.append(i18n("Replaced wrong clip producer %1 with %2", id, clip->getId()) + '\n'); + QString prodId = clip->getId(); + if (clip->clipType() == PLAYLIST || clip->clipType() == AV || clip->clipType() == AUDIO) { + // We need producer for the track + prodId.append("_" + QString::number(ix)); + } + elem.setAttribute("producer", prodId); + producerReplacementIds.insert(idString, prodId); + // now adjust the mlt producer + bool found = false; + for (int i = 0; i < producers.count(); i++) { + QDomElement prod = producers.at(i).toElement(); + if (prod.attribute("id") == prodId) { + // ok, producer already exists + found = true; + break; + } + } + if (!found) { + for (int i = 0; i < producers.count(); i++) { + QDomElement prod = producers.at(i).toElement(); + if (prod.attribute("id") == idString) { + prod.setAttribute("id", prodId); + m_replacementProducerIds.insert(idString, prodId); + found = true; + break; + } + } + } + if (!found) { + // We didn't find the producer for this track, find producer for another track and duplicate + for (int i = 0; i < producers.count(); i++) { + QDomElement prod = producers.at(i).toElement(); + QString mltProdId = prod.attribute("id"); + if (mltProdId == prodId || mltProdId.startsWith(prodId + "_")) { + // Found parent producer, clone it + QDomElement clone = prod.cloneNode().toElement(); + clone.setAttribute("id", prodId); + m_doc->toXml().documentElement().insertBefore(clone, xml); + break; + } + } + } + } + else { // We cannot find the producer, something is really wrong, add // placeholder color clip QDomDocument doc; @@ -667,11 +721,6 @@ 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'); - elem.setAttribute("producer", clip->getId()); } m_doc->setModified(true); } @@ -936,6 +985,26 @@ break; } } + if (missingXml == QDomElement()) { + // Check if producer id was replaced in another track + if (m_replacementProducerIds.contains(id)) { + QString newId = m_replacementProducerIds.value(id); + slowmotionClip = false; + for (int i = 0; i < maxprod; i++) { + QDomNode m = prods.at(i); + QString prodId = m.toElement().attribute("id"); + if (prodId.startsWith("slowmotion")) { + slowmotionClip = true; + prodId = prodId.section(':', 1, 1); + } + prodId = prodId.section('_', 0, 0); + if (prodId == id) { + missingXml = m.toElement(); + break; + } + } + } + } if (missingXml == QDomElement()) return NULL; QString resource = EffectsList::property(missingXml, "resource"); QString service = EffectsList::property(missingXml, "mlt_service"); Modified: trunk/kdenlive/src/trackview.h =================================================================== --- trunk/kdenlive/src/trackview.h 2011-07-06 00:12:50 UTC (rev 5766) +++ trunk/kdenlive/src/trackview.h 2011-07-06 01:42:39 UTC (rev 5767) @@ -94,6 +94,8 @@ int m_projectTracks; QString m_editMode; CustomTrackScene *m_scene; + /** @brief A list of producer ids to be replaced when opening a corrupted document*/ + QMap <QString, QString> m_replacementProducerIds; KdenliveDoc *m_doc; int m_verticalZoom; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |