From: Jean-Baptiste M. <jb...@kd...> - 2012-10-24 14:10:16
|
Git commit 515478642cdca3a049c55d4cccbcafef823a4f5d by Jean-Baptiste Mardelle. Committed on 24/10/2012 at 16:09. Pushed by mardelle into branch 'master'. Cleanup filter jobs M +12 -1 effects/automask.xml M +3 -1 effects/sox_gain.xml M +5 -4 src/customtrackview.cpp M +1 -1 src/customtrackview.h M +12 -1 src/docclipbase.cpp M +1 -1 src/effectstack/collapsibleeffect.cpp M +1 -1 src/effectstack/collapsibleeffect.h M +3 -3 src/effectstack/effectstackview2.cpp M +2 -2 src/effectstack/effectstackview2.h M +7 -2 src/effectstack/parametercontainer.cpp M +1 -1 src/effectstack/parametercontainer.h M +3 -3 src/mainwindow.cpp M +26 -34 src/projectlist.cpp M +4 -4 src/projectlist.h M +7 -22 src/projecttree/meltjob.cpp M +3 -3 src/projecttree/meltjob.h http://commits.kde.org/kdenlive/515478642cdca3a049c55d4cccbcafef823a4f5d diff --git a/effects/automask.xml b/effects/automask.xml index ae2c51e..ae68503 100644 --- a/effects/automask.xml +++ b/effects/automask.xml @@ -12,6 +12,12 @@ <parameter type="constant" name="motion_est.macroblock_height" max="100" min="1" default="16" suffix="pixels"> <name>Macroblock height</name> </parameter> + <parameter type="constant" name="motion_est.limit_x" max="500" min="1" default="64" suffix="pixels"> + <name>Maximum x distance</name> + </parameter> + <parameter type="constant" name="motion_est.limit_y" max="500" min="1" default="64" suffix="pixels"> + <name>Maximum y distance</name> + </parameter> <parameter type="bool" name="motion_est.denoise" default="0"> <name>Denoise</name> </parameter> @@ -21,7 +27,12 @@ <parameter type="bool" name="obscure" default="1"> <name>Obscure</name> </parameter> - <parameter type="filterjob" filtertag="autotrack_rectangle" filterparams="_serialize=1 motion_vector_list=0 %params" consumer="null" consumerparams="all=1 terminate_on_pause=1" finalfilter="autotrack_rectangle" extraparams="key:motion_vector_list projecttreefilter storedata"> + <parameter type="filterjob" filtertag="autotrack_rectangle" filterparams="_serialize=1 motion_vector_list=0 %params" consumer="null" consumerparams="all=1 terminate_on_pause=1"> + <jobparam name="storedata" /> + <jobparam name="projecttreefilter" /> + <jobparam name="key">motion_vector_list</jobparam> + <jobparam name="finalfilter">autotrack_rectangle</jobparam> + <jobparam name="displaydataname">Motion vectors</jobparam> <name>Analyse</name> </parameter> </effect> diff --git a/effects/sox_gain.xml b/effects/sox_gain.xml index 0a67a67..11f7a8d 100644 --- a/effects/sox_gain.xml +++ b/effects/sox_gain.xml @@ -6,7 +6,9 @@ <parameter type="double" name="gain" max="50" min="-50" default="5.00" decimals="2"> <name>Gain</name> </parameter> - <parameter type="filterjob" filtertag="sox:analysis" filterparams="" consumer="null" consumerparams="video_off=1 all=1 terminate_on_pause=1" extraparams="key:gain" finalfilter="sox_gain"> + <parameter type="filterjob" filtertag="sox:analysis" filterparams="" consumer="null" consumerparams="video_off=1 all=1 terminate_on_pause=1"> + <jobparam name="key">gain</jobparam> + <jobparam name="finalfilter">sox_gain</jobparam> <name>Normalize</name> </parameter> </effect> diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index a0833a0..cba00f1 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -2684,7 +2684,8 @@ void CustomTrackView::dropEvent(QDropEvent * event) groupSelectedItems(true); } else if (items.count() == 1) { m_dragItem = static_cast <AbstractClipItem *>(items.at(0)); - emit clipItemSelected((ClipItem*)m_dragItem, false); + ClipItem *selected = static_cast <ClipItem*>(m_dragItem); + emit clipItemSelected(selected, false); } event->setDropAction(Qt::MoveAction); event->accept(); @@ -7491,16 +7492,16 @@ void CustomTrackView::adjustEffects(ClipItem* item, ItemInfo oldInfo, QUndoComma } -void CustomTrackView::slotGotFilterJobResults(const QString &/*id*/, int startPos, int track, const QString &filter, stringMap filterParams, QStringList extra) +void CustomTrackView::slotGotFilterJobResults(const QString &/*id*/, int startPos, int track, stringMap filterParams, stringMap extra) { ClipItem *clip = getClipItemAt(GenTime(startPos, m_document->fps()), track); if (clip == NULL) { - emit displayMessage(i18n("Cannot find clip for effect update %1.", filter), ErrorMessage); + emit displayMessage(i18n("Cannot find clip for effect update %1.", extra.value("finalfilter")), ErrorMessage); return; } QDomElement newEffect; QDomElement effect = clip->getEffectAtIndex(clip->selectedEffectIndex()); - if (effect.attribute("id") == filter) { + if (effect.attribute("id") == extra.value("finalfilter")) { newEffect = effect.cloneNode().toElement(); QMap<QString, QString>::const_iterator i = filterParams.constBegin(); while (i != filterParams.constEnd()) { diff --git a/src/customtrackview.h b/src/customtrackview.h index 74f9b9e..3312e74 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -495,7 +495,7 @@ private slots: * @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, QStringList extra); + void slotGotFilterJobResults(const QString &id, int startPos, int track, stringMap filterParams, stringMap extra); signals: diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 5dd95e5..5f2f01a 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -1279,7 +1279,18 @@ QImage DocClipBase::extractImage(int frame, int width, int height) void DocClipBase::setAnalysisData(const QString &name, const QString &data) { if (data.isEmpty()) m_analysisdata.remove(name); - else m_analysisdata.insert(name, data); + else { + if (m_analysisdata.contains(name)) { + int i = 1; + QString newname = name + " " + QString::number(i); + while (m_analysisdata.contains(newname)) { + i++; + newname = name + " " + QString::number(i); + } + m_analysisdata.insert(newname, data); + } + else m_analysisdata.insert(name, data); + } } QMap <QString, QString> DocClipBase::analysisData() const diff --git a/src/effectstack/collapsibleeffect.cpp b/src/effectstack/collapsibleeffect.cpp index 7ca8237..70733f3 100644 --- a/src/effectstack/collapsibleeffect.cpp +++ b/src/effectstack/collapsibleeffect.cpp @@ -455,7 +455,7 @@ void CollapsibleEffect::setupWidget(ItemInfo info, EffectMetaInfo *metaInfo) } connect (m_paramWidget, SIGNAL(parameterChanged(const QDomElement, const QDomElement, int)), this, SIGNAL(parameterChanged(const QDomElement, const QDomElement, int))); - connect(m_paramWidget, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QStringList)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QStringList))); + connect(m_paramWidget, SIGNAL(startFilterJob(QString,QString,QString,QString,const QMap <QString, QString>)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,const QMap <QString, QString>))); connect (this, SIGNAL(syncEffectsPos(int)), m_paramWidget, SIGNAL(syncEffectsPos(int))); connect (m_paramWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int))); diff --git a/src/effectstack/collapsibleeffect.h b/src/effectstack/collapsibleeffect.h index 54daa70..0d05354 100644 --- a/src/effectstack/collapsibleeffect.h +++ b/src/effectstack/collapsibleeffect.h @@ -129,7 +129,7 @@ signals: void checkMonitorPosition(int); void seekTimeline(int); /** @brief Start an MLT filter job on this clip. */ - void startFilterJob(QString filterName, QString filterParams, QString finalFilterName, QString consumer, QString consumerParams, QStringList extraParams); + void startFilterJob(QString filterName, QString filterParams, QString consumer, QString consumerParams, const QMap <QString, QString>extraParams); /** @brief An effect was reset, trigger param reload. */ void resetEffect(int ix); /** @brief Ask for creation of a group. */ diff --git a/src/effectstack/effectstackview2.cpp b/src/effectstack/effectstackview2.cpp index 7366b75..69c28d7 100644 --- a/src/effectstack/effectstackview2.cpp +++ b/src/effectstack/effectstackview2.cpp @@ -271,7 +271,7 @@ void EffectStackView2::connectEffect(CollapsibleEffect *currentEffect) // Check drag & drop currentEffect->installEventFilter( this ); connect(currentEffect, SIGNAL(parameterChanged(const QDomElement, const QDomElement, int)), this , SLOT(slotUpdateEffectParams(const QDomElement, const QDomElement, int))); - connect(currentEffect, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QStringList)), this , SLOT(slotStartFilterJob(QString,QString,QString,QString,QString,QStringList))); + connect(currentEffect, SIGNAL(startFilterJob(QString,QString,QString,QString,const QMap <QString, QString>)), this , SLOT(slotStartFilterJob(QString,QString,QString,QString,const QMap <QString, QString>))); connect(currentEffect, SIGNAL(deleteEffect(const QDomElement)), this , SLOT(slotDeleteEffect(const QDomElement))); connect(currentEffect, SIGNAL(reloadEffects()), this , SIGNAL(reloadEffects())); connect(currentEffect, SIGNAL(resetEffect(int)), this , SLOT(slotResetEffect(int))); @@ -644,10 +644,10 @@ void EffectStackView2::slotMoveEffectUp(QList <int> indexes, bool up) else emit changeEffectPosition(m_clipref, -1, indexes, endPos); } -void EffectStackView2::slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QStringList &extraParams) +void EffectStackView2::slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&consumer, const QString&consumerParams, const QMap <QString, QString> &extraParams) { if (!m_clipref) return; - emit startFilterJob(m_clipref->info(), m_clipref->clipProducer(), filterName, filterParams, finalFilterName, consumer, consumerParams, extraParams); + emit startFilterJob(m_clipref->info(), m_clipref->clipProducer(), filterName, filterParams, consumer, consumerParams, extraParams); } void EffectStackView2::slotResetEffect(int ix) diff --git a/src/effectstack/effectstackview2.h b/src/effectstack/effectstackview2.h index 6c87850..dd34fe0 100644 --- a/src/effectstack/effectstackview2.h +++ b/src/effectstack/effectstackview2.h @@ -167,7 +167,7 @@ private slots: void slotSetCurrentEffect(int ix); /** @brief Triggers a filter job on this clip. */ - void slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QStringList &extraParams); + void slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&consumer, const QString&consumerParams, const QMap <QString, QString> &extraParams); /** @brief Reset an effect to its default values. */ void slotResetEffect(int ix); @@ -223,7 +223,7 @@ signals: void updateClipRegion(ClipItem*, int, QString); void displayMessage(const QString&, int); void showComments(bool show); - void startFilterJob(ItemInfo info, const QString &clipId, const QString &filterName, const QString &filterParams, const QString&finalFilterName, const QString &consumer, const QString &consumerParams, const QStringList &extraParams); + void startFilterJob(ItemInfo info, const QString &clipId, const QString &filterName, const QString &filterParams, const QString &consumer, const QString &consumerParams, const QMap<QString, QString> &extraParams); void addEffect(ClipItem*,QDomElement); void importClipKeyframes(GRAPHICSRECTITEM = AVWIDGET); }; diff --git a/src/effectstack/parametercontainer.cpp b/src/effectstack/parametercontainer.cpp index bcaeec5..b3820c6 100644 --- a/src/effectstack/parametercontainer.cpp +++ b/src/effectstack/parametercontainer.cpp @@ -820,8 +820,13 @@ void ParameterContainer::slotStartFilterJobAction() paramData.append(parameters.at(j).name()+"="+parameters.at(j).value()+" "); filterparams.replace("%params", paramData); } - QStringList extra = pa.attribute("extraparams").split(' ', QString::SkipEmptyParts); - emit startFilterJob(pa.attribute("filtertag"), filterparams, pa.attribute("finalfilter"), pa.attribute("consumer"), pa.attribute("consumerparams"), extra); + QMap <QString, QString> extraParams; + QDomNodeList jobparams = pa.elementsByTagName("jobparam"); + for (int j = 0; j < jobparams.count(); j++) { + QDomElement e = jobparams.item(j).toElement(); + extraParams.insert(e.attribute("name"), e.text().toUtf8()); + } + emit startFilterJob(pa.attribute("filtertag"), filterparams, pa.attribute("consumer"), pa.attribute("consumerparams"), extraParams); kDebug()<<" - - -PROPS:\n"<<pa.attribute("filtertag")<<"-"<< filterparams<<"-"<< pa.attribute("consumer")<<"-"<< pa.attribute("consumerparams")<<"-"<< pa.attribute("extraparams"); break; } diff --git a/src/effectstack/parametercontainer.h b/src/effectstack/parametercontainer.h index 178180d..92b8dcb 100644 --- a/src/effectstack/parametercontainer.h +++ b/src/effectstack/parametercontainer.h @@ -104,7 +104,7 @@ signals: void seekTimeline(int); void showComments(bool); /** @brief Start an MLT filter job on this clip. */ - void startFilterJob(QString filterName, QString filterParams, QString finalFilterName, QString consumer, QString consumerParams, QStringList extra); + void startFilterJob(QString filterName, QString filterParams, QString consumer, QString consumerParams, const QMap <QString, QString>extra); /** @brief Request import of keyframes from clip data. */ void importClipKeyframes(); }; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6aee688..49bf501 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -280,7 +280,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_effectStack = new EffectStackView2(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 QStringList&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QStringList&))); + connect(m_effectStack, SIGNAL(startFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QMap <QString, QString>&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QMap <QString, QString>&))); m_transitionConfigDock = new QDockWidget(i18n("Transition"), this); m_transitionConfigDock->setObjectName("transition"); @@ -2523,7 +2523,7 @@ 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,QStringList)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap,QStringList))); + disconnect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, stringMap,stringMap)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, stringMap, stringMap))); disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(slotActivateMonitor())); disconnect(m_activeTimeline, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int))); @@ -2605,7 +2605,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha 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,QStringList)), trackView->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap,QStringList))); + connect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, stringMap,stringMap)), trackView->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, stringMap,stringMap))); connect(m_projectList, SIGNAL(addMarkers(const QString &, QList <CommentedTime>)), trackView->projectView(), SLOT(slotAddClipMarker(const QString &, QList <CommentedTime>))); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 70ea5a1..022b197 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -3009,9 +3009,9 @@ void ProjectList::slotProcessJobs() MeltJob *jb = static_cast<MeltJob *> (job); jb->setProducer(currentClip->getProducer(), currentClip->fileURL()); if (jb->isProjectFilter()) - connect(job, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap,QStringList)), this, SLOT(slotGotFilterJobResults(QString,int, int, QString,stringMap,QStringList))); + connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SLOT(slotGotFilterJobResults(QString,int, int,stringMap,stringMap))); else - connect(job, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap,QStringList)), this, SIGNAL(gotFilterJobResults(QString,int, int, QString,stringMap,QStringList))); + connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int, int,stringMap,stringMap))); } job->startJob(); if (job->jobStatus == JOBDONE) { @@ -3436,19 +3436,19 @@ void ProjectList::discardJobs(const QString &id, JOBTYPE type) { } } -void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QStringList &extraParams) +void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QString&filterName, const QString&filterParams, const QString&consumer, const QString&consumerParams, const QMap <QString, QString> &extraParams) { ProjectItem *item = getItemById(id); if (!item) return; QStringList jobParams; jobParams << QString::number(info.cropStart.frames(m_fps)) << QString::number((info.cropStart + info.cropDuration).frames(m_fps)); - jobParams << QString() << filterName << filterParams << consumer << consumerParams << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track) << finalFilterName; + jobParams << QString() << filterName << filterParams << consumer << consumerParams << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track); MeltJob *job = new MeltJob(item->clipType(), id, jobParams, extraParams); if (job->isExclusive() && hasPendingJob(item, job->jobType)) { delete job; return; } - job->description = i18n("Filter %1", finalFilterName); + job->description = i18n("Filter %1", extraParams.value("finalfilter")); m_jobList.append(job); setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage()); slotCheckJobProcess(); @@ -3492,16 +3492,16 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c jobParams << filterName << "bounding=\"25%x25%:25%x25\" shot_change_list=0"; // Consumer jobParams << "null" << "all=1 terminate_on_pause=1 real_time=-1"; - QStringList extraParams; - extraParams << "key:shot_change_list"; - extraParams << "projecttreefilter"; + QMap <QString, QString> extraParams; + extraParams.insert("key", "shot_change_list"); + extraParams.insert("projecttreefilter", "1"); if (ui.add_markers->isChecked()) { // We want to create markers - extraParams << QString("addmarkers:%1").arg(ui.marker_type->currentIndex()); + extraParams.insert("addmarkers", QString::number(ui.marker_type->currentIndex())); } if (ui.cut_scenes->isChecked()) { // We want to cut scenes - extraParams << "cutscenes"; + extraParams.insert("cutscenes", "1"); } delete d; processClipJob(ids, QString(), false, jobParams, i18n("Auto split"), extraParams); @@ -3509,15 +3509,15 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c else { QPointer<ClipStabilize> d = new ClipStabilize(destination, ids.count(), filterName); if (d->exec() == QDialog::Accepted) { - QStringList extraParams; - extraParams << "producer_profile"; + QMap <QString, QString> extraParams; + extraParams.insert("producer_profile", "1"); processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc(), extraParams); } delete d; } } -void ProjectList::processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description, QStringList extraParams) +void ProjectList::processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description, QMap <QString, QString> extraParams) { QStringList preParams; // in and out @@ -3611,38 +3611,31 @@ void ProjectList::slotClosePopup() m_errorLog.clear(); } -void ProjectList::slotGotFilterJobResults(QString id, int , int , QString filter, stringMap results, QStringList extra) +void ProjectList::slotGotFilterJobResults(QString id, int , int , stringMap results, stringMap filterInfo) { + // Currently, only the first value of results is used + kDebug()<<"// FILTER RES:\n"<<filterInfo<<"\n--------------\n"<<results; ProjectItem *clip = getItemById(id); if (!clip) return; // Check for return value - QString returnKey; int markersType = -1; - for (int i = 0; i < extra.count(); i++) { - if (extra.at(i).startsWith("key:")) - returnKey = extra.at(i).section(':', 1); - if (extra.at(i).startsWith("addmarkers:")) { - markersType = extra.at(i).section(':', 1).toInt(); - } - } - if (returnKey.isEmpty()) { - emit displayMessage(i18n("No data returned from clip analysis"), ErrorMessage); - return; - } - QStringList returnData = results.value(returnKey).split(';', QString::SkipEmptyParts); - if (returnData.isEmpty()) { + if (filterInfo.contains("addmarkers")) markersType = filterInfo.value("addmarkers").toInt(); + if (results.isEmpty()) { emit displayMessage(i18n("No data returned from clip analysis"), ErrorMessage); return; } emit displayMessage(i18n("Processing data analysis"), InformationMessage); bool dataProcessed = false; - if (extra.contains("cutscenes")) { + QString key = filterInfo.value("key"); + QStringList value = results.value(key).split(';', QString::SkipEmptyParts); + kDebug()<<"// RESULT; "<<key<<" = "<<value; + if (filterInfo.contains("cutscenes")) { // Check if we want to cut scenes from returned data dataProcessed = true; int cutPos = 0; QUndoCommand *command = new QUndoCommand(); command->setText(i18n("Auto Split Clip")); - foreach (QString pos, returnData) { + foreach (QString pos, value) { if (!pos.contains("=")) continue; int newPos = pos.section("=", 0, 0).toInt(); // Don't use scenes shorter than 1 second @@ -3662,7 +3655,7 @@ void ProjectList::slotGotFilterJobResults(QString id, int , int , QString filter command->setText(i18n("Add Markers")); QList <CommentedTime> markersList; int index = 1; - foreach (QString pos, returnData) { + foreach (QString pos, value) { if (!pos.contains("=")) continue; int newPos = pos.section("=", 0, 0).toInt(); // Don't use scenes shorter than 1 second @@ -3674,10 +3667,9 @@ void ProjectList::slotGotFilterJobResults(QString id, int , int , QString filter } emit addMarkers(id, markersList); } - if (!dataProcessed || extra.contains("storedata")) { + if (!dataProcessed || filterInfo.contains("storedata")) { // Store returned data as clip extra data - - clip->referencedClip()->setAnalysisData(i18n("Motion vectors"), results.value(returnKey)); + clip->referencedClip()->setAnalysisData(filterInfo.contains("displaydataname") ? filterInfo.value("displaydataname") : key, results.value(key)); emit updateAnalysisData(clip->referencedClip()); } } diff --git a/src/projectlist.h b/src/projectlist.h index 1f906a5..ef290da 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -330,7 +330,7 @@ public slots: /** @brief Start transcoding selected clips. */ void slotTranscodeClipJob(const QString &condition, QString params, QString desc); /** @brief Start an MLT process job. */ - void slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QStringList&); + void slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QMap <QString, QString>&); void slotSetThumbnail(const QString &id, int framePos, QImage img); @@ -425,7 +425,7 @@ private: /** @brief Get the list of job names for current clip. */ QStringList getPendingJobs(const QString &id); /** @brief Start an MLT process job. */ - void processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description, QStringList extraParams = QStringList()); + void processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description, QMap <QString, QString>extraParams = QMap <QString, QString>()); private slots: void slotClipSelected(); @@ -492,7 +492,7 @@ private slots: /** @brief close warning info passive popup. */ void slotClosePopup(); /** @brief process clip job result. */ - void slotGotFilterJobResults(QString ,int , int, QString, stringMap, QStringList); + void slotGotFilterJobResults(QString ,int , int, stringMap, stringMap); signals: void clipSelected(DocClipBase *, QPoint zone = QPoint(), bool forceUpdate = false); @@ -525,7 +525,7 @@ signals: 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, QStringList extre); + void gotFilterJobResults(const QString &id, int startPos, int track, stringMap params, stringMap extra); void pauseMonitor(); void updateAnalysisData(DocClipBase *); void addMarkers(const QString &, QList <CommentedTime>); diff --git a/src/projecttree/meltjob.cpp b/src/projecttree/meltjob.cpp index ed170fd..5592607 100644 --- a/src/projecttree/meltjob.cpp +++ b/src/projecttree/meltjob.cpp @@ -35,7 +35,7 @@ static void consumer_frame_render(mlt_consumer, MeltJob * self, mlt_frame /*fram self->emitFrameNumber(); } -MeltJob::MeltJob(CLIPTYPE cType, const QString &id, QStringList parameters, QStringList extraParams) : AbstractClipJob(MLTJOB, cType, id, parameters), +MeltJob::MeltJob(CLIPTYPE cType, const QString &id, QStringList parameters, QMap <QString, QString>extraParams) : AbstractClipJob(MLTJOB, cType, id, parameters), addClipToProject(0), m_producer(NULL), m_profile(NULL), @@ -80,19 +80,7 @@ void MeltJob::startJob() if (!m_params.isEmpty()) startPos = m_params.takeFirst().toInt(); int track = -1; if (!m_params.isEmpty()) track = m_params.takeFirst().toInt(); - QString finalFilter; - if (!m_params.isEmpty()) finalFilter = m_params.takeFirst(); - else finalFilter = filter; - - // Check if we want to return analysis data - QString properties; - for (int i = 0; i < m_extra.count(); i++) { - if (m_extra.at(i).startsWith("key:")) { - properties = m_extra.at(i).section(':', 1); - break; - } - } - + if (!m_extra.contains("finalfilter")) m_extra.insert("finalfilter", filter); if (out != -1 && out <= in) { m_errorMessage.append(i18n("Clip zone undefined (%1 - %2).", in, out)); @@ -115,7 +103,7 @@ void MeltJob::startJob() prod = tmp->cut(in, out); delete tmp; } - if (m_extra.contains("prducer_profile")) { + if (m_extra.contains("producer_profile")) { m_profile->from_producer(*prod); m_profile->set_explicit(true); } @@ -174,13 +162,10 @@ void MeltJob::startJob() } 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); - } - if (!jobResults.isEmpty() && jobStatus != JOBABORTED) emit gotFilterJobResults(m_clipId, startPos, track, finalFilter, jobResults, m_extra); + QMap <QString, QString> jobResults; + if (m_extra.contains("key")) + jobResults.insert(m_extra.value("key"), mltFilter.get(m_extra.value("key").toUtf8().constData())); + if (!jobResults.isEmpty() && jobStatus != JOBABORTED) emit gotFilterJobResults(m_clipId, startPos, track, jobResults, m_extra); setStatus(JOBDONE); delete m_consumer; delete prod; diff --git a/src/projecttree/meltjob.h b/src/projecttree/meltjob.h index d373650..41671a6 100644 --- a/src/projecttree/meltjob.h +++ b/src/projecttree/meltjob.h @@ -41,7 +41,7 @@ class MeltJob : public AbstractClipJob Q_OBJECT public: - MeltJob(CLIPTYPE cType, const QString &id, QStringList parameters, QStringList extraParams = QStringList()); + MeltJob(CLIPTYPE cType, const QString &id, QStringList parameters, QMap <QString, QString> extraParams = QMap <QString, QString>()); virtual ~ MeltJob(); const QString destination() const; void startJob(); @@ -62,10 +62,10 @@ private: QString m_dest; QString m_url; int m_length; - QStringList m_extra; + QMap <QString, QString> m_extra; signals: - void gotFilterJobResults(const QString &id, int startPos, int track, const QString &filterName, stringMap params, QStringList extraParam); + void gotFilterJobResults(const QString &id, int startPos, int track, stringMap result, stringMap extra); }; #endif |