X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprofilesdialog.cpp;h=c9aa53c29f53d02588d7f7c357910ade2a2df235;hb=a6c1dd8bf93a54b38ad03095f99dcfc4f8e03e15;hp=3a8d559a53867bc95706c5679be5bffa0b2abd66;hpb=8715b83a1b754b71511b8db5f4f2e608de7fd3e3;p=kdenlive diff --git a/src/profilesdialog.cpp b/src/profilesdialog.cpp index 3a8d559a..c9aa53c2 100644 --- a/src/profilesdialog.cpp +++ b/src/profilesdialog.cpp @@ -29,12 +29,18 @@ #include ProfilesDialog::ProfilesDialog(QWidget * parent) : - QDialog(parent), - m_profileIsModified(false), - m_isCustomProfile(false) + QDialog(parent), + m_profileIsModified(false), + m_isCustomProfile(false) { m_view.setupUi(this); + // Fill colorspace list (see mlt_profile.h) + m_view.colorspace->addItem(getColorspaceDescription(601), 601); + m_view.colorspace->addItem(getColorspaceDescription(709), 709); + m_view.colorspace->addItem(getColorspaceDescription(240), 240); + m_view.colorspace->addItem(getColorspaceDescription(0), 0); + QStringList profilesFilter; profilesFilter << "*"; @@ -72,7 +78,7 @@ void ProfilesDialog::slotProfileEdited() void ProfilesDialog::fillList(const QString selectedProfile) { - // List the Mlt profiles + // List the Mlt profiles m_view.profiles_list->clear(); QMap profilesInfo = ProfilesDialog::getProfilesInfo(); QMapIterator i(profilesInfo); @@ -167,7 +173,7 @@ void ProfilesDialog::saveProfile(const QString path) return; } QTextStream out(&file); - out << "description=" << m_view.description->text() << "\n" << "frame_rate_num=" << m_view.frame_num->value() << "\n" << "frame_rate_den=" << m_view.frame_den->value() << "\n" << "width=" << m_view.size_w->value() << "\n" << "height=" << m_view.size_h->value() << "\n" << "progressive=" << m_view.progressive->isChecked() << "\n" << "sample_aspect_num=" << m_view.aspect_num->value() << "\n" << "sample_aspect_den=" << m_view.aspect_den->value() << "\n" << "display_aspect_num=" << m_view.display_num->value() << "\n" << "display_aspect_den=" << m_view.display_den->value() << "\n"; + out << "description=" << m_view.description->text() << "\n" << "frame_rate_num=" << m_view.frame_num->value() << "\n" << "frame_rate_den=" << m_view.frame_den->value() << "\n" << "width=" << m_view.size_w->value() << "\n" << "height=" << m_view.size_h->value() << "\n" << "progressive=" << m_view.progressive->isChecked() << "\n" << "sample_aspect_num=" << m_view.aspect_num->value() << "\n" << "sample_aspect_den=" << m_view.aspect_den->value() << "\n" << "display_aspect_num=" << m_view.display_num->value() << "\n" << "display_aspect_den=" << m_view.display_den->value() << "\n" << "colorspace=" << m_view.colorspace->itemData(m_view.colorspace->currentIndex()).toInt() << "\n"; if (file.error() != QFile::NoError) { KMessageBox::error(this, i18n("Cannot write to file %1", path)); } @@ -196,7 +202,7 @@ MltVideoProfile ProfilesDialog::getVideoProfile(QString name) if (name.contains('/')) isCustom = true; if (!isCustom) { - // List the Mlt profiles + // List the Mlt profiles profilesFiles = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); if (profilesFiles.contains(name)) path = KdenliveSettings::mltpath() + name; } @@ -206,7 +212,7 @@ MltVideoProfile ProfilesDialog::getVideoProfile(QString name) if (path.isEmpty() || !QFile::exists(path)) { if (name == "dv_pal") { - kDebug() << "!!! WARNING, COULD NOT FIND DEFAULT MLT PROFILE"; + kDebug() << "!!! WARNING, COULD NOT FIND DEFAULT MLT PROFILE"; return result; } if (name == KdenliveSettings::default_profile()) KdenliveSettings::setDefault_profile("dv_pal"); @@ -225,6 +231,7 @@ MltVideoProfile ProfilesDialog::getVideoProfile(QString name) result.sample_aspect_den = confFile.entryMap().value("sample_aspect_den").toInt(); result.display_aspect_num = confFile.entryMap().value("display_aspect_num").toInt(); result.display_aspect_den = confFile.entryMap().value("display_aspect_den").toInt(); + result.colorspace = confFile.entryMap().value("colorspace").toInt(); return result; } @@ -249,7 +256,7 @@ bool ProfilesDialog::existingProfileDescription(const QString &desc) QStringList profilesFilter; profilesFilter << "*"; - // List the Mlt profiles + // List the Mlt profiles QStringList profilesFiles = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); for (int i = 0; i < profilesFiles.size(); ++i) { KConfig confFile(KdenliveSettings::mltpath() + profilesFiles.at(i), KConfig::SimpleConfig); @@ -275,7 +282,7 @@ QString ProfilesDialog::existingProfile(MltVideoProfile profile) QStringList profilesFilter; profilesFilter << "*"; - // Check the Mlt profiles + // Check the Mlt profiles QStringList profilesFiles = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); for (int i = 0; i < profilesFiles.size(); ++i) { KConfig confFile(KdenliveSettings::mltpath() + profilesFiles.at(i), KConfig::SimpleConfig); @@ -288,6 +295,7 @@ QString ProfilesDialog::existingProfile(MltVideoProfile profile) if (profile.frame_rate_den != confFile.entryMap().value("frame_rate_den").toInt()) continue; if (profile.frame_rate_num != confFile.entryMap().value("frame_rate_num").toInt()) continue; if (profile.progressive != confFile.entryMap().value("progressive").toInt()) continue; + if (profile.colorspace != confFile.entryMap().value("colorspace").toInt()) continue; return profilesFiles.at(i); } @@ -306,6 +314,7 @@ QString ProfilesDialog::existingProfile(MltVideoProfile profile) if (profile.frame_rate_den != confFile.entryMap().value("frame_rate_den").toInt()) continue; if (profile.frame_rate_num != confFile.entryMap().value("frame_rate_num").toInt()) continue; if (profile.progressive != confFile.entryMap().value("progressive").toInt()) continue; + if (profile.colorspace != confFile.entryMap().value("colorspace").toInt()) continue; return customProfiles.at(i) + profilesFiles.at(j); } } @@ -319,7 +328,7 @@ QMap ProfilesDialog::getProfilesInfo() QStringList profilesFilter; profilesFilter << "*"; - // List the Mlt profiles + // List the Mlt profiles QStringList profilesFiles = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); for (int i = 0; i < profilesFiles.size(); ++i) { KConfig confFile(KdenliveSettings::mltpath() + profilesFiles.at(i), KConfig::SimpleConfig); @@ -367,7 +376,7 @@ QMap< QString, QString > ProfilesDialog::getSettingsForProfile(const QString pro QStringList profilesFilter; profilesFilter << "*"; - // List the Mlt profiles + // List the Mlt profiles profilesFiles = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); for (int i = 0; i < profilesFiles.size(); ++i) { KConfig confFile(KdenliveSettings::mltpath() + profilesFiles.at(i), KConfig::SimpleConfig); @@ -382,11 +391,11 @@ QMap< QString, QString > ProfilesDialog::getSettingsForProfile(const QString pro QStringList customProfiles = KGlobal::dirs()->findDirs("appdata", "profiles"); for (int i = 0; i < customProfiles.size(); ++i) { QStringList profiles = QDir(customProfiles.at(i)).entryList(profilesFilter, QDir::Files); - for (int i = 0; i < profiles.size(); ++i) { - KConfig confFile(customProfiles.at(i) + profiles.at(i), KConfig::SimpleConfig); + for (int j = 0; j < profiles.size(); ++j) { + KConfig confFile(customProfiles.at(i) + profiles.at(j), KConfig::SimpleConfig); QMap< QString, QString > values = confFile.entryMap(); if (values.value("description") == profileName) { - values.insert("path", customProfiles.at(i) + profiles.at(i)); + values.insert("path", customProfiles.at(i) + profiles.at(j)); return values; } } @@ -394,6 +403,63 @@ QMap< QString, QString > ProfilesDialog::getSettingsForProfile(const QString pro return QMap< QString, QString >(); } +// static +bool ProfilesDialog::matchProfile(int width, int height, double fps, double par, bool isImage, MltVideoProfile profile) +{ + int profileWidth; + if (isImage) { + // when using image, compare with display width + profileWidth = profile.height * profile.display_aspect_num / profile.display_aspect_den + 0.5; + } else profileWidth = profile.width; + if (width != profileWidth || height != profile.height || (fps > 0 && qAbs((double) profile.frame_rate_num / profile.frame_rate_den - fps) > 0.4) || (!isImage && par > 0 && qAbs((double) profile.sample_aspect_num / profile.sample_aspect_den - par) > 0.1)) return false; + return true; +} + +// static +QMap ProfilesDialog::getProfilesFromProperties(int width, int height, double fps, double par, bool useDisplayWidth) +{ + QStringList profilesNames; + QStringList profilesFiles; + QStringList profilesFilter; + QMap result; + profilesFilter << "*"; + // List the Mlt profiles + profilesFiles = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); + for (int i = 0; i < profilesFiles.size(); ++i) { + KConfig confFile(KdenliveSettings::mltpath() + profilesFiles.at(i), KConfig::SimpleConfig); + QMap< QString, QString > values = confFile.entryMap(); + int profileWidth; + if (useDisplayWidth) profileWidth = values.value("height").toInt() * values.value("display_aspect_num").toInt() / values.value("display_aspect_den").toInt() + 0.5; + else profileWidth = values.value("width").toInt(); + if (profileWidth == width && values.value("height").toInt() == height) { + double profile_fps = values.value("frame_rate_num").toDouble() / values.value("frame_rate_den").toDouble(); + double profile_par = values.value("sample_aspect_num").toDouble() / values.value("sample_aspect_den").toDouble(); + if ((fps <= 0 || qAbs(profile_fps - fps) < 0.5) && (par <= 0 || qAbs(profile_par - par) < 0.1)) + result.insert(profilesFiles.at(i), values.value("description")); + } + } + + // List custom profiles + QStringList customProfiles = KGlobal::dirs()->findDirs("appdata", "profiles"); + for (int i = 0; i < customProfiles.size(); ++i) { + QStringList profiles = QDir(customProfiles.at(i)).entryList(profilesFilter, QDir::Files); + for (int j = 0; j < profiles.size(); j++) { + KConfig confFile(customProfiles.at(i) + profiles.at(j), KConfig::SimpleConfig); + QMap< QString, QString > values = confFile.entryMap(); + int profileWidth; + if (useDisplayWidth) profileWidth = values.value("height").toInt() * values.value("display_aspect_num").toInt() / values.value("display_aspect_den").toInt() + 0.5; + else profileWidth = values.value("width").toInt(); + if (profileWidth == width && values.value("height").toInt() == height) { + double profile_fps = values.value("frame_rate_num").toDouble() / values.value("frame_rate_den").toDouble(); + double profile_par = values.value("sample_aspect_num").toDouble() / values.value("sample_aspect_den").toDouble(); + if ((fps <= 0 || qAbs(profile_fps - fps) < 0.5) && (par <= 0 || qAbs(profile_par - par) < 0.1)) + result.insert(customProfiles.at(i) + profiles.at(j), values.value("description")); + } + } + } + return result; +} + // static QString ProfilesDialog::getPathFromDescription(const QString profileDesc) { @@ -402,7 +468,7 @@ QString ProfilesDialog::getPathFromDescription(const QString profileDesc) QStringList profilesFilter; profilesFilter << "*"; - // List the Mlt profiles + // List the Mlt profiles profilesFiles = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); for (int i = 0; i < profilesFiles.size(); ++i) { KConfig confFile(KdenliveSettings::mltpath() + profilesFiles.at(i), KConfig::SimpleConfig); @@ -414,25 +480,27 @@ QString ProfilesDialog::getPathFromDescription(const QString profileDesc) QStringList customProfiles = KGlobal::dirs()->findDirs("appdata", "profiles"); for (int i = 0; i < customProfiles.size(); ++i) { QStringList profiles = QDir(customProfiles.at(i)).entryList(profilesFilter, QDir::Files); - for (int i = 0; i < profiles.size(); ++i) { - KConfig confFile(customProfiles.at(i) + profiles.at(i), KConfig::SimpleConfig); + for (int j = 0; j < profiles.size(); ++j) { + KConfig confFile(customProfiles.at(i) + profiles.at(j), KConfig::SimpleConfig); QMap< QString, QString > values = confFile.entryMap(); - if (values.value("description") == profileDesc) return customProfiles.at(i) + profiles.at(i); + if (values.value("description") == profileDesc) return customProfiles.at(i) + profiles.at(j); } } return QString(); } // static -void ProfilesDialog::saveProfile(MltVideoProfile &profile) +void ProfilesDialog::saveProfile(MltVideoProfile &profile, QString profilePath) { - int i = 0; - QString customName = "profiles/customprofile"; - QString profilePath = KStandardDirs::locateLocal("appdata", customName + QString::number(i)); - kDebug() << " TYING PROFILE FILE: " << profilePath; - while (KIO::NetAccess::exists(KUrl(profilePath), KIO::NetAccess::SourceSide, 0)) { - i++; + if (profilePath.isEmpty()) { + int i = 0; + QString customName = "profiles/customprofile"; profilePath = KStandardDirs::locateLocal("appdata", customName + QString::number(i)); + kDebug() << " TYING PROFILE FILE: " << profilePath; + while (KIO::NetAccess::exists(KUrl(profilePath), KIO::NetAccess::SourceSide, 0)) { + i++; + profilePath = KStandardDirs::locateLocal("appdata", customName + QString::number(i)); + } } QFile file(profilePath); if (!file.open(QIODevice::WriteOnly)) { @@ -440,7 +508,7 @@ void ProfilesDialog::saveProfile(MltVideoProfile &profile) return; } QTextStream out(&file); - out << "description=" << profile.description << "\n" << "frame_rate_num=" << profile.frame_rate_num << "\n" << "frame_rate_den=" << profile.frame_rate_den << "\n" << "width=" << profile.width << "\n" << "height=" << profile.height << "\n" << "progressive=" << profile.progressive << "\n" << "sample_aspect_num=" << profile.sample_aspect_num << "\n" << "sample_aspect_den=" << profile.sample_aspect_den << "\n" << "display_aspect_num=" << profile.display_aspect_num << "\n" << "display_aspect_den=" << profile.display_aspect_den << "\n"; + out << "description=" << profile.description << "\n" << "frame_rate_num=" << profile.frame_rate_num << "\n" << "frame_rate_den=" << profile.frame_rate_den << "\n" << "width=" << profile.width << "\n" << "height=" << profile.height << "\n" << "progressive=" << profile.progressive << "\n" << "sample_aspect_num=" << profile.sample_aspect_num << "\n" << "sample_aspect_den=" << profile.sample_aspect_den << "\n" << "display_aspect_num=" << profile.display_aspect_num << "\n" << "display_aspect_den=" << profile.display_aspect_den << "\n" << "colorspace=" << profile.colorspace << "\n"; if (file.error() != QFile::NoError) { KMessageBox::error(0, i18n("Cannot write to file %1", profilePath)); } @@ -476,9 +544,41 @@ void ProfilesDialog::slotUpdateDisplay() m_view.frame_num->setValue(values.value("frame_rate_num").toInt()); m_view.frame_den->setValue(values.value("frame_rate_den").toInt()); m_view.progressive->setChecked(values.value("progressive").toInt()); + if (values.value("progressive").toInt()) { + m_view.fields->setText(QString::number((double) values.value("frame_rate_num").toInt() / values.value("frame_rate_den").toInt(), 'f', 2)); + } else { + m_view.fields->setText(QString::number((double) 2 * values.value("frame_rate_num").toInt() / values.value("frame_rate_den").toInt(), 'f', 2)); + } + + int colorix = m_view.colorspace->findData(values.value("colorspace").toInt()); + if (colorix > -1) m_view.colorspace->setCurrentIndex(colorix); m_profileIsModified = false; } +//static +QString ProfilesDialog::getColorspaceDescription(int colorspace) +{ + //TODO: should the descriptions be translated? + switch (colorspace) { + case 601: + return QString("ITU-R 601"); + case 709: + return QString("ITU-R 709"); + case 240: + return QString("SMPTE240M"); + default: + return i18n("Unknown"); + } +} + +//static +int ProfilesDialog::getColorspaceFromDescription(const QString &description) +{ + //TODO: should the descriptions be translated? + if (description == "SMPTE240M") return 240; + if (description == "ITU-R 709") return 709; + return 601; +} #include "profilesdialog.moc"