]> git.sesse.net Git - kdenlive/blobdiff - src/profilesdialog.cpp
render dialog: select and edit bitrates using a combo box (WIP).
[kdenlive] / src / profilesdialog.cpp
index 9710e12c857e7da5bce2fb1ef97a9a77bc10aaa8..557f6f7cdb4352b0cc7f552f0d09f1d4915e20eb 100644 (file)
@@ -35,6 +35,12 @@ ProfilesDialog::ProfilesDialog(QWidget * parent) :
 {
     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 << "*";
 
@@ -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));
     }
@@ -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;
 }
 
@@ -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);
         }
     }
@@ -395,11 +404,24 @@ QMap< QString, QString > ProfilesDialog::getSettingsForProfile(const QString pro
 }
 
 // static
-QString ProfilesDialog::getPathFromProperties(int width, int height, double fps, bool useDisplayWidth)
+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 <QString, QString> ProfilesDialog::getProfilesFromProperties(int width, int height, double fps, double par, bool useDisplayWidth)
 {
     QStringList profilesNames;
     QStringList profilesFiles;
     QStringList profilesFilter;
+    QMap <QString, QString> result;
     profilesFilter << "*";
     // List the Mlt profiles
     profilesFiles = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files);
@@ -411,8 +433,9 @@ QString ProfilesDialog::getPathFromProperties(int width, int height, double fps,
         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();
-            if (fps <= 0 || qAbs(profile_fps - fps) < 0.5)
-                return profilesFiles.at(i);
+            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"));
         }
     }
 
@@ -428,12 +451,13 @@ QString ProfilesDialog::getPathFromProperties(int width, int height, double fps,
             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();
-                if (fps <= 0 || qAbs(profile_fps - fps) < 0.5)
-                    return customProfiles.at(i) + profiles.at(j);
+                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 QString();
+    return result;
 }
 
 // static
@@ -482,7 +506,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));
     }
@@ -523,9 +547,27 @@ void ProfilesDialog::slotUpdateDisplay()
     } 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");
+    }
+}
 
 #include "profilesdialog.moc"