]> git.sesse.net Git - kdenlive/commitdiff
Start GUI for clip transcoding
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 19 May 2009 08:37:19 +0000 (08:37 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 19 May 2009 08:37:19 +0000 (08:37 +0000)
svn path=/trunk/kdenlive/; revision=3396

src/CMakeLists.txt
src/kdenlivesettingsdialog.cpp
src/kdenlivesettingsdialog.h
src/kdenliveui.rc
src/mainwindow.cpp
src/mainwindow.h
src/projectlist.cpp
src/projectlist.h
src/widgets/configtranscode_ui.ui [new file with mode: 0644]

index 34a4e1cd7a2ea43877bc97b1d03055fe0dee0ce8..20a2785496ef99210924ce6ae7147dfae0a74d31 100644 (file)
@@ -36,6 +36,7 @@ kde4_add_ui_files(kdenlive_UI
   widgets/configdisplay_ui.ui
   widgets/configsdl_ui.ui
   widgets/configcapture_ui.ui
+  widgets/configtranscode_ui.ui
   widgets/effectlist_ui.ui
   widgets/effectstack_ui.ui
   widgets/profiledialog_ui.ui
index a8b2a609e986c1683c70d0529dc63ee701d4fc22..15b1420921195a5b0a8cce311fa0a01594d0db2f 100644 (file)
@@ -30,6 +30,7 @@
 
 #include <QDir>
 #include <QTimer>
+#include <QTreeWidgetItem>
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -90,6 +91,12 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) :
     m_configSdl.setupUi(p6);
     m_page6 = addPage(p6, i18n("Playback"), "media-playback-start");
 
+    QWidget *p7 = new QWidget;
+    m_configTranscode.setupUi(p7);
+    m_page7 = addPage(p7, i18n("Transcode"), "edit-copy");
+    connect(m_configTranscode.button_add, SIGNAL(clicked()), this, SLOT(slotAddTranscode()));
+    connect(m_configTranscode.button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteTranscode()));
+
     QStringList actions;
     actions << i18n("Do nothing");
     actions << i18n("Play / Pause");
@@ -125,6 +132,7 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) :
     connect(m_configCapture.kcfg_rmd_capture_type, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateRmdRegionStatus()));
 
     slotUpdateRmdRegionStatus();
+    loadTranscodeProfiles();
 
 
     //HACK: check dvgrab version, because only dvgrab >= 3.3 supports
@@ -437,6 +445,9 @@ void KdenliveSettingsDialog::updateSettings()
         updatePreview = true;
     }
 
+    // TODO: only save profiles if modified
+    saveTranscodeProfiles();
+
     KConfigDialog::updateSettings();
     if (resetProfile) emit doResetProfile();
     if (updatePreview) emit updatePreviewSettings();
@@ -462,6 +473,49 @@ void KdenliveSettingsDialog::slotCheckAlsaDriver()
     m_configSdl.kcfg_audio_device->setEnabled(value == "alsa");
 }
 
+void KdenliveSettingsDialog::loadTranscodeProfiles()
+{
+    KSharedConfigPtr config = KGlobal::config();
+    KConfigGroup transConfig(config, "Transcoding");
+    // read the entries
+
+    QMap< QString, QString > profiles = transConfig.entryMap();
+    QMapIterator<QString, QString> i(profiles);
+    while (i.hasNext()) {
+        i.next();
+        QTreeWidgetItem *item = new QTreeWidgetItem(m_configTranscode.profiles_list, QStringList() << i.key() << i.value());
+        item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+    }
+}
+
+void KdenliveSettingsDialog::saveTranscodeProfiles()
+{
+    KSharedConfigPtr config = KGlobal::config();
+    KConfigGroup transConfig(config, "Transcoding");
+    // read the entries
+    transConfig.deleteGroup();
+    int max = m_configTranscode.profiles_list->topLevelItemCount();
+    for (int i = 0; i < max; i++) {
+        QTreeWidgetItem *item = m_configTranscode.profiles_list->topLevelItem(i);
+        transConfig.writeEntry(item->text(0), item->text(1));
+    }
+    config->sync();
+}
+
+void KdenliveSettingsDialog::slotAddTranscode()
+{
+    QTreeWidgetItem *item = new QTreeWidgetItem(m_configTranscode.profiles_list, QStringList() << i18n("Name") << i18n("Parameters"));
+    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+    m_configTranscode.profiles_list->editItem(item);
+}
+
+void KdenliveSettingsDialog::slotDeleteTranscode()
+{
+    QTreeWidgetItem *item = m_configTranscode.profiles_list->currentItem();
+    if (item == NULL) return;
+    delete item;
+}
+
 #include "kdenlivesettingsdialog.moc"
 
 
