From 4191df91ef00b8e1ea8f5cf627da46eb53246302 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sat, 20 Oct 2012 21:45:35 +0200 Subject: [PATCH] Prepare for clip extra data (reusable analysis data) --- effects/automask.xml | 3 + src/clipproperties.cpp | 35 ++++++++++- src/clipproperties.h | 3 + src/commands/CMakeLists.txt | 1 + src/commands/addextradatacommand.cpp | 47 +++++++++++++++ src/commands/addextradatacommand.h | 48 ++++++++++++++++ src/customtrackview.cpp | 22 +++++++ src/customtrackview.h | 6 +- src/docclipbase.cpp | 10 ++++ src/docclipbase.h | 4 ++ src/effectstack/collapsibleeffect.cpp | 2 +- src/effectstack/collapsibleeffect.h | 2 +- src/effectstack/effectstackview2.cpp | 6 +- src/effectstack/effectstackview2.h | 4 +- src/effectstack/parametercontainer.cpp | 15 ++++- src/effectstack/parametercontainer.h | 2 +- src/effectstackedit.cpp | 2 +- src/effectstackedit.h | 2 +- src/mainwindow.cpp | 5 +- src/projectlist.cpp | 18 ++++-- src/projectlist.h | 3 +- src/projecttree/meltjob.cpp | 10 ++-- src/widgets/clipproperties_ui.ui | 80 +++++++++++++++++++++++++- 23 files changed, 304 insertions(+), 26 deletions(-) create mode 100644 src/commands/addextradatacommand.cpp create mode 100644 src/commands/addextradatacommand.h diff --git a/effects/automask.xml b/effects/automask.xml index 7d1b9062..d2bde1ac 100644 --- a/effects/automask.xml +++ b/effects/automask.xml @@ -12,4 +12,7 @@ Obscure + + Analyse + diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index 99166634..7981f953 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -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 analysis = clip->analysisData(); + m_view.analysis_box->setHidden(analysis.isEmpty()); + QMap::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(); diff --git a/src/clipproperties.h b/src/clipproperties.h index c321b202..97ac8dd6 100644 --- a/src/clipproperties.h +++ b/src/clipproperties.h @@ -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 , QMap , bool, bool); void saveMarkers(const QString &); void loadMarkers(const QString &); + void deleteAnalysis(const QString &, const QString &); }; diff --git a/src/commands/CMakeLists.txt b/src/commands/CMakeLists.txt index 1420bd44..5da8b75b 100644 --- a/src/commands/CMakeLists.txt +++ b/src/commands/CMakeLists.txt @@ -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 index 00000000..c5ff3289 --- /dev/null +++ b/src/commands/addextradatacommand.cpp @@ -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 + +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 index 00000000..784d17f4 --- /dev/null +++ b/src/commands/addextradatacommand.h @@ -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 +#include +#include +#include +#include + +#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 + diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 396625b5..5ab409b5 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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 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++) { diff --git a/src/customtrackview.h b/src/customtrackview.h index c4a84704..6ba3bb2a 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -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.*/ diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 13d1c40b..693e4ecc 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -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 DocClipBase::analysisData() const +{ + return m_analysisdata; +} diff --git a/src/docclipbase.h b/src/docclipbase.h index 352a1bd6..724ca218 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -204,6 +204,8 @@ Q_OBJECT public: void cleanupProducers(); bool isClean() const; bool getAudioThumbs(); + void setAnalysisData(const QString &name, const QString &data); + QMap analysisData() const; private: // Private attributes @@ -236,6 +238,8 @@ private: // Private attributes QMap m_properties; /** Holds clip metadata like author, copyright,... */ QMap m_metadata; + /** Holds clip analysis data that can be used later to create markers or keyframes */ + QMap m_analysisdata; /** Try to make sure we don't delete a producer while using it */ QMutex m_producerMutex; diff --git a/src/effectstack/collapsibleeffect.cpp b/src/effectstack/collapsibleeffect.cpp index 8b983c15..22e2a02b 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,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))); diff --git a/src/effectstack/collapsibleeffect.h b/src/effectstack/collapsibleeffect.h index 9a6f9d85..736cba36 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, 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. */ diff --git a/src/effectstack/effectstackview2.cpp b/src/effectstack/effectstackview2.cpp index fa541eee..b82d96f7 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,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 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) diff --git a/src/effectstack/effectstackview2.h b/src/effectstack/effectstackview2.h index eeb3aebf..419b07c6 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 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); }; diff --git a/src/effectstack/parametercontainer.cpp b/src/effectstack/parametercontainer.cpp index 89a62da0..8bd9f709 100644 --- a/src/effectstack/parametercontainer.cpp +++ b/src/effectstack/parametercontainer.cpp @@ -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"<getValue(); + filtertag.replace("%geometry", data); + kDebug()<<"// Setting geometry: "<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))); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 5fe20516..a702d442 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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 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()); + } + } } diff --git a/src/projectlist.h b/src/projectlist.h index 8d127722..9f3d91e8 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 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 diff --git a/src/projecttree/meltjob.cpp b/src/projecttree/meltjob.cpp index 2bf1680b..1e24caff 100644 --- a/src/projecttree/meltjob.cpp +++ b/src/projecttree/meltjob.cpp @@ -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); } diff --git a/src/widgets/clipproperties_ui.ui b/src/widgets/clipproperties_ui.ui index c926aa92..95516d38 100644 --- a/src/widgets/clipproperties_ui.ui +++ b/src/widgets/clipproperties_ui.ui @@ -522,7 +522,7 @@ Metadata - + true @@ -560,6 +560,84 @@ + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + + false + + + true + + + false + + + + 1 + + + + + 2 + + + + + + + + ... + + + true + + + + + + + ... + + + true + + + + + + + ... + + + true + + + + + + + Qt::Horizontal + + + + 186 + 20 + + + + + + + -- 2.39.2