#include "sampleplugin.h"
#include "ui_countdown_ui.h"
-#include <KUrlRequester>
-#include <KIntSpinBox>
#include <KDebug>
#include <KMessageBox>
+#include <KApplication>
#include <QDialog>
-#include <QDomDocument>
-#include <QInputDialog>
+#include <QProcess>
-QStringList SamplePlugin::generators() const
+QStringList SamplePlugin::generators(const QStringList &producers) const
{
- return QStringList() << i18n("Countdown") << i18n("Noise");
+ QStringList result;
+ if (producers.contains(QLatin1String("pango"))) result << i18n("Countdown");
+ if (producers.contains(QLatin1String("noise"))) result << i18n("Noise");
+ return result;
}
-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")) {
- prePath = projectFolder.path() + "/noise";
- } else prePath = projectFolder.path() + "/counter";
+ prePath = projectFolder.path() + QLatin1String("/noise");
+ } else prePath = projectFolder.path() + QLatin1String("/counter");
int ct = 0;
- QString counter = QString::number(ct).rightJustified(5, '0', false);
- while (QFile::exists(prePath + counter + ".westley")) {
+ QString counter = QString::number(ct).rightJustified(5, QLatin1Char('0'), false);
+ while (QFile::exists(prePath + counter + QLatin1String(".mlt"))) {
ct++;
- counter = QString::number(ct).rightJustified(5, '0', false);
+ counter = QString::number(ct).rightJustified(5, QLatin1Char('0'), false);
}
- QDialog d;
- if (generator == i18n("Noise")) d.setWindowTitle(tr("Create Noise Clip"));
- else d.setWindowTitle(tr("Create Countdown Clip"));
+ QPointer<QDialog> d = new QDialog;
Ui::CountDown_UI view;
- view.setupUi(&d);
- QString clipFile = prePath + counter + ".westley";
- view.path->setPath(clipFile);
- if (d.exec() == QDialog::Accepted) {
- QDomDocument doc;
- QDomElement westley = doc.createElement("westley");
- QDomElement playlist = doc.createElement("playlist");
+ view.setupUi(d);
+ if (generator == i18n("Noise")) {
+ d->setWindowTitle(i18n("Create Noise Clip"));
+ view.font_label->setHidden(true);
+ view.font->setHidden(true);
+ } else {
+ d->setWindowTitle(i18n("Create Countdown Clip"));
+ view.font->setValue(height);
+ }
+
+ // Set single file mode. Default seems to be File::ExistingOnly.
+ view.path->setMode(KFile::File);
+
+ QString clipFile = prePath + counter + QLatin1String(".mlt");
+ view.path->setUrl(KUrl(clipFile));
+ KUrl result;
+
+ if (d->exec() == QDialog::Accepted) {
+ 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(QLatin1String("MLT_NO_VDPAU"), QLatin1String("1"));
+ generatorProcess.setProcessEnvironment(env);
+#else
+ QStringList env = QProcess::systemEnvironment();
+ env << QLatin1String("MLT_NO_VDPAU=1");
+ generatorProcess.setEnvironment(env);
+#endif
+ QStringList args;
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 {
+ args << QLatin1String("noise:") << QLatin1String("in=0") << QLatin1String("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("markup", QString::number(view.duration->value() - i));
- playlist.appendChild(prod);
+ args << QLatin1String("pango:") << QLatin1String("in=0") << QLatin1String("out=") + QString::number((int) fps * view.duration->value());
+ args << QLatin1String("text=") + QString::number(view.duration->value() - i);
+ args << QLatin1String("font=") + QString::number(view.font->value()) + QLatin1String("px");
}
}
- westley.appendChild(playlist);
- doc.appendChild(westley);
- 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()));
- 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();
- return KUrl();
+
+ args << QLatin1String("-consumer")<<QString::fromLatin1("xml:%1").arg(view.path->url().path());
+ generatorProcess.start(renderer, args);
+ if (generatorProcess.waitForFinished()) {
+ if (generatorProcess.exitStatus() == QProcess::CrashExit) {
+ kDebug() << "/// Generator failed: ";
+ QString error = QString::fromLocal8Bit(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 = QString::fromLocal8Bit(generatorProcess.readAllStandardError());
+ KMessageBox::sorry(kapp->activeWindow(), i18n("Failed to generate clip:\n%1", error, i18n("Generator Failed")));
}
- file.close();
- return view.path->url();
}
- return KUrl();
+ delete d;
+ return result;
}
Q_EXPORT_PLUGIN2(kdenlive_sampleplugin, SamplePlugin)
+
+#include "sampleplugin.moc"