const int EditableRole = GroupRole + 5;
const int MetaGroupRole = GroupRole + 6;
const int ExtraRole = GroupRole + 7;
+const int TwoPassRole = GroupRole + 8;
+const int BitratesRole = GroupRole + 9;
+const int DefaultBitrateRole = GroupRole + 10;
// Running job status
const int WAITINGJOB = 0;
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);
// disable audio if requested
if (!exportAudio) renderArgs.append(" an=1 ");
- // Set the thread counts
- renderArgs.append(QString(" threads=%1").arg(KdenliveSettings::encodethreads()));
- renderArgs.append(QString(" real_time=-%1").arg(KdenliveSettings::mltthreads()));
+ // Set the thread counts
+ renderArgs.append(QString(" threads=%1").arg(KdenliveSettings::encodethreads()));
+ renderArgs.append(QString(" real_time=-%1").arg(KdenliveSettings::mltthreads()));
+
+ // 2 pass
+ if (m_view.checkTwoPass->isEnabled() && m_view.checkTwoPass->isChecked())
+ renderArgs.append(" pass=2");
+
+ // bitrate
+ if (m_view.comboBitrates->isEnabled())
+ renderArgs.replace("%bitrate", m_view.comboBitrates->currentText());
// Check if the rendering profile is different from project profile,
// in which case we need to use the producer_comsumer from MLT
render_process_args << "consumer:" + (scriptExport ? "$SOURCE" : playlistPath);
else
render_process_args << (scriptExport ? "$SOURCE" : playlistPath);
- render_process_args << (scriptExport ? "$TARGET" : dest);
+ render_process_args << (scriptExport ? "$TARGET" : KUrl(dest).url());
render_process_args << paramsList;
QString group = m_view.size_list->currentItem()->data(MetaGroupRole).toString();
- QStringList renderParameters;
- renderParameters << dest << item->data(RenderRole).toString() << renderArgs.simplified();
- renderParameters << QString::number(zoneIn) << QString::number(zoneOut) << QString::number(m_view.play_after->isChecked());
- renderParameters << QString::number(guideStart) << QString::number(guideEnd) << QString::number(resizeProfile);
-
QString scriptName;
if (scriptExport) {
// Generate script file
m_view.tabWidget->setCurrentIndex(2);
return;
}
- renderParameters << scriptName;
// Save rendering profile to document
QMap <QString, QString> renderProps;
renderProps.insert("rendertctype", QString::number(m_view.tc_type->currentIndex()));
renderProps.insert("renderratio", QString::number(m_view.rescale_keep->isChecked()));
renderProps.insert("renderplay", QString::number(m_view.play_after->isChecked()));
+ renderProps.insert("rendertwopass", QString::number(m_view.checkTwoPass->isChecked()));
emit selectedRenderProfile(renderProps);
{
m_profile = profile;
//WARNING: this way to tell the video standard is a bit hackish...
- if (m_profile.description.contains("pal", Qt::CaseInsensitive) || m_profile.description.contains("25", Qt::CaseInsensitive) || m_profile.description.contains("50", Qt::CaseInsensitive)) m_view.format_selection->setCurrentIndex(0);
- else m_view.format_selection->setCurrentIndex(1);
+ if (m_profile.description.contains("pal", Qt::CaseInsensitive) || m_profile.description.contains("25", Qt::CaseInsensitive) || m_profile.description.contains("50", Qt::CaseInsensitive))
+ m_view.format_selection->setCurrentIndex(0);
+ else
+ m_view.format_selection->setCurrentIndex(1);
m_view.scanning_list->setCurrentIndex(0);
m_view.rescale_width->setValue(KdenliveSettings::defaultrescalewidth());
if (!m_view.rescale_keep->isChecked()) {
destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString();
KIcon brokenIcon("dialog-close");
+ if (m_view.format_list->currentItem()->data(TwoPassRole).canConvert(QVariant::Bool))
+ m_view.checkTwoPass->setEnabled(m_view.format_list->currentItem()->data(TwoPassRole).toBool());
+ else
+ m_view.checkTwoPass->setEnabled(true);
+
const QStringList formatsList = KdenliveSettings::supportedformats();
const QStringList vcodecsList = KdenliveSettings::videocodecs();
const QStringList acodecsList = KdenliveSettings::audiocodecs();
m_view.buttonEdit->setEnabled(true);
}
+ // setup comboBox with bitrates
+ if (item->data(BitratesRole).canConvert(QVariant::StringList)) {
+ m_view.comboBitrates->setEnabled(true);
+ m_view.comboBitrates->clear();
+ QStringList bitrates = item->data(BitratesRole).toStringList();
+ foreach (QString bitrate, bitrates)
+ m_view.comboBitrates->addItem(bitrate);
+ if (item->data(DefaultBitrateRole).canConvert(QVariant::String))
+ m_view.comboBitrates->setCurrentIndex(bitrates.indexOf(item->data(DefaultBitrateRole).toString()));
+ } else {
+ m_view.comboBitrates->setEnabled(false);
+ }
+
m_view.buttonRender->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
m_view.buttonGenerateScript->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
}
QString renderer;
QString params;
QString standard;
+ QString twoPass;
+ QString bitrates, defaultBitrate;
KIcon icon;
while (!groups.item(i).isNull()) {
groupName = documentElement.attribute("name", i18nc("Attribute Name", "Custom"));
extension = documentElement.attribute("extension", QString());
renderer = documentElement.attribute("renderer", QString());
+ twoPass = documentElement.attribute("twopass", "true");
bool exists = false;
for (int j = 0; j < m_renderCategory.count(); j++) {
if (m_renderCategory.at(j)->text() == groupName && m_renderCategory.at(j)->data(MetaGroupRole) == metagroupId) {
if (!exists) {
QListWidgetItem *itemcat = new QListWidgetItem(groupName); //, m_view.format_list);
itemcat->setData(MetaGroupRole, metagroupId);
+ itemcat->setData(TwoPassRole, twoPass == "false" ? false : true);
m_renderCategory.append(itemcat);
}
profileElement = n.toElement();
profileName = profileElement.attribute("name");
standard = profileElement.attribute("standard");
+ bitrates = profileElement.attribute("bitrates");
+ defaultBitrate = profileElement.attribute("defaultbitrate");
params = profileElement.attribute("args");
if (replaceVorbisCodec && params.contains("acodec=vorbis")) {
item->setData(RenderRole, renderer);
item->setData(StandardRole, standard);
item->setData(ParamsRole, params);
+ item->setData(BitratesRole, bitrates.split(','));
+ item->setData(DefaultBitrateRole, defaultBitrate);
if (profileElement.hasAttribute("url")) item->setData(ExtraRole, profileElement.attribute("url"));
if (editable) item->setData(EditableRole, exportFile);
m_renderItems.append(item);
if (props.contains("rendertctype")) m_view.tc_type->setCurrentIndex(props.value("rendertctype").toInt());
if (props.contains("renderratio")) m_view.rescale_keep->setChecked(props.value("renderratio").toInt());
if (props.contains("renderplay")) m_view.play_after->setChecked(props.value("renderplay").toInt());
+ if (props.contains("rendertwopass")) m_view.checkTwoPass->setChecked(props.value("rendertwopass").toInt());
if (props.value("renderzone") == "1") m_view.render_zone->setChecked(true);
else if (props.value("renderguide") == "1") {