X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderwidget.cpp;h=2a4ce736286564d8032e1d2b26e29ec18d67f720;hb=45a4a9543b182b7e91166cb14f97054d144d267a;hp=0ed975131ce94187f73876a61877fe0d2f44e422;hpb=88fdb10b69fb5f4aeaaf0feda772fdcd48fe8820;p=kdenlive diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 0ed97513..2a4ce736 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -31,6 +31,7 @@ #include #include #include +#include // #include #include @@ -39,8 +40,10 @@ #include #include #include -#include #include +#include +#include +#include const int GroupRole = Qt::UserRole; const int ExtensionRole = GroupRole + 1; @@ -156,7 +159,8 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) : 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(); @@ -170,14 +174,38 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) : 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(); @@ -266,6 +294,10 @@ void RenderWidget::slotUpdateButtons(KUrl url) } 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); @@ -594,6 +626,10 @@ void RenderWidget::slotPrepareExport(bool scriptExport) 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); } @@ -609,7 +645,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const // 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); } @@ -645,7 +681,8 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const 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 << "-"; @@ -718,13 +755,11 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const 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"; @@ -770,7 +805,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const 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; @@ -780,7 +815,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const } 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); } @@ -791,6 +826,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const 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) { @@ -798,14 +834,14 @@ void RenderWidget::checkRenderStatus() 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")); @@ -824,6 +860,7 @@ void RenderWidget::checkRenderStatus() } item = m_view.running_jobs->itemBelow(item); } + if (waitingJob == false && m_view.shutdown->isChecked()) emit shutdown(); } int RenderWidget::waitingJobsCount() const @@ -931,7 +968,6 @@ void RenderWidget::refreshView() 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); @@ -991,17 +1027,25 @@ void RenderWidget::refreshView() 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); } @@ -1122,6 +1166,13 @@ void RenderWidget::parseFile(QString exportFile, bool editable) 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) { @@ -1168,6 +1219,16 @@ void RenderWidget::parseFile(QString exportFile, bool editable) 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"); @@ -1274,6 +1335,16 @@ void RenderWidget::parseFile(QString exportFile, bool editable) 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); @@ -1567,8 +1638,6 @@ bool RenderWidget::startWaitingRenderJobs() 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); @@ -1577,7 +1646,7 @@ bool RenderWidget::startWaitingRenderJobs() 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"; @@ -1615,7 +1684,9 @@ QString RenderWidget::getFreeScriptName(const QString &prefix) 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); }