391 lines
8.7 KiB
C++
391 lines
8.7 KiB
C++
|
#include "EngineCommon.h"
|
||
|
#include "PackageInfo.h"
|
||
|
#include "HardwareDetector.h"
|
||
|
#include "IOpenCVEngine.h"
|
||
|
#include "StringUtils.h"
|
||
|
#include <assert.h>
|
||
|
#include <vector>
|
||
|
#include <utils/Log.h>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
map<int, string> PackageInfo::InitPlatformNameMap()
|
||
|
{
|
||
|
map<int, string> result;
|
||
|
|
||
|
// TODO: Do not forget to add Platrfom constant to HardwareDetector.h
|
||
|
result[PLATFORM_TEGRA] = PLATFORM_TEGRA_NAME;
|
||
|
result[PLATFORM_TEGRA2] = PLATFORM_TEGRA2_NAME;
|
||
|
result[PLATFORM_TEGRA3] = PLATFORM_TEGRA3_NAME;
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
const map<int, string> PackageInfo::PlatformNameMap = InitPlatformNameMap();
|
||
|
const string PackageInfo::BasePackageName = "org.opencv.lib";
|
||
|
|
||
|
inline string JoinARMFeatures(int cpu_id)
|
||
|
{
|
||
|
string result;
|
||
|
|
||
|
if (FEATURES_HAS_NEON2 & cpu_id)
|
||
|
{
|
||
|
result = string(FEATURES_HAS_NEON2_NAME);
|
||
|
}
|
||
|
else if (FEATURES_HAS_NEON & cpu_id)
|
||
|
{
|
||
|
result = string(FEATURES_HAS_NEON_NAME);
|
||
|
}
|
||
|
else if (FEATURES_HAS_VFPv3 & cpu_id)
|
||
|
{
|
||
|
result = string(FEATURES_HAS_VFPv3_NAME);
|
||
|
}
|
||
|
else if (FEATURES_HAS_VFPv3d16 & cpu_id)
|
||
|
{
|
||
|
result = string(FEATURES_HAS_VFPv3d16_NAME);
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
inline int SplitARMFeatures(const vector<string>& features)
|
||
|
{
|
||
|
int result = 0;
|
||
|
|
||
|
for (size_t i = 3; i < features.size(); i++)
|
||
|
{
|
||
|
if (FEATURES_HAS_VFPv3_NAME == features[i])
|
||
|
{
|
||
|
result |= FEATURES_HAS_VFPv3;
|
||
|
}
|
||
|
else if (FEATURES_HAS_VFPv3d16_NAME == features[i])
|
||
|
{
|
||
|
result |= FEATURES_HAS_VFPv3d16;
|
||
|
}
|
||
|
else if (FEATURES_HAS_NEON_NAME == features[i])
|
||
|
{
|
||
|
result |= FEATURES_HAS_NEON;
|
||
|
}
|
||
|
else if (FEATURES_HAS_NEON2_NAME == features[i])
|
||
|
{
|
||
|
result |= FEATURES_HAS_NEON2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
inline string JoinIntelFeatures(int cpu_id)
|
||
|
{
|
||
|
string result;
|
||
|
|
||
|
if (FEATURES_HAS_SSSE3 & cpu_id)
|
||
|
{
|
||
|
result = FEATURES_HAS_SSSE3_NAME;
|
||
|
}
|
||
|
else if (FEATURES_HAS_SSE2 & cpu_id)
|
||
|
{
|
||
|
result = FEATURES_HAS_SSE2_NAME;
|
||
|
}
|
||
|
else if (FEATURES_HAS_SSE & cpu_id)
|
||
|
{
|
||
|
result = FEATURES_HAS_SSE_NAME;
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
inline int SplitIntelFeatures(const vector<string>& features)
|
||
|
{
|
||
|
int result = 0;
|
||
|
|
||
|
for (size_t i = 3; i < features.size(); i++)
|
||
|
{
|
||
|
if (FEATURES_HAS_SSSE3_NAME == features[i])
|
||
|
{
|
||
|
result |= FEATURES_HAS_SSSE3;
|
||
|
}
|
||
|
else if (FEATURES_HAS_SSE2_NAME == features[i])
|
||
|
{
|
||
|
result |= FEATURES_HAS_SSE2;
|
||
|
}
|
||
|
else if (FEATURES_HAS_SSE_NAME == features[i])
|
||
|
{
|
||
|
result |= FEATURES_HAS_SSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
inline string SplitVersion(const vector<string>& features, const string& package_version)
|
||
|
{
|
||
|
string result;
|
||
|
|
||
|
if ((features.size() > 1) && ('v' == features[1][0]))
|
||
|
{
|
||
|
result = features[1].substr(1);
|
||
|
result += SplitStringVector(package_version, '.')[0];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// TODO: Report package name format error
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
inline string JoinPlatform(int platform)
|
||
|
{
|
||
|
string result;
|
||
|
map<int, string>::const_iterator it = PackageInfo::PlatformNameMap.find(platform);
|
||
|
|
||
|
assert(PackageInfo::PlatformNameMap.end() != it);
|
||
|
result = it->second;
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
inline int SplitPlatfrom(const vector<string>& features)
|
||
|
{
|
||
|
int result = 0;
|
||
|
|
||
|
if (features.size() > 2)
|
||
|
{
|
||
|
string tmp = features[2];
|
||
|
if (PLATFORM_TEGRA_NAME == tmp)
|
||
|
{
|
||
|
result = PLATFORM_TEGRA;
|
||
|
}
|
||
|
else if (PLATFORM_TEGRA2_NAME == tmp)
|
||
|
{
|
||
|
result = PLATFORM_TEGRA2;
|
||
|
}
|
||
|
else if (PLATFORM_TEGRA3_NAME == tmp)
|
||
|
{
|
||
|
result = PLATFORM_TEGRA3;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// TODO: Report package name format error
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/* Package naming convention
|
||
|
* All parts of package name seporated by "_" symbol
|
||
|
* First part is base namespace.
|
||
|
* Second part is version. Version starts from "v" symbol. After "v" symbol version nomber without dot symbol added.
|
||
|
* If platform is known third part is platform name
|
||
|
* If platform is unknown it is defined by hardware capabilities using pattern: <arch>_<fpu features>_<vectorisation features>_<other features>
|
||
|
* Example: armv7_vfpv3_neon, armv7_vfpv3d16_neon
|
||
|
*/
|
||
|
PackageInfo::PackageInfo(const string& version, int platform, int cpu_id):
|
||
|
Version(version),
|
||
|
Platform(platform),
|
||
|
CpuID(cpu_id),
|
||
|
InstallPath("")
|
||
|
{
|
||
|
FullName = BasePackageName + "_v" + Version.substr(0, Version.size()-1);
|
||
|
if (PLATFORM_UNKNOWN != Platform)
|
||
|
{
|
||
|
FullName += string("_") + JoinPlatform(platform);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (ARCH_UNKNOWN != CpuID)
|
||
|
{
|
||
|
if (ARCH_X86 & CpuID)
|
||
|
{
|
||
|
LOGD("Found processor with x86 arch");
|
||
|
FullName += string("_") + ARCH_X86_NAME;
|
||
|
// NOTE: Intel features temporary are not supported
|
||
|
//string features = JoinIntelFeatures(CpuID);
|
||
|
string features;
|
||
|
if (!features.empty())
|
||
|
{
|
||
|
FullName += string("_") + features;
|
||
|
}
|
||
|
}
|
||
|
if (ARCH_X64 & CpuID)
|
||
|
{
|
||
|
LOGD("Found processor with x64 arch");
|
||
|
// NOTE: Intel features temporary are not supported
|
||
|
//FullName += string("_") + ARCH_X64_NAME;
|
||
|
//string features = JoinIntelFeatures(CpuID);
|
||
|
FullName += string("_") + ARCH_X86_NAME;
|
||
|
string features;
|
||
|
if (!features.empty())
|
||
|
{
|
||
|
FullName += string("_") + features;
|
||
|
}
|
||
|
}
|
||
|
if (ARCH_ARMv5 & CpuID)
|
||
|
{
|
||
|
LOGD("Found processor with ARMv5 arch");
|
||
|
FullName += string("_") + ARCH_ARMv5_NAME;
|
||
|
string features = JoinARMFeatures(CpuID);
|
||
|
if (!features.empty())
|
||
|
{
|
||
|
FullName += string("_") + features;
|
||
|
}
|
||
|
}
|
||
|
if (ARCH_ARMv6 & CpuID)
|
||
|
{
|
||
|
LOGD("Found processor with ARMv6 arch");
|
||
|
// NOTE: ARM v6 used instead ARM v6
|
||
|
//FullName += string("_") + ARCH_ARMv6_NAME;
|
||
|
FullName += string("_") + ARCH_ARMv5_NAME;
|
||
|
// NOTE: ARM features temporary are not supported
|
||
|
//string features = JoinARMFeatures(CpuID);
|
||
|
string features;
|
||
|
if (!features.empty())
|
||
|
{
|
||
|
FullName += string("_") + features;
|
||
|
}
|
||
|
}
|
||
|
if (ARCH_ARMv7 & CpuID)
|
||
|
{
|
||
|
LOGD("Found processor with ARMv7 arch");
|
||
|
FullName += string("_") + ARCH_ARMv7_NAME;
|
||
|
// NOTE: ARM features temporary are not supported
|
||
|
//string features = JoinARMFeatures(CpuID);
|
||
|
string features;
|
||
|
if (!features.empty())
|
||
|
{
|
||
|
FullName += string("_") + features;
|
||
|
}
|
||
|
}
|
||
|
if (ARCH_ARMv8 & CpuID)
|
||
|
{
|
||
|
LOGD("Found processor with ARMv8 arch");
|
||
|
FullName += string("_") + ARCH_ARMv8_NAME;
|
||
|
string features = JoinARMFeatures(CpuID);
|
||
|
if (!features.empty())
|
||
|
{
|
||
|
FullName += string("_") + features;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOGD("Found processor with unknown arch");
|
||
|
Version.clear();
|
||
|
CpuID = ARCH_UNKNOWN;
|
||
|
Platform = PLATFORM_UNKNOWN;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PackageInfo::PackageInfo(const string& fullname, const string& install_path, const string& package_version):
|
||
|
FullName(fullname),
|
||
|
InstallPath(install_path)
|
||
|
{
|
||
|
LOGD("PackageInfo::PackageInfo(\"%s\", \"%s\")", fullname.c_str(), install_path.c_str());
|
||
|
|
||
|
assert(!fullname.empty());
|
||
|
assert(!install_path.empty());
|
||
|
|
||
|
vector<string> features = SplitStringVector(FullName, '_');
|
||
|
|
||
|
if (!features.empty() && (BasePackageName == features[0]))
|
||
|
{
|
||
|
Version = SplitVersion(features, package_version);
|
||
|
if (Version.empty())
|
||
|
{
|
||
|
CpuID = ARCH_UNKNOWN;
|
||
|
Platform = PLATFORM_UNKNOWN;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Platform = SplitPlatfrom(features);
|
||
|
if (PLATFORM_UNKNOWN != Platform)
|
||
|
{
|
||
|
CpuID = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (features.size() < 3)
|
||
|
{
|
||
|
LOGD("It is not OpenCV library package for this platform");
|
||
|
Version.clear();
|
||
|
CpuID = ARCH_UNKNOWN;
|
||
|
Platform = PLATFORM_UNKNOWN;
|
||
|
return;
|
||
|
}
|
||
|
else if (ARCH_ARMv5_NAME == features[2])
|
||
|
{
|
||
|
CpuID = ARCH_ARMv5 | SplitARMFeatures(features);
|
||
|
}
|
||
|
else if (ARCH_ARMv6_NAME == features[2])
|
||
|
{
|
||
|
CpuID = ARCH_ARMv6 | SplitARMFeatures(features);
|
||
|
}
|
||
|
else if (ARCH_ARMv7_NAME == features[2])
|
||
|
{
|
||
|
CpuID = ARCH_ARMv7 | SplitARMFeatures(features);
|
||
|
}
|
||
|
else if (ARCH_X86_NAME == features[2])
|
||
|
{
|
||
|
CpuID = ARCH_X86 | SplitIntelFeatures(features);
|
||
|
}
|
||
|
else if (ARCH_X64_NAME == features[2])
|
||
|
{
|
||
|
CpuID = ARCH_X64 | SplitIntelFeatures(features);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOGD("It is not OpenCV library package for this platform");
|
||
|
Version.clear();
|
||
|
CpuID = ARCH_UNKNOWN;
|
||
|
Platform = PLATFORM_UNKNOWN;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOGD("It is not OpenCV library package for this platform");
|
||
|
Version.clear();
|
||
|
CpuID = ARCH_UNKNOWN;
|
||
|
Platform = PLATFORM_UNKNOWN;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool PackageInfo::IsValid() const
|
||
|
{
|
||
|
return !(Version.empty() && (PLATFORM_UNKNOWN == Platform) && (ARCH_UNKNOWN == CpuID));
|
||
|
}
|
||
|
|
||
|
int PackageInfo::GetPlatform() const
|
||
|
{
|
||
|
return Platform;
|
||
|
}
|
||
|
|
||
|
int PackageInfo::GetCpuID() const
|
||
|
{
|
||
|
return CpuID;
|
||
|
}
|
||
|
|
||
|
string PackageInfo::GetFullName() const
|
||
|
{
|
||
|
return FullName;
|
||
|
}
|
||
|
|
||
|
string PackageInfo::GetVersion() const
|
||
|
{
|
||
|
return Version;
|
||
|
}
|
||
|
|
||
|
string PackageInfo::GetInstalationPath() const
|
||
|
{
|
||
|
return InstallPath;
|
||
|
}
|
||
|
|
||
|
bool PackageInfo::operator==(const PackageInfo& package) const
|
||
|
{
|
||
|
return (package.FullName == FullName);
|
||
|
}
|