From d99246be40d1c8a275a21af1775e595d209d040d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 25 Apr 2011 17:08:52 +0000 Subject: [PATCH] Fix rendering when using proxies with speed effect: http://kdenlive.org/mantis/view.php?id=2103 svn path=/trunk/kdenlive/; revision=5555 --- src/effectslist.cpp | 13 +++++++++++++ src/effectslist.h | 4 ++++ src/mainwindow.cpp | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/effectslist.cpp b/src/effectslist.cpp index d048e6d9..91b76936 100644 --- a/src/effectslist.cpp +++ b/src/effectslist.cpp @@ -241,6 +241,19 @@ QString EffectsList::property(QDomElement effect, const QString &name) return QString(); } +// static +void EffectsList::removeProperty(QDomElement effect, const QString &name) +{ + QDomNodeList params = effect.elementsByTagName("property"); + for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("name") == name) { + effect.removeChild(params.item(i)); + break; + } + } +} + void EffectsList::append(QDomElement e) { m_baseElement.appendChild(importNode(e, true)); diff --git a/src/effectslist.h b/src/effectslist.h index 17d7f9a5..b30c2ee2 100644 --- a/src/effectslist.h +++ b/src/effectslist.h @@ -72,8 +72,12 @@ public: static bool hasGeometryKeyFrames(QDomElement effect); static void setParameter(QDomElement effect, const QString &name, const QString &value); static QString parameter(QDomElement effect, const QString &name); + /** @brief Change the value of a 'property' element from the effect node. */ static void setProperty(QDomElement effect, const QString &name, const QString &value); + /** @brief Get the value of a 'property' element from the effect node. */ static QString property(QDomElement effect, const QString &name); + /** @brief Delete a 'property' element from the effect node. */ + static void removeProperty(QDomElement effect, const QString &name); void clearList(); private: diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 61eab3d0..4013073f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3821,18 +3821,48 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS // replace proxy clips with originals QMap proxies = m_projectList->getProxies(); - QMapIterator i(proxies); + + + QDomNodeList producers = doc.elementsByTagName("producer"); + QString producerResource; + QString suffix; + for (uint n = 0; n < producers.length(); n++) { + QDomElement e = producers.item(n).toElement(); + producerResource = EffectsList::property(e, "resource"); + if (producerResource.contains('?')) { + suffix = "?" + producerResource.section('?', 1); + producerResource = producerResource.section('?', 0, 0); + } + else suffix.clear(); + if (!producerResource.isEmpty()) { + if (proxies.contains(producerResource)) { + EffectsList::setProperty(e, "resource", proxies.value(producerResource) + suffix); + // We need to delete the "aspect_ratio" property because proxy clips + // sometimes have different ratio than original clips + EffectsList::removeProperty(e, "aspect_ratio"); + } + else if (!root.isEmpty() && producerResource.startsWith(root) && proxies.contains(producerResource.remove(0, root.count() + 1))) { + EffectsList::setProperty(e, "resource", proxies.value(producerResource.remove(0, root.count() + 1)) + suffix); + // We need to delete the "aspect_ratio" property because proxy clips + // sometimes have different ratio than original clips + EffectsList::removeProperty(e, "aspect_ratio"); + } + } + } + + /*QMapIterator i(proxies); while (i.hasNext()) { i.next(); // Replace all keys with their values (proxy path with original path) QString key = i.key(); playlistContent.replace(key, i.value()); if (!root.isEmpty() && key.startsWith(root)) { - // in case ther resource path in MLT playlist is relative + // in case the resource path in MLT playlist is relative key.remove(0, root.count() + 1); playlistContent.replace(key, i.value()); } - } + }*/ + playlistContent = doc.toString(); } // Do save scenelist -- 2.39.2