#include "interfaces.h"
#include "config-kdenlive.h"
#include "cliptranscode.h"
+#include "clipstabilize.h"
#include "ui_templateclip_ui.h"
#include "colorscopes/vectorscope.h"
#include "colorscopes/waveform.h"
connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor(const QString &)));
connect(m_projectList, SIGNAL(findInTimeline(const QString&)), this, SLOT(slotClipInTimeline(const QString&)));
connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_projectList, SLOT(slotUpdateClipCut(QPoint)));
+ connect(m_clipMonitor, SIGNAL(extractZone(const QString &, QPoint)), m_projectList, SLOT(slotCutClipJob(const QString &, QPoint)));
m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this);
m_projectMonitorDock->setObjectName("project_monitor");
connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
connect(m_recMonitor, SIGNAL(addProjectClipList(KUrl::List)), this, SLOT(slotAddProjectClipList(KUrl::List)));
connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int)));
+
#endif /* ! Q_WS_MAC */
m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor, m_recMonitor);
m_effectStack = new EffectStackView(m_projectMonitor);
m_effectStackDock->setWidget(m_effectStack);
addDockWidget(Qt::TopDockWidgetArea, m_effectStackDock);
+ connect(m_effectStack, SIGNAL(startFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&)));
m_transitionConfigDock = new QDockWidget(i18n("Transition"), this);
m_transitionConfigDock->setObjectName("transition");
clipInTimeline->setIcon(KIcon("go-jump"));
QHash<QString,QMenu*> menus;
menus.insert("addMenu",static_cast<QMenu*>(factory()->container("generators", this)));
+ menus.insert("extractAudioMenu",static_cast<QMenu*>(factory()->container("extract_audio", this)));
menus.insert("transcodeMenu",static_cast<QMenu*>(factory()->container("transcoders", this)));
menus.insert("stabilizeMenu",static_cast<QMenu*>(factory()->container("stabilize", this)));
menus.insert("inTimelineMenu",clipInTimeline);
disconnect(m_activeTimeline->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay()));
disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, bool, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool, const int)));
+ disconnect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap)));
+
disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor()));
disconnect(m_activeTimeline, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int)));
disconnect(m_activeTimeline, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int)));
connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(ClipItem*)));
connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(Transition*)));
+
+ connect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap)), trackView->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap)));
connect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int)));
connect(m_effectStack, SIGNAL(updateClipRegion(ClipItem*, int, QString)), trackView->projectView(), SLOT(slotUpdateClipRegion(ClipItem*, int, QString)));
// Update list of transcoding profiles
loadTranscoders();
- loadStabilize();
+ loadStabilize();
#ifdef USE_JOGSHUTTLE
activateShuttleDevice();
#endif
void MainWindow::loadStabilize()
{
QMenu* stabMenu= static_cast<QMenu*>(factory()->container("stabilize", this));
- stabMenu->clear();
- Mlt::Profile profile;
- if (Mlt::Factory::filter(profile,(char*)"videostab")){
- QAction *action=stabMenu->addAction("Videostab (vstab)");
- action->setData("videostab");
- connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize()));
- }
- if (Mlt::Factory::filter(profile,(char*)"videostab2")){
- QAction *action=stabMenu->addAction("Videostab (transcode)");
- action->setData("videostab2");
- connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize()));
+ if (stabMenu){
+ stabMenu->clear();
+ Mlt::Profile profile;
+ if (Mlt::Factory::filter(profile,(char*)"videostab")){
+ QAction *action=stabMenu->addAction("Videostab (vstab)");
+ action->setData("videostab");
+ connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize()));
+ }
+ if (Mlt::Factory::filter(profile,(char*)"videostab2")){
+ QAction *action=stabMenu->addAction("Videostab (transcode)");
+ action->setData("videostab2");
+ connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize()));
+ }
}
{
QMenu *transMenu = static_cast<QMenu*>(factory()->container("transcoders", this));
transMenu->clear();
+
+ QMenu *extractAudioMenu = static_cast<QMenu*>(factory()->container("extract_audio", this));
+ extractAudioMenu->clear();
KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc");
KConfigGroup transConfig(config, "Transcoding");
QMapIterator<QString, QString> i(profiles);
while (i.hasNext()) {
i.next();
- QStringList data = i.value().split(";", QString::SkipEmptyParts);
- QAction *a = transMenu->addAction(i.key());
+ QStringList data = i.value().split(";");
+ QAction *a;
+ // separate audio transcoding in a separate menu
+ if (data.count() > 2 && data.at(2) == "audio") {
+ a = extractAudioMenu->addAction(i.key());
+ }
+ else {
+ a = transMenu->addAction(i.key());
+ }
a->setData(data);
- if (data.count() > 1)
- a->setToolTip(data.at(1));
+ if (data.count() > 1) a->setToolTip(data.at(1));
connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode()));
}
}
void MainWindow::slotStabilize(KUrl::List urls)
{
- QString condition;
- if (urls.isEmpty()) {
+ QString condition,filtername;
+
+ if (urls.isEmpty()) {
QAction *action = qobject_cast<QAction *>(sender());
- if (action){
- QString filtername=action->data().toString();
- urls = m_projectList->getConditionalUrls(condition);
- }
+ if (action){
+ filtername=action->data().toString();
+ urls = m_projectList->getConditionalUrls(condition);
+ }
+ }
+ if (urls.isEmpty()) {
+ m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage);
+ return;
}
+ Mlt::Profile profile;
+ Mlt::Filter filter(profile,filtername.toUtf8().data());
+ ClipStabilize *d=new ClipStabilize(urls,filtername,&filter);
+ connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
+ d->show();
+
}
void MainWindow::slotTranscode(KUrl::List urls)
QStringList data = action->data().toStringList();
params = data.at(0);
if (data.count() > 1) desc = data.at(1);
- if (data.count() > 2) condition = data.at(2);
- urls << m_projectList->getConditionalUrls(condition);
- urls.removeAll(KUrl());
+ if (data.count() > 3) condition = data.at(3);
+ QStringList ids = m_projectList->getConditionalIds(condition);
+ m_projectList->slotTranscodeClipJob(ids, params, desc);
+ return;
}
if (urls.isEmpty()) {
m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage);
ClipTranscode *d = new ClipTranscode(urls, params, desc);
connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
d->show();
- //QProcess::startDetached("ffmpeg", parameters);
}
void MainWindow::slotTranscodeClip()
void MainWindow::slotUpdateColorScopes()
{
bool request = false;
- kDebug()<<"// UPDATE SCOPES";
for (int i = 0; i < m_gfxScopesList.count(); i++) {
// Check if we need the renderer to send a new frame for update
if (!m_gfxScopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->autoRefreshEnabled())) request = true;
if (request && m_monitorManager->activeRenderer()) {
m_monitorManager->activeRenderer()->sendFrameUpdate();
}
+ if (m_audiosignal->isVisible() && m_recMonitor->abstractRender()) {
+ connect(m_recMonitor->abstractRender(), SIGNAL(audioSamplesSignal(const QVector<int16_t>&, const int&, const int&, const int&)), m_audiosignal, SLOT(slotReceiveAudio(const QVector<int16_t>&, const int&, const int&, const int&)));
+ }
}
void MainWindow::slotClearColorScopes()
kDebug()<<"-----------------------------------------\n"<<"Time elapsed: "<<m_timer.elapsed()<<"\n-------------------------";
}
+
#include "mainwindow.moc"
#ifdef DEBUG_MAINW