]> git.sesse.net Git - kdenlive/blobdiff - src/projecttree/cutclipjob.cpp
Cleaning code style of Definitions.
[kdenlive] / src / projecttree / cutclipjob.cpp
index bc483b52b2f98d626d602b8800a4fcd506d4139c..a5ed89f98f2de1cf64566a47398f2725c187c809 100644 (file)
 #include "kdenlivedoc.h"
 
 #include <KDebug>
-#include <KLocale>
+#include <KLocalizedString>
 
-CutClipJob::CutClipJob(CLIPTYPE cType, const QString &id, QStringList parameters) : AbstractClipJob(CUTJOB, cType, id, parameters)
+CutClipJob::CutClipJob(ClipType cType, const QString &id, const QStringList &parameters) : AbstractClipJob(CUTJOB, cType, id, parameters)
 {
-    description = i18n("clip cut");
+    m_jobStatus = JobWaiting;
     m_dest = parameters.at(0);
     m_src = parameters.at(1);
     m_start = parameters.at(2);
     m_end = parameters.at(3);
+    if (m_start.isEmpty()) {
+        // this is a transcoding job
+        description = i18n("Transcode clip");
+    } else {
+        description = i18n("Cut clip");
+    }
     m_jobDuration = parameters.at(4).toInt();
-    if (parameters.count() == 6) m_cutExtraParams = parameters.at(5).simplified();
+    m_addClipToProject = parameters.at(5).toInt();
+    replaceClip = false;
+    if (parameters.count() == 7) m_cutExtraParams = parameters.at(6).simplified();
 }
 
-QProcess *CutClipJob::startJob(bool *ok)
+void CutClipJob::startJob()
 {
     // Special case: playlist clips (.mlt or .kdenlive project files)
-    if (clipType == AV || clipType == AUDIO || clipType == VIDEO) {
-       QStringList parameters;
+    if (clipType == AV || clipType == Audio || clipType == Video) {
+        QStringList parameters;
         parameters << "-i" << m_src;
-        parameters << "-ss" << m_start <<"-t" << m_end;
-        parameters << "-acodec" << "copy" << "-vcodec" << "copy";
+        if (!m_start.isEmpty())
+            parameters << "-ss" << m_start <<"-t" << m_end;
         if (!m_cutExtraParams.isEmpty()) {
             foreach(const QString &s, m_cutExtraParams.split(' '))
                 parameters << s;
@@ -54,29 +62,54 @@ QProcess *CutClipJob::startJob(bool *ok)
         parameters << m_dest;
         m_jobProcess = new QProcess;
         m_jobProcess->setProcessChannelMode(QProcess::MergedChannels);
-        kDebug()<<"// STARTING CIUT JOS: "<<parameters;
-        m_jobProcess->start("ffmpeg", parameters);
+        m_jobProcess->start(KdenliveSettings::ffmpegpath(), parameters);
         m_jobProcess->waitForStarted();
-        QString log = m_jobProcess->readAll();
-        if (!log.isEmpty()) m_errorMessage.append(log + '\n');
-       return m_jobProcess;
+        while (m_jobProcess->state() != QProcess::NotRunning) {
+            processLogInfo();
+            if (m_jobStatus == JobAborted) {
+                m_jobProcess->close();
+                m_jobProcess->waitForFinished();
+                QFile::remove(m_dest);
+            }
+            m_jobProcess->waitForFinished(400);
+        }
+        
+        if (m_jobStatus != JobAborted) {
+            int result = m_jobProcess->exitStatus();
+            if (result == QProcess::NormalExit) {
+                if (QFileInfo(m_dest).size() == 0) {
+                    // File was not created
+                    processLogInfo();
+                    m_errorMessage.append(i18n("Failed to create file."));
+                    setStatus(JobCrashed);
+                } else {
+                    setStatus(JobDone);
+                }
+            } else if (result == QProcess::CrashExit) {
+                // Proxy process crashed
+                QFile::remove(m_dest);
+                setStatus(JobCrashed);
+            }
+        }
+        delete m_jobProcess;
+        return;
+    } else {
+        m_errorMessage = i18n("Cannot process this clip type.");
     }
-    else m_errorMessage = i18n("Cannot process this clip type.");
-    *ok = false;
-    return NULL;
+    setStatus(JobCrashed);
+    return;
 }
 
-int CutClipJob::processLogInfo()
+void CutClipJob::processLogInfo()
 {
-    if (!m_jobProcess || m_jobDuration == 0) return -1;
+    if (!m_jobProcess || m_jobDuration == 0 || m_jobStatus == JobAborted) return;
     QString log = m_jobProcess->readAll();
-    if (!log.isEmpty()) m_errorMessage.append(log + '\n');
+    if (!log.isEmpty()) m_logDetails.append(log + '\n');
     int progress;
     // Parse FFmpeg output
     if (log.contains("frame=")) {
-        int progress = log.section("frame=", 1, 1).simplified().section(' ', 0, 0).toInt();
-        kDebug()<<"// PROgress: "<<progress<<", DUR: "<<m_jobDuration;
-        return (int) (100.0 * progress / m_jobDuration);
+        progress = log.section("frame=", 1, 1).simplified().section(' ', 0, 0).toInt();
+        emit jobProgress(m_clipId, (int) (100.0 * progress / m_jobDuration), jobType);
     }
     else if (log.contains("time=")) {
         QString time = log.section("time=", 1, 1).simplified().section(' ', 0, 0);
@@ -85,10 +118,8 @@ int CutClipJob::processLogInfo()
             progress = numbers.at(0).toInt() * 3600 + numbers.at(1).toInt() * 60 + numbers.at(2).toDouble();
         }
         else progress = (int) time.toDouble();
-        kDebug()<<"// PROgress: "<<progress<<", DUR: "<<m_jobDuration;
-        return (int) (100.0 * progress / m_jobDuration);
+        emit jobProgress(m_clipId, (int) (100.0 * progress / m_jobDuration), jobType);
     }
-    return -1;
 }
 
 CutClipJob::~CutClipJob()
@@ -106,4 +137,28 @@ stringMap CutClipJob::cancelProperties()
     return props;
 }
 
+const QString CutClipJob::statusMessage()
+{
+    QString statusInfo;
+    switch (m_jobStatus) {
+        case JobWorking:
+            if (m_start.isEmpty()) statusInfo = i18n("Transcoding clip");
+            else statusInfo = i18n("Extracting clip cut");
+            break;
+        case JobWaiting:
+            if (m_start.isEmpty()) statusInfo = i18n("Waiting - transcode clip");
+            else statusInfo = i18n("Waiting - cut clip");
+            break;
+        default:
+            break;
+    }
+    return statusInfo;
+}
+
+bool CutClipJob::isExclusive()
+{
+    return false;
+}
+
 
+#include "cutclipjob.moc"