+void RenderWidget::refreshView(const QString &profile)
+{
+ if (!m_view.format_list->currentItem()) return;
+ m_view.size_list->blockSignals(true);
+ m_view.size_list->clear();
+ QListWidgetItem *sizeItem;
+ QString std;
+ QString group = m_view.format_list->currentItem()->text();
+ QString destination;
+ if (m_view.destination_list->currentIndex() > 0)
+ destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString();
+ KIcon brokenIcon("dialog-close");
+ KIcon warningIcon("dialog-warning");
+
+ QStringList formatsList;
+ QStringList vcodecsList;
+ QStringList acodecsList;
+ if (!KdenliveSettings::bypasscodeccheck()) {
+ formatsList= KdenliveSettings::supportedformats();
+ vcodecsList = KdenliveSettings::videocodecs();
+ acodecsList = KdenliveSettings::audiocodecs();
+ }
+
+ KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window);
+ const QColor disabled = scheme.foreground(KColorScheme::InactiveText).color();
+ const QColor disabledbg = scheme.background(KColorScheme::NegativeBackground).color();
+
+ double project_framerate = (double) m_profile.frame_rate_num / m_profile.frame_rate_den;
+ for (int i = 0; i < m_renderItems.count(); ++i) {
+ sizeItem = m_renderItems.at(i);
+ QListWidgetItem *dupItem = NULL;
+ if ((sizeItem->data(GroupRole).toString() == group || sizeItem->data(GroupRole).toString().isEmpty()) && sizeItem->data(MetaGroupRole).toString() == destination) {
+ std = sizeItem->data(StandardRole).toString();
+ if (!m_view.show_all_profiles->isChecked() && !std.isEmpty()) {
+ if ((std.contains("PAL", Qt::CaseInsensitive) && m_profile.frame_rate_num == 25 && m_profile.frame_rate_den == 1) ||
+ (std.contains("NTSC", Qt::CaseInsensitive) && m_profile.frame_rate_num == 30000 && m_profile.frame_rate_den == 1001))
+ dupItem = sizeItem->clone();
+ } else {
+ dupItem = sizeItem->clone();
+ }
+
+ if (dupItem) {
+ m_view.size_list->addItem(dupItem);
+ std = dupItem->data(ParamsRole).toString();
+ // Make sure the selected profile uses the same frame rate as project profile
+ if (!m_view.show_all_profiles->isChecked() && std.contains("mlt_profile=")) {
+ QString profile = std.section("mlt_profile=", 1, 1).section(' ', 0, 0);
+ MltVideoProfile p = ProfilesDialog::getVideoProfile(profile);
+ if (p.frame_rate_den > 0) {
+ double profile_rate = (double) p.frame_rate_num / p.frame_rate_den;
+ if ((int) (1000.0 * profile_rate) != (int) (1000.0 * project_framerate)) {
+ dupItem->setToolTip(i18n("Frame rate (%1) not compatible with project profile (%2)", profile_rate, project_framerate));
+ dupItem->setIcon(brokenIcon);
+ dupItem->setForeground(disabled);
+ }
+ }
+ }
+
+ // Make sure the selected profile uses an installed avformat codec / format
+ if (!formatsList.isEmpty()) {
+ QString format;
+ if (std.startsWith("f=")) format = std.section("f=", 1, 1);
+ else if (std.contains(" f=")) format = std.section(" f=", 1, 1);
+ if (!format.isEmpty()) {
+ format = format.section(' ', 0, 0).toLower();
+ if (!formatsList.contains(format)) {
+ kDebug() << "***** UNSUPPORTED F: " << format;
+ //sizeItem->setHidden(true);
+ //sizeItem-item>setFlags(Qt::ItemIsSelectable);
+ dupItem->setToolTip(i18n("Unsupported video format: %1", format));
+ dupItem->setIcon(brokenIcon);
+ dupItem->setForeground(disabled);
+ }
+ }
+ }
+ if (!acodecsList.isEmpty()) {
+ QString format;
+ if (std.startsWith("acodec=")) format = std.section("acodec=", 1, 1);
+ else if (std.contains(" acodec=")) format = std.section(" acodec=", 1, 1);
+ if (!format.isEmpty()) {
+ format = format.section(' ', 0, 0).toLower();
+ if (!acodecsList.contains(format)) {
+ kDebug() << "***** UNSUPPORTED ACODEC: " << format;
+ //sizeItem->setHidden(true);
+ //sizeItem->setFlags(Qt::ItemIsSelectable);
+ dupItem->setToolTip(i18n("Unsupported audio codec: %1", format));
+ dupItem->setIcon(brokenIcon);
+ dupItem->setForeground(disabled);
+ dupItem->setBackground(disabledbg);
+ }
+ }
+ }
+ if (!vcodecsList.isEmpty()) {
+ QString format;
+ if (std.startsWith("vcodec=")) format = std.section("vcodec=", 1, 1);
+ else if (std.contains(" vcodec=")) format = std.section(" vcodec=", 1, 1);
+ if (!format.isEmpty()) {
+ format = format.section(' ', 0, 0).toLower();
+ if (!vcodecsList.contains(format)) {
+ kDebug() << "***** UNSUPPORTED VCODEC: " << format;
+ //sizeItem->setHidden(true);
+ //sizeItem->setFlags(Qt::ItemIsSelectable);
+ dupItem->setToolTip(i18n("Unsupported video codec: %1", format));
+ dupItem->setIcon(brokenIcon);
+ dupItem->setForeground(disabled);
+ }
+ }
+ }
+ if (std.contains(" profile=") || std.startsWith("profile=")) {
+ // changed in MLT commit d8a3a5c9190646aae72048f71a39ee7446a3bd45
+ // (http://www.mltframework.org/gitweb/mlt.git?p=mltframework.org/mlt.git;a=commit;h=d8a3a5c9190646aae72048f71a39ee7446a3bd45)
+ dupItem->setToolTip(i18n("This render profile uses a 'profile' parameter.<br />Unless you know what you are doing you will probably have to change it to 'mlt_profile'."));
+ dupItem->setIcon(warningIcon);
+ }
+ }
+ }
+ }
+ focusFirstVisibleItem(profile);
+ m_view.size_list->blockSignals(false);
+ if (m_view.size_list->count() > 0) {
+ refreshParams();
+ }
+ else {
+ // No matching profile
+ errorMessage(i18n("No matching profile"));
+ m_view.advanced_params->clear();
+ }
+}
+
+KUrl RenderWidget::filenameWithExtension(KUrl url, const QString &extension)
+{
+ if (url.isEmpty()) url = KUrl(m_projectFolder);
+ QString directory = url.directory(KUrl::AppendTrailingSlash | KUrl::ObeyTrailingSlash);
+ QString filename = url.fileName(KUrl::ObeyTrailingSlash);
+ QString ext;
+
+ 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(directory + filename);
+}
+
+void RenderWidget::refreshParams()
+{
+ // 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);
+ return;
+ }
+ errorMessage(item->toolTip());
+ QString params = item->data(ParamsRole).toString();
+ QString extension = item->data(ExtensionRole).toString();
+ m_view.advanced_params->setPlainText(params);
+ QString destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString();
+ if (params.contains(" s=") || params.startsWith("s=") || destination == "audioonly") {
+ // profile has a fixed size, do not allow resize
+ m_view.rescale->setEnabled(false);
+ setRescaleEnabled(false);
+ } else {
+ m_view.rescale->setEnabled(true);
+ setRescaleEnabled(m_view.rescale->isChecked());
+ }
+ KUrl url = filenameWithExtension(m_view.out_file->url(), extension);
+ m_view.out_file->setUrl(url);
+// if (!url.isEmpty()) {
+// QString path = url.path();
+// int pos = path.lastIndexOf('.') + 1;
+// if (pos == 0) path.append('.' + extension);
+// else path = path.left(pos) + extension;
+// m_view.out_file->setUrl(KUrl(path));
+// } else {
+// m_view.out_file->setUrl(KUrl(QDir::homePath() + "/untitled." + extension));
+// }
+ m_view.out_file->setFilter("*." + extension);
+ QString edit = item->data(EditableRole).toString();
+ if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) {
+ m_view.buttonDelete->setEnabled(false);
+ m_view.buttonEdit->setEnabled(false);
+ } else {
+ m_view.buttonDelete->setEnabled(true);
+ m_view.buttonEdit->setEnabled(true);
+ }
+
+ // setup comboBox with bitrates
+ 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 (const 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.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 (const 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());
+}
+
+void RenderWidget::reloadProfiles()
+{
+ parseProfiles();
+}
+
+void RenderWidget::parseProfiles(const QString &meta, const QString &group, const QString &profile)
+{
+ m_view.destination_list->blockSignals(true);
+ m_view.destination_list->clear();
+ qDeleteAll(m_renderItems);
+ qDeleteAll(m_renderCategory);
+ m_renderItems.clear();
+ m_renderCategory.clear();
+ m_view.destination_list->addItem(KIcon("video-x-generic"), i18n("File rendering"));
+ m_view.destination_list->addItem(KIcon("favorites"), i18n("Favorites"), "favorites");
+ m_view.destination_list->addItem(KIcon("media-optical"), i18n("DVD"), "dvd");
+ m_view.destination_list->addItem(KIcon("audio-x-generic"), i18n("Audio only"), "audioonly");
+ m_view.destination_list->addItem(KIcon("applications-internet"), i18n("Web sites"), "websites");
+ m_view.destination_list->addItem(KIcon("applications-multimedia"), i18n("Media players"), "mediaplayers");
+ m_view.destination_list->addItem(KIcon("drive-harddisk"), i18n("Lossless / HQ"), "lossless");
+ m_view.destination_list->addItem(KIcon("pda"), i18n("Mobile devices"), "mobile");
+
+ QString exportFile = KStandardDirs::locate("appdata", "export/profiles.xml");
+ parseFile(exportFile, false);
+
+
+ QString exportFolder = KStandardDirs::locateLocal("appdata", "export/");
+ QDir directory = QDir(exportFolder);
+ QStringList filter;
+ filter << "*.xml";
+ QStringList fileList = directory.entryList(filter, QDir::Files);
+ // We should parse customprofiles.xml in last position, so that user profiles
+ // can also override profiles installed by KNewStuff
+ fileList.removeAll("customprofiles.xml");
+ foreach(const QString &filename, fileList)
+ parseFile(exportFolder + filename, true);
+ if (QFile::exists(exportFolder + "customprofiles.xml")) parseFile(exportFolder + "customprofiles.xml", true);
+
+ int categoryIndex = m_view.destination_list->findData(meta);
+ if (categoryIndex == -1) categoryIndex = 0;
+ m_view.destination_list->setCurrentIndex(categoryIndex);
+ m_view.destination_list->blockSignals(false);
+ refreshCategory(group, profile);
+}
+
+void RenderWidget::parseFile(const QString &exportFile, bool editable)
+{
+ kDebug() << "// Parsing file: " << exportFile;
+ kDebug() << "------------------------------";