]> git.sesse.net Git - kdenlive/commitdiff
Prepare for clip extra data (reusable analysis data)
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 20 Oct 2012 19:45:35 +0000 (21:45 +0200)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 20 Oct 2012 19:45:35 +0000 (21:45 +0200)
23 files changed:
effects/automask.xml
src/clipproperties.cpp
src/clipproperties.h
src/commands/CMakeLists.txt
src/commands/addextradatacommand.cpp [new file with mode: 0644]
src/commands/addextradatacommand.h [new file with mode: 0644]
src/customtrackview.cpp
src/customtrackview.h
src/docclipbase.cpp
src/docclipbase.h
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/effectstackedit.cpp
src/effectstackedit.h
src/mainwindow.cpp
src/projectlist.cpp
src/projectlist.h
src/projecttree/meltjob.cpp
src/widgets/clipproperties_ui.ui

index 7d1b9062f835d2481cf89d02f1649b5bb9e9a91b..d2bde1acc79f5efa3b24183a089d1b26d8b15357 100644 (file)
@@ -12,4 +12,7 @@
        <parameter type="bool" name="obscure" default="1">
                <name>Obscure</name>
        </parameter>
+       <parameter type="filterjob" filtertag="autotrack_rectangle:%geometry" filterparams="_serialize=1" consumer="null" consumerparams="all=1 terminate_on_pause=1" wantedproperties="motion_vector_list" finalfilter="autotrack_rectangle" extraparams="projecttreefilter">
+               <name>Analyse</name>
+       </parameter>
 </effect>
index 991666340ad4d06ca4433574d84a162694cb3952..7981f9537cb666953525e5fcc801e6b24da59875 100644 (file)
@@ -485,6 +485,12 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
     m_view.marker_save->setToolTip(i18n("Save markers"));
     m_view.marker_load->setIcon(KIcon("document-open"));
     m_view.marker_load->setToolTip(i18n("Load markers"));
+    m_view.analysis_delete->setIcon(KIcon("trash-empty"));
+    m_view.analysis_delete->setToolTip(i18n("Delete analysis data"));
+    m_view.analysis_load->setIcon(KIcon("document-open"));
+    m_view.analysis_load->setToolTip(i18n("Load analysis data"));
+    m_view.analysis_save->setIcon(KIcon("document-save-as"));
+    m_view.analysis_save->setToolTip(i18n("Save analysis data"));
 
         // Check for Nepomuk metadata
 #ifdef USE_NEPOMUK
@@ -512,13 +518,19 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
 #endif
     
     slotFillMarkersList(m_clip);
+    slotUpdateAnalysisData(m_clip);
+    
     connect(m_view.marker_new, SIGNAL(clicked()), this, SLOT(slotAddMarker()));
     connect(m_view.marker_edit, SIGNAL(clicked()), this, SLOT(slotEditMarker()));
     connect(m_view.marker_delete, SIGNAL(clicked()), this, SLOT(slotDeleteMarker()));
     connect(m_view.marker_save, SIGNAL(clicked()), this, SLOT(slotSaveMarkers()));
     connect(m_view.marker_load, SIGNAL(clicked()), this, SLOT(slotLoadMarkers()));
     connect(m_view.markers_list, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotEditMarker()));
-
+    
+    connect(m_view.analysis_delete, SIGNAL(clicked()), this, SLOT(slotDeleteAnalysis()));
+    connect(m_view.analysis_save, SIGNAL(clicked()), this, SLOT(slotSaveAnalysis()));
+    connect(m_view.analysis_load, SIGNAL(clicked()), this, SLOT(slotLoadAnalysis()));
+    
     connect(this, SIGNAL(accepted()), this, SLOT(slotApplyProperties()));
     connect(m_view.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(slotApplyProperties()));
     m_view.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false);
@@ -724,6 +736,21 @@ void ClipProperties::slotEnableLumaFile(int state)
     m_view.label_softness->setEnabled(enable);
 }
 
