Fixed VapourSynth detection for R46+ and increase minimum required version to R46.

This commit is contained in:
LoRd_MuldeR 2019-07-22 14:19:18 +02:00
parent 528acc04c3
commit ed02fae429
6 changed files with 119 additions and 101 deletions

View File

@ -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:

View File

@ -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,12 +79,20 @@ 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)

View File

@ -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
//------------------------------------- //-------------------------------------
@ -54,12 +66,12 @@ QScopedPointer<QFile> VapourSynthCheckThread::m_vpsDllPath[2];
#define BOOLIFY(X) ((X) ? '1' : '0') #define BOOLIFY(X) ((X) ? '1' : '0')
#define VPS_BITNESS(X) (((X) + 1U) * 32U) #define VPS_BITNESS(X) (((X) + 1U) * 32U)
static inline QString &cleanDir(QString &path) static inline QString& cleanDir(QString& path)
{ {
if(!path.isEmpty()) if (!path.isEmpty())
{ {
path = QDir::fromNativeSeparators(path); path = QDir::fromNativeSeparators(path);
while(path.endsWith('/')) while (path.endsWith('/'))
{ {
path.chop(1); path.chop(1);
} }
@ -71,13 +83,14 @@ static inline QString &cleanDir(QString &path)
// External API // External API
//------------------------------------- //-------------------------------------
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;
@ -95,7 +108,7 @@ bool VapourSynthCheckThread::detect(SysinfoModel *sysinfo)
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
if(!thread.wait(1000)) if (!thread.wait(1000))
{ {
qWarning("VapourSynth thread encountered timeout -> probably deadlock!"); qWarning("VapourSynth thread encountered timeout -> probably deadlock!");
thread.terminate(); thread.terminate();
@ -103,24 +116,31 @@ bool VapourSynthCheckThread::detect(SysinfoModel *sysinfo)
return false; return false;
} }
if(thread.getException()) if (thread.getException())
{ {
qWarning("VapourSynth thread encountered an exception !!!"); qWarning("VapourSynth thread encountered an exception !!!");
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;

View File

@ -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);
}; };

View File

@ -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)

View File

@ -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