index a0da7569823a84c9b4de2c84fbeb9cbbfdf60ffe..3266c98faee7a5d651de8052e5c8de9301650d5f 100644 (file)
@@ -32,6 +32,7 @@
 #include "ui_configcapture_ui.h"
 #include "ui_configjogshuttle_ui.h"
 #include "ui_configsdl_ui.h"
+#include "ui_configtranscode_ui.h"
 
 class KdenliveSettingsDialog : public KConfigDialog
 {
@@ -60,6 +61,8 @@ private slots:
     void slotReadAudioDevices();
     void slotUpdateRmdRegionStatus();
     void slotCheckAlsaDriver();
+    void slotAddTranscode();
+    void slotDeleteTranscode();
 
 private:
     KPageWidgetItem *m_page1;
@@ -68,16 +71,20 @@ private:
     KPageWidgetItem *m_page4;
     KPageWidgetItem *m_page5;
     KPageWidgetItem *m_page6;
+    KPageWidgetItem *m_page7;
     Ui::ConfigEnv_UI m_configEnv;
     Ui::ConfigMisc_UI m_configMisc;
     Ui::ConfigDisplay_UI m_configDisplay;
     Ui::ConfigCapture_UI m_configCapture;
     Ui::ConfigJogShuttle_UI m_configShuttle;
     Ui::ConfigSdl_UI m_configSdl;
+    Ui::ConfigTranscode_UI m_configTranscode;
     QString m_defaultProfile;
     QString m_defaultPath;
     KProcess m_readProcess;
     void initDevices();
+    void loadTranscodeProfiles();
+    void saveTranscodeProfiles();
 
 signals:
     void customChanged();
index a776cef6178dfae31d79e6738a63905f2110d037..bc3fdf2f5ce73252527e7bc18606f38aabc1be5f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<gui name="kdenlive" version="42">
+<gui name="kdenlive" version="43">
   <ToolBar name="extraToolBar" >
     <text>Extra Toolbar</text>
        <Action name="project_render" />
@@ -23,6 +23,8 @@
       <Action name="add_slide_clip" />
       <Action name="add_text_clip" />
       <Action name="add_folder" /> 
+      <Menu name="transcoders" ><text>Transcode</text>
+      </Menu>
       <Menu name="generators" ><text>Generators</text>
       </Menu>
       <Menu name="track_menu" ><text>Tracks</text>
index 19161222c4d8b2f86f18cf51aa2e6d072c6b0f09..15adae1b9ecb1080bd11df7b7b06e02539f25a21 100644 (file)
@@ -226,11 +226,12 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     guiFactory()->addClient(sp);*/
 
     loadPlugins();
+    loadTranscoders();
     //kDebug() << factory() << " " << factory()->container("video_effects_menu", this);
 
     m_projectMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone);
     m_clipMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast<QMenu*>(factory()->container("marker_menu", this)));
-    m_projectList->setupGeneratorMenu(static_cast<QMenu*>(factory()->container("generators", this)));
+    m_projectList->setupGeneratorMenu(static_cast<QMenu*>(factory()->container("generators", this)), static_cast<QMenu*>(factory()->container("transcoders", this)));
 
     // build effects menus
     QAction *action;
@@ -2651,4 +2652,59 @@ void MainWindow::slotMaximizeCurrent(bool show)
     }*/
 }
 
+void MainWindow::loadTranscoders()
+{
+    QMenu *transMenu = static_cast<QMenu*>(factory()->container("transcoders", this));
+    transMenu->clear();
+    KSharedConfigPtr config = KGlobal::config();
+    KConfigGroup transConfig(config, "Transcoding");
+    // read the entries
+    QMap< QString, QString > profiles = transConfig.entryMap();
+    QMapIterator<QString, QString> i(profiles);
+    while (i.hasNext()) {
+        i.next();
+        QAction *a = transMenu->addAction(i.key());
+        a->setData(i.value());
+        connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode()));
+    }
+}
+
+void MainWindow::slotTranscode()
+{
+    if (m_transcodeProcess.state() != QProcess::NotRunning) {
+        m_messageLabel->setMessage(i18n("A transcoding job is already running"), ErrorMessage);
+        return;
+    }
+    QString url = m_projectList->currentClipUrl();
+    if (url.isEmpty()) return;
+    QAction *action = qobject_cast<QAction *>(sender());
+    QString params = action->data().toString();
+    params = params.simplified();
+    QStringList parameters;
+    parameters << "-i" << url;
+    QString fileName = url; //.section('.', 0, -1);
+    params.replace("%1", fileName);
+    QString newFile = params.section(' ', -1);
+    kDebug() << "//PARAMS: " << params << "\n\nNAME: " << newFile;
+    if (QFile::exists(newFile)) {
+        if (KMessageBox::questionYesNo(this, i18n("File %1 already exists.\nDo you want to overwrite it?", newFile)) == KMessageBox::No) return;
+        parameters << "-y";
+    }
+    parameters << params.split(' ');
+    kDebug() << "/// FFMPEG ARGS: " << parameters;
+    m_transcodeProcess.setProcessChannelMode(QProcess::MergedChannels);
+    connect(&m_transcodeProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(slotShowTranscodeInfo()));
+    m_transcodeProcess.start("ffmpeg", parameters);
+
+    //QProcess::startDetached("ffmpeg", parameters);
+}
+
+void MainWindow::slotShowTranscodeInfo()
+{
+    QString log = QString(m_transcodeProcess.readAll());
+    kDebug() << "//LOG: " << log;
+    //TODO: find better way to display transcode output info
+    m_messageLabel->setMessage(log, ErrorMessage);
+}
+
 #include "mainwindow.moc"
