Fixed VapourSynth detection for R46+ and increase minimum required version to R46.
This commit is contained in:
parent
528acc04c3
commit
ed02fae429
@ -108,7 +108,8 @@ public:
|
|||||||
SYSINFO_MAKE_FLAG(VapourSynth)
|
SYSINFO_MAKE_FLAG(VapourSynth)
|
||||||
|
|
||||||
SYSINFO_MAKE_PATH(AVS)
|
SYSINFO_MAKE_PATH(AVS)
|
||||||
SYSINFO_MAKE_PATH(VPS)
|
SYSINFO_MAKE_PATH(VPS32)
|
||||||
|
SYSINFO_MAKE_PATH(VPS64)
|
||||||
SYSINFO_MAKE_PATH(App)
|
SYSINFO_MAKE_PATH(App)
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
#include <QPair>
|
#include <QPair>
|
||||||
|
|
||||||
static const unsigned int VER_X264_VSPIPE_API = 3;
|
static const unsigned int VER_X264_VSPIPE_API = 3;
|
||||||
static const unsigned int VER_X264_VSPIPE_VER = 43;
|
static const unsigned int VER_X264_VSPIPE_VER = 46;
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
// Encoder Info
|
// Encoder Info
|
||||||
@ -41,7 +41,7 @@ class VapoursyntSourceInfo : public AbstractSourceInfo
|
|||||||
public:
|
public:
|
||||||
virtual QString getBinaryPath(const SysinfoModel *const sysinfo, const bool& x64) const
|
virtual QString getBinaryPath(const SysinfoModel *const sysinfo, const bool& x64) const
|
||||||
{
|
{
|
||||||
return QString("%1/core%2/vspipe.exe").arg(sysinfo->getVPSPath(), (x64 ? "64" : "32"));
|
return QString("%1/vspipe.exe").arg(x64 ? sysinfo->getVPS64Path() : sysinfo->getVPS32Path());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -79,13 +79,21 @@ QString VapoursynthSource::getName(void) const
|
|||||||
|
|
||||||
bool VapoursynthSource::isSourceAvailable()
|
bool VapoursynthSource::isSourceAvailable()
|
||||||
{
|
{
|
||||||
if(!(m_sysinfo->hasVapourSynth() && (!m_sysinfo->getVPSPath().isEmpty()) && QFileInfo(getBinaryPath()).isFile()))
|
if (m_sysinfo->hasVapourSynth())
|
||||||
{
|
{
|
||||||
|
if (m_sysinfo->getVapourSynth(SysinfoModel::VapourSynth_X86) && (!m_sysinfo->getVPS32Path().isEmpty()))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (m_sysinfo->getVapourSynth(SysinfoModel::VapourSynth_X64) && (!m_sysinfo->getVPS64Path().isEmpty()))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log(tr("\nVPY INPUT REQUIRES VAPOURSYNTH, BUT IT IS *NOT* AVAILABLE !!!"));
|
log(tr("\nVPY INPUT REQUIRES VAPOURSYNTH, BUT IT IS *NOT* AVAILABLE !!!"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VapoursynthSource::checkVersion_init(QList<QRegExp*> &patterns, QStringList &cmdLine)
|
void VapoursynthSource::checkVersion_init(QList<QRegExp*> &patterns, QStringList &cmdLine)
|
||||||
{
|
{
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
//Internal
|
//Internal
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
@ -38,14 +39,25 @@
|
|||||||
//CRT
|
//CRT
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
//Const
|
|
||||||
static const bool ENABLE_PORTABLE_VPS = true;
|
|
||||||
|
|
||||||
//Static
|
//Static
|
||||||
QMutex VapourSynthCheckThread::m_vpsLock;
|
QMutex VapourSynthCheckThread::m_vpsLock;
|
||||||
QScopedPointer<QFile> VapourSynthCheckThread::m_vpsExePath[2];
|
QScopedPointer<QFile> VapourSynthCheckThread::m_vpsExePath[2];
|
||||||
QScopedPointer<QFile> VapourSynthCheckThread::m_vpsDllPath[2];
|
QScopedPointer<QFile> VapourSynthCheckThread::m_vpsDllPath[2];
|
||||||
|
|
||||||
|
//Const
|
||||||
|
static const char* const VPS_REG_KEYS = "SOFTWARE\\VapourSynth";
|
||||||
|
static const char* const VPS_REG_NAME = "Path";
|
||||||
|
|
||||||
|
//Default VapurSynth architecture
|
||||||
|
#if _WIN64 || __x86_64__
|
||||||
|
#define VAPOURSYNTH_DEF VAPOURSYNTH_X64
|
||||||
|
#else
|
||||||
|
#define VAPOURSYNTH_DEF VAPOURSYNTH_X86;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Enable detection of "portabel" edition?
|
||||||
|
#define ENABLE_PORTABLE_VPS true
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
// Auxilary functions
|
// Auxilary functions
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
@ -73,11 +85,12 @@ static inline QString &cleanDir(QString &path)
|
|||||||
|
|
||||||
bool VapourSynthCheckThread::detect(SysinfoModel* sysinfo)
|
bool VapourSynthCheckThread::detect(SysinfoModel* sysinfo)
|
||||||
{
|
{
|
||||||
sysinfo->clearVapourSynth();
|
|
||||||
sysinfo->clearVPSPath();
|
|
||||||
|
|
||||||
QMutexLocker lock(&m_vpsLock);
|
QMutexLocker lock(&m_vpsLock);
|
||||||
|
|
||||||
|
sysinfo->clearVapourSynth();
|
||||||
|
sysinfo->clearVPS32Path();
|
||||||
|
sysinfo->clearVPS64Path();
|
||||||
|
|
||||||
QEventLoop loop;
|
QEventLoop loop;
|
||||||
VapourSynthCheckThread thread;
|
VapourSynthCheckThread thread;
|
||||||
|
|
||||||
@ -109,18 +122,25 @@ bool VapourSynthCheckThread::detect(SysinfoModel *sysinfo)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(thread.getSuccess())
|
if (!thread.getSuccess())
|
||||||
{
|
|
||||||
sysinfo->setVapourSynth(SysinfoModel::VapourSynth_X86, thread.getSuccess() & VAPOURSYNTH_X86);
|
|
||||||
sysinfo->setVapourSynth(SysinfoModel::VapourSynth_X64, thread.getSuccess() & VAPOURSYNTH_X64);
|
|
||||||
sysinfo->setVPSPath(thread.getPath());
|
|
||||||
qDebug("VapourSynth support is officially enabled now! [x86=%c, x64=%c]", BOOLIFY(sysinfo->getVapourSynth(SysinfoModel::VapourSynth_X86)), BOOLIFY(sysinfo->getVapourSynth(SysinfoModel::VapourSynth_X64)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
qWarning("VapourSynth could not be found -> VapourSynth support disabled!");
|
qWarning("VapourSynth could not be found -> VapourSynth support disabled!");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (thread.getSuccess() & VAPOURSYNTH_X86)
|
||||||
|
{
|
||||||
|
sysinfo->setVapourSynth(SysinfoModel::VapourSynth_X86, true);
|
||||||
|
sysinfo->setVPS32Path(thread.getPath32());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thread.getSuccess() & VAPOURSYNTH_X64)
|
||||||
|
{
|
||||||
|
sysinfo->setVapourSynth(SysinfoModel::VapourSynth_X64, true);
|
||||||
|
sysinfo->setVPS64Path(thread.getPath64());
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("VapourSynth support is officially enabled now! [x86=%c, x64=%c]", BOOLIFY(sysinfo->getVapourSynth(SysinfoModel::VapourSynth_X86)), BOOLIFY(sysinfo->getVapourSynth(SysinfoModel::VapourSynth_X64)));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +150,8 @@ bool VapourSynthCheckThread::detect(SysinfoModel *sysinfo)
|
|||||||
|
|
||||||
VapourSynthCheckThread::VapourSynthCheckThread(void)
|
VapourSynthCheckThread::VapourSynthCheckThread(void)
|
||||||
{
|
{
|
||||||
m_vpsPath.clear();
|
m_vpsPath[0U].clear();
|
||||||
|
m_vpsPath[1U].clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
VapourSynthCheckThread::~VapourSynthCheckThread(void)
|
VapourSynthCheckThread::~VapourSynthCheckThread(void)
|
||||||
@ -139,61 +160,39 @@ VapourSynthCheckThread::~VapourSynthCheckThread(void)
|
|||||||
|
|
||||||
void VapourSynthCheckThread::run(void)
|
void VapourSynthCheckThread::run(void)
|
||||||
{
|
{
|
||||||
m_vpsPath.clear();
|
m_vpsPath[0U].clear();
|
||||||
|
m_vpsPath[1U].clear();
|
||||||
StarupThread::run();
|
StarupThread::run();
|
||||||
}
|
}
|
||||||
|
|
||||||
int VapourSynthCheckThread::threadMain(void)
|
int VapourSynthCheckThread::threadMain(void)
|
||||||
{
|
{
|
||||||
static const char *VPS_CORE_DIR[] =
|
|
||||||
{
|
|
||||||
"core32",
|
|
||||||
"core64",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
static const int VPS_BIT_FLAG[] =
|
static const int VPS_BIT_FLAG[] =
|
||||||
{
|
{
|
||||||
VAPOURSYNTH_X86,
|
VAPOURSYNTH_X86,
|
||||||
VAPOURSYNTH_X64,
|
VAPOURSYNTH_X64,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
static const char *VPS_REG_KEYS[] =
|
|
||||||
{
|
|
||||||
"SOFTWARE\\VapourSynth",
|
|
||||||
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VapourSynth_is1",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
static const char *VPS_REG_NAME[] =
|
|
||||||
{
|
|
||||||
"Path",
|
|
||||||
"InstallLocation",
|
|
||||||
"Inno Setup: App Path",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
static const MUtils::Registry::reg_scope_t REG_SCOPE[3] =
|
static const MUtils::Registry::reg_scope_t REG_SCOPE[3] =
|
||||||
{
|
{
|
||||||
MUtils::Registry::scope_default,
|
|
||||||
MUtils::Registry::scope_wow_x32,
|
MUtils::Registry::scope_wow_x32,
|
||||||
MUtils::Registry::scope_wow_x64
|
MUtils::Registry::scope_wow_x64,
|
||||||
|
MUtils::Registry::scope_default
|
||||||
};
|
};
|
||||||
|
|
||||||
QString vapoursynthPath;
|
QHash<int, QString> vapoursynthPath;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
//Look for "portable" VapourSynth version
|
//Look for "portable" VapourSynth version
|
||||||
if (ENABLE_PORTABLE_VPS)
|
for (size_t i = 0; i < 2U; i++)
|
||||||
{
|
{
|
||||||
const QString vpsPortableDir = QString("%1/extra/VapourSynth").arg(QCoreApplication::applicationDirPath());
|
const QString vpsPortableDir = QString("%1/extra/VapourSynth-%u").arg(QCoreApplication::applicationDirPath(), VPS_BITNESS(i));
|
||||||
if (VALID_DIR(vpsPortableDir))
|
if (VALID_DIR(vpsPortableDir))
|
||||||
{
|
{
|
||||||
for (size_t i = 0; VPS_CORE_DIR[i]; i++)
|
const QFileInfo vpsPortableFile = QFileInfo(QString("%1/vspipe.exe").arg(vpsPortableDir));
|
||||||
|
if (vpsPortableFile.exists() && vpsPortableFile.isFile())
|
||||||
{
|
{
|
||||||
const QFileInfo vpsPortableDll = QFileInfo(QString("%1/%2/VapourSynth.dll").arg(vpsPortableDir, QString::fromLatin1(VPS_CORE_DIR[i])));
|
vapoursynthPath.insert(VPS_BIT_FLAG[i], vpsPortableDir);
|
||||||
if (vpsPortableDll.exists() && vpsPortableDll.isFile())
|
|
||||||
{
|
|
||||||
vapoursynthPath = vpsPortableDir;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -201,34 +200,26 @@ int VapourSynthCheckThread::threadMain(void)
|
|||||||
//Read VapourSynth path from registry
|
//Read VapourSynth path from registry
|
||||||
if (vapoursynthPath.isEmpty())
|
if (vapoursynthPath.isEmpty())
|
||||||
{
|
{
|
||||||
for (size_t i = 0; VPS_REG_KEYS[i]; i++)
|
for (size_t i = 0; i < 3U; i++)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; VPS_REG_NAME[j]; j++)
|
if (MUtils::Registry::reg_key_exists(MUtils::Registry::root_machine, QString::fromLatin1(VPS_REG_KEYS), REG_SCOPE[i]))
|
||||||
{
|
{
|
||||||
for (size_t k = 0; k < 3; k++)
|
QString vpsInstallPath;
|
||||||
|
if (MUtils::Registry::reg_value_read(MUtils::Registry::root_machine, QString::fromLatin1(VPS_REG_KEYS), QString::fromLatin1(VPS_REG_NAME), vpsInstallPath, REG_SCOPE[i]))
|
||||||
{
|
{
|
||||||
if (MUtils::Registry::reg_key_exists(MUtils::Registry::root_machine, QString::fromLatin1(VPS_REG_KEYS[i]), REG_SCOPE[k]))
|
if (VALID_DIR(vpsInstallPath))
|
||||||
{
|
{
|
||||||
QString temp;
|
const QString vpsCorePath = QString("%1/core").arg(cleanDir(vpsInstallPath));
|
||||||
if (MUtils::Registry::reg_value_read(MUtils::Registry::root_machine, QString::fromLatin1(VPS_REG_KEYS[i]), QString::fromLatin1(VPS_REG_NAME[j]), temp, REG_SCOPE[k]))
|
if (VALID_DIR(vpsCorePath))
|
||||||
{
|
{
|
||||||
temp = cleanDir(temp);
|
const int flag = getVapourSynthType(REG_SCOPE[i]);
|
||||||
if (VALID_DIR(temp))
|
if (!vapoursynthPath.contains(flag))
|
||||||
{
|
{
|
||||||
vapoursynthPath = temp;
|
vapoursynthPath.insert(flag, vpsCorePath);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!vapoursynthPath.isEmpty())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!vapoursynthPath.isEmpty())
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -241,18 +232,22 @@ int VapourSynthCheckThread::threadMain(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Validate the VapourSynth installation now!
|
//Validate the VapourSynth installation now!
|
||||||
qDebug("VapourSynth Dir: %s", vapoursynthPath.toUtf8().constData());
|
for (size_t i = 0; i < 2U; i++)
|
||||||
for (size_t i = 0; VPS_CORE_DIR[i]; i++)
|
|
||||||
{
|
{
|
||||||
|
if (vapoursynthPath.contains(VPS_BIT_FLAG[i]))
|
||||||
|
{
|
||||||
|
const QString path = vapoursynthPath[VPS_BIT_FLAG[i]];
|
||||||
|
qDebug("VapourSynth %u-Bit \"core\" path: %s", VPS_BITNESS(i), MUTILS_UTF8(path));
|
||||||
QFile *vpsExeFile, *vpsDllFile;
|
QFile *vpsExeFile, *vpsDllFile;
|
||||||
if (isVapourSynthComplete(QString("%1/%2").arg(vapoursynthPath, QString::fromLatin1(VPS_CORE_DIR[i])), vpsExeFile, vpsDllFile))
|
if (isVapourSynthComplete(path, vpsExeFile, vpsDllFile))
|
||||||
{
|
{
|
||||||
if (vpsExeFile && checkVapourSynth(vpsExeFile->fileName()))
|
if (vpsExeFile && checkVapourSynth(vpsExeFile->fileName()))
|
||||||
{
|
{
|
||||||
flags |= VPS_BIT_FLAG[i];
|
|
||||||
qDebug("VapourSynth %u-Bit edition found!", VPS_BITNESS(i));
|
qDebug("VapourSynth %u-Bit edition found!", VPS_BITNESS(i));
|
||||||
m_vpsExePath[i].reset(vpsExeFile);
|
m_vpsExePath[i].reset(vpsExeFile);
|
||||||
m_vpsDllPath[i].reset(vpsDllFile);
|
m_vpsDllPath[i].reset(vpsDllFile);
|
||||||
|
m_vpsPath[i] = path;
|
||||||
|
flags |= VPS_BIT_FLAG[i];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -260,17 +255,16 @@ int VapourSynthCheckThread::threadMain(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
qWarning("VapourSynth %u-Bit edition was found, but appears to be incomplete!", VPS_BITNESS(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
qDebug("VapourSynth %u-Bit edition *not* found!", VPS_BITNESS(i));
|
qDebug("VapourSynth %u-Bit edition *not* found!", VPS_BITNESS(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Return VapourSynth path
|
|
||||||
if(flags)
|
|
||||||
{
|
|
||||||
m_vpsPath = vapoursynthPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,6 +272,19 @@ int VapourSynthCheckThread::threadMain(void)
|
|||||||
// Internal functions
|
// Internal functions
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
|
|
||||||
|
VapourSynthCheckThread::VapourSynthFlags VapourSynthCheckThread::getVapourSynthType(const int scope)
|
||||||
|
{
|
||||||
|
switch (scope)
|
||||||
|
{
|
||||||
|
case MUtils::Registry::scope_wow_x32:
|
||||||
|
return VAPOURSYNTH_X86;
|
||||||
|
case MUtils::Registry::scope_wow_x64:
|
||||||
|
return VAPOURSYNTH_X64;
|
||||||
|
default:
|
||||||
|
return VAPOURSYNTH_DEF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool VapourSynthCheckThread::isVapourSynthComplete(const QString &vsCorePath, QFile *&vpsExeFile, QFile *&vpsDllFile)
|
bool VapourSynthCheckThread::isVapourSynthComplete(const QString &vsCorePath, QFile *&vpsExeFile, QFile *&vpsDllFile)
|
||||||
{
|
{
|
||||||
bool complete = false;
|
bool complete = false;
|
||||||
|
@ -47,10 +47,11 @@ protected:
|
|||||||
VapourSynthCheckThread(void);
|
VapourSynthCheckThread(void);
|
||||||
~VapourSynthCheckThread(void);
|
~VapourSynthCheckThread(void);
|
||||||
|
|
||||||
QString getPath(void) { return m_vpsPath; }
|
QString getPath32(void) { return m_vpsPath[0U]; }
|
||||||
|
QString getPath64(void) { return m_vpsPath[1U]; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_vpsPath;
|
QString m_vpsPath[2];
|
||||||
|
|
||||||
static QMutex m_vpsLock;
|
static QMutex m_vpsLock;
|
||||||
static QScopedPointer<QFile> VapourSynthCheckThread::m_vpsExePath[2];
|
static QScopedPointer<QFile> VapourSynthCheckThread::m_vpsExePath[2];
|
||||||
@ -63,6 +64,7 @@ private:
|
|||||||
virtual int threadMain(void);
|
virtual int threadMain(void);
|
||||||
|
|
||||||
//Internal functions
|
//Internal functions
|
||||||
|
static VapourSynthFlags getVapourSynthType(const int scope);
|
||||||
static bool isVapourSynthComplete(const QString &vsCorePath, QFile *&vpsExeFile, QFile *&vpsDllFile);
|
static bool isVapourSynthComplete(const QString &vsCorePath, QFile *&vpsExeFile, QFile *&vpsDllFile);
|
||||||
static bool checkVapourSynth(const QString &vspipePath);
|
static bool checkVapourSynth(const QString &vspipePath);
|
||||||
};
|
};
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#define VER_X264_MAJOR 2
|
#define VER_X264_MAJOR 2
|
||||||
#define VER_X264_MINOR 9
|
#define VER_X264_MINOR 9
|
||||||
#define VER_X264_PATCH 1
|
#define VER_X264_PATCH 1
|
||||||
#define VER_X264_BUILD 1170
|
#define VER_X264_BUILD 1172
|
||||||
|
|
||||||
#define VER_X264_PORTABLE_EDITION (0)
|
#define VER_X264_PORTABLE_EDITION (0)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 15.0.27130.2036
|
VisualStudioVersion = 16.0.29102.190
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x264_launcher", "x264_launcher_MSVC2019.vcxproj", "{563D953B-CBC3-4C75-AFC2-5BD87531C332}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x264_launcher", "x264_launcher_MSVC2019.vcxproj", "{563D953B-CBC3-4C75-AFC2-5BD87531C332}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
Loading…
Reference in New Issue
Block a user