--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Simple x264 Launcher
+// Copyright (C) 2004-2019 LoRd_MuldeR <MuldeR2@GMX.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// http://www.gnu.org/licenses/gpl-2.0.txt
+///////////////////////////////////////////////////////////////////////////////
+
+#include "thread_abstract.h"
+
+//MUtils
+#include <MUtils/Global.h>
+
+//Qt
+#include <QDir>
+#include <QElapsedTimer>
+#include <QProcess>
+
+//-------------------------------------
+// Constructor
+//-------------------------------------
+
+AbstractThread::AbstractThread(void)
+{
+ m_exception = false;
+ m_success = 0;
+}
+
+AbstractThread::~AbstractThread(void)
+{
+}
+
+//-------------------------------------
+// Thread entry point
+//-------------------------------------
+
+void AbstractThread::run(void)
+{
+ m_exception = false;
+ m_success = 0;
+ runChecked1(this, m_success, &m_exception);
+}
+
+void AbstractThread::runChecked1(AbstractThread *const thread, volatile int &success, volatile bool *exception)
+{
+#if !defined(_DEBUG)
+ __try
+ {
+ return runChecked2(thread, success, exception);
+ }
+ __except(1)
+ {
+ *exception = true;
+ qWarning("Unhandled structured exception in worker thread !!!");
+ }
+#else
+ return runChecked2(thread, success, exception);
+#endif
+}
+
+void AbstractThread::runChecked2(AbstractThread *const thread, volatile int &success, volatile bool *exception)
+{
+#if !defined(_DEBUG)
+ try
+ {
+ success = thread->threadMain();
+ }
+ catch(const std::exception &e)
+ {
+ *exception = true;
+ qWarning("Worker thread raised an C++ exception: %s", e.what());
+ }
+ catch(char *const msg)
+ {
+ *exception = true;
+ qWarning("Worker thread raised an C++ exception: %s", msg);
+ }
+ catch(...)
+ {
+ *exception = true;
+ qWarning("Worker thread raised an C++ exception!");
+ }
+#else
+ success = thread->threadMain();
+#endif
+}
--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Simple x264 Launcher
+// Copyright (C) 2004-2019 LoRd_MuldeR <MuldeR2@GMX.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// http://www.gnu.org/licenses/gpl-2.0.txt
+///////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+//Qt
+#include <QThread>
+
+class AbstractThread : public QThread
+{
+ Q_OBJECT
+
+public:
+ AbstractThread(void);
+ ~AbstractThread(void);
+
+ bool getException(void) { return m_exception; }
+ int getSuccess(void) { return m_success; }
+
+protected:
+ volatile int m_success;
+ volatile bool m_exception;
+
+ //Entry point
+ virtual void run(void);
+
+ //Error handling
+ static void runChecked1(AbstractThread *const thread, volatile int &success, volatile bool *exception);
+ static void runChecked2(AbstractThread *const thread, volatile int &success, volatile bool *exception);
+
+ //Thread main
+ virtual int threadMain(void) = 0;
+};
log("\nPROCESS ABORTED BY USER !!!"); \
setStatus(JobStatus_Aborted); \
if(QFileInfo(m_outputFileName).exists() && (QFileInfo(m_outputFileName).size() == 0)) QFile::remove(m_outputFileName); \
- return; \
+ return 0; \
} \
else if(!(OK_FLAG)) \
{ \
setStatus(JobStatus_Failed); \
if(QFileInfo(m_outputFileName).exists() && (QFileInfo(m_outputFileName).size() == 0)) QFile::remove(m_outputFileName); \
- return; \
+ return 0; \
} \
} \
while(0)
void EncodeThread::run(void)
{
-#if !defined(_DEBUG)
- __try
- {
- checkedRun();
- }
- __except(1)
+ m_progress = 0;
+ m_status = JobStatus_Starting;
+
+ AbstractThread::run();
+
+ if (m_exception)
{
- qWarning("STRUCTURED EXCEPTION ERROR IN ENCODE THREAD !!!");
+ log(tr("UNHANDLED EXCEPTION ERROR IN THREAD !!!"));
+ setStatus(JobStatus_Failed);
}
-#else
- checkedRun();
-#endif
if(m_jobObject)
{
}
}
-void EncodeThread::checkedRun(void)
-{
- m_progress = 0;
- m_status = JobStatus_Starting;
-
- try
- {
- try
- {
- ExecutionStateHandler executionStateHandler;
- encode();
- }
- catch(const std::exception &e)
- {
- log(tr("EXCEPTION ERROR IN THREAD: ").append(QString::fromLatin1(e.what())));
- setStatus(JobStatus_Failed);
- }
- catch(char *msg)
- {
- log(tr("EXCEPTION ERROR IN THREAD: ").append(QString::fromLatin1(msg)));
- setStatus(JobStatus_Failed);
- }
- catch(...)
- {
- log(tr("UNHANDLED EXCEPTION ERROR IN THREAD !!!"));
- setStatus(JobStatus_Failed);
- }
- }
- catch(...)
- {
- MUtils::OS::fatal_exit(L"Unhandeled exception error in encode thread!");
- }
-}
-
void EncodeThread::start(Priority priority)
{
qDebug("Thread starting...");
m_pause = false;
while(m_semaphorePaused.tryAcquire(1, 0));
- QThread::start(priority);
+ AbstractThread::start(priority);
}
///////////////////////////////////////////////////////////////////////////////
// Encode functions
///////////////////////////////////////////////////////////////////////////////
-void EncodeThread::encode(void)
+int EncodeThread::threadMain(void)
{
QDateTime startTime = QDateTime::currentDateTime();
int timePassed = startTime.secsTo(QDateTime::currentDateTime());
log(tr("Job finished at %1, %2. Process took %3 minutes, %4 seconds.").arg(QDate::currentDate().toString(Qt::ISODate), QTime::currentTime().toString(Qt::ISODate), QString::number(timePassed / 60), QString::number(timePassed % 60)));
setStatus(JobStatus_Completed);
+
+ return 1; /*completed*/
}
///////////////////////////////////////////////////////////////////////////////
#pragma once
+#include "thread_abstract.h"
#include "model_status.h"
#include <QThread>
class AbstractEncoder;
class AbstractSource;
-class EncodeThread : public QThread
+class EncodeThread : public AbstractThread
{
Q_OBJECT
//Entry point
virtual void run(void);
- virtual void checkedRun(void);
- //Main encoding functions
- void encode(void);
+ //Thread main
+ virtual int threadMain(void);
//Static functions
static QString getPasslogFile(const QString &outputFile);
// Thread Main
////////////////////////////////////////////////////////////
-void IPCThread_Recv::run()
+void IPCThread_Recv::run(void)
{
setTerminationEnabled(true);
+ AbstractThread::run();
+}
+
+int IPCThread_Recv::threadMain(void)
+{
QStringList params;
quint32 command, flags;
break;
}
}
+
+ return 1;
}
////////////////////////////////////////////////////////////
#pragma once
-#include <QThread>
+#include "thread_abstract.h"
namespace MUtils
{
class IPCChannel;
}
-class IPCThread_Recv: public QThread
+class IPCThread_Recv: public AbstractThread
{
Q_OBJECT
volatile bool m_stopFlag;
MUtils::IPCChannel *const m_ipcChannel;
- void run();
+ //Entry point
+ virtual void run(void);
+
+ //Thread main
+ virtual int threadMain(void);
};
{
}
-void IPCThread_Send::run()
+////////////////////////////////////////////////////////////
+// Thread Main
+////////////////////////////////////////////////////////////
+
+void IPCThread_Send::run(void)
{
setTerminationEnabled(true);
+ AbstractThread::run();
+}
+
+int IPCThread_Send::threadMain(void)
+{
bool bSentFiles = false;
const MUtils::OS::ArgumentMap &args = MUtils::OS::arguments();
qWarning("Failed to send IPC message!");
}
}
+
+ return 1;
}
////////////////////////////////////////////////////////////
#pragma once
-#include <QThread>
+#include "thread_abstract.h"
namespace MUtils
{
class IPCChannel;
}
-class IPCThread_Send: public QThread
+class IPCThread_Send: public AbstractThread
{
Q_OBJECT
IPCThread_Send(MUtils::IPCChannel *const ipcChannel);
~IPCThread_Send(void);
- void run();
+ //Entry point
+ virtual void run(void);
+
+ //Thread main
+ virtual int threadMain(void);
protected:
MUtils::IPCChannel *const m_ipcChannel;
StarupThread::StarupThread(void)
{
- m_exception = false;
- m_success = 0;
}
StarupThread::~StarupThread(void)
}
//-------------------------------------
-// Thread entry point
-//-------------------------------------
-
-void StarupThread::run(void)
-{
- m_exception = false;
- m_success = 0;
- runChecked1(this, m_success, &m_exception);
-}
-
-void StarupThread::runChecked1(StarupThread *const thread, volatile int &success, volatile bool *exception)
-{
- __try
- {
- return runChecked2(thread, success, exception);
- }
- __except(1)
- {
- *exception = true;
- qWarning("Unhandled exception error in startup thread !!!");
- }
-}
-
-void StarupThread::runChecked2(StarupThread *const thread, volatile int &success, volatile bool *exception)
-{
- try
- {
- success = thread->threadMain();
- }
- catch(...)
- {
- *exception = true;
- qWarning("Startup thread raised an C++ exception!");
- }
-}
-
-//-------------------------------------
// Utility functions
//-------------------------------------
#pragma once
+#include "thread_abstract.h"
+
//Qt
-#include <QThread>
#include <QStringList>
-class StarupThread : public QThread
+class StarupThread : public AbstractThread
{
Q_OBJECT
StarupThread(void);
~StarupThread(void);
- bool getException(void) { return m_exception; }
- int getSuccess(void) { return m_success; }
-
protected slots:
void start(Priority priority = InheritPriority) { QThread::start(priority); }
protected:
- volatile int m_success;
- volatile bool m_exception;
-
- //Entry point
- virtual void run(void);
-
- //Error handling
- static void runChecked1(StarupThread *const thread, volatile int &success, volatile bool *exception);
- static void runChecked2(StarupThread *const thread, volatile int &success, volatile bool *exception);
-
- //Thread main
- virtual int threadMain(void) = 0;
-
- //Utility functions
static QStringList runProcess(const QString &exePath, const QStringList &args, const QStringList *const extraPaths = NULL);
};
#define VER_X264_MAJOR 2
#define VER_X264_MINOR 9
#define VER_X264_PATCH 0
-#define VER_X264_BUILD 1156
+#define VER_X264_BUILD 1157
#define VER_X264_PORTABLE_EDITION (0)
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
</CustomBuild>
+ <CustomBuild Include="src\thread_abstract.h">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
+ </CustomBuild>
<ClInclude Include="tmp\x264_launcher\UIC_win_about.h" />
<ClInclude Include="tmp\x264_launcher\UIC_win_addJob.h" />
<ClInclude Include="tmp\x264_launcher\UIC_win_editor.h" />
<ClCompile Include="src\source_factory.cpp" />
<ClCompile Include="src\source_vapoursynth.cpp" />
<ClCompile Include="src\string_validator.cpp" />
+ <ClCompile Include="src\thread_abstract.cpp" />
<ClCompile Include="src\thread_avisynth.cpp" />
<ClCompile Include="src\thread_binaries.cpp" />
<ClCompile Include="src\thread_encode.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_input_filter.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_model_jobList.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_model_logFile.cpp" />
+ <ClCompile Include="tmp\x264_launcher\MOC_thread_abstract.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_avisynth.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_binaries.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_encode.cpp" />
<ClInclude Include="src\encoder_nvencc.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="src\thread_startup.h">
- <Filter>Header Files</Filter>
- </ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\main.cpp">
<ClCompile Include="tmp\x264_launcher\MOC_thread_startup.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
+ <ClCompile Include="src\thread_abstract.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="tmp\x264_launcher\MOC_thread_abstract.cpp">
+ <Filter>Generated Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="src\win_main.h">
<CustomBuild Include="src\thread_binaries.h">
<Filter>Header Files</Filter>
</CustomBuild>
+ <CustomBuild Include="src\thread_startup.h">
+ <Filter>Header Files</Filter>
+ </CustomBuild>
+ <CustomBuild Include="src\thread_abstract.h">
+ <Filter>Header Files</Filter>
+ </CustomBuild>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="x264_launcher.rc">
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
</CustomBuild>
+ <CustomBuild Include="src\thread_abstract.h">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
+ </CustomBuild>
<ClInclude Include="tmp\x264_launcher\UIC_win_about.h" />
<ClInclude Include="tmp\x264_launcher\UIC_win_addJob.h" />
<ClInclude Include="tmp\x264_launcher\UIC_win_editor.h" />
<ClCompile Include="src\source_factory.cpp" />
<ClCompile Include="src\source_vapoursynth.cpp" />
<ClCompile Include="src\string_validator.cpp" />
+ <ClCompile Include="src\thread_abstract.cpp" />
<ClCompile Include="src\thread_avisynth.cpp" />
<ClCompile Include="src\thread_binaries.cpp" />
<ClCompile Include="src\thread_encode.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_input_filter.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_model_jobList.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_model_logFile.cpp" />
+ <ClCompile Include="tmp\x264_launcher\MOC_thread_abstract.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_avisynth.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_binaries.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_encode.cpp" />
<ClInclude Include="src\encoder_nvencc.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="src\thread_startup.h">
- <Filter>Header Files</Filter>
- </ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\main.cpp">
<ClCompile Include="tmp\x264_launcher\MOC_thread_startup.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
+ <ClCompile Include="src\thread_abstract.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="tmp\x264_launcher\MOC_thread_abstract.cpp">
+ <Filter>Generated Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="src\win_main.h">
<CustomBuild Include="src\thread_binaries.h">
<Filter>Header Files</Filter>
</CustomBuild>
+ <CustomBuild Include="src\thread_startup.h">
+ <Filter>Header Files</Filter>
+ </CustomBuild>
+ <CustomBuild Include="src\thread_abstract.h">
+ <Filter>Header Files</Filter>
+ </CustomBuild>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="x264_launcher.rc">
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
</CustomBuild>
+ <CustomBuild Include="src\thread_abstract.h">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
+ </CustomBuild>
<ClInclude Include="tmp\x264_launcher\UIC_win_about.h" />
<ClInclude Include="tmp\x264_launcher\UIC_win_addJob.h" />
<ClInclude Include="tmp\x264_launcher\UIC_win_editor.h" />
<ClCompile Include="src\source_factory.cpp" />
<ClCompile Include="src\source_vapoursynth.cpp" />
<ClCompile Include="src\string_validator.cpp" />
+ <ClCompile Include="src\thread_abstract.cpp" />
<ClCompile Include="src\thread_avisynth.cpp" />
<ClCompile Include="src\thread_binaries.cpp" />
<ClCompile Include="src\thread_encode.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_input_filter.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_model_jobList.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_model_logFile.cpp" />
+ <ClCompile Include="tmp\x264_launcher\MOC_thread_abstract.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_avisynth.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_binaries.cpp" />
<ClCompile Include="tmp\x264_launcher\MOC_thread_encode.cpp" />
<ClInclude Include="src\encoder_nvencc.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="src\thread_startup.h">
- <Filter>Header Files</Filter>
- </ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\main.cpp">
<ClCompile Include="tmp\x264_launcher\MOC_thread_startup.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
+ <ClCompile Include="src\thread_abstract.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="tmp\x264_launcher\MOC_thread_abstract.cpp">
+ <Filter>Generated Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="src\win_main.h">
<CustomBuild Include="src\thread_binaries.h">
<Filter>Header Files</Filter>
</CustomBuild>
+ <CustomBuild Include="src\thread_startup.h">
+ <Filter>Header Files</Filter>
+ </CustomBuild>
+ <CustomBuild Include="src\thread_abstract.h">
+ <Filter>Header Files</Filter>
+ </CustomBuild>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="x264_launcher.rc">