+void ClipProperties::slotUpdateAnalysisData(DocClipBase *clip)
+{
+    if (m_clip != clip) return;
+    m_view.analysis_list->clear();
+    QMap <QString, QString> analysis = clip->analysisData();
+    m_view.analysis_box->setHidden(analysis.isEmpty());
+    QMap<QString, QString>::const_iterator i = analysis.constBegin();
+    while (i != analysis.constEnd()) {
+       QStringList itemtext;
+       itemtext << i.key() << i.value();
+       (void) new QTreeWidgetItem(m_view.analysis_list, itemtext);
+       ++i;
+    }
+}
+
 void ClipProperties::slotFillMarkersList(DocClipBase *clip)
 {
     if (m_clip != clip) return;
@@ -785,6 +812,12 @@ void ClipProperties::slotDeleteMarker()
        emit addMarker(m_clip->getId(), toDelete.at(i));
 }
 
+void ClipProperties::slotDeleteAnalysis()
+{
+    QTreeWidgetItem *current = m_view.analysis_list->currentItem();
+    if (current) emit deleteAnalysis(m_clip->getId(), current->text(0));
+}
+
 const QString &ClipProperties::clipId() const
 {
     return m_clip->getId();
index c321b20220d8d07a1911a00a76a25e41223073dd..97ac8dd6a9713834d246b6aea3482f36e6b2273d 100644 (file)
@@ -58,6 +58,7 @@ public:
 
 public slots:
     void slotFillMarkersList(DocClipBase *clip);
+    void slotUpdateAnalysisData(DocClipBase *clip);
     
 private slots:
     void parseFolder();
@@ -74,6 +75,7 @@ private slots:
     void slotOpenUrl(const QString &url);
     void slotSaveMarkers();
     void slotLoadMarkers();
+    void slotDeleteAnalysis();
 
 private:
     Ui::ClipProperties_UI m_view;
@@ -96,6 +98,7 @@ signals:
     void applyNewClipProperties(const QString, QMap <QString, QString> , QMap <QString, QString> , bool, bool);
     void saveMarkers(const QString &);
     void loadMarkers(const QString &);
+    void deleteAnalysis(const QString &, const QString &);
 };
 
 
