#include "proxyclipjob.h"
#include "kdenlivesettings.h"
#include "kdenlivedoc.h"
+#include <QProcess>
+
#include <KDebug>
-#include <KLocale>
+#include <KLocalizedString>
-ProxyJob::ProxyJob(CLIPTYPE cType, const QString &id, QStringList parameters) : AbstractClipJob(PROXYJOB, cType, id, parameters),
- m_jobDuration(0),
- m_isFfmpegJob(true)
+ProxyJob::ProxyJob(ClipType cType, const QString &id, const QStringList& parameters)
+ : AbstractClipJob(PROXYJOB, cType, id, parameters),
+ m_jobDuration(0),
+ m_isFfmpegJob(true)
{
- m_jobStatus = JOBWAITING;
+ m_jobStatus = JobWaiting;
description = i18n("proxy");
m_dest = parameters.at(0);
m_src = parameters.at(1);
{
// Special case: playlist clips (.mlt or .kdenlive project files)
m_jobDuration = 0;
- if (clipType == PLAYLIST) {
+ if (clipType == Playlist) {
// change FFmpeg params to MLT format
m_isFfmpegJob = false;
QStringList mltParameters;
mltParameters << m_src;
- mltParameters << "-consumer" << "avformat:" + m_dest;
- QStringList params = m_proxyParams.split('-', QString::SkipEmptyParts);
-
+ mltParameters << QLatin1String("-consumer") << QLatin1String("avformat:") + m_dest;
+ QStringList params = m_proxyParams.split(QLatin1Char('-'), QString::SkipEmptyParts);
+
foreach(const QString &s, params) {
QString t = s.simplified();
- if (t.count(' ') == 0) {
- t.append("=1");
+ if (t.count(QLatin1Char(' ')) == 0) {
+ t.append(QLatin1String("=1"));
}
- else t.replace(' ', '=');
+ else t.replace(QLatin1Char(' '), QLatin1String("="));
mltParameters << t;
}
- mltParameters.append(QString("real_time=-%1").arg(KdenliveSettings::mltthreads()));
+ mltParameters.append(QString::fromLatin1("real_time=-%1").arg(KdenliveSettings::mltthreads()));
//TODO: currently, when rendering an xml file through melt, the display ration is lost, so we enforce it manualy
double display_ratio;
- if (m_src.startsWith("consumer:")) display_ratio = KdenliveDoc::getDisplayRatio(m_src.section(":", 1));
- else display_ratio = KdenliveDoc::getDisplayRatio(m_src);
- mltParameters << "aspect=" + QString::number(display_ratio);
-
+ if (m_src.startsWith(QLatin1String("consumer:"))) display_ratio = KdenliveDoc::getDisplayRatio(m_src.section(QLatin1String(":"), 1));
+ else display_ratio = KdenliveDoc::getDisplayRatio(m_src);
+ mltParameters << QLatin1String("aspect=") + QLocale().toString(display_ratio);
+
// Ask for progress reporting
- mltParameters << "progress=1";
+ mltParameters << QLatin1String("progress=1");
- m_jobProcess = new QProcess;
+ m_jobProcess = new QProcess;
m_jobProcess->setProcessChannelMode(QProcess::MergedChannels);
m_jobProcess->start(KdenliveSettings::rendererpath(), mltParameters);
m_jobProcess->waitForStarted();
}
- else if (clipType == IMAGE) {
+ else if (clipType == Image) {
m_isFfmpegJob = false;
// Image proxy
QImage i(m_src);
if (i.isNull()) {
- m_errorMessage.append(i18n("Cannot load image %1.", m_src));
- setStatus(JOBCRASHED);
- return;
- }
-
+ m_errorMessage.append(i18n("Cannot load image %1.", m_src));
+ setStatus(JobCrashed);
+ return;
+ }
+
QImage proxy;
- // Images are scaled to profile size.
+ // Images are scaled to profile size.
//TODO: Make it be configurable?
if (i.width() > i.height()) proxy = i.scaledToWidth(m_renderWidth);
else proxy = i.scaledToHeight(m_renderHeight);
QMatrix matrix;
switch ( m_exif ) {
- case 2:
- matrix.scale( -1, 1 );
- break;
- case 3:
- matrix.rotate( 180 );
- break;
- case 4:
- matrix.scale( 1, -1 );
- break;
- case 5:
- matrix.rotate( 270 );
- matrix.scale( -1, 1 );
- break;
- case 6:
- matrix.rotate( 90 );
- break;
- case 7:
- matrix.rotate( 90 );
- matrix.scale( -1, 1 );
- break;
- case 8:
- matrix.rotate( 270 );
- break;
+ case 2:
+ matrix.scale( -1, 1 );
+ break;
+ case 3:
+ matrix.rotate( 180 );
+ break;
+ case 4:
+ matrix.scale( 1, -1 );
+ break;
+ case 5:
+ matrix.rotate( 270 );
+ matrix.scale( -1, 1 );
+ break;
+ case 6:
+ matrix.rotate( 90 );
+ break;
+ case 7:
+ matrix.rotate( 90 );
+ matrix.scale( -1, 1 );
+ break;
+ case 8:
+ matrix.rotate( 270 );
+ break;
}
processed = proxy.transformed( matrix );
processed.save(m_dest);
+ } else {
+ proxy.save(m_dest);
}
- else proxy.save(m_dest);
- setStatus(JOBDONE);
- return;
- }
- else {
+ setStatus(JobDone);
+ return;
+ } else {
m_isFfmpegJob = true;
- QStringList parameters;
- parameters << "-i" << m_src;
+ QStringList parameters;
+ parameters << QLatin1String("-i") << m_src;
QString params = m_proxyParams;
- foreach(const QString &s, params.split(' '))
+ foreach(const QString &s, params.split(QLatin1Char(' ')))
parameters << s;
// Make sure we don't block when proxy file already exists
- parameters << "-y";
+ parameters << QLatin1String("-y");
parameters << m_dest;
m_jobProcess = new QProcess;
m_jobProcess->setProcessChannelMode(QProcess::MergedChannels);
}
while (m_jobProcess->state() != QProcess::NotRunning) {
processLogInfo();
- if (m_jobStatus == JOBABORTED) {
+ if (m_jobStatus == JobAborted) {
emit cancelRunningJob(m_clipId, cancelProperties());
m_jobProcess->close();
m_jobProcess->waitForFinished();
m_jobProcess->waitForFinished(400);
}
- if (m_jobStatus != JOBABORTED) {
+ 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 proxy clip."));
- setStatus(JOBCRASHED);
+ setStatus(JobCrashed);
}
- else setStatus(JOBDONE);
+ else setStatus(JobDone);
}
else if (result == QProcess::CrashExit) {
// Proxy process crashed
QFile::remove(m_dest);
- setStatus(JOBCRASHED);
+ setStatus(JobCrashed);
}
}
void ProxyJob::processLogInfo()
{
- if (!m_jobProcess || m_jobStatus == JOBABORTED) return;
- QString log = m_jobProcess->readAll();
- if (!log.isEmpty()) m_logDetails.append(log + '\n');
- else return;
+ if (!m_jobProcess || m_jobStatus == JobAborted) return;
+ QString log = QString::fromUtf8(m_jobProcess->readAll());
+ if (!log.isEmpty())
+ m_logDetails.append(log + QLatin1Char('\n'));
+ else
+ return;
+
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(':');
+ if (log.contains(QLatin1String("Duration:"))) {
+ QString data = log.section(QLatin1String("Duration:"), 1, 1).section(QLatin1Char(','), 0, 0).simplified();
+ QStringList numbers = data.split(QLatin1Char(':'));
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(':');
+ else if (log.contains(QLatin1String("time="))) {
+ QString time = log.section(QLatin1String("time="), 1, 1).simplified().section(QLatin1Char(' '), 0, 0);
+ if (time.contains(QLatin1Char(':'))) {
+ QStringList numbers = time.split(QLatin1Char(':'));
progress = numbers.at(0).toInt() * 3600 + numbers.at(1).toInt() * 60 + numbers.at(2).toDouble();
}
else progress = (int) time.toDouble();
}
else {
// Parse MLT output
- if (log.contains("percentage:")) {
- progress = log.section(':', -1).simplified().toInt();
+ if (log.contains(QLatin1String("percentage:"))) {
+ progress = log.section(QLatin1String("percentage:"), 1).simplified().section(QLatin1Char(' '), 0, 0).toInt();
emit jobProgress(m_clipId, progress, jobType);
}
}
stringMap ProxyJob::cancelProperties()
{
QMap <QString, QString> props;
- props.insert("proxy", "-");
+ props.insert(QLatin1String("proxy"), QLatin1String("-"));
return props;
}
{
QString statusInfo;
switch (m_jobStatus) {
- case JOBWORKING:
- statusInfo = i18n("Creating proxy");
- break;
- case JOBWAITING:
- statusInfo = i18n("Waiting - proxy");
- break;
- default:
- break;
+ case JobWorking:
+ statusInfo = i18n("Creating proxy");
+ break;
+ case JobWaiting:
+ statusInfo = i18n("Waiting - proxy");
+ break;
+ default:
+ break;
}
return statusInfo;
}
+
+#include "proxyclipjob.moc"