const int ExtraRole = GroupRole + 7;
const int BitratesRole = GroupRole + 8;
const int DefaultBitrateRole = GroupRole + 9;
+const int AudioBitratesRole = GroupRole + 10;
+const int DefaultAudioBitrateRole = GroupRole + 11;
// Running job status
const int WAITINGJOB = 0;
const int FINISHEDJOB = 2;
-RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, QWidget * parent) :
+RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVideoProfile profile, QWidget * parent) :
QDialog(parent),
m_projectFolder(projectfolder),
+ m_profile(profile),
m_blockProcessing(false)
{
m_view.setupUi(this);
m_view.buttonFavorite->setToolTip(i18n("Copy profile to favorites"));
m_view.advanced_params->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 5);
-
+
+ m_view.buttonRender->setEnabled(false);
+ m_view.buttonGenerateScript->setEnabled(false);
+ m_view.rescale_box->setEnabled(false);
+ m_view.guides_box->setVisible(false);
+ m_view.open_dvd->setVisible(false);
+ m_view.create_chapter->setVisible(false);
+ m_view.open_browser->setVisible(false);
+ m_view.error_box->setVisible(false);
+ m_view.tc_type->setEnabled(false);
+ m_view.checkTwoPass->setEnabled(false);
+
if (KdenliveSettings::showrenderparams()) {
m_view.buttonInfo->setDown(true);
} else m_view.advanced_params->hide();
m_view.proxy_render->setHidden(!enableProxy);
+ KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
+ QColor bg = scheme.background(KColorScheme::NegativeBackground).color();
+ m_view.errorBox->setStyleSheet(QString("QGroupBox { background-color: rgb(%1, %2, %3); border-radius: 5px;}; ").arg(bg.red()).arg(bg.green()).arg(bg.blue()));
+ int height = QFontInfo(font()).pixelSize();
+ m_view.errorIcon->setPixmap(KIcon("dialog-warning").pixmap(height, height));
+ m_view.errorBox->setHidden(true);
+
+#if KDE_IS_VERSION(4,7,0)
+ m_infoMessage = new KMessageWidget;
+ QGridLayout *s = static_cast <QGridLayout*> (m_view.tab->layout());
+ s->addWidget(m_infoMessage, 16, 0, 1, -1);
+ m_infoMessage->setCloseButtonVisible(false);
+ m_infoMessage->hide();
+#endif
+
m_view.encoder_threads->setMaximum(QThread::idealThreadCount());
m_view.encoder_threads->setValue(KdenliveSettings::encodethreads());
connect(m_view.encoder_threads, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateEncodeThreads(int)));
m_view.format_list->setAlternatingRowColors(true);
m_view.size_list->setAlternatingRowColors(true);
- KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
- QColor bg = scheme.background(KColorScheme::NegativeBackground).color();
- m_view.errorBox->setStyleSheet(QString("QGroupBox { background-color: rgb(%1, %2, %3); border-radius: 5px;}; ").arg(bg.red()).arg(bg.green()).arg(bg.blue()));
- int height = QFontInfo(font()).pixelSize();
- m_view.errorIcon->setPixmap(KIcon("dialog-warning").pixmap(height, height));
- m_view.errorBox->setHidden(true);
-
connect(m_view.export_audio, SIGNAL(stateChanged(int)), this, SLOT(slotUpdateAudioLabel(int)));
m_view.export_audio->setCheckState(Qt::PartiallyChecked);
connect(m_view.tc_overlay, SIGNAL(toggled(bool)), m_view.tc_type, SLOT(setEnabled(bool)));
- m_view.buttonRender->setEnabled(false);
- m_view.buttonGenerateScript->setEnabled(false);
- m_view.rescale_box->setEnabled(false);
- m_view.guides_box->setVisible(false);
- m_view.open_dvd->setVisible(false);
- m_view.create_chapter->setVisible(false);
- m_view.open_browser->setVisible(false);
- m_view.error_box->setVisible(false);
- m_view.tc_type->setEnabled(false);
- m_view.checkTwoPass->setEnabled(false);
-
m_view.splitter->setStretchFactor(1, 5);
m_view.splitter->setStretchFactor(0, 2);
m_view.shutdown->setEnabled(false);
focusFirstVisibleItem();
+ adjustSize();
+}
+
+QSize RenderWidget::sizeHint() const
+{
+ // Make sure the widget has minimum size on opening
+ return QSize(200, 200);
}
RenderWidget::~RenderWidget()
}
}
-void RenderWidget::setDocumentPath(const QString path)
+void RenderWidget::setDocumentPath(const QString &path)
{
if (m_view.out_file->url().directory() == KUrl(m_projectFolder).directory()) {
const QString fileName = m_view.out_file->url().fileName();
if (customGroup.isEmpty()) customGroup = i18nc("Group Name", "Custom");
ui.group_name->setText(customGroup);
- ui.parameters->setText(m_view.advanced_params->toPlainText());
+ QStringList arguments = m_view.advanced_params->toPlainText().split(" ", QString::SkipEmptyParts);
+ ui.parameters->setText(arguments.join(" "));
ui.extension->setText(m_view.size_list->currentItem()->data(ExtensionRole).toString());
ui.profile_name->setFocus();
profileElement.setAttribute("category", newGroupName);
profileElement.setAttribute("destinationid", newMetaGroupId);
profileElement.setAttribute("extension", ui.extension->text().simplified());
- profileElement.setAttribute("args", ui.parameters->toPlainText().simplified());
+ QString args = ui.parameters->toPlainText().simplified();
+ profileElement.setAttribute("args", args);
+ if (args.contains("%bitrate")) {
+ // profile has a variable bitrate
+ profileElement.setAttribute("defaultbitrate", m_view.comboBitrates->currentText());
+ QStringList bitrateValues;
+ for (int i = 0; i < m_view.comboBitrates->count(); i++)
+ bitrateValues << m_view.comboBitrates->itemText(i);
+ profileElement.setAttribute("bitrates", bitrateValues.join(","));
+ }
+ if (args.contains("%audiobitrate")) {
+ // profile has a variable bitrate
+ profileElement.setAttribute("defaultaudiobitrate", m_view.comboAudioBitrates->currentText());
+ QStringList bitrateValues;
+ for (int i = 0; i < m_view.comboAudioBitrates->count(); i++)
+ bitrateValues << m_view.comboAudioBitrates->itemText(i);
+ profileElement.setAttribute("audiobitrates", bitrateValues.join(","));
+ }
doc.appendChild(profileElement);
saveProfile(doc.documentElement());
profileElement.setAttribute("destinationid", "favorites");
profileElement.setAttribute("extension", extension);
profileElement.setAttribute("args", params);
+ profileElement.setAttribute("bitrates", item->data(BitratesRole).toStringList().join(","));
+ profileElement.setAttribute("defaultbitrate", item->data(DefaultBitrateRole).toString());
+ profileElement.setAttribute("audiobitrates", item->data(AudioBitratesRole).toStringList().join(","));
+ profileElement.setAttribute("defaultaudiobitrate", item->data(DefaultAudioBitrateRole).toString());
doc.appendChild(profileElement);
saveProfile(doc.documentElement());
parseProfiles(m_view.destination_list->itemData(m_view.destination_list->currentIndex(), Qt::UserRole).toString(), currentGroup, currentProfile);
profileElement.setAttribute("category", newGroupName);
profileElement.setAttribute("destinationid", newMetaGroupId);
profileElement.setAttribute("extension", ui.extension->text().simplified());
- profileElement.setAttribute("args", ui.parameters->toPlainText().simplified());
+ QString args = ui.parameters->toPlainText().simplified();
+ profileElement.setAttribute("args", args);
+ if (args.contains("%bitrate")) {
+ // profile has a variable bitrate
+ profileElement.setAttribute("defaultbitrate", m_view.comboBitrates->currentText());
+ QStringList bitrateValues;
+ for (int i = 0; i < m_view.comboBitrates->count(); i++)
+ bitrateValues << m_view.comboBitrates->itemText(i);
+ profileElement.setAttribute("bitrates", bitrateValues.join(","));
+ }
+ if (args.contains("%audiobitrate")) {
+ // profile has a variable bitrate
+ profileElement.setAttribute("defaultaudiobitrate", m_view.comboAudioBitrates->currentText());
+ QStringList bitrateValues;
+ for (int i = 0; i < m_view.comboAudioBitrates->count(); i++)
+ bitrateValues << m_view.comboAudioBitrates->itemText(i);
+ profileElement.setAttribute("audiobitrates", bitrateValues.join(","));
+ }
+
profiles.appendChild(profileElement);
//QCString save = doc.toString().utf8();
if (!scriptExport) render_process_args << "-erase";
if (KdenliveSettings::usekuiserver()) render_process_args << "-kuiserver";
+ // get process id
+ render_process_args << QString("-pid:%1").arg(QCoreApplication::applicationPid());
+
// Set locale for render process if required
if (QLocale().decimalPoint() != QLocale::system().decimalPoint()) {
render_process_args << QString("-locale:%1").arg(QLocale().name());
if (!exportAudio) renderArgs.append(" an=1 ");
// Set the thread counts
- renderArgs.append(QString(" threads=%1").arg(KdenliveSettings::encodethreads()));
+ if (!renderArgs.contains("threads=")) {
+ renderArgs.append(QString(" threads=%1").arg(KdenliveSettings::encodethreads()));
+ }
renderArgs.append(QString(" real_time=-%1").arg(KdenliveSettings::mltthreads()));
// Check if the rendering profile is different from project profile,
QScriptEngine sEngine;
sEngine.globalObject().setProperty("bitrate", m_view.comboBitrates->currentText());
+ sEngine.globalObject().setProperty("audiobitrate", m_view.comboAudioBitrates->currentText());
sEngine.globalObject().setProperty("dar", '@' + QString::number(m_profile.display_aspect_num) + '/' + QString::number(m_profile.display_aspect_den));
sEngine.globalObject().setProperty("passes", static_cast<int>(m_view.checkTwoPass->isChecked()) + 1);
item->setData(1, Qt::UserRole, i18n("Rendering crashed"));
item->setIcon(0, KIcon("dialog-close"));
item->setData(2, Qt::UserRole, 100);
- } else KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", item->text(1)), QPixmap(), this);
+ } else {
+ KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", item->text(1)), QPixmap(), this);
+ }
} else {
// Script item
if (QProcess::startDetached(item->data(1, Qt::UserRole + 3).toString()) == false) {
void RenderWidget::setProfile(MltVideoProfile profile)
{
- m_profile = profile;
m_view.scanning_list->setCurrentIndex(0);
m_view.rescale_width->setValue(KdenliveSettings::defaultrescalewidth());
if (!m_view.rescale_keep->isChecked()) {
m_view.rescale_height->setValue(KdenliveSettings::defaultrescaleheight());
m_view.rescale_height->blockSignals(false);
}
- refreshView();
+ if (m_profile != profile) {
+ m_profile = profile;
+ refreshView();
+ }
}
void RenderWidget::refreshCategory()
m_view.size_list->setVisible(m_view.size_list->count() > 1 || m_view.format_list->count() <= 1);
m_view.size_list->blockSignals(false);
m_view.format_list->blockSignals(false);
- if (m_view.size_list->count() > 0)
+ if (m_view.size_list->count() > 0) {
refreshParams();
- else
+ }
+ else {
+ // No matching profile
+ errorMessage(i18n("No matching profile"));
m_view.advanced_params->clear();
+ }
}
KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension)
// Format not available (e.g. codec not installed); Disable start button
QListWidgetItem *item = m_view.size_list->currentItem();
if (!item || item->isHidden()) {
+ if (!item) errorMessage(i18n("No matching profile"));
m_view.advanced_params->clear();
m_view.buttonRender->setEnabled(false);
m_view.buttonGenerateScript->setEnabled(false);
m_view.comboBitrates->clear();
if (params.contains("bitrate")) {
m_view.comboBitrates->setEnabled(true);
+ m_view.bitrateLabel->setEnabled(true);
if ( item->data(BitratesRole).canConvert(QVariant::StringList) && item->data(BitratesRole).toStringList().count()) {
QStringList bitrates = item->data(BitratesRole).toStringList();
foreach (QString bitrate, bitrates)
}
} else {
m_view.comboBitrates->setEnabled(false);
+ m_view.bitrateLabel->setEnabled(false);
+ }
+
+ // setup comboBox with audiobitrates
+ m_view.comboAudioBitrates->clear();
+ if (params.contains("audiobitrate")) {
+ m_view.comboAudioBitrates->setEnabled(true);
+ m_view.audiobitrateLabel->setEnabled(true);
+ if ( item->data(AudioBitratesRole).canConvert(QVariant::StringList) && item->data(AudioBitratesRole).toStringList().count()) {
+ QStringList audiobitrates = item->data(AudioBitratesRole).toStringList();
+ foreach (QString bitrate, audiobitrates)
+ m_view.comboAudioBitrates->addItem(bitrate);
+ if (item->data(DefaultAudioBitrateRole).canConvert(QVariant::String))
+ m_view.comboAudioBitrates->setCurrentIndex(audiobitrates.indexOf(item->data(DefaultAudioBitrateRole).toString()));
+ }
+ } else {
+ m_view.comboAudioBitrates->setEnabled(false);
+ m_view.audiobitrateLabel->setEnabled(false);
}
-
+
m_view.checkTwoPass->setEnabled(params.contains("passes"));
+ m_view.encoder_threads->setEnabled(!params.contains("threads="));
+
m_view.buttonRender->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
m_view.buttonGenerateScript->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
}
item->setData(RenderRole, "avformat");
item->setData(StandardRole, standard);
item->setData(ParamsRole, params);
+ item->setData(BitratesRole, profile.attribute("bitrates").split(',', QString::SkipEmptyParts));
+ item->setData(DefaultBitrateRole, profile.attribute("defaultbitrate"));
+ item->setData(AudioBitratesRole, profile.attribute("audiobitrates").split(',', QString::SkipEmptyParts));
+ item->setData(DefaultAudioBitrateRole, profile.attribute("defaultaudiobitrate"));
if (profile.hasAttribute("url")) item->setData(ExtraRole, profile.attribute("url"));
if (editable) {
item->setData(EditableRole, exportFile);
QString renderer;
QString params;
QString standard;
- QString bitrates, defaultBitrate;
+ QString bitrates, defaultBitrate, audioBitrates, defaultAudioBitrate;
KIcon icon;
while (!groups.item(i).isNull()) {
standard = profileElement.attribute("standard");
bitrates = profileElement.attribute("bitrates");
defaultBitrate = profileElement.attribute("defaultbitrate");
+ audioBitrates = profileElement.attribute("audiobitrates");
+ defaultAudioBitrate = profileElement.attribute("defaultaudiobitrate");
params = profileElement.attribute("args");
if (replaceVorbisCodec && params.contains("acodec=vorbis")) {
item->setData(ParamsRole, params);
item->setData(BitratesRole, bitrates.split(',', QString::SkipEmptyParts));
item->setData(DefaultBitrateRole, defaultBitrate);
+ item->setData(AudioBitratesRole, audioBitrates.split(',', QString::SkipEmptyParts));
+ item->setData(DefaultAudioBitrateRole, defaultAudioBitrate);
if (profileElement.hasAttribute("url")) item->setData(ExtraRole, profileElement.attribute("url"));
if (editable) item->setData(EditableRole, exportFile);
m_renderItems.append(item);
void RenderWidget::errorMessage(const QString &message)
{
if (!message.isEmpty()) {
+#if KDE_IS_VERSION(4,7,0)
+ m_infoMessage->setMessageType(KMessageWidget::Warning);
+ m_infoMessage->setText(message);
+ m_infoMessage->animatedShow();
+#else
m_view.errorLabel->setText(message);
m_view.errorBox->setHidden(false);
+#endif
}
else {
+#if KDE_IS_VERSION(4,7,0)
+ m_infoMessage->animatedHide();
+#else
m_view.errorBox->setHidden(true);
m_view.errorLabel->setText(QString());
+#endif
+
}
}