index 1420bd444d3a8d9157a06fd4de99e08027566962..5da8b75bcfcdbccc1b062d0c14ba5b12f79aa10d 100644 (file)
@@ -5,6 +5,7 @@ set(kdenlive_SRCS
   commands/addeffectcommand.cpp
   commands/addfoldercommand.cpp
   commands/addmarkercommand.cpp
+  commands/addextradatacommand.cpp
   commands/addtimelineclipcommand.cpp
   commands/addtrackcommand.cpp
   commands/addtransitioncommand.cpp
diff --git a/src/commands/addextradatacommand.cpp b/src/commands/addextradatacommand.cpp
new file mode 100644 (file)
index 0000000..c5ff328
--- /dev/null
@@ -0,0 +1,47 @@
+/***************************************************************************
+                          addextradatacommand.cpp  -  description
+                             -------------------
+    begin                : 2012
+    copyright            : (C) 2012 by Jean-Baptiste Mardelle
+    email                : jb@kdenlive.org
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+
+#include "addextradatacommand.h"
+#include "customtrackview.h"
+
+#include <KLocale>
+
+AddExtraDataCommand::AddExtraDataCommand(CustomTrackView *view, const QString&id, const QString&key, const QString &oldData, const QString &newData, QUndoCommand * parent) :
+        QUndoCommand(parent),
+        m_view(view),
+        m_oldData(oldData),
+        m_newData(newData),
+        m_key(key),
+        m_id(id)
+{
+    if (m_newData.isEmpty()) setText(i18n("Delete data"));
+    else setText(i18n("Add data"));
+}
+
+
+// virtual
+void AddExtraDataCommand::undo()
+{
+    m_view->addData(m_id, m_key, m_oldData);
+}
+// virtual
+void AddExtraDataCommand::redo()
+{
+    m_view->addData(m_id, m_key, m_newData);
+}
+
diff --git a/src/commands/addextradatacommand.h b/src/commands/addextradatacommand.h
new file mode 100644 (file)
index 0000000..784d17f
--- /dev/null
@@ -0,0 +1,48 @@
+/***************************************************************************
+                          addextradatacommand.h  -  description
+                             -------------------
+    begin                : 2012
+    copyright            : (C) 2012 by Jean-Baptiste Mardelle
+    email                : jb@kdenlive.org
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef EXTRADATACOMMAND_H
+#define EXTRADATACOMMAND_H
+
+#include <QUndoCommand>
+#include <QGraphicsView>
+#include <QPointF>
+#include <QDomElement>
+#include <KDebug>
+
+#include "gentime.h"
+#include "definitions.h"
+class CustomTrackView;
+
+
+class AddExtraDataCommand : public QUndoCommand
+{
+public:
+    AddExtraDataCommand(CustomTrackView *view, const QString&id, const QString&key, const QString &oldData, const QString &newData, QUndoCommand * parent = 0);
+    virtual void undo();
+    virtual void redo();
+
+private:
+    CustomTrackView *m_view;
+    QString m_oldData;
+    QString m_newData;
+    QString m_key;
+    QString m_id;
+};
+
+#endif
+
index 396625b5deb4101770251f36944502611001d9c1..5ab409b5d8a571f874db423849c42a9f71c591a7 100644 (file)
@@ -26,6 +26,7 @@
 #include "commands/movetransitioncommand.h"
 #include "commands/resizeclipcommand.h"
 #include "commands/editguidecommand.h"
+#include "commands/addextradatacommand.h"
 #include "commands/addtimelineclipcommand.h"
 #include "commands/addeffectcommand.h"
 #include "commands/editeffectcommand.h"
@@ -5251,6 +5252,16 @@ void CustomTrackView::clipEnd()
     }
 }
 
+void CustomTrackView::slotAddClipExtraData(const QString &id, const QString &key, const QString &data, QUndoCommand *groupCommand)
+{
+    DocClipBase *base = m_document->clipManager()->getClipById(id);
+    if (!base) return;
+    QMap <QString, QString> extraData = base->analysisData();
+    QString oldData = extraData.value(key);
+    AddExtraDataCommand *command = new AddExtraDataCommand(this, id, key, oldData, data, groupCommand);
+    if (!groupCommand) m_commandStack->push(command);
+}
+
 void CustomTrackView::slotAddClipMarker(const QString &id, CommentedTime newMarker, QUndoCommand *groupCommand)
 {
     CommentedTime oldMarker = m_document->clipManager()->getClipById(id)->markerAt(newMarker.time());
@@ -5414,6 +5425,7 @@ void CustomTrackView::slotLoadClipMarkers(const QString &id)
 void CustomTrackView::addMarker(const QString &id, const CommentedTime marker)
 {
     DocClipBase *base = m_document->clipManager()->getClipById(id);
+    if (base == NULL) return;
     if (marker.markerType() < 0) base->deleteSnapMarker(marker.time());
     else base->addSnapMarker(marker);
     emit updateClipMarkers(base);
@@ -5421,6 +5433,16 @@ void CustomTrackView::addMarker(const QString &id, const CommentedTime marker)
     viewport()->update();
 }
 
+void CustomTrackView::addData(const QString &id, const QString &key, const QString &data)
+{
+    DocClipBase *base = m_document->clipManager()->getClipById(id);
+    if (base == NULL) return;
+    base->setAnalysisData(key, data);
+    emit updateClipExtraData(base);
+    setDocumentModified();
+    viewport()->update();
+}
+
 int CustomTrackView::hasGuide(int pos, int offset)
 {
     for (int i = 0; i < m_guides.count(); i++) {
index c4a84704cd5d9b058d7244fd62a0fe85f43e0358..6ba3bb2a919cffa4035e2622fdc5f2beef6b999a 100644 (file)
@@ -77,6 +77,7 @@ public:
     void slotDeleteClipMarker(const QString &comment, const QString &id, const GenTime &position);
     void slotDeleteAllClipMarkers(const QString &id);
     void addMarker(const QString &id, const CommentedTime marker);
+    void addData(const QString &id, const QString &key, const QString &data);
     void setScale(double scaleFactor, double verticalScale);
     void deleteClip(const QString &clipId);
     /** @brief Add effect to current clip */
@@ -226,7 +227,9 @@ public slots:
     void slotSwitchTrackVideo(int ix);
     void slotSwitchTrackLock(int ix);
     void slotUpdateClip(const QString &clipId, bool reload = true);
-
+    
+    /** @brief Add extra data to a clip. */
+    void slotAddClipExtraData(const QString &id, const QString &key, const QString &data = QString(), QUndoCommand *groupCommand = 0);
     /** @brief Creates a AddClipCommand to add, edit or delete a marker.
      * @param id Id of the marker's clip
      * @param t Position of the marker
@@ -511,6 +514,7 @@ signals:
     void showClipFrame(DocClipBase *, QPoint, bool, const int);
     void doTrackLock(int, bool);
     void updateClipMarkers(DocClipBase *);
+    void updateClipExtraData(DocClipBase *);
     void updateTrackHeaders();
     void playMonitor();
     /** @brief Monitor document changes (for example the presence of audio data in timeline for export widget.*/
index 13d1c40b02a78ad701f521d755eb4fa29f682d07..693e4ecca2f2829fc62d73add95782907d46fb70 100644 (file)
@@ -1259,4 +1259,14 @@ QImage DocClipBase::extractImage(int frame, int width, int height)
     return m_thumbProd->extractImage(frame, width, height);
 }
 
+void DocClipBase::setAnalysisData(const QString &name, const QString &data)
+{
+    if (data.isEmpty()) m_analysisdata.remove(name);
+    else m_analysisdata.insert(name, data);
+}
+
+QMap <QString, QString> DocClipBase::analysisData() const
+{
+    return m_analysisdata;
+}
 
index 352a1bd6393affa82344e6576845d4e04884560c..724ca2180dbc4bfe096f44080bc348dfb90c406b 100644 (file)
@@ -204,6 +204,8 @@ Q_OBJECT public:
     void cleanupProducers();
     bool isClean() const;
     bool getAudioThumbs();
+    void setAnalysisData(const QString &name, const QString &data);
+    QMap <QString, QString> analysisData() const;
 
 private:   // Private attributes
 
@@ -236,6 +238,8 @@ private:   // Private attributes
     QMap <QString, QString> m_properties;
     /** Holds clip metadata like author, copyright,... */
     QMap <QString, QString> m_metadata;
+    /** Holds clip analysis data that can be used later to create markers or keyframes */
+    QMap <QString, QString> m_analysisdata;
     
     /** Try to make sure we don't delete a producer while using it */
     QMutex m_producerMutex;
index 8b983c15ad08a5bd6289c65f92206bd09b7eeda7..22e2a02b85212c50d5e2c37bf2fd043215c6395f 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,QString)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString)));
+    connect(m_paramWidget, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString,QStringList)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString,QStringList)));
     
     connect (this, SIGNAL(syncEffectsPos(int)), m_paramWidget, SIGNAL(syncEffectsPos(int)));
     connect (m_paramWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
index 9a6f9d85bce97c8efb19d66d37ec73c19a363c75..736cba36465fae775e324e03917abc8987a2d0c2 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, QString properties);
+    void startFilterJob(QString filterName, QString filterParams, QString finalFilterName, QString consumer, QString consumerParams, QString properties, QStringList extraParams);
     /** @brief An effect was reset, trigger param reload. */
     void resetEffect(int ix);
     /** @brief Ask for creation of a group. */
