diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2009-09-27 17:21:26 -0400 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2009-09-27 17:21:26 -0400 |
commit | 89c443bd183ffe579625d94545026d7243207a9f (patch) | |
tree | 178480cdedbc7c839cc18f5fd78f4b7b08c36cbc /encodemp4job.cpp | |
parent | Add from ISO (diff) | |
download | AnyRip-89c443bd183ffe579625d94545026d7243207a9f.tar.xz AnyRip-89c443bd183ffe579625d94545026d7243207a9f.zip |
Termination, slotted dvd title loading, framework fixes.
Diffstat (limited to 'encodemp4job.cpp')
-rw-r--r-- | encodemp4job.cpp | 87 |
1 files changed, 46 insertions, 41 deletions
diff --git a/encodemp4job.cpp b/encodemp4job.cpp index 9713193..49c7042 100644 --- a/encodemp4job.cpp +++ b/encodemp4job.cpp @@ -2,26 +2,34 @@ #include "encodemp4jobgui.h" #include <QWidget> #include <QLabel> -#include <QProcess> #include <QStringList> #include <QRegExp> #include <QTime> +#include <QFile> -EncodeMP4Job::EncodeMP4Job(Video *video, QString encodePath, QString imagePath) : - Job(video), - m_encodePath(encodePath), - m_imagePath(imagePath) +EncodeMP4Job::EncodeMP4Job(Video *video) : + Job(video, false), + m_process(0) { } +EncodeMP4Job::~EncodeMP4Job() +{ + disconnect(this, 0, 0, 0); + terminate(); +} Video::Jobs EncodeMP4Job::jobType() const { return Video::EncodeMP4; } bool EncodeMP4Job::executeJob() { - QProcess process; + m_process = new QProcess(this); + connect(m_process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(terminate())); + connect(m_process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finished(int,QProcess::ExitStatus))); + connect(m_process, SIGNAL(readyRead()), this, SLOT(readyRead())); QStringList arguments; - arguments << "-i" << m_imagePath; + arguments << "-i" << video()->imagePath(); + m_encodePath = video()->encodePath(); arguments << "-o" << m_encodePath; arguments << "-e" << "x264"; arguments << "-b" << "500"; @@ -37,15 +45,18 @@ bool EncodeMP4Job::executeJob() arguments << "--optimize" << "--decomb" << "--deblock" << "--denoise=\"weak\""; arguments << "-x" << "ref=3:mixed-refs:bframes=6:weightb:direct=auto:b-pyramid:me=umh:subme=9:analyse=all:8x8dct:trellis=1:no-fast-pskip:psy-rd=1,1"; qDebug() << "starting handbreak with arguments:" << arguments; - //process.setStandardErrorFile("/home/zx2c4/Desktop/error.log"); - //process.setStandardOutputFile("/home/zx2c4/Desktop/out.log"); - process.start(QLatin1String("./HandBrakeCLI"), arguments, QIODevice::ReadOnly); - if (!process.waitForStarted()) - return false; - QRegExp percentLinePattern(QLatin1String("^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\\.[0-9]*) % (\\(([0-9]*\\.[0-9]*) fps, avg ([0-9]*\\.[0-9]*) fps, ETA ([0-9]{2})h([0-9]{2})m([0-9]{2})s\\))?")); - QRegExp lessPercentLinePattern(QLatin1String("^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\\.[0-9]*) %")); - while (process.waitForReadyRead(-1)) { - QString line = QString(process.readLine()).trimmed(); + //m_process->setStandardErrorFile("/home/zx2c4/Desktop/error.log"); + //m_process->setStandardOutputFile("/home/zx2c4/Desktop/out.log"); + m_process->start(QLatin1String("./HandBrakeCLI"), arguments, QIODevice::ReadOnly); + return true; +} +void EncodeMP4Job::readyRead() +{ + static const QRegExp percentLinePattern(QLatin1String("^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\\.[0-9]*) % (\\(([0-9]*\\.[0-9]*) fps, avg ([0-9]*\\.[0-9]*) fps, ETA ([0-9]{2})h([0-9]{2})m([0-9]{2})s\\))?")); + static const QRegExp lessPercentLinePattern(QLatin1String("^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\\.[0-9]*) %")); + QByteArray byteLine; + while (!(byteLine = m_process->readLine()).isEmpty()) { + QString line = QString(byteLine).trimmed(); if (percentLinePattern.exactMatch(line)) { int currentTask = percentLinePattern.cap(1).toInt(); int totalTasks = percentLinePattern.cap(2).toInt(); @@ -61,35 +72,29 @@ bool EncodeMP4Job::executeJob() emit encodeProgress(currentTask, totalTasks, percent, -1, -1, QTime()); } } - process.waitForFinished(-1); - return process.exitStatus() == QProcess::NormalExit; } -QWidget* EncodeMP4Job::gui() +void EncodeMP4Job::terminate() { - return new EncodeMP4JobGui(this); + if (m_process) { + disconnect(m_process, 0, 0, 0); + delete m_process; + m_process = 0; + QFile::remove(m_encodePath); + } + emit completed(false); } -QMap<int, QString> EncodeMP4Job::titles() const +void EncodeMP4Job::finished(int exitCode, QProcess::ExitStatus exitStatus) { - return titles(m_encodePath); + if (exitCode == 0 && exitStatus == QProcess::NormalExit) { + disconnect(m_process, 0, 0, 0); + delete m_process; + m_process = 0; + emit completed(true); + } + else + terminate(); } -QMap<int, QString> EncodeMP4Job::titles(const QString &location) +QWidget* EncodeMP4Job::gui() { - QMap<int, QString> titles; - QProcess process; - QStringList arguments; - arguments << "-i" << location; - arguments << "-t" << "0"; - arguments << "--dvdnav"; - process.start(QLatin1String("./HandBrakeCLI"), arguments, QIODevice::ReadOnly); - if (!process.waitForStarted()) - return titles; - process.waitForFinished(-1); - QRegExp titleDurationPattern(QLatin1String("\\+ title ([0-9]*):\\n[^\\n]*\\n[^\\n]*\\n \\+ duration: ([0-9]{2}:[0-9]{2}:[0-9]{2})")); - QString output(process.readAllStandardError()); - int matchLocation = 0; - while ((matchLocation = titleDurationPattern.indexIn(output, matchLocation)) != -1) { - matchLocation += titleDurationPattern.matchedLength(); - titles.insert(titleDurationPattern.cap(1).toInt(), titleDurationPattern.cap(2)); - } - return titles; + return new EncodeMP4JobGui(this); } |