From: Jean-Baptiste Mardelle Date: Thu, 29 Dec 2011 15:57:06 +0000 (+0100) Subject: Introduce MLT clip analysis, can now be used for getting auto normalize data in sox... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=d43bad100aefbcb4e40a5fb1062c7fdf1c6d03f6;p=kdenlive Introduce MLT clip analysis, can now be used for getting auto normalize data in sox gain effect --- diff --git a/effects/sox_gain.xml b/effects/sox_gain.xml index d43f91ee..4a0e5adb 100644 --- a/effects/sox_gain.xml +++ b/effects/sox_gain.xml @@ -3,7 +3,10 @@ Sox Gain Sox gain audio effect http://sox.sourceforge.net - + Gain + + Normalize + diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 1ec88d5c..fd6d7084 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -1896,7 +1896,7 @@ void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedE return; } QDomElement effect = insertedEffect.cloneNode().toElement(); - //kDebug() << "// update effect ix: " << effect.attribute("kdenlive_ix")<<", TRACK: "<fps()), track); + if (clip == NULL) { + emit displayMessage(i18n("Cannot find clip for effect update %1.", filter), ErrorMessage); + return; + } + QDomElement newEffect; + QDomElement effect = clip->getEffectAt(clip->selectedEffectIndex()); + if (effect.attribute("id") == filter) { + newEffect = effect.cloneNode().toElement(); + QMap::const_iterator i = filterParams.constBegin(); + while (i != filterParams.constEnd()) { + EffectsList::setParameter(newEffect, i.key(), i.value()); + kDebug()<<"// RESULT FILTER: "<tracksCount() - clip->track(), clip->startPos(), effect, newEffect, clip->selectedEffectIndex(), true); + m_commandStack->push(command); + emit clipItemSelected(clip, clip->selectedEffectIndex()); + } + +} + + diff --git a/src/customtrackview.h b/src/customtrackview.h index dea6e8df..747d490b 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -451,6 +451,8 @@ private slots: * @param id The clip's Id string. * @param resetThumbs Should we recreate the timeline thumbnails. */ void slotRefreshThumbs(const QString &id, bool resetThumbs); + /** @brief A Filter job producer results. */ + void slotGotFilterJobResults(const QString &id, int startPos, int track, const QString &filter, stringMap filterParams); signals: void cursorMoved(int, int); diff --git a/src/effectstackedit.cpp b/src/effectstackedit.cpp index c274a8f8..2f3d1d8d 100644 --- a/src/effectstackedit.cpp +++ b/src/effectstackedit.cpp @@ -910,7 +910,7 @@ void EffectStackEdit::slotStartFilterJobAction() QDomElement pa = namenode.item(i).toElement(); QString type = pa.attribute("type"); if (type == "filterjob") { - emit startFilterJob(pa.attribute("filtertag"), pa.attribute("filterparams"), pa.attribute("consumer"), pa.attribute("consumerparams"), pa.attribute("wantedproperties")); + emit startFilterJob(pa.attribute("filtertag"), pa.attribute("filterparams"), pa.attribute("finalfilter"), pa.attribute("consumer"), pa.attribute("consumerparams"), pa.attribute("wantedproperties")); kDebug()<<" - - -PROPS:\n"<isChecked()); } -void EffectStackView::slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&consumer, const QString&consumerParams, const QString&properties) +void EffectStackView::slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QString&properties) { if (!m_clipref) return; - emit startFilterJob(m_clipref->clipProducer(), filterName, filterParams, consumer, consumerParams, properties); + emit startFilterJob(m_clipref->info(), m_clipref->clipProducer(), filterName, filterParams, finalFilterName, consumer, consumerParams, properties); } #include "effectstackview.moc" diff --git a/src/effectstackview.h b/src/effectstackview.h index e3412bd4..c2a4e2bd 100644 --- a/src/effectstackview.h +++ b/src/effectstackview.h @@ -143,7 +143,7 @@ private slots: void slotShowComments(); /** @brief Triggers a filter job on this clip. */ - void slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&consumer, const QString&consumerParams, const QString&properties); + void slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QString&properties); signals: void removeEffect(ClipItem*, int, QDomElement); @@ -164,7 +164,7 @@ signals: void updateClipRegion(ClipItem*, int, QString); void displayMessage(const QString&, int); void showComments(bool show); - void startFilterJob(const QString &clipId, const QString &filterName, const QString &filterParams, const QString &consumer, const QString &consumerParams, const QString &properties); + void startFilterJob(ItemInfo info, const QString &clipId, const QString &filterName, const QString &filterParams, const QString&finalFilterName, const QString &consumer, const QString &consumerParams, const QString &properties); }; #endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 164d5fe5..72d3897e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -269,7 +269,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_effectStack = new EffectStackView(m_projectMonitor); m_effectStackDock->setWidget(m_effectStack); addDockWidget(Qt::TopDockWidgetArea, m_effectStackDock); - connect(m_effectStack, SIGNAL(startFilterJob(const QString&,const QString&,const QString&,const QString&,const QString&,const QString&)), m_projectList, SLOT(slotStartFilterJob(const QString&,const QString&,const QString&,const QString&,const QString&,const QString&))); + 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"); @@ -2488,6 +2488,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha 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))); @@ -2568,6 +2570,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha 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))); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index fb481bd7..bfbfd78a 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -2832,6 +2832,7 @@ void ProjectList::slotProcessJobs() } connect(job, SIGNAL(jobProgress(QString, int, int)), this, SIGNAL(processLog(QString, int, int))); connect(job, SIGNAL(cancelRunningJob(const QString, stringMap)), this, SIGNAL(cancelRunningJob(const QString, stringMap))); + connect(job, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap))); if (job->jobType == MLTJOB) { MeltJob *jb = static_cast (job); @@ -3247,13 +3248,13 @@ void ProjectList::discardJobs(const QString &id, JOBTYPE type) { } } -void ProjectList::slotStartFilterJob(const QString&id, const QString&filterName, const QString&filterParams, const QString&consumer, const QString&consumerParams, const QString&properties) +void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QString&properties) { ProjectItem *item = getItemById(id); if (!item) return; QStringList jobParams; - jobParams << filterName << filterParams << consumer << consumerParams << properties; - kDebug()<<"// STARTING JOB: "<clipType(), id, jobParams); if (job->isExclusive() && hasPendingJob(item, job->jobType)) { delete job; diff --git a/src/projectlist.h b/src/projectlist.h index 1fb55de7..785cbff5 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -303,7 +303,7 @@ public slots: void slotCutClipJob(const QString &id, QPoint zone); void slotTranscodeClipJob(QStringList ids, QString params, QString desc); /** @brief Start an MLT process job. */ - void slotStartFilterJob(const QString&,const QString&,const QString&,const QString&,const QString&,const QString&); + void slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&); private: ProjectListView *m_listView; @@ -483,6 +483,8 @@ signals: void updateJobStatus(const QString, int, int, const QString &label = QString(), const QString &actionName = QString(), const QString details = QString()); void gotProxy(const QString); void checkJobProcess(); + /** @brief A Filter Job produced results, send them back to the clip. */ + void gotFilterJobResults(const QString &id, int startPos, int track, const QString &filterName, stringMap params); }; #endif diff --git a/src/projecttree/abstractclipjob.h b/src/projecttree/abstractclipjob.h index 26c46a6d..fdd049c8 100644 --- a/src/projecttree/abstractclipjob.h +++ b/src/projecttree/abstractclipjob.h @@ -59,6 +59,7 @@ protected: signals: void jobProgress(QString, int, int); void cancelRunningJob(const QString, stringMap); + void gotFilterJobResults(const QString &id, int startPos, int track, const QString &filterName, stringMap params); }; diff --git a/src/projecttree/meltjob.cpp b/src/projecttree/meltjob.cpp index 7e239e20..97fe6169 100644 --- a/src/projecttree/meltjob.cpp +++ b/src/projecttree/meltjob.cpp @@ -57,11 +57,25 @@ void MeltJob::startJob() setStatus(JOBCRASHED); return; } + int in = m_params.takeFirst().toInt(); + int out = m_params.takeFirst().toInt(); QString filter = m_params.takeFirst(); QString filterParams = m_params.takeFirst(); QString consumer = m_params.takeFirst(); QString consumerParams = m_params.takeFirst(); QString properties = m_params.takeFirst(); + int startPos = m_params.takeFirst().toInt(); + int track = m_params.takeFirst().toInt(); + QString finalFilter; + if (!m_params.isEmpty()) finalFilter = m_params.takeFirst(); + else finalFilter = filter; + + if (out <= in) { + m_errorMessage.append(i18n("Clip zone undefined (%1 - %2).", in, out)); + setStatus(JOBCRASHED); + return; + } + Mlt::Producer *prod = m_producer->cut(in, out); m_profile = m_producer->profile(); m_consumer = new Mlt::Consumer(*m_profile, consumer.toUtf8().constData()); if (!m_consumer || !m_consumer->is_valid()) { @@ -88,25 +102,29 @@ void MeltJob::startJob() mltFilter.set(data.section('=', 0, 0).toUtf8().constData(), data.section('=', 1, 1).toUtf8().constData()); } } - m_producer->attach(mltFilter); - m_length = m_producer->get_length(); - m_consumer->connect(*m_producer); - m_producer->set_speed(0); - m_producer->seek(0); + prod->attach(mltFilter); + m_length = prod->get_length(); + m_consumer->connect(*prod); + prod->set_speed(0); + prod->seek(0); m_showFrameEvent = m_consumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_render); m_consumer->start(); - m_producer->set_speed(1); + prod->set_speed(1); while (jobStatus != JOBABORTED && !m_consumer->is_stopped()) { } m_consumer->stop(); QStringList wanted = properties.split(',', QString::SkipEmptyParts); + stringMap jobResults; foreach(const QString key, wanted) { QString value = mltFilter.get(key.toUtf8().constData()); + jobResults.insert(key, value); kDebug()<<"RESULT: "<