Got rid of 'pipebuf.exe' tool. Will now use two QProcess objects to handle the redirection internally.
This commit is contained in:
parent
6410bdbaac
commit
c1d867228e
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/tmp/
|
||||||
|
/obj/
|
||||||
|
/bin/
|
||||||
|
/ipch/
|
||||||
|
/*.sdf
|
||||||
|
/*.suo
|
||||||
|
/*.user
|
BIN
res/buttons/cross.png
Normal file
BIN
res/buttons/cross.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 655 B |
BIN
res/buttons/disk.png
Normal file
BIN
res/buttons/disk.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 620 B |
@ -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())
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user