File indexing completed on 2024-05-12 04:52:43

0001 /*
0002     SPDX-FileCopyrightText: 2009 Jean-Baptiste Mardelle <jb@kdenlive.org>
0003 
0004     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "sampleplugin.h"
0008 #include "ui_countdown_ui.h"
0009 
0010 #include <KMessageBox>
0011 #include <QDebug>
0012 
0013 #include <QDialog>
0014 #include <QProcess>
0015 
0016 QStringList SamplePlugin::generators(const QStringList &producers) const
0017 {
0018     QStringList result;
0019     if (producers.contains(QLatin1String("pango"))) {
0020         result << i18n("Countdown");
0021     }
0022     if (producers.contains(QLatin1String("noise"))) {
0023         result << i18n("Noise");
0024     }
0025     return result;
0026 }
0027 
0028 QUrl SamplePlugin::generatedClip(const QString &renderer, const QString &generator, const QUrl &projectFolder, const QStringList & /*lumaNames*/,
0029                                  const QStringList & /*lumaFiles*/, const double fps, const int /*width*/, const int height)
0030 {
0031     QString prePath;
0032     if (generator == i18n("Noise")) {
0033         prePath = projectFolder.path() + QLatin1String("/noise");
0034     } else {
0035         prePath = projectFolder.path() + QLatin1String("/counter");
0036     }
0037     int ct = 0;
0038     QString counter = QString::number(ct).rightJustified(5, QLatin1Char('0'), false);
0039     while (QFile::exists(prePath + counter + QLatin1String(".mlt"))) {
0040         ct++;
0041         counter = QString::number(ct).rightJustified(5, QLatin1Char('0'), false);
0042     }
0043     QPointer<QDialog> d = new QDialog;
0044     Ui::CountDown_UI view;
0045     view.setupUi(d);
0046     if (generator == i18n("Noise")) {
0047         d->setWindowTitle(i18nc("@title:window", "Create Noise Clip"));
0048         view.font_label->setHidden(true);
0049         view.font->setHidden(true);
0050     } else {
0051         d->setWindowTitle(i18nc("@title:window", "Create Countdown Clip"));
0052         view.font->setValue(height);
0053     }
0054 
0055     // Set single file mode. Default seems to be File::ExistingOnly.
0056     view.path->setMode(KFile::File);
0057 
0058     QString clipFile = prePath + counter + QLatin1String(".mlt");
0059     view.path->setUrl(QUrl(clipFile));
0060     QUrl result;
0061 
0062     if (d->exec() == QDialog::Accepted) {
0063         QProcess generatorProcess;
0064 
0065         // Disable VDPAU so that rendering will work even if there is a Kdenlive instance using VDPAU
0066         QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
0067         env.insert(QLatin1String("MLT_NO_VDPAU"), QLatin1String("1"));
0068         generatorProcess.setProcessEnvironment(env);
0069         QStringList args;
0070         if (generator == i18n("Noise")) {
0071             args << QLatin1String("noise:") << QLatin1String("in=0") << QLatin1String("out=") + QString::number((int)fps * view.duration->value());
0072         } else {
0073             // Countdown producer
0074             for (int i = 0; i < view.duration->value(); ++i) {
0075                 // Create the producers
0076                 args << QLatin1String("pango:") << QLatin1String("in=0") << QLatin1String("out=") + QString::number((int)fps * view.duration->value());
0077                 args << QLatin1String("text=") + QString::number(view.duration->value() - i);
0078                 args << QLatin1String("font=") + QString::number(view.font->value()) + QLatin1String("px");
0079             }
0080         }
0081 
0082         args << QLatin1String("-consumer") << QString::fromLatin1("xml:%1").arg(view.path->url().path());
0083         generatorProcess.start(renderer, args);
0084         if (generatorProcess.waitForFinished()) {
0085             if (generatorProcess.exitStatus() == QProcess::CrashExit) {
0086                 // qDebug() << "/// Generator failed: ";
0087                 QString error = QString::fromLocal8Bit(generatorProcess.readAllStandardError());
0088                 KMessageBox::error(QApplication::activeWindow(), i18n("Failed to generate clip:\n%1", error), i18n("Generator Failed"));
0089             } else {
0090                 result = view.path->url();
0091             }
0092         } else {
0093             // qDebug() << "/// Generator failed: ";
0094             QString error = QString::fromLocal8Bit(generatorProcess.readAllStandardError());
0095             KMessageBox::error(QApplication::activeWindow(), i18n("Failed to generate clip:\n%1", error), i18n("Generator Failed"));
0096         }
0097     }
0098     delete d;
0099     return result;
0100 }
0101 
0102 Q_EXPORT_PLUGIN2(kdenlive_sampleplugin, SamplePlugin)