From: Jean-Baptiste Mardelle Date: Mon, 19 Dec 2011 17:52:50 +0000 (+0100) Subject: Some progress on clip jobs X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=fd65780a125fea8029fe416e515f5000b63476f5;p=kdenlive Some progress on clip jobs --- diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 4e6b6ad4..2e4bfac0 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -2561,7 +2561,6 @@ void ProjectList::slotGenerateProxy() ProjectItem *item = getItemById(job->clipId()); processingItems.append(item); - //TODO: rename m_abortAllJobs to m_abortAllJobs /*while (*it && !m_abortAllJobs) { if ((*it)->type() == PROJECTCLIPTYPE) { ProjectItem *item = static_cast (*it); @@ -2590,7 +2589,6 @@ void ProjectList::slotGenerateProxy() QProcess *jobProcess = job->startJob(&success); int result = -1; - int duration = 0; if (jobProcess == NULL) { // job is finished for (int i = 0; i < processingItems.count(); i++) @@ -2623,9 +2621,8 @@ void ProjectList::slotGenerateProxy() result = -2; } else { - QString log = QString(jobProcess->readAll()); - //TODO: should be handeled by job - processLogInfo(processingItems, &duration, log); + int progress = job->processLogInfo(); + if (progress > -1) processLogInfo(processingItems, progress); } jobProcess->waitForFinished(500); } @@ -2663,26 +2660,10 @@ void ProjectList::slotGenerateProxy() } -void ProjectList::processLogInfo(QList items, int *duration, const QString &log) +void ProjectList::processLogInfo(QList items, int progress) { - int progress; - if (*duration == 0) { - if (log.contains("Duration:")) { - QString data = log.section("Duration:", 1, 1).section(',', 0, 0).simplified(); - QStringList numbers = data.split(':'); - *duration = (int) (numbers.at(0).toInt() * 3600 + numbers.at(1).toInt() * 60 + numbers.at(2).toDouble()); - } - } - else if (log.contains("time=")) { - QString time = log.section("time=", 1, 1).simplified().section(' ', 0, 0); - if (time.contains(':')) { - QStringList numbers = time.split(':'); - progress = numbers.at(0).toInt() * 3600 + numbers.at(1).toInt() * 60 + numbers.at(2).toDouble(); - } - else progress = (int) time.toDouble(); - for (int i = 0; i < items.count(); i++) - setProxyStatus(items.at(i), CREATINGJOB, (int) (100.0 * progress / (*duration))); - } + for (int i = 0; i < items.count(); i++) + setProxyStatus(items.at(i), CREATINGJOB, progress); } void ProjectList::updateProxyConfig() diff --git a/src/projectlist.h b/src/projectlist.h index 7e5b1e8d..e273b724 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -170,6 +170,7 @@ public: } } else if (proxy == JOBCRASHED) { + proxyText = i18n("Proxy crashed"); QRectF txtBounding = painter->boundingRect(r2, Qt::AlignRight | Qt::AlignVCenter, " " + proxyText + " "); painter->setPen(Qt::NoPen); painter->setBrush(option.palette.highlight()); @@ -356,7 +357,7 @@ private: * @param status The proxy status (see definitions.h) */ void setProxyStatus(ProjectItem *item, CLIPJOBSTATUS status, int progress = 0); /** @brief Process ffmpeg output to find out process progress. */ - void processLogInfo(QList items, int *duration, const QString &log); + void processLogInfo(QList items, int progress); void monitorItemEditing(bool enable); /** @brief Get cached thumbnail for a project's clip or create it if no cache. */ void getCachedThumbnail(ProjectItem *item); diff --git a/src/projecttree/abstractclipjob.cpp b/src/projecttree/abstractclipjob.cpp index 58dd9484..64b6905a 100644 --- a/src/projecttree/abstractclipjob.cpp +++ b/src/projecttree/abstractclipjob.cpp @@ -30,7 +30,8 @@ AbstractClipJob::AbstractClipJob(JOBTYPE type, CLIPTYPE cType, const QString &id QObject(), clipType(cType), jobType(type), - m_clipId(id) + m_clipId(id), + m_jobProcess(NULL) { } @@ -43,7 +44,7 @@ const QString AbstractClipJob::clipId() const return m_clipId; } -QProcess *AbstractClipJob::startJob(bool *ok) +QProcess *AbstractClipJob::startJob(bool */*ok*/) { return NULL; } @@ -58,3 +59,7 @@ stringMap AbstractClipJob::cancelProperties() return QMap (); } +int AbstractClipJob::processLogInfo() +{ + return -1; +} diff --git a/src/projecttree/abstractclipjob.h b/src/projecttree/abstractclipjob.h index 9659d864..74c656ca 100644 --- a/src/projecttree/abstractclipjob.h +++ b/src/projecttree/abstractclipjob.h @@ -41,9 +41,11 @@ public: QString description; const QString clipId() const; virtual const QString destination() const; - virtual QProcess *startJob(bool *ok); + virtual QProcess *startJob(bool */*ok*/); virtual stringMap cancelProperties(); - + virtual int processLogInfo(); + QProcess *m_jobProcess; + signals: void jobProgress(int progress); diff --git a/src/projecttree/proxyclipjob.cpp b/src/projecttree/proxyclipjob.cpp index dd0171a4..5526eb2b 100644 --- a/src/projecttree/proxyclipjob.cpp +++ b/src/projecttree/proxyclipjob.cpp @@ -25,7 +25,9 @@ #include #include -ProxyJob::ProxyJob(JOBTYPE type, CLIPTYPE cType, const QString &id, QStringList parameters) : AbstractClipJob(type, cType, id, parameters) +ProxyJob::ProxyJob(JOBTYPE type, CLIPTYPE cType, const QString &id, QStringList parameters) : AbstractClipJob(type, cType, id, parameters), + m_jobDuration(0), + m_isFfmpegJob(true) { description = i18n("proxy"); m_dest = parameters.at(0); @@ -39,8 +41,10 @@ ProxyJob::ProxyJob(JOBTYPE type, CLIPTYPE cType, const QString &id, QStringList QProcess *ProxyJob::startJob(bool *ok) { // Special case: playlist clips (.mlt or .kdenlive project files) + m_jobDuration = 0; if (clipType == PLAYLIST) { // change FFmpeg params to MLT format + m_isFfmpegJob = false; QStringList mltParameters; mltParameters << m_src; mltParameters << "-consumer" << "avformat:" + m_dest; @@ -60,14 +64,18 @@ QProcess *ProxyJob::startJob(bool *ok) //TODO: currently, when rendering an xml file through melt, the display ration is lost, so we enforce it manualy double display_ratio = KdenliveDoc::getDisplayRatio(m_src); mltParameters << "aspect=" + QString::number(display_ratio); + + // Ask for progress reporting + mltParameters << "progress=1"; - QProcess *myProcess = new QProcess; - myProcess->setProcessChannelMode(QProcess::MergedChannels); - myProcess->start(KdenliveSettings::rendererpath(), mltParameters); - myProcess->waitForStarted(); - return myProcess; + m_jobProcess = new QProcess; + m_jobProcess->setProcessChannelMode(QProcess::MergedChannels); + m_jobProcess->start(KdenliveSettings::rendererpath(), mltParameters); + m_jobProcess->waitForStarted(); + return m_jobProcess; } else if (clipType == IMAGE) { + m_isFfmpegJob = false; // Image proxy QImage i(m_src); if (i.isNull()) { @@ -118,6 +126,7 @@ QProcess *ProxyJob::startJob(bool *ok) return NULL; } else { + m_isFfmpegJob = true; QStringList parameters; parameters << "-i" << m_src; QString params = m_proxyParams; @@ -127,14 +136,48 @@ QProcess *ProxyJob::startJob(bool *ok) // Make sure we don't block when proxy file already exists parameters << "-y"; parameters << m_dest; - QProcess *myProcess = new QProcess; - myProcess->setProcessChannelMode(QProcess::MergedChannels); - myProcess->start("ffmpeg", parameters); - myProcess->waitForStarted(); - return myProcess; + m_jobProcess = new QProcess; + m_jobProcess->setProcessChannelMode(QProcess::MergedChannels); + m_jobProcess->start("ffmpeg", parameters); + m_jobProcess->waitForStarted(); + return m_jobProcess; } } +int ProxyJob::processLogInfo() +{ + if (!m_jobProcess) return -1; + QString log = m_jobProcess->readAll(); + int progress; + if (m_isFfmpegJob) { + // Parse FFmpeg output + if (m_jobDuration == 0) { + if (log.contains("Duration:")) { + QString data = log.section("Duration:", 1, 1).section(',', 0, 0).simplified(); + QStringList numbers = data.split(':'); + m_jobDuration = (int) (numbers.at(0).toInt() * 3600 + numbers.at(1).toInt() * 60 + numbers.at(2).toDouble()); + } + } + else if (log.contains("time=")) { + QString time = log.section("time=", 1, 1).simplified().section(' ', 0, 0); + if (time.contains(':')) { + QStringList numbers = time.split(':'); + progress = numbers.at(0).toInt() * 3600 + numbers.at(1).toInt() * 60 + numbers.at(2).toDouble(); + } + else progress = (int) time.toDouble(); + return (int) (100.0 * progress / m_jobDuration); + } + } + else { + // Parse MLT output + if (log.contains("percentage:")) { + progress = log.section(':', -1).simplified().toInt(); + return progress; + } + } + return -1; +} + ProxyJob::~ProxyJob() { } diff --git a/src/projecttree/proxyclipjob.h b/src/projecttree/proxyclipjob.h index 92acf068..82366aff 100644 --- a/src/projecttree/proxyclipjob.h +++ b/src/projecttree/proxyclipjob.h @@ -37,6 +37,7 @@ public: const QString destination() const; QProcess *startJob(bool *ok); stringMap cancelProperties(); + int processLogInfo(); private: QString m_dest; @@ -45,7 +46,8 @@ private: QString m_proxyParams; int m_renderWidth; int m_renderHeight; - + int m_jobDuration; + bool m_isFfmpegJob; }; #endif