X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fprojecttree%2Fcutclipjob.cpp;h=5b7d72102d56d3290ced44aeb0f99cc0c60cdea0;hb=50a62076c3e96ac7aa16410a609c0daefb1a3522;hp=e52a7f3663636f5b36cc8567815d9d9717398f7f;hpb=9278bc71e5136b057be653aae43686adb946373b;p=kdenlive diff --git a/src/projecttree/cutclipjob.cpp b/src/projecttree/cutclipjob.cpp index e52a7f36..5b7d7210 100644 --- a/src/projecttree/cutclipjob.cpp +++ b/src/projecttree/cutclipjob.cpp @@ -23,73 +23,103 @@ #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(); - addClipToProject = parameters.at(5).toInt(); + 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; - parameters << "-i" << m_src; - parameters << "-ss" << m_start <<"-t" << m_end; - parameters << "-acodec" << "copy" << "-vcodec" << "copy"; + if (clipType == AV || clipType == Audio || clipType == Video) { + QStringList parameters; + parameters << QLatin1String("-i") << m_src; + if (!m_start.isEmpty()) + parameters << QLatin1String("-ss") << m_start <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; - QString log = m_jobProcess->readAll(); - if (!log.isEmpty()) m_errorMessage.append(log + '\n'); + if (!m_jobProcess || m_jobDuration == 0 || m_jobStatus == JobAborted) return; + QString log = QString::fromUtf8(m_jobProcess->readAll()); + if (!log.isEmpty()) m_logDetails.append(log + QLatin1Char('\n')); int progress; // Parse FFmpeg output - if (log.contains("frame=")) { - int progress = log.section("frame=", 1, 1).simplified().section(' ', 0, 0).toInt(); - kDebug()<<"// PROgress: "<