X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojecttree%2Fcutclipjob.cpp;h=a5ed89f98f2de1cf64566a47398f2725c187c809;hb=c24658bd34221d735f0641c924b890e1a6be7101;hp=bc483b52b2f98d626d602b8800a4fcd506d4139c;hpb=dd604e8fc559277a2fc42a161feb0de91d3515a5;p=kdenlive diff --git a/src/projecttree/cutclipjob.cpp b/src/projecttree/cutclipjob.cpp index bc483b52..a5ed89f9 100644 --- a/src/projecttree/cutclipjob.cpp +++ b/src/projecttree/cutclipjob.cpp @@ -23,27 +23,35 @@ #include "kdenlivedoc.h" #include -#include +#include -CutClipJob::CutClipJob(CLIPTYPE cType, const QString &id, QStringList parameters) : AbstractClipJob(CUTJOB, cType, id, parameters) +CutClipJob::CutClipJob(ClipType cType, const QString &id, const QStringList ¶meters) : 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: "<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: "<