CutClipJob::CutClipJob(CLIPTYPE cType, const QString &id, 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();
- 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;
+ 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;
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);
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()
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;
+}