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
#include <QDir>
#include <QTimer>
+#include <QTreeWidgetItem>
#include <stdlib.h>
#include <stdio.h>
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");
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
updatePreview = true;
}
+ // TODO: only save profiles if modified
+ saveTranscodeProfiles();
+
KConfigDialog::updateSettings();
if (resetProfile) emit doResetProfile();
if (updatePreview) emit updatePreviewSettings();
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"
#include "ui_configcapture_ui.h"
#include "ui_configjogshuttle_ui.h"
#include "ui_configsdl_ui.h"
+#include "ui_configtranscode_ui.h"
class KdenliveSettingsDialog : public KConfigDialog
{
void slotReadAudioDevices();
void slotUpdateRmdRegionStatus();
void slotCheckAlsaDriver();
+ void slotAddTranscode();
+ void slotDeleteTranscode();
private:
KPageWidgetItem *m_page1;
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();
<?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" />
<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>
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;
}*/
}
+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"
bool m_findActivated;
QString m_findString;
QTimer m_findTimer;
+ QProcess m_transcodeProcess;
void readOptions();
void saveOptions();
void aboutPlugins();
QStringList m_pluginFileNames;
QByteArray m_timelineState;
+ void loadTranscoders();
public slots:
void openFile(const KUrl &url);
void slotUpdateClipType(QAction *action);
void slotShowTimeline(bool show);
void slotMaximizeCurrent(bool show);
+ void slotTranscode();
+ void slotShowTranscodeInfo();
signals:
Q_SCRIPTABLE void abortRenderJob(const QString &url);
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();
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);
}
-QByteArray ProjectList::headerInfo()
+QByteArray ProjectList::headerInfo() const
{
return m_listView->header()->saveState();
}
}
}
+QString ProjectList::currentClipUrl() const
+{
+ ProjectItem *item = static_cast <ProjectItem*>(m_listView->currentItem());
+ if (item == NULL) return QString();
+ return item->clipUrl().path();
+}
+
#include "projectlist.moc"
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);
--- /dev/null
+<?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>