[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kdenlive] src: Only set proxy on a clip when it is successfully created
From: Jean-Baptiste Mardelle <jb () kdenlive ! org>
Date: 2016-06-30 22:33:02
Message-ID: E1bIkW6-0006lY-WC () code ! kde ! org
[Download RAW message or body]
Git commit d52d16923d3f794335544669db20d35d75913d55 by Jean-Baptiste Mardelle.
Committed on 30/06/2016 at 22:32.
Pushed by mardelle into branch 'master'.
Only set proxy on a clip when it is successfully created
Add option to discard pending jobs
Fix bin job counter
CCBUG: 364941
M +6 -1 src/bin/bin.cpp
M +2 -1 src/bin/bin.h
M +39 -18 src/project/jobs/jobmanager.cpp
M +4 -0 src/project/jobs/jobmanager.h
M +3 -1 src/project/jobs/proxyclipjob.cpp
http://commits.kde.org/kdenlive/d52d16923d3f794335544669db20d35d75913d55
diff --git a/src/bin/bin.cpp b/src/bin/bin.cpp
index c6ce2d8..d5d8f78 100644
--- a/src/bin/bin.cpp
+++ b/src/bin/bin.cpp
@@ -444,8 +444,11 @@ Bin::Bin(QWidget* parent) :
m_cancelJobs->setCheckable(false);
m_discardCurrentClipJobs = new QAction(i18n("Cancel Current Clip Jobs"), this);
m_discardCurrentClipJobs->setCheckable(false);
+ m_discardPendingJobs = new QAction(i18n("Cancel Pending Jobs"), this);
+ m_discardPendingJobs->setCheckable(false);
m_jobsMenu->addAction(m_cancelJobs);
m_jobsMenu->addAction(m_discardCurrentClipJobs);
+ m_jobsMenu->addAction(m_discardPendingJobs);
m_infoLabel->setMenu(m_jobsMenu);
m_infoLabel->setAction(infoAction);
@@ -977,6 +980,7 @@ void Bin::setDocument(KdenliveDoc* project)
connect(m_jobManager, SIGNAL(jobCount(int)), m_infoLabel, \
SLOT(slotSetJobCount(int)));
connect(m_discardCurrentClipJobs, SIGNAL(triggered()), m_jobManager, \
SLOT(slotDiscardClipJobs()));
connect(m_cancelJobs, SIGNAL(triggered()), m_jobManager, \
SLOT(slotCancelJobs())); + connect(m_discardPendingJobs, SIGNAL(triggered()), \
m_jobManager, SLOT(slotCancelPendingJobs())); connect(m_jobManager, \
SIGNAL(updateJobStatus(QString,int,int,QString,QString,QString)), this, \
SLOT(slotUpdateJobStatus(QString,int,int,QString,QString,QString)));
connect(m_jobManager, \
SIGNAL(gotFilterJobResults(QString,int,int,stringMap,stringMap)), this, \
SLOT(slotGotFilterJobResults(QString,int,int,stringMap,stringMap))); @@ -2092,11 \
+2096,12 @@ void Bin::slotShowJobLog() d.exec();
}
-void Bin::gotProxy(const QString &id)
+void Bin::gotProxy(const QString &id, const QString &path)
{
ProjectClip *clip = m_rootFolder->clip(id);
if (clip) {
QDomDocument doc;
+ clip->setProducerProperty(QStringLiteral("kdenlive:proxy"), path);
QDomElement xml = clip->toXml(doc, true);
if (!xml.isNull()) m_doc->getFileProperties(xml, id, 150, true);
}
diff --git a/src/bin/bin.h b/src/bin/bin.h
index b5dd303..19c4b16 100644
--- a/src/bin/bin.h
+++ b/src/bin/bin.h
@@ -426,7 +426,7 @@ public:
const QString getDocumentProperty(const QString &key);
/** @brief A proxy clip was just created, pass it to the responsible item */
- void gotProxy(const QString &id);
+ void gotProxy(const QString &id, const QString &path);
/** @brief Get the document's renderer frame size */
const QSize getRenderSize();
@@ -693,6 +693,7 @@ private:
QMenu *m_jobsMenu;
QAction *m_cancelJobs;
QAction *m_discardCurrentClipJobs;
+ QAction *m_discardPendingJobs;
SmallJobLabel *m_infoLabel;
/** @brief The info widget for failed jobs. */
BinMessageWidget *m_infoMessage;
diff --git a/src/project/jobs/jobmanager.cpp b/src/project/jobs/jobmanager.cpp
index eadb240..2130ec5 100644
--- a/src/project/jobs/jobmanager.cpp
+++ b/src/project/jobs/jobmanager.cpp
@@ -90,6 +90,7 @@ void JobManager::discardJobs(const QString &id, \
AbstractClipJob::JOBTYPE type) m_jobList.at(i)->setStatus(JobAborted);
}
}
+ updateJobCount();
}
bool JobManager::hasPendingJob(const QString &clipId, AbstractClipJob::JOBTYPE type)
@@ -121,40 +122,47 @@ void JobManager::slotCheckJobProcess()
m_jobMutex.lock();
int count = 0;
for (int i = 0; i < m_jobList.count(); ++i) {
- if (m_jobList.at(i)->status() == JobWorking || m_jobList.at(i)->status() == \
JobWaiting) + if (m_jobList.at(i)->status() == JobWorking || \
m_jobList.at(i)->status() == JobWaiting) { count ++;
- else {
+ } else {
// remove finished jobs
AbstractClipJob *job = m_jobList.takeAt(i);
job->deleteLater();
--i;
}
}
- emit jobCount(count);
m_jobMutex.unlock();
+ emit jobCount(count);
if (m_jobThreads.futures().isEmpty() || m_jobThreads.futures().count() < \
KdenliveSettings::proxythreads()) m_jobThreads.addFuture(QtConcurrent::run(this, \
&JobManager::slotProcessJobs)); }
+void JobManager::updateJobCount()
+{
+ int count = 0;
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ if (m_jobList.at(i)->status() == JobWaiting || m_jobList.at(i)->status() == \
JobWorking) + count ++;
+ }
+ // Set jobs count
+ emit jobCount(count);
+}
void JobManager::slotProcessJobs()
{
while (!m_jobList.isEmpty() && !m_abortAllJobs) {
AbstractClipJob *job = NULL;
- int count = 0;
m_jobMutex.lock();
- for (int i = 0; i < m_jobList.count(); ++i) {
+ int i = 0;
+ for (; i < m_jobList.count(); ++i) {
if (m_jobList.at(i)->status() == JobWaiting) {
- if (job == NULL) {
- m_jobList.at(i)->setStatus(JobWorking);
- job = m_jobList.at(i);
- }
- count++;
+ job = m_jobList.at(i);
+ job->setStatus(JobWorking);
+ break;
}
- else if (m_jobList.at(i)->status() == JobWorking)
- count ++;
}
- // Set jobs count
- emit jobCount(count);
+ if (i > 0) {
+ updateJobCount();
+ }
m_jobMutex.unlock();
if (job == NULL) {
@@ -163,7 +171,6 @@ void JobManager::slotProcessJobs()
QString destination = job->destination();
// Check if the clip is still here
ProjectClip *currentClip = m_bin->getBinClip(job->clipId());
- //ProjectItem *processingItem = getItemById(job->clipId());
if (currentClip == NULL) {
job->setStatus(JobDone);
continue;
@@ -193,7 +200,7 @@ void JobManager::slotProcessJobs()
emit updateJobStatus(job->clipId(), job->jobType, JobDone);
//TODO: replace with more generic clip replacement framework
if (job->jobType == AbstractClipJob::PROXYJOB) {
- m_bin->gotProxy(job->clipId());
+ m_bin->gotProxy(job->clipId(), destination);
}
if (job->addClipToProject()) {
emit addClip(destination);
@@ -268,7 +275,9 @@ void JobManager::launchJob(ProjectClip *clip, AbstractClipJob \
*job, bool runQueu
m_jobList.append(job);
clip->setJobStatus(job->jobType, JobWaiting, 0, job->statusMessage());
- if (runQueue) slotCheckJobProcess();
+ if (runQueue) {
+ slotCheckJobProcess();
+ }
}
void JobManager::slotDiscardClipJobs()
@@ -284,6 +293,18 @@ void JobManager::slotDiscardClipJobs()
discardJobs(id);
}
+void JobManager::slotCancelPendingJobs()
+{
+ QMutexLocker lock(&m_jobMutex);
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ if (m_jobList.at(i)->status() == JobWaiting) {
+ // discard this job
+ m_jobList.at(i)->setStatus(JobAborted);
+ }
+ }
+ updateJobCount();
+}
+
void JobManager::slotCancelJobs()
{
m_abortAllJobs = true;
@@ -292,7 +313,7 @@ void JobManager::slotCancelJobs()
}
m_jobThreads.waitForFinished();
m_jobThreads.clearFutures();
-
+
//TODO: undo job cancelation ? not sure it's necessary
/*QUndoCommand *command = new QUndoCommand();
command->setText(i18np("Cancel job", "Cancel jobs", m_jobList.count()));
diff --git a/src/project/jobs/jobmanager.h b/src/project/jobs/jobmanager.h
index d8fab81..ebc51e5 100644
--- a/src/project/jobs/jobmanager.h
+++ b/src/project/jobs/jobmanager.h
@@ -103,6 +103,8 @@ public slots:
void slotDiscardClipJobs();
/** @brief Discard all running jobs. */
void slotCancelJobs();
+ /** @brief Discard all pending jobs. */
+ void slotCancelPendingJobs();
private:
/** @brief A pointer to the project's bin. */
@@ -117,6 +119,8 @@ private:
bool m_abortAllJobs;
/** @brief Create a proxy for a clip. */
void createProxy(const QString &id);
+ /** @brief Update job count in info widget. */
+ void updateJobCount();
signals:
void addClip(const QString);
diff --git a/src/project/jobs/proxyclipjob.cpp b/src/project/jobs/proxyclipjob.cpp
index 2aabd74..d702b25 100644
--- a/src/project/jobs/proxyclipjob.cpp
+++ b/src/project/jobs/proxyclipjob.cpp
@@ -288,10 +288,12 @@ QHash <ProjectClip *, AbstractClipJob *> \
ProxyJob::prepareJob(Bin *bin, QList <P
item->setJobStatus(AbstractClipJob::PROXYJOB, JobCrashed, -1, \
i18n("Failed to create proxy, empty path.")); continue;
}
+ // Reset proxy path until it is really created
+ item->setProducerProperty(QStringLiteral("kdenlive:proxy"), QString());
if (QFileInfo(path).size() > 0) {
// Proxy already created
item->setJobStatus(AbstractClipJob::PROXYJOB, JobDone);
- bin->gotProxy(id);
+ bin->gotProxy(id, path);
continue;
}
QString sourcePath = item->url().toLocalFile();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic