#include <KIO/NetAccess>
#include <KColorScheme>
#include <KNotification>
+#include <KStartupInfo>
// #include <knewstuff2/engine.h>
#include <QDomDocument>
#include <QListWidgetItem>
#include <QHeaderView>
#include <QMenu>
-#include <QProcess>
#include <QInputDialog>
+#include <QProcess>
+#include <QDBusConnectionInterface>
+#include <QDBusInterface>
const int GroupRole = Qt::UserRole;
const int ExtensionRole = GroupRole + 1;
m_view.out_file->setMode(KFile::File);
m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File") << i18n("Progress"));
- m_view.running_jobs->setItemDelegate(new RenderViewDelegate(this));
+ m_jobsDelegate = new RenderViewDelegate(this);
+ m_view.running_jobs->setItemDelegate(m_jobsDelegate);
QHeaderView *header = m_view.running_jobs->header();
QFontMetrics fm = fontMetrics();
m_view.scripts_list->setHeaderLabels(QStringList() << QString() << i18n("Script Files"));
- m_view.scripts_list->setItemDelegate(new RenderViewDelegate(this));
+ m_scriptsDelegate = new RenderViewDelegate(this);
+ m_view.scripts_list->setItemDelegate(m_scriptsDelegate);
header = m_view.scripts_list->header();
header->setResizeMode(0, QHeaderView::Fixed);
header->resizeSection(0, 30);
+ // Find path for Kdenlive renderer
+ m_renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
+ if (!QFile::exists(m_renderer)) {
+ m_renderer = KStandardDirs::findExe("kdenlive_render");
+ if (m_renderer.isEmpty()) m_renderer = KStandardDirs::locate("exe", "kdenlive_render");
+ if (m_renderer.isEmpty()) m_renderer = "kdenlive_render";
+ }
+
+ QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
+ if (!interface || !interface->isServiceRegistered("org.kde.ksmserver")) {
+ m_view.shutdown->setEnabled(false);
+ }
+
focusFirstVisibleItem();
}
+RenderWidget::~RenderWidget()
+{
+ m_view.running_jobs->blockSignals(true);
+ m_view.scripts_list->blockSignals(true);
+ m_view.running_jobs->clear();
+ m_view.scripts_list->clear();
+ delete m_jobsDelegate;
+ delete m_scriptsDelegate;
+}
+
void RenderWidget::slotEditItem(QListWidgetItem *item)
{
QString edit = item->data(EditableRole).toString();
}
if (url != 0) {
QListWidgetItem *item = m_view.size_list->currentItem();
+ if (!item) {
+ m_view.buttonStart->setEnabled(false);
+ return;
+ }
QString extension = item->data(ExtensionRole).toString();
url = filenameWithExtension(url, extension);
m_view.out_file->setUrl(url);
KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog."));
QString chapterFile;
if (m_view.create_chapter->isChecked()) chapterFile = m_view.out_file->url().path() + ".dvdchapter";
+
+ // mantisbt 1051
+ KStandardDirs::makeDir(m_view.out_file->url().directory());
+
emit prepareRenderingData(scriptExport, m_view.render_zone->isChecked(), chapterFile);
}
// Check whether target file has an extension.
// If not, ask whether extension should be added or not.
QString extension = item->data(ExtensionRole).toString();
- if (!dest.endsWith(extension)) {
+ if (!dest.endsWith(extension, Qt::CaseInsensitive)) {
if (KMessageBox::questionYesNo(this, i18n("File has no extension. Add extension (%1)?", extension)) == KMessageBox::Yes) {
dest.append("." + extension);
}
render_process_args << "in=" + QString::number(GenTime(guideStart).frames(fps)) << "out=" + QString::number(GenTime(guideEnd).frames(fps));
}
- render_process_args << overlayargs;
+ if (!overlayargs.isEmpty()) render_process_args << "preargs=" + overlayargs.join(" ");
+
render_process_args << KdenliveSettings::rendererpath() << m_profile.path << item->data(RenderRole).toString();
if (m_view.play_after->isChecked()) render_process_args << KdenliveSettings::KdenliveSettings::defaultplayerapp();
else render_process_args << "-";
KMessageBox::error(this, i18n("Cannot write to file %1", scriptPath));
return;
}
- QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
- if (!QFile::exists(renderer)) renderer = "kdenlive_render";
QTextStream outStream(&file);
outStream << "#! /bin/sh" << "\n" << "\n";
outStream << "SOURCE=" << "\"" + playlistPath + "\"" << "\n";
outStream << "TARGET=" << "\"" + dest + "\"" << "\n";
- outStream << "RENDERER=" << "\"" + renderer + "\"" << "\n";
+ outStream << "RENDERER=" << "\"" + m_renderer + "\"" << "\n";
outStream << "MELT=" << "\"" + render_process_args.takeFirst() + "\"" << "\n";
outStream << "PARAMETERS=" << "\"" + render_process_args.join(" ") + "\"" << "\n";
outStream << "$RENDERER $MELT $PARAMETERS" << "\n" << "\n";
if (m_view.open_dvd->isChecked()) {
renderItem->setData(0, Qt::UserRole, group);
if (renderArgs.contains("profile=")) {
- // rendering profile contains an MLT profile, so pass it to the running jog item, useful for dvd
+ // rendering profile contains an MLT profile, so pass it to the running jog item, useful for dvd
QString prof = renderArgs.section("profile=", 1, 1);
prof = prof.section(' ', 0, 0);
kDebug() << "// render profile: " << prof;
} else {
if (group == "websites" && m_view.open_browser->isChecked()) {
renderItem->setData(0, Qt::UserRole, group);
- // pass the url
+ // pass the url
QString url = m_view.size_list->currentItem()->data(ExtraRole).toString();
renderItem->setData(0, Qt::UserRole + 1, url);
}
void RenderWidget::checkRenderStatus()
{
+ // check if we have a job waiting to render
if (m_blockProcessing) return;
QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
while (item) {
item = m_view.running_jobs->itemBelow(item);
}
item = m_view.running_jobs->topLevelItem(0);
+ bool waitingJob = false;
while (item) {
if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) {
item->setData(1, Qt::UserRole + 1, QTime::currentTime());
+ waitingJob = true;
if (item->data(1, Qt::UserRole + 4).isNull()) {
// Normal render process
- QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
- if (!QFile::exists(renderer)) renderer = "kdenlive_render";
- if (QProcess::startDetached(renderer, item->data(1, Qt::UserRole + 3).toStringList()) == false) {
+ if (QProcess::startDetached(m_renderer, item->data(1, Qt::UserRole + 3).toStringList()) == false) {
item->setData(1, Qt::UserRole + 2, FINISHEDJOB);
item->setData(1, Qt::UserRole, i18n("Rendering crashed"));
item->setIcon(0, KIcon("dialog-close"));
}
item = m_view.running_jobs->itemBelow(item);
}
+ if (waitingJob == false && m_view.shutdown->isChecked()) emit shutdown();
}
int RenderWidget::waitingJobsCount() const
if (!sizeItem->isHidden()) {
// Make sure the selected profile uses an installed avformat codec / format
std = sizeItem->data(ParamsRole).toString();
-
if (!formatsList.isEmpty()) {
QString format;
if (std.startsWith("f=")) format = std.section("f=", 1, 1);
KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension)
{
- QString path;
- if (!url.isEmpty()) {
- path = url.path();
- int pos = path.lastIndexOf('.') + 1;
- if (pos == 0) path.append('.' + extension);
- else path = path.left(pos) + extension;
+ if (url.isEmpty()) url = KUrl(m_projectFolder);
+ QString directory = url.directory(KUrl::AppendTrailingSlash | KUrl::ObeyTrailingSlash);
+ QString filename = url.fileName(KUrl::ObeyTrailingSlash);
+ QString ext;
- } else {
- path = m_projectFolder + "untitled." + extension;
+ if (extension.at(0) == '.') ext = extension;
+ else ext = '.' + extension;
+
+ if (filename.isEmpty()) filename = i18n("untitled");
+
+ int pos = filename.lastIndexOf('.');
+ if (pos == 0) filename.append(ext);
+ else {
+ if (!filename.endsWith(ext, Qt::CaseInsensitive)) {
+ filename = filename.left(pos) + ext;
+ }
}
- return KUrl(path);
+
+ return KUrl(directory + filename);
}
QListWidgetItem *item;
QDomNodeList groups = doc.elementsByTagName("group");
+ const QStringList acodecsList = KdenliveSettings::audiocodecs();
+ bool replaceVorbisCodec = false;
+ if (!acodecsList.contains("vorbis") && acodecsList.contains("libvorbis")) replaceVorbisCodec = true;
+ bool replaceLibfaacCodec = false;
+ if (!acodecsList.contains("libfaac") && acodecsList.contains("aac")) replaceLibfaacCodec = true;
+
+
if (editable || groups.count() == 0) {
QDomElement profiles = doc.documentElement();
if (editable && profiles.attribute("version", 0).toInt() < 1) {
QString profileName = profile.attribute("name");
QString standard = profile.attribute("standard");
QString params = profile.attribute("args");
+
+ if (replaceVorbisCodec && params.contains("acodec=vorbis")) {
+ // replace vorbis with libvorbis
+ params = params.replace("vorbis", "libvorbis");
+ }
+ if (replaceLibfaacCodec && params.contains("acodec=libfaac")) {
+ // replace libfaac with aac
+ params = params.replace("libfaac", "aac");
+ }
+
QString category = profile.attribute("category", i18n("Custom"));
QString dest = profile.attribute("destinationid");
QString prof_extension = profile.attribute("extension");
profileName = profileElement.attribute("name");
standard = profileElement.attribute("standard");
params = profileElement.attribute("args");
+
+ if (replaceVorbisCodec && params.contains("acodec=vorbis")) {
+ // replace vorbis with libvorbis
+ params = params.replace("vorbis", "libvorbis");
+ }
+ if (replaceLibfaacCodec && params.contains("acodec=libfaac")) {
+ // replace libfaac with aac
+ params = params.replace("libfaac", "aac");
+ }
+
prof_extension = profileElement.attribute("extension");
if (!prof_extension.isEmpty()) extension = prof_extension;
item = new QListWidgetItem(profileName, m_view.size_list);
return false;
}
- QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
- if (!QFile::exists(renderer)) renderer = "kdenlive_render";
QTextStream outStream(&file);
outStream << "#! /bin/sh" << "\n" << "\n";
QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
if (item->data(1, Qt::UserRole + 4).isNull()) {
// Add render process for item
const QString params = item->data(1, Qt::UserRole + 3).toStringList().join(" ");
- outStream << renderer << " " << params << "\n";
+ outStream << m_renderer << " " << params << "\n";
} else {
// Script item
outStream << item->data(1, Qt::UserRole + 3).toString() << "\n";
void RenderWidget::slotPlayRendering(QTreeWidgetItem *item, int)
{
if (KdenliveSettings::defaultplayerapp().isEmpty() || item->data(1, Qt::UserRole + 2).toInt() != FINISHEDJOB) return;
- QProcess::startDetached(KdenliveSettings::defaultplayerapp(), QStringList() << item->text(1));
+ const QByteArray startId = KStartupInfo::createNewStartupId();
+ const QString command = KdenliveSettings::defaultplayerapp() + ' ' + item->text(1);
+ KRun::runCommand(command, KdenliveSettings::defaultplayerapp(), KdenliveSettings::defaultplayerapp(), this, startId);
}