From d59f690d748cafd00bbc49fb29d2eba90a15e914 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sat, 22 Sep 2012 12:01:11 +0200 Subject: [PATCH] Generators now use MLT's xml consumer instead of manually creating a buggy mlt xml playlist --- plugins/sampleplugin/sampleplugin.cpp | 91 ++++++++++++++------------- plugins/sampleplugin/sampleplugin.h | 2 +- src/interfaces.h | 2 +- src/mainwindow.cpp | 2 +- 4 files changed, 50 insertions(+), 47 deletions(-) diff --git a/plugins/sampleplugin/sampleplugin.cpp b/plugins/sampleplugin/sampleplugin.cpp index 1cdcf680..d40395c0 100644 --- a/plugins/sampleplugin/sampleplugin.cpp +++ b/plugins/sampleplugin/sampleplugin.cpp @@ -25,10 +25,12 @@ #include #include #include +#include #include #include #include +#include QStringList SamplePlugin::generators(const QStringList producers) const { @@ -39,7 +41,7 @@ QStringList SamplePlugin::generators(const QStringList producers) const } -KUrl SamplePlugin::generatedClip(const QString &generator, const KUrl &projectFolder, const QStringList &/*lumaNames*/, const QStringList &/*lumaFiles*/, const double fps, const int /*width*/, const int height) +KUrl SamplePlugin::generatedClip(const QString &renderer, const QString &generator, const KUrl &projectFolder, const QStringList &/*lumaNames*/, const QStringList &/*lumaFiles*/, const double fps, const int /*width*/, const int height) { QString prePath; if (generator == i18n("Noise")) { @@ -68,53 +70,54 @@ KUrl SamplePlugin::generatedClip(const QString &generator, const KUrl &projectFo QString clipFile = prePath + counter + ".mlt"; view.path->setUrl(KUrl(clipFile)); + KUrl result; + if (d->exec() == QDialog::Accepted) { - QDomDocument doc; - QDomElement mlt = doc.createElement("mlt"); - QDomElement playlist = doc.createElement("playlist"); - if (generator == i18n("Noise")) { - QDomElement prod = doc.createElement("producer"); - prod.setAttribute("mlt_service", "noise"); - prod.setAttribute("in", "0"); - prod.setAttribute("out", QString::number((int) fps * view.duration->value())); - playlist.appendChild(prod); - } else { - for (int i = 0; i < view.duration->value(); i++) { + QProcess generatorProcess; + + // Disable VDPAU so that rendering will work even if there is a Kdenlive instance using VDPAU +#if QT_VERSION >= 0x040600 + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert("MLT_NO_VDPAU", "1"); + generatorProcess.setProcessEnvironment(env); +#else + QStringList env = QProcess::systemEnvironment(); + env << "MLT_NO_VDPAU=1"; + generatorProcess.setEnvironment(env); +#endif + QStringList args; + if (generator == i18n("Noise")) { + args << "noise:" << "in=0" << QString("out=" + QString::number((int) fps * view.duration->value())); + } + else { + // Countdown producer + for (int i = 0; i < view.duration->value(); i++) { // Create the producers - QDomElement prod = doc.createElement("producer"); - prod.setAttribute("mlt_service", "pango"); - prod.setAttribute("in", "0"); - prod.setAttribute("out", QString::number((int) fps)); - prod.setAttribute("text", QString::number(view.duration->value() - i)); - //FIXME: the font and pad values are approximate, the pango producer seems unable - // to produce a predictable frame size. - prod.setAttribute("font", QString::number(view.font->value()) + "px"); - //prod.setAttribute("pad", 50); - playlist.appendChild(prod); - } - } - mlt.appendChild(playlist); - doc.appendChild(mlt); - QFile file(view.path->url().path()); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - kWarning() << "////// ERROR writing to file: " << view.path->url().path(); - KMessageBox::error(0, i18n("Cannot write to file %1", view.path->url().path())); - delete d; - return KUrl(); - } - QTextStream out(&file); - out << doc.toString(); - if (file.error() != QFile::NoError) { - KMessageBox::error(0, i18n("Cannot write to file %1", view.path->url().path())); - file.close(); - delete d; - return KUrl(); + args << "pango:" << "in=0" << QString("out=" + QString::number((int) fps * view.duration->value())); + args << QString("text=" + QString::number(view.duration->value() - i)); + args << QString("font=" + QString::number(view.font->value()) + "px"); + } + } + + args << "-consumer"<url().path()); + generatorProcess.start(renderer, args); + if (generatorProcess.waitForFinished()) { + if (generatorProcess.exitStatus() == QProcess::CrashExit) { + kDebug() << "/// Generator failed: "; + QString error = generatorProcess.readAllStandardError(); + KMessageBox::sorry(kapp->activeWindow(), i18n("Failed to generate clip:\n%1", error, i18n("Generator Failed"))); + } + else { + result = view.path->url(); + } + } else { + kDebug() << "/// Generator failed: "; + QString error = generatorProcess.readAllStandardError(); + KMessageBox::sorry(kapp->activeWindow(), i18n("Failed to generate clip:\n%1", error, i18n("Generator Failed"))); } - file.close(); - delete d; - return view.path->url(); } - return KUrl(); + delete d; + return result; } Q_EXPORT_PLUGIN2(kdenlive_sampleplugin, SamplePlugin) diff --git a/plugins/sampleplugin/sampleplugin.h b/plugins/sampleplugin/sampleplugin.h index e7bc0acd..6c1667b1 100644 --- a/plugins/sampleplugin/sampleplugin.h +++ b/plugins/sampleplugin/sampleplugin.h @@ -35,7 +35,7 @@ class SamplePlugin : public QObject, public ClipGenerator public: QStringList generators(const QStringList producers = QStringList()) const; - KUrl generatedClip(const QString &generator, const KUrl &projectFolder, const QStringList &lumaNames, const QStringList &lumaFiles, const double fps, const int width, const int height); + KUrl generatedClip(const QString &renderer, const QString &generator, const KUrl &projectFolder, const QStringList &lumaNames, const QStringList &lumaFiles, const double fps, const int width, const int height); }; diff --git a/src/interfaces.h b/src/interfaces.h index 5cada381..974ed3b6 100644 --- a/src/interfaces.h +++ b/src/interfaces.h @@ -30,7 +30,7 @@ public: virtual ~ClipGenerator() {} virtual QStringList generators(const QStringList producers = QStringList()) const = 0; - virtual KUrl generatedClip(const QString &generator, const KUrl &projectFolder, const QStringList &lumaNames, const QStringList &lumaFiles, const double fps, const int width, const int height) = 0; + virtual KUrl generatedClip(const QString &renderer, const QString &generator, const KUrl &projectFolder, const QStringList &lumaNames, const QStringList &lumaFiles, const double fps, const int width, const int height) = 0; }; Q_DECLARE_INTERFACE(ClipGenerator, diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 43c1fc02..e9e5861c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -812,7 +812,7 @@ void MainWindow::generateClip() QAction *action = qobject_cast(sender()); ClipGenerator *iGenerator = qobject_cast(action->parent()); - KUrl clipUrl = iGenerator->generatedClip(action->data().toString(), m_activeDocument->projectFolder(), + KUrl clipUrl = iGenerator->generatedClip(KdenliveSettings::rendererpath(), action->data().toString(), m_activeDocument->projectFolder(), QStringList(), QStringList(), m_activeDocument->fps(), m_activeDocument->width(), m_activeDocument->height()); if (!clipUrl.isEmpty()) { m_projectList->slotAddClip(QList () << clipUrl); -- 2.39.2