index fa541eee4cdcef7f9d3214e941d6eb857e578618..b82d96f7da0c3fee26709918e8bb960a9e643efd 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,QString)), this , SLOT(slotStartFilterJob(QString,QString,QString,QString,QString,QString)));
+    connect(currentEffect, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString,QStringList)), this , SLOT(slotStartFilterJob(QString,QString,QString,QString,QString,QString,QStringList)));
     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)));
@@ -643,10 +643,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 QString&properties)
+void EffectStackView2::slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QString&properties, const QStringList &extraParams)
 {
     if (!m_clipref) return;
-    emit startFilterJob(m_clipref->info(), m_clipref->clipProducer(), filterName, filterParams, finalFilterName, consumer, consumerParams, properties);
+    emit startFilterJob(m_clipref->info(), m_clipref->clipProducer(), filterName, filterParams, finalFilterName, consumer, consumerParams, properties, extraParams);
 }
 
 void EffectStackView2::slotResetEffect(int ix)
index eeb3aebf3ebe5f140571f2ba01ceea106dff51b4..419b07c6edc31b54754b063a8731df386a674a50 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 QString&properties);
+    void slotStartFilterJob(const QString&filterName, const QString&filterParams, const QString&finalFilterName, const QString&consumer, const QString&consumerParams, const QString&properties,const QStringList &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 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,const QStringList &extraParams);
     void addEffect(ClipItem*,QDomElement);
 };
 
index 89a62da02919bcca0c7f520d3b79b327b133c0ee..8bd9f709c374dda5f5f6eff70d7bf98841dbb559 100644 (file)
@@ -807,8 +807,19 @@ void ParameterContainer::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("finalfilter"), pa.attribute("consumer"), pa.attribute("consumerparams"), pa.attribute("wantedproperties"));
-            kDebug()<<" - - -PROPS:\n"<<pa.attribute("filtertag")<<"-"<< pa.attribute("filterparams")<<"-"<< pa.attribute("consumer")<<"-"<< pa.attribute("consumerparams")<<"-"<< pa.attribute("wantedproperties");
+           QString filtertag = pa.attribute("filtertag");
+           if (filtertag.contains("%geometry")) {
+               // Replace with current geometry
+               if (m_geometryWidget) {
+                   QString data = m_geometryWidget->getValue();
+                   filtertag.replace("%geometry", data);
+                   kDebug()<<"// Setting geometry: "<<data<<", RES: "<<filtertag;
+               }
+           }
+           QStringList extra;
+           extra = pa.attribute("extraparams").split(' ', QString::SkipEmptyParts);
+            emit startFilterJob(filtertag, pa.attribute("filterparams"), pa.attribute("finalfilter"), pa.attribute("consumer"), pa.attribute("consumerparams"), pa.attribute("wantedproperties"), extra);
+            kDebug()<<" - - -PROPS:\n"<<"filtertag"<<"-"<< pa.attribute("filterparams")<<"-"<< pa.attribute("consumer")<<"-"<< pa.attribute("consumerparams")<<"-"<< pa.attribute("wantedproperties");
             break;
         }
     }
index 5e98a3f2d5323a0a55a676ae516135e9fa37e599..ba0c0f3811928cd505929727352670716e61e0fa 100644 (file)
@@ -102,7 +102,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, QString properties);
+    void startFilterJob(QString filterName, QString filterParams, QString finalFilterName, QString consumer, QString consumerParams, QString properties, QStringList extra);
     
 };
 
index 168486d9c02e1dcc6a0a5d60eccf19a7500a0b53..2dec16e18028a5080cfede0827cb402891f06b9b 100644 (file)
@@ -152,7 +152,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement &d, ItemInfo info, boo
     m_paramWidget = new ParameterContainer(d, info, &m_metaInfo, m_baseWidget);
     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,QString)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString)));
+    connect(m_paramWidget, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString,QStringList)), this, SIGNAL(startFilterJob(QString,QString,QString,QString,QString,QString,QStringList)));
     
     connect (this, SIGNAL(syncEffectsPos(int)), m_paramWidget, SIGNAL(syncEffectsPos(int)));
     connect (m_paramWidget, SIGNAL(checkMonitorPosition(int)), this, SIGNAL(checkMonitorPosition(int)));
