From 1dd4e9ce2f4ad2b7b7b5ab42f6c01ad414bc41ea Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 19 May 2009 08:37:19 +0000 Subject: [PATCH] Start GUI for clip transcoding svn path=/trunk/kdenlive/; revision=3396 --- src/CMakeLists.txt | 1 + src/kdenlivesettingsdialog.cpp | 54 ++++++++++++++++++++++++ src/kdenlivesettingsdialog.h | 7 ++++ src/kdenliveui.rc | 4 +- src/mainwindow.cpp | 58 +++++++++++++++++++++++++- src/mainwindow.h | 4 ++ src/projectlist.cpp | 13 +++++- src/projectlist.h | 5 ++- src/widgets/configtranscode_ui.ui | 68 +++++++++++++++++++++++++++++++ 9 files changed, 208 insertions(+), 6 deletions(-) create mode 100644 src/widgets/configtranscode_ui.ui diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 34a4e1cd..20a27854 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 diff --git a/src/kdenlivesettingsdialog.cpp b/src/kdenlivesettingsdialog.cpp index a8b2a609..15b14209 100644 --- a/src/kdenlivesettingsdialog.cpp +++ b/src/kdenlivesettingsdialog.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -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 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" diff --git a/src/kdenlivesettingsdialog.h b/src/kdenlivesettingsdialog.h index a0da7569..3266c98f 100644 --- a/src/kdenlivesettingsdialog.h +++ b/src/kdenlivesettingsdialog.h @@ -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(); diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index a776cef6..bc3fdf2f 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -1,6 +1,6 @@ - + Extra Toolbar @@ -23,6 +23,8 @@ + Transcode + Generators Tracks diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 19161222..15adae1b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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(factory()->container("monitor_go", this)), m_playZone, m_loopZone); m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast(factory()->container("marker_menu", this))); - m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this))); + m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this)), static_cast(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(factory()->container("transcoders", this)); + transMenu->clear(); + KSharedConfigPtr config = KGlobal::config(); + KConfigGroup transConfig(config, "Transcoding"); + // read the entries + QMap< QString, QString > profiles = transConfig.entryMap(); + QMapIterator 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(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" diff --git a/src/mainwindow.h b/src/mainwindow.h index 0d7d846f..3e563f2e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -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); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 20ab1d4b..5092babf 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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 (m_listView->currentItem()); + if (item == NULL) return QString(); + return item->clipUrl().path(); +} + #include "projectlist.moc" diff --git a/src/projectlist.h b/src/projectlist.h index b046757a..c52491c9 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -124,10 +124,11 @@ public: void setRenderer(Render *projectRender); void slotUpdateClipProperties(const QString &id, QMap 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 index 00000000..78e7a4ad --- /dev/null +++ b/src/widgets/configtranscode_ui.ui @@ -0,0 +1,68 @@ + + + ConfigTranscode_UI + + + + 0 + 0 + 440 + 237 + + + + + + + true + + + false + + + true + + + + Name + + + + + FFmpeg parameters + + + + + + + + Add Profile + + + + + + + Delete Profile + + + + + + + Qt::Horizontal + + + + 213 + 20 + + + + + + + + + -- 2.39.2