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 <ProjectItem *>(*it);
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++)
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);
}
}
-void ProjectList::processLogInfo(QList <ProjectItem *>items, int *duration, const QString &log)
+void ProjectList::processLogInfo(QList <ProjectItem *>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()
}
}
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());
* @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 <ProjectItem *>items, int *duration, const QString &log);
+ void processLogInfo(QList <ProjectItem *>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);
QObject(),
clipType(cType),
jobType(type),
- m_clipId(id)
+ m_clipId(id),
+ m_jobProcess(NULL)
{
}
return m_clipId;
}
-QProcess *AbstractClipJob::startJob(bool *ok)
+QProcess *AbstractClipJob::startJob(bool */*ok*/)
{
return NULL;
}
return QMap <QString, QString>();
}
+int AbstractClipJob::processLogInfo()
+{
+ return -1;
+}
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);
#include <KDebug>
#include <KLocale>
-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);
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;
//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()) {
return NULL;
}
else {
+ m_isFfmpegJob = true;
QStringList parameters;
parameters << "-i" << m_src;
QString params = m_proxyParams;
// 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()
{
}
const QString destination() const;
QProcess *startJob(bool *ok);
stringMap cancelProperties();
+ int processLogInfo();
private:
QString m_dest;
QString m_proxyParams;
int m_renderWidth;
int m_renderHeight;
-
+ int m_jobDuration;
+ bool m_isFfmpegJob;
};
#endif