index ca79ccca7b1fc0b15b15f312a019361918066a41..a4e74ff20c5ae8ef4cd712d0fbe56cad52925d91 100644 (file)
@@ -79,7 +79,7 @@ signals:
     void showComments(bool show);
     void effectStateChanged(bool enabled);
     /** @brief Start an MLT filter job on this clip. */
-    void startFilterJob(const QString &filterName, const QString &filterParams, const QString &finalFilterName, const QString &consumer, const QString &consumerParams, const QString &properties);
+    void startFilterJob(const QString &filterName, const QString &filterParams, const QString &finalFilterName, const QString &consumer, const QString &consumerParams, const QString &properties, const QStringList&extraParams);
 };
 
 #endif
index 5f9e06618872c47faf56ea3e784c4772c0ee4c66..6945bf9c449e61751938b018cd0e9a068bd06033 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 QString&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,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&,const QStringList&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QStringList&)));
 
     m_transitionConfigDock = new QDockWidget(i18n("Transition"), this);
     m_transitionConfigDock->setObjectName("transition");
@@ -3313,7 +3313,10 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip)
     // any type of clip but a title
     ClipProperties *dia = new ClipProperties(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this);
     connect(dia, SIGNAL(addMarker(const QString &, CommentedTime)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, CommentedTime)));
+    connect(dia, SIGNAL(deleteAnalysis(QString,QString)), m_activeTimeline->projectView(), SLOT(slotAddClipExtraData(QString,QString)));
     connect(m_activeTimeline->projectView(), SIGNAL(updateClipMarkers(DocClipBase *)), dia, SLOT(slotFillMarkersList(DocClipBase *)));
+    connect(m_activeTimeline->projectView(), SIGNAL(updateClipExtraData(DocClipBase *)), dia, SLOT(slotUpdateAnalysisData(DocClipBase *)));
+    connect(m_projectList, SIGNAL(updateAnalysisData(DocClipBase *)), dia, SLOT(slotUpdateAnalysisData(DocClipBase *)));
     connect(dia, SIGNAL(loadMarkers(const QString &)), m_activeTimeline->projectView(), SLOT(slotLoadClipMarkers(const QString &)));
     connect(dia, SIGNAL(saveMarkers(const QString &)), m_activeTimeline->projectView(), SLOT(slotSaveClipMarkers(const QString &)));
     connect(dia, SIGNAL(deleteProxy(const QString)), m_projectList, SLOT(slotDeleteProxy(const QString)));
index 5fe205165618e4775cfcb068b771b1f7ceb11847..a702d4422dcbe1ea372363eb3aca6039882e1b2f 100644 (file)
@@ -3421,14 +3421,14 @@ 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 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, const QStringList &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 << properties << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track) << finalFilterName;
-    MeltJob *job = new MeltJob(item->clipType(), id, jobParams);
+    MeltJob *job = new MeltJob(item->clipType(), id, jobParams, extraParams);
     if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
         delete job;
         return;
@@ -3466,13 +3466,15 @@ void ProjectList::startClipFilterJob(const QString &filterName, const QString &c
        // Keys
        jobParams << "shot_change_list";
        QStringList extraParams;
-       extraParams << "projecttreefilter" << "project_profile";
+       extraParams << "projecttreefilter";
        processClipJob(ids, QString(), false, jobParams, i18n("Auto split"), extraParams);
     }
     else {
        QPointer<ClipStabilize> d = new ClipStabilize(destination, ids.count(), filterName);
        if (d->exec() == QDialog::Accepted) {
-           processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc());
+           QStringList extraParams;
+           extraParams << "producer_profile";
+           processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc(), extraParams);
        }
        delete d;
     }