index 0d7d846fdf20b8c11ca5f60d429e2dd4b87fe390..3e563f2eea73d62390370c7ff2b981065351c8b2 100644 (file)
@@ -173,6 +173,7 @@ private:
     bool m_findActivated;
     QString m_findString;
     QTimer m_findTimer;
+    QProcess m_transcodeProcess;
 
     void readOptions();
     void saveOptions();
@@ -192,6 +193,7 @@ private:
     void aboutPlugins();
     QStringList m_pluginFileNames;
     QByteArray m_timelineState;
+    void loadTranscoders();
 
 public slots:
     void openFile(const KUrl &url);
@@ -297,6 +299,8 @@ private slots:
     void slotUpdateClipType(QAction *action);
     void slotShowTimeline(bool show);
     void slotMaximizeCurrent(bool show);
+    void slotTranscode();
+    void slotShowTranscodeInfo();
 
 signals:
     Q_SCRIPTABLE void abortRenderJob(const QString &url);
index 20ab1d4b3c6e23fb888cbec8a7b87423bad806e1..5092babf5db5b5fba09c08eddd0b0ac1e205c167 100644 (file)
@@ -149,7 +149,7 @@ void ProjectList::setupMenu(QMenu *addMenu, QAction *defaultAction)
     m_menu->addActions(addMenu->actions());
 }
 
-void ProjectList::setupGeneratorMenu(QMenu *addMenu)
+void ProjectList::setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu)
 {
     if (!addMenu) return;
     QMenu *menu = m_addButton->menu();
@@ -158,6 +158,8 @@ void ProjectList::setupGeneratorMenu(QMenu *addMenu)
 
     m_menu->addMenu(addMenu);
     if (addMenu->isEmpty()) addMenu->setEnabled(false);
+    m_menu->addMenu(transcodeMenu);
+    if (transcodeMenu->isEmpty()) transcodeMenu->setEnabled(false);
     m_menu->addAction(m_reloadAction);
     m_menu->addAction(m_editAction);
     m_menu->addAction(m_openAction);
@@ -166,7 +168,7 @@ void ProjectList::setupGeneratorMenu(QMenu *addMenu)
 }
 
 
-QByteArray ProjectList::headerInfo()
+QByteArray ProjectList::headerInfo() const
 {
     return m_listView->header()->saveState();
 }
@@ -887,4 +889,11 @@ void ProjectList::slotSelectClip(const QString &ix)
     }
 }
 
+QString ProjectList::currentClipUrl() const
+{
+    ProjectItem *item = static_cast <ProjectItem*>(m_listView->currentItem());
+    if (item == NULL) return QString();
+    return item->clipUrl().path();
+}
+
 #include "projectlist.moc"
index b046757a4978808cf0c8a5730afc8a06e7af700c..c52491c9a0e301687794e512d2e1fe80995ecdc3 100644 (file)
@@ -124,10 +124,11 @@ public:
     void setRenderer(Render *projectRender);
     void slotUpdateClipProperties(const QString &id, QMap <QString, QString> properties);
     void updateAllClips();
-    QByteArray headerInfo();
+    QByteArray headerInfo() const;
     void setHeaderInfo(const QByteArray &state);
     void setupMenu(QMenu *addMenu, QAction *defaultAction);
-    void setupGeneratorMenu(QMenu *addMenu);
+    void setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu);
+    QString currentClipUrl() const;
 
 public slots:
     void setDocument(KdenliveDoc *doc);
diff --git a/src/widgets/configtranscode_ui.ui b/src/widgets/configtranscode_ui.ui
new file mode 100644 (file)
index 0000000..78e7a4a
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ConfigTranscode_UI</class>
+ <widget class="QWidget" name="ConfigTranscode_UI">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>440</width>
+    <height>237</height>
+   </rect>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0" colspan="3">
+    <widget class="QTreeWidget" name="profiles_list">
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+     <property name="allColumnsShowFocus">
+      <bool>true</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string>Name</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>FFmpeg parameters</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QPushButton" name="button_add">
+     <property name="text">
+      <string>Add Profile</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QPushButton" name="button_delete">
+     <property name="text">
+      <string>Delete Profile</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="2">
+    <spacer name="horizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>213</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>