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_PATH(AVS)
SYSINFO_MAKE_PATH(VPS)
SYSINFO_MAKE_PATH(VPS32)
SYSINFO_MAKE_PATH(VPS64)
SYSINFO_MAKE_PATH(App)
protected:

View File

@ -30,7 +30,7 @@
#include <QPair>
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
@ -41,7 +41,7 @@ class VapoursyntSourceInfo : public AbstractSourceInfo
public:
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()
{
if(!(m_sysinfo->hasVapourSynth() && (!m_sysinfo->getVPSPath().isEmpty()) && QFileInfo(getBinaryPath()).isFile()))
if (m_sysinfo->hasVapourSynth())
{
log(tr("\nVPY INPUT REQUIRES VAPOURSYNTH, BUT IT IS *NOT* AVAILABLE !!!"));
return false;
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;
}
}
return true;
log(tr("\nVPY INPUT REQUIRES VAPOURSYNTH, BUT IT IS *NOT* AVAILABLE !!!"));
return false;
}
void VapoursynthSource::checkVersion_init(QList<QRegExp*> &patterns, QStringList &cmdLine)

View File

@ -30,6 +30,7 @@
#include <QTimer>
#include <QApplication>
#include <QDir>
#include <QHash>
//Internal
#include "global.h"
@ -38,14 +39,25 @@
//CRT
#include <cassert>
//Const
static const bool ENABLE_PORTABLE_VPS = true;
//Static
QMutex VapourSynthCheckThread::m_vpsLock;
QScopedPointer<QFile> VapourSynthCheckThread::m_vpsExePath[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
//-------------------------------------
@ -54,12 +66,12 @@ QScopedPointer<QFile> VapourSynthCheckThread::m_vpsDllPath[2];
#define BOOLIFY(X) ((X) ? '1' : '0')
#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);
while(path.endsWith('/'))
while (path.endsWith('/'))
{
path.chop(1);
}
@ -71,13 +83,14 @@ static inline QString &cleanDir(QString &path)
// External API
//-------------------------------------
bool VapourSynthCheckThread::detect(SysinfoModel *sysinfo)
bool VapourSynthCheckThread::detect(SysinfoModel* sysinfo)
{
sysinfo->clearVapourSynth();
sysinfo->clearVPSPath();
QMutexLocker lock(&m_vpsLock);
sysinfo->clearVapourSynth();
sysinfo->clearVPS32Path();
sysinfo->clearVPS64Path();
QEventLoop loop;
VapourSynthCheckThread thread;
@ -95,7 +108,7 @@ bool VapourSynthCheckThread::detect(SysinfoModel *sysinfo)
QApplication::restoreOverrideCursor();
if(!thread.wait(1000))
if (!thread.wait(1000))
{
qWarning("VapourSynth thread encountered timeout -> probably deadlock!");
thread.terminate();
@ -103,24 +116,31 @@ bool VapourSynthCheckThread::detect(SysinfoModel *sysinfo)
return false;
}
if(thread.getException())
if (thread.getException())
{
qWarning("VapourSynth thread encountered an exception !!!");
return false;
}
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
if (!thread.getSuccess())
{
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;
}
@ -130,7 +150,8 @@ bool VapourSynthCheckThread::detect(SysinfoModel *sysinfo)
VapourSynthCheckThread::VapourSynthCheckThread(void)
{
m_vpsPath.clear();
m_vpsPath[0U].clear();
m_vpsPath[1U].clear();
}
VapourSynthCheckThread::~VapourSynthCheckThread(void)
@ -139,61 +160,39 @@ VapourSynthCheckThread::~VapourSynthCheckThread(void)
void VapourSynthCheckThread::run(void)
{
m_vpsPath.clear();
m_vpsPath[0U].clear();
m_vpsPath[1U].clear();
StarupThread::run();
}
int VapourSynthCheckThread::threadMain(void)
{
static const char *VPS_CORE_DIR[] =
{
"core32",
"core64",
NULL
};
static const int VPS_BIT_FLAG[] =
{
VAPOURSYNTH_X86,
VAPOURSYNTH_X64,
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] =
{
MUtils::Registry::scope_default,
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;
//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))
{
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])));
if (vpsPortableDll.exists() && vpsPortableDll.isFile())
{
vapoursynthPath = vpsPortableDir;
break;
}
vapoursynthPath.insert(VPS_BIT_FLAG[i], vpsPortableDir);
}
}
}
@ -201,34 +200,26 @@ int VapourSynthCheckThread::threadMain(void)
//Read VapourSynth path from registry
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;
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]))
const QString vpsCorePath = QString("%1/core").arg(cleanDir(vpsInstallPath));
if (VALID_DIR(vpsCorePath))
{
temp = cleanDir(temp);
if (VALID_DIR(temp))
const int flag = getVapourSynthType(REG_SCOPE[i]);
if (!vapoursynthPath.contains(flag))
{
vapoursynthPath = temp;
break;
vapoursynthPath.insert(flag, vpsCorePath);
}
}
}
}
if (!vapoursynthPath.isEmpty())
{
break;
}
}
if (!vapoursynthPath.isEmpty())
{
break;
}
}
}
@ -241,22 +232,31 @@ int VapourSynthCheckThread::threadMain(void)
}
//Validate the VapourSynth installation now!
qDebug("VapourSynth Dir: %s", vapoursynthPath.toUtf8().constData());
for (size_t i = 0; VPS_CORE_DIR[i]; i++)
for (size_t i = 0; i < 2U; i++)
{
QFile *vpsExeFile, *vpsDllFile;
if (isVapourSynthComplete(QString("%1/%2").arg(vapoursynthPath, QString::fromLatin1(VPS_CORE_DIR[i])), vpsExeFile, vpsDllFile))
if (vapoursynthPath.contains(VPS_BIT_FLAG[i]))
{
if (vpsExeFile && checkVapourSynth(vpsExeFile->fileName()))
const QString path = vapoursynthPath[VPS_BIT_FLAG[i]];
qDebug("VapourSynth %u-Bit \"core\" path: %s", VPS_BITNESS(i), MUTILS_UTF8(path));
QFile *vpsExeFile, *vpsDllFile;
if (isVapourSynthComplete(path, vpsExeFile, vpsDllFile))
{
flags |= VPS_BIT_FLAG[i];
qDebug("VapourSynth %u-Bit edition found!", VPS_BITNESS(i));
m_vpsExePath[i].reset(vpsExeFile);
m_vpsDllPath[i].reset(vpsDllFile);
if (vpsExeFile && checkVapourSynth(vpsExeFile->fileName()))
{
qDebug("VapourSynth %u-Bit edition found!", VPS_BITNESS(i));
m_vpsExePath[i].reset(vpsExeFile);
m_vpsDllPath[i].reset(vpsDllFile);
m_vpsPath[i] = path;
flags |= VPS_BIT_FLAG[i];
}
else
{
qWarning("VapourSynth %u-Bit edition was found, but version check has failed!", VPS_BITNESS(i));
}
}
else
{
qWarning("VapourSynth %u-Bit edition was found, but version check has failed!", VPS_BITNESS(i));
qWarning("VapourSynth %u-Bit edition was found, but appears to be incomplete!", VPS_BITNESS(i));
}
}
else
@ -265,12 +265,6 @@ int VapourSynthCheckThread::threadMain(void)
}
}
//Return VapourSynth path
if(flags)
{
m_vpsPath = vapoursynthPath;
}
return flags;
}
@ -278,6 +272,19 @@ int VapourSynthCheckThread::threadMain(void)
// 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 complete = false;

View File

@ -47,10 +47,11 @@ protected:
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:
QString m_vpsPath;
QString m_vpsPath[2];
static QMutex m_vpsLock;
static QScopedPointer<QFile> VapourSynthCheckThread::m_vpsExePath[2];
@ -63,6 +64,7 @@ private:
virtual int threadMain(void);
//Internal functions
static VapourSynthFlags getVapourSynthType(const int scope);
static bool isVapourSynthComplete(const QString &vsCorePath, QFile *&vpsExeFile, QFile *&vpsDllFile);
static bool checkVapourSynth(const QString &vspipePath);
};

View File

@ -26,7 +26,7 @@
#define VER_X264_MAJOR 2
#define VER_X264_MINOR 9
#define VER_X264_PATCH 1
#define VER_X264_BUILD 1170
#define VER_X264_BUILD 1172
#define VER_X264_PORTABLE_EDITION (0)

View File

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2036
# Visual Studio Version 16
VisualStudioVersion = 16.0.29102.190
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x264_launcher", "x264_launcher_MSVC2019.vcxproj", "{563D953B-CBC3-4C75-AFC2-5BD87531C332}"
ProjectSection(ProjectDependencies) = postProject