]> git.sesse.net Git - kdenlive/commitdiff
Cleanup filter jobs
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 24 Oct 2012 14:09:26 +0000 (16:09 +0200)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 24 Oct 2012 14:09:26 +0000 (16:09 +0200)
16 files changed:
effects/automask.xml
effects/sox_gain.xml
src/customtrackview.cpp
src/customtrackview.h
src/docclipbase.cpp
src/effectstack/collapsibleeffect.cpp
src/effectstack/collapsibleeffect.h
src/effectstack/effectstackview2.cpp
src/effectstack/effectstackview2.h
src/effectstack/parametercontainer.cpp
src/effectstack/parametercontainer.h
src/mainwindow.cpp
src/projectlist.cpp
src/projectlist.h
src/projecttree/meltjob.cpp
src/projecttree/meltjob.h

index ae2c51e3ee770fb748d289c043a2ebd587b40bcb..ae68503a84de60d13e3ca1a4bf1b818a7ea453a0 100644 (file)
        <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>
        <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>
index 0a67a67403d81e7ef4fde3dfd5f375d258da3b90..11f7a8db4006291c4365a920a57419ae5500aeba 100644 (file)
@@ -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>
index a0833a0d00710c94f32faf2b8f228cd104ce6fc5..cba00f154de403d2bf8057de40d9248050613618 100644 (file)
@@ -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()) {
index 74f9b9e3349ffabcc59f3fc281e109007daa355d..3312e74ebd95f561412b6bfe0e259bccd196119b 100644 (file)
@@ -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:
index 5dd95e56e7da1d3d5bafce4a0ae8c5a3e22b2175..5f2f01a19d8a27248dcc4cc89b9e95e9d742c6c7 100644 (file)
@@ -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
index 7ca823759dc6fe5c5f2b5054e1582617a8399c49..70733f310039a805f2758db7e28ac52d81d232c1 100644 (file)
@@ -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)));
index 54daa70b7724faff8389f0bf2e00545dea940b10..0d0535461cbc3d20a8f2ae160acf6e103cb55725 100644 (file)
@@ -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. */
index 7366b7531465b584527fc6e0651e9f95b5f2886b..69c28d758bbdc7d01eae7b3f82dfa1c1ea434048 100644 (file)
@@ -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)
index 6c878505ef45a611d89cb540b9fdf6782182a490..dd34fe0931deb0a0baf22f3d7ddc608c9f52003b 100644 (file)
@@ -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);
 };
index bcaeec5563ad100e29cea5c3d0168b67542cba46..b3820c6f1a469413243b2591e9f2d4b6fc4566ca 100644 (file)
@@ -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;
         }
index 178180dcd5c9d97a5aa1d5c220b09c6860cd1e6c..92b8dcb508c11fd124dd6183b3df384b6d31088e 100644 (file)
@@ -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();
 };
index 6aee68887847aea2cf454870367a7ea5d38248be..49bf50184f02ba8d3dd795f831aecbd79cddd8d3 100644 (file)
@@ -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>)));
 
index 70ea5a10774f1d588967242708dea648cd83b2cc..022b1971b9eb8c2a4fd17c27b8664c41ff4c67aa 100644 (file)
@@ -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());
     }
 }
index 1f906a5db3c15f7dba8436c02b1254b2fdccd0b9..ef290dad26df73769eb2040760d2dd8dfe103b57 100644 (file)
@@ -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>);
index ed170fdbe132fe3a4d71a41f0d9e7d946a1cbd39..5592607709d81d5c365a1343bf0d35c5e7ba3abc 100644 (file)
@@ -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;
index d37365038635d7d475d8d9cd3f5c3db023cce7d7..41671a6bf978f88a2825b84b3bfaf6700fa884c8 100644 (file)
@@ -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