Got rid of 'pipebuf.exe' tool. Will now use two QProcess objects to handle the redirection internally.

This commit is contained in:
LoRd_MuldeR 2012-01-31 15:15:15 +01:00
parent 6410bdbaac
commit c1d867228e
6 changed files with 80 additions and 31 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
/tmp/
/obj/
/bin/
/ipch/
/*.sdf
/*.suo
/*.user

BIN
res/buttons/cross.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

BIN
res/buttons/disk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

View File

@ -151,7 +151,7 @@ void EncodeThread::encode(void)
unsigned int frames = 0; unsigned int frames = 0;
//Detect source info //Detect source info
bool usePipe = m_x64 && (QFileInfo(m_sourceFileName).suffix().compare("avs", Qt::CaseInsensitive) == 0); bool usePipe = true; //m_x64 && (QFileInfo(m_sourceFileName).suffix().compare("avs", Qt::CaseInsensitive) == 0);
if(usePipe) if(usePipe)
{ {
log(tr("\n--- AVS INFO ---\n")); log(tr("\n--- AVS INFO ---\n"));
@ -217,23 +217,28 @@ void EncodeThread::encode(void)
bool EncodeThread::runEncodingPass(bool x64, bool usePipe, unsigned int frames, int pass, const QString &passLogFile) bool EncodeThread::runEncodingPass(bool x64, bool usePipe, unsigned int frames, int pass, const QString &passLogFile)
{ {
QProcess process; QProcess processEncode, processAvisynth;
QStringList cmdLine;
if(usePipe) if(usePipe)
{ {
cmdLine << QString("%1/avs2yuv.exe").arg(m_binDir); QStringList cmdLine_Avisynth;
cmdLine << QDir::toNativeSeparators(m_sourceFileName); cmdLine_Avisynth << QDir::toNativeSeparators(m_sourceFileName);
cmdLine << "-" << ":"; cmdLine_Avisynth << "-";
cmdLine << QString("%1/%2.exe").arg(m_binDir,(x64 ? "x264_x64" : "x264")); processAvisynth.setStandardOutputProcess(&processEncode);
log("Creating Avisynth process:");
if(!startProcess(processAvisynth, QString("%1/avs2yuv.exe").arg(m_binDir), cmdLine_Avisynth, false))
{
return false;
}
} }
cmdLine << buildCommandLine(usePipe, frames, pass, passLogFile); QStringList cmdLine_Encode = buildCommandLine(usePipe, frames, pass, passLogFile);
log("Creating process:"); log("Creating x264 process:");
if(!startProcess(process, QString("%1/%2.exe").arg(m_binDir, usePipe ? "pipebuf" : (x64 ? "x264_x64" : "x264")), cmdLine)) if(!startProcess(processEncode, QString("%1/%2.exe").arg(m_binDir, x64 ? "x264_x64" : "x264"), cmdLine_Encode))
{ {
return false;; return false;
} }
QRegExp regExpIndexing("indexing.+\\[(\\d+)\\.\\d+%\\]"); QRegExp regExpIndexing("indexing.+\\[(\\d+)\\.\\d+%\\]");
@ -243,28 +248,29 @@ bool EncodeThread::runEncodingPass(bool x64, bool usePipe, unsigned int frames,
bool bTimeout = false; bool bTimeout = false;
bool bAborted = false; bool bAborted = false;
while(process.state() != QProcess::NotRunning) while(processEncode.state() != QProcess::NotRunning)
{ {
if(m_abort) if(m_abort)
{ {
process.kill(); processEncode.kill();
processAvisynth.kill();
bAborted = true; bAborted = true;
break; break;
} }
if(!process.waitForReadyRead(m_processTimeoutInterval)) if(!processEncode.waitForReadyRead(m_processTimeoutInterval))
{ {
if(process.state() == QProcess::Running) if(processEncode.state() == QProcess::Running)
{ {
process.kill(); processEncode.kill();
qWarning("x264 process timed out <-- killing!"); qWarning("x264 process timed out <-- killing!");
log("\nPROCESS TIMEOUT !!!"); log("\nPROCESS TIMEOUT !!!");
bTimeout = true; bTimeout = true;
break; break;
} }
} }
while(process.bytesAvailable() > 0) while(processEncode.bytesAvailable() > 0)
{ {
QList<QByteArray> lines = process.readLine().split('\r'); QList<QByteArray> lines = processEncode.readLine().split('\r');
while(!lines.isEmpty()) while(!lines.isEmpty())
{ {
QString text = QString::fromUtf8(lines.takeFirst().constData()).simplified(); QString text = QString::fromUtf8(lines.takeFirst().constData()).simplified();
@ -298,24 +304,50 @@ bool EncodeThread::runEncodingPass(bool x64, bool usePipe, unsigned int frames,
} }
} }
process.waitForFinished(); processEncode.waitForFinished(5000);
if(process.state() != QProcess::NotRunning) if(processEncode.state() != QProcess::NotRunning)
{ {
process.kill(); qWarning("x264 process still running, going to kill it!");
process.waitForFinished(-1); processEncode.kill();
processEncode.waitForFinished(-1);
} }
if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS) processAvisynth.waitForFinished(5000);
if(processAvisynth.state() != QProcess::NotRunning)
{
qWarning("Avisynth process still running, going to kill it!");
processAvisynth.kill();
processAvisynth.waitForFinished(-1);
}
while(processAvisynth.bytesAvailable() > 0)
{
log(tr("av2y [info]: %1").arg(QString::fromUtf8(processAvisynth.readLine()).simplified()));
}
if(usePipe && (processAvisynth.exitCode() != EXIT_SUCCESS))
{ {
if(!(bTimeout || bAborted)) if(!(bTimeout || bAborted))
{ {
log(tr("\nPROCESS EXITED WITH ERROR CODE: %1").arg(QString::number(process.exitCode()))); log(tr("\nWARNING: Avisynth process exited with error code: %1").arg(QString::number(processAvisynth.exitCode())));
} }
}
if(bTimeout || bAborted || processEncode.exitCode() != EXIT_SUCCESS)
{
if(!(bTimeout || bAborted))
{
log(tr("\nPROCESS EXITED WITH ERROR CODE: %1").arg(QString::number(processEncode.exitCode())));
}
processEncode.close();
processAvisynth.close();
return false; return false;
} }
setStatus((pass == 2) ? JobStatus_Running_Pass2 : ((pass == 1) ? JobStatus_Running_Pass1 : JobStatus_Running)); setStatus((pass == 2) ? JobStatus_Running_Pass2 : ((pass == 1) ? JobStatus_Running_Pass1 : JobStatus_Running));
setProgress(100); setProgress(100);
processEncode.close();
processAvisynth.close();
return true; return true;
} }
@ -363,6 +395,7 @@ QStringList EncodeThread::buildCommandLine(bool usePipe, unsigned int frames, in
if(usePipe) if(usePipe)
{ {
if(frames < 1) throw "Frames not set!";
cmdLine << "--frames" << QString::number(frames); cmdLine << "--frames" << QString::number(frames);
cmdLine << "--demuxer" << "y4m"; cmdLine << "--demuxer" << "y4m";
cmdLine << "--stdin" << "y4m" << "-"; cmdLine << "--stdin" << "y4m" << "-";
@ -632,7 +665,7 @@ void EncodeThread::setDetails(const QString &text)
emit detailsChanged(m_jobId, text); emit detailsChanged(m_jobId, text);
} }
bool EncodeThread::startProcess(QProcess &process, const QString &program, const QStringList &args) bool EncodeThread::startProcess(QProcess &process, const QString &program, const QStringList &args, bool mergeChannels)
{ {
static AssignProcessToJobObjectFun AssignProcessToJobObjectPtr = NULL; static AssignProcessToJobObjectFun AssignProcessToJobObjectPtr = NULL;
static CreateJobObjectFun CreateJobObjectPtr = NULL; static CreateJobObjectFun CreateJobObjectPtr = NULL;
@ -674,8 +707,17 @@ bool EncodeThread::startProcess(QProcess &process, const QString &program, const
AssignProcessToJobObjectPtr = (AssignProcessToJobObjectFun) Kernel32Lib.resolve("AssignProcessToJobObject"); AssignProcessToJobObjectPtr = (AssignProcessToJobObjectFun) Kernel32Lib.resolve("AssignProcessToJobObject");
} }
process.setProcessChannelMode(QProcess::MergedChannels); if(mergeChannels)
process.setReadChannel(QProcess::StandardOutput); {
process.setProcessChannelMode(QProcess::MergedChannels);
process.setReadChannel(QProcess::StandardOutput);
}
else
{
process.setProcessChannelMode(QProcess::SeparateChannels);
process.setReadChannel(QProcess::StandardError);
}
process.start(program, args); process.start(program, args);
if(process.waitForStarted()) if(process.waitForStarted())

View File

@ -94,7 +94,7 @@ protected:
inline void setStatus(JobStatus newStatus); inline void setStatus(JobStatus newStatus);
inline void setProgress(unsigned int newProgress); inline void setProgress(unsigned int newProgress);
inline void setDetails(const QString &text); inline void setDetails(const QString &text);
bool startProcess(QProcess &process, const QString &program, const QStringList &args); bool startProcess(QProcess &process, const QString &program, const QStringList &args, bool mergeChannels = true);
static QString commandline2string(const QString &program, const QStringList &arguments); static QString commandline2string(const QString &program, const QStringList &arguments);

View File

@ -303,7 +303,7 @@ void MainWindow::launchNextJob(void)
void MainWindow::init(void) void MainWindow::init(void)
{ {
static const char *binFiles = "x264.exe:x264_x64.exe:avs2yuv.exe:pipebuf.exe"; static const char *binFiles = "x264.exe:x264_x64.exe:avs2yuv.exe";
QStringList binaries = QString::fromLatin1(binFiles).split(":", QString::SkipEmptyParts); QStringList binaries = QString::fromLatin1(binFiles).split(":", QString::SkipEmptyParts);
updateLabel(); updateLabel();