]> git.sesse.net Git - kdenlive/commitdiff
Some progress on clip jobs
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 19 Dec 2011 17:52:50 +0000 (18:52 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 19 Dec 2011 17:52:50 +0000 (18:52 +0100)
src/projectlist.cpp
src/projectlist.h
src/projecttree/abstractclipjob.cpp
src/projecttree/abstractclipjob.h
src/projecttree/proxyclipjob.cpp
src/projecttree/proxyclipjob.h

index 4e6b6ad4a41e0332d32b7f88a2ba020f7ff143fd..2e4bfac0db01a90537f1ea98d5a10672f6894b06 100644 (file)
@@ -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 <ProjectItem *>(*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 <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()
index 7e5b1e8d692a8d42583fc3984115cd08e347ba96..e273b724cb1343c84aff155d0112b81576a21c4e 100644 (file)
@@ -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 <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);
index 58dd94840456302b48b56ec772314b60fda2c588..64b6905a75b647f302890ac4b18570c8fca1ab33 100644 (file)
@@ -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 <QString, QString>();
 }
 
+int AbstractClipJob::processLogInfo()
+{
+    return -1;
+}
index 9659d86468adf06243d234ad688617c04aa74c1a..74c656ca7fec120d07f54b298985a6dcb76951ce 100644 (file)
@@ -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);
 
index dd0171a4d071983180c22b5cb2ce5226a6974e7d..5526eb2b34d446f1ab222ed3bf29fc81704d6f8a 100644 (file)
@@ -25,7 +25,9 @@
 #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);
@@ -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()
 {
 }
index 92acf0683238b4f3c62242242545fc3795c85682..82366aff490206bfce3a1a8a2f430d8b9a241799 100644 (file)
@@ -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