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)