@@ -3592,6 +3594,14 @@ void ProjectList::slotGotFilterJobResults(QString id, int , int , QString filter
            delete command;
        else m_commandStack->push(command);
     }
+    else if (filter.startsWith("autotrack_rectangle")) {
+       QString cuts = results.value("motion_vector_list");
+       ProjectItem *clip = getItemById(id);
+       if (clip) {
+           clip->referencedClip()->setAnalysisData(i18n("Motion vectors"), cuts);
+           emit updateAnalysisData(clip->referencedClip());
+       }
+    }
     
 }
 
index 8d127722f90b60cfa286ec334abe360533162d77..9f3d91e8f1b31a20471f44422440f25d365d3862 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 QString&);
+    void slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QStringList&);
     
 
 private:
@@ -526,6 +526,7 @@ signals:
     /** @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);
     void pauseMonitor();
+    void updateAnalysisData(DocClipBase *);
 };
 
 #endif
index 2bf1680b036124559a62ae56bb7e69c4865eeb14..1e24caffc1582b4647c7640b61bf890a7f82895f 100644 (file)
@@ -93,13 +93,13 @@ void MeltJob::startJob()
         return;
     }
     Mlt::Producer *prod ;
-    if (m_extra.contains("project_profile")) {
-       m_profile = new Mlt::Profile(KdenliveSettings::current_profile().toUtf8().constData());
-    }
-    else {
+    if (m_extra.contains("producer_profile")) {
        m_profile = new Mlt::Profile;
        m_profile->set_explicit(false);
     }
+    else {
+       m_profile = new Mlt::Profile(KdenliveSettings::current_profile().toUtf8().constData());
+    }
     if (out == -1) {
        prod = new Mlt::Producer(*m_profile,  m_url.toUtf8().constData());
     }
@@ -108,7 +108,7 @@ void MeltJob::startJob()
         prod = tmp->cut(in, out);
        delete tmp;
     }
-    if (!m_extra.contains("project_profile")) {
+    if (m_extra.contains("prducer_profile")) {
        m_profile->from_producer(*prod);
        m_profile->set_explicit(true);
     }
index c926aa923399045f018e5cfdaed6c2dac97da480..95516d38a507415b6ef274acc8919526b416b402 100644 (file)
        <string>Metadata</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_9">
-       <item row="0" column="0">
+       <item row="0" column="0" colspan="2">
         <widget class="QTreeWidget" name="metadata_list">
          <property name="alternatingRowColors">
           <bool>true</bool>
          </column>
         </widget>
        </item>
+       <item row="2" column="0">
+        <widget class="QFrame" name="analysis_box">
+         <property name="frameShape">
+          <enum>QFrame::NoFrame</enum>
+         </property>
+         <property name="frameShadow">
+          <enum>QFrame::Plain</enum>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_4">
+          <item row="0" column="0" colspan="4">
+           <widget class="QTreeWidget" name="analysis_list">
+            <property name="rootIsDecorated">
+             <bool>false</bool>
+            </property>
+            <property name="allColumnsShowFocus">
+             <bool>true</bool>
+            </property>
+            <attribute name="headerVisible">
+             <bool>false</bool>
+            </attribute>
+            <column>
+             <property name="text">
+              <string>1</string>
+             </property>
+            </column>
+            <column>
+             <property name="text">
+              <string>2</string>
+             </property>
+            </column>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QToolButton" name="analysis_delete">
+            <property name="text">
+             <string>...</string>
+            </property>
+            <property name="autoRaise">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1">
+           <widget class="QToolButton" name="analysis_save">
+            <property name="text">
+             <string>...</string>
+            </property>
+            <property name="autoRaise">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="2">
+           <widget class="QToolButton" name="analysis_load">
+            <property name="text">
+             <string>...</string>
+            </property>
+            <property name="autoRaise">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="3">
+           <spacer name="horizontalSpacer_2">
+            <property name="orientation">
+             <enum>Qt::Horizontal</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>186</width>
+              <height>20</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+         </layout>
+        </widget>
+       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_advanced">