diff --git a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp index d0d8514b7..bb0a34cca 100644 --- a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp +++ b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp @@ -91,6 +91,10 @@ int GetCpuID() { result |= FEATURES_HAS_NEON2; } + if (features.end() != features.find(CPU_INFO_VFPV4_STR)) + { + result |= FEATURES_HAS_VFPv4; + } if (features.end() != features.find(CPU_INFO_VFPV3_STR)) { if (features.end () != features.find(CPU_INFO_VFPV3D16_STR)) diff --git a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h index 0a6590e83..1e14ba701 100644 --- a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h +++ b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h @@ -17,6 +17,7 @@ #define FEATURES_HAS_VFPv4 4L #define FEATURES_HAS_NEON 8L #define FEATURES_HAS_NEON2 16L + #define FEATURES_HAS_SSE 1L #define FEATURES_HAS_SSE2 2L #define FEATURES_HAS_SSSE3 4L @@ -28,8 +29,8 @@ #define PLATFORM_TEGRA 1L #define PLATFORM_TEGRA2 2L #define PLATFORM_TEGRA3 3L -#define PLATFORM_TEGRA4 4L -#define PLATFORM_TEGRA4i 5L +#define PLATFORM_TEGRA4i 4L +#define PLATFORM_TEGRA4 5L #define PLATFORM_TEGRA5 6L int DetectKnownPlatforms(); diff --git a/platforms/android/service/engine/jni/BinderComponent/ProcReader.h b/platforms/android/service/engine/jni/BinderComponent/ProcReader.h index f703ccf9c..5eff3610a 100644 --- a/platforms/android/service/engine/jni/BinderComponent/ProcReader.h +++ b/platforms/android/service/engine/jni/BinderComponent/ProcReader.h @@ -7,8 +7,9 @@ #define CPU_INFO_NEON_STR "neon" #define CPU_INFO_NEON2_STR "neon2" -#define CPU_INFO_VFPV3_STR "vfpv3" #define CPU_INFO_VFPV3D16_STR "vfpv3d16" +#define CPU_INFO_VFPV3_STR "vfpv3" +#define CPU_INFO_VFPV4_STR "vfpv4" #define CPU_INFO_SSE_STR "sse" #define CPU_INFO_SSE2_STR "sse2" diff --git a/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp b/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp index d96048fcb..5c5022ff4 100644 --- a/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp +++ b/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp @@ -187,16 +187,22 @@ std::vector > CommonPackageManager::InitArmRating() result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_TEGRA2, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_VFPv3)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_NEON)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_NEON)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_NEON)); - result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); + + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv4 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv4 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_NEON)); + result.push_back(std::pair(PLATFORM_TEGRA3, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); result.push_back(std::pair(PLATFORM_TEGRA4i, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); result.push_back(std::pair(PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); diff --git a/platforms/android/service/engine/jni/Tests/OpenCVEngineTest.cpp b/platforms/android/service/engine/jni/Tests/OpenCVEngineTest.cpp index b22eb09ef..b0bb6d58e 100644 --- a/platforms/android/service/engine/jni/Tests/OpenCVEngineTest.cpp +++ b/platforms/android/service/engine/jni/Tests/OpenCVEngineTest.cpp @@ -193,11 +193,11 @@ TEST(OpenCVEngineTest, GetPathForCompatiblePackage2) #ifdef __SUPPORT_TEGRA3 EXPECT_STREQ("/data/data/org.opencv.lib_v24_tegra3/lib", String8(result).string()); #else - #ifdef __SUPPORT_ARMEABI_V7A_FEATURES +# ifdef __SUPPORT_ARMEABI_V7A_FEATURES EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a_neon/lib", String8(result).string()); - #else +# else EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a/lib", String8(result).string()); - #endif +# endif #endif } @@ -205,18 +205,18 @@ TEST(OpenCVEngineTest, GetPathForCompatiblePackage3) { sp Engine = InitConnect(); Starter.PackageManager->InstalledPackages.clear(); - Starter.PackageManager->InstallVersion(2040400, PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON); + Starter.PackageManager->InstallVersion(2040400, PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON); EXPECT_FALSE(NULL == Engine.get()); String16 result = Engine->GetLibPathByVersion(String16("2.4")); - #ifdef __SUPPORT_TEGRA3 +#ifdef __SUPPORT_TEGRA3 EXPECT_STREQ("/data/data/org.opencv.lib_v24_tegra4/lib", String8(result).string()); - #else - #ifdef __SUPPORT_ARMEABI_V7A_FEATURES +#else +# ifdef __SUPPORT_ARMEABI_V7A_FEATURES EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a_neon/lib", String8(result).string()); - #else +# else EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a/lib", String8(result).string()); - #endif - #endif +# endif +#endif } TEST(OpenCVEngineTest, InstallAndGetVersion) @@ -226,15 +226,15 @@ TEST(OpenCVEngineTest, InstallAndGetVersion) EXPECT_FALSE(NULL == Engine.get()); EXPECT_TRUE(Engine->InstallVersion(String16("2.4"))); String16 result = Engine->GetLibPathByVersion(String16("2.4")); - #ifdef __SUPPORT_TEGRA3 +#ifdef __SUPPORT_TEGRA3 EXPECT_STREQ("/data/data/org.opencv.lib_v24_tegra3/lib", String8(result).string()); - #else - #ifdef __SUPPORT_ARMEABI_V7A_FEATURES +#else +# ifdef __SUPPORT_ARMEABI_V7A_FEATURES EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a_neon/lib", String8(result).string()); - #else +# else EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a/lib", String8(result).string()); - #endif - #endif +# endif +#endif } TEST(OpenCVEngineTest, GetPathFor2_4_2) diff --git a/platforms/android/service/engine/jni/Tests/PackageInfoTest.cpp b/platforms/android/service/engine/jni/Tests/PackageInfoTest.cpp index 36fdae764..de6b22453 100644 --- a/platforms/android/service/engine/jni/Tests/PackageInfoTest.cpp +++ b/platforms/android/service/engine/jni/Tests/PackageInfoTest.cpp @@ -34,6 +34,13 @@ TEST(PackageInfo, FullNameArmv7VFPv3) EXPECT_STREQ("org.opencv.lib_v23_armv7a", name.c_str()); } +TEST(PackageInfo, FullNameArmv7VFPv4) +{ + PackageInfo info(2030300, PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv4); + string name = info.GetFullName(); + EXPECT_STREQ("org.opencv.lib_v23_armv7a", name.c_str()); +} + TEST(PackageInfo, FullNameArmv7VFPv3Neon) { PackageInfo info(2030000, PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON); @@ -74,30 +81,60 @@ TEST(PackageInfo, FullNameTegra3) { PackageInfo info(2030000, PLATFORM_TEGRA3, ARCH_ARMv7 | FEATURES_HAS_NEON); string name = info.GetFullName(); - #ifdef __SUPPORT_TEGRA3 +#ifdef __SUPPORT_TEGRA3 EXPECT_STREQ("org.opencv.lib_v23_tegra3", name.c_str()); - #else - #ifdef __SUPPORT_ARMEABI_V7A_FEATURES +#else +# ifdef __SUPPORT_ARMEABI_V7A_FEATURES EXPECT_STREQ("org.opencv.lib_v23_armv7a_neon", name.c_str()); - #else +# else EXPECT_STREQ("org.opencv.lib_v23_armv7a", name.c_str()); - #endif - #endif +# endif +#endif } TEST(PackageInfo, FullNameTegra4) { PackageInfo info(2040400, PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_NEON); string name = info.GetFullName(); - #ifdef __SUPPORT_TEGRA3 +#ifdef __SUPPORT_TEGRA3 EXPECT_STREQ("org.opencv.lib_v24_tegra4", name.c_str()); - #else - #ifdef __SUPPORT_ARMEABI_V7A_FEATURES +#else +# ifdef __SUPPORT_ARMEABI_V7A_FEATURES EXPECT_STREQ("org.opencv.lib_v24_armv7a_neon", name.c_str()); - #else +# else EXPECT_STREQ("org.opencv.lib_v24_armv7a", name.c_str()); - #endif - #endif +# endif +#endif +} + +TEST(PackageInfo, FullNameTegra4i) +{ + PackageInfo info(2040700, PLATFORM_TEGRA4i, ARCH_ARMv7 | FEATURES_HAS_NEON); + string name = info.GetFullName(); +#ifdef __SUPPORT_TEGRA3 + EXPECT_STREQ("org.opencv.lib_v24_tegra4", name.c_str()); +#else +# ifdef __SUPPORT_ARMEABI_V7A_FEATURES + EXPECT_STREQ("org.opencv.lib_v24_armv7a_neon", name.c_str()); +# else + EXPECT_STREQ("org.opencv.lib_v24_armv7a", name.c_str()); +# endif +#endif +} + +TEST(PackageInfo, FullNameTegra5) +{ + PackageInfo info(2040700, PLATFORM_TEGRA5, ARCH_ARMv7 | FEATURES_HAS_NEON); + string name = info.GetFullName(); +#ifdef __SUPPORT_TEGRA3 + EXPECT_STREQ("org.opencv.lib_v24_tegra5", name.c_str()); +#else +# ifdef __SUPPORT_ARMEABI_V7A_FEATURES + EXPECT_STREQ("org.opencv.lib_v24_armv7a_neon", name.c_str()); +# else + EXPECT_STREQ("org.opencv.lib_v24_armv7a", name.c_str()); +# endif +#endif } TEST(PackageInfo, FullNameX86SSE2) diff --git a/platforms/android/service/engine/jni/Tests/PackageManagmentTest.cpp b/platforms/android/service/engine/jni/Tests/PackageManagmentTest.cpp index 61d6e01c2..952af6280 100644 --- a/platforms/android/service/engine/jni/Tests/PackageManagmentTest.cpp +++ b/platforms/android/service/engine/jni/Tests/PackageManagmentTest.cpp @@ -105,8 +105,8 @@ TEST(PackageManager, GetPackagePathForTegra3) TEST(PackageManager, GetPackagePathForTegra4) { PackageManagerStub pm; - EXPECT_TRUE(pm.InstallVersion(2040400, PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); - string path = pm.GetPackagePathByVersion(2040400, PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON); + EXPECT_TRUE(pm.InstallVersion(2040400, PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); + string path = pm.GetPackagePathByVersion(2040400, PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON); #ifdef __SUPPORT_TEGRA3 EXPECT_STREQ("/data/data/org.opencv.lib_v24_tegra4/lib", path.c_str()); #else @@ -118,6 +118,22 @@ TEST(PackageManager, GetPackagePathForTegra4) #endif } +TEST(PackageManager, GetPackagePathForTegra5) +{ + PackageManagerStub pm; + EXPECT_TRUE(pm.InstallVersion(2040400, PLATFORM_TEGRA5, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); + string path = pm.GetPackagePathByVersion(2040400, PLATFORM_TEGRA5, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON); + #ifdef __SUPPORT_TEGRA3 + EXPECT_STREQ("/data/data/org.opencv.lib_v24_tegra5/lib", path.c_str()); + #else + #ifdef __SUPPORT_ARMEABI_V7A_FEATURES + EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a_neon/lib", path.c_str()); + #else + EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a/lib", path.c_str()); + #endif + #endif +} + #ifdef __SUPPORT_MIPS TEST(PackageManager, GetPackagePathForMips) { diff --git a/platforms/android/service/engine/src/org/opencv/engine/HardwareDetector.java b/platforms/android/service/engine/src/org/opencv/engine/HardwareDetector.java index dc82ec30c..1d52f0cf0 100644 --- a/platforms/android/service/engine/src/org/opencv/engine/HardwareDetector.java +++ b/platforms/android/service/engine/src/org/opencv/engine/HardwareDetector.java @@ -19,8 +19,9 @@ public class HardwareDetector // ARM specific features public static final int FEATURES_HAS_VFPv3d16 = 0x01; public static final int FEATURES_HAS_VFPv3 = 0x02; - public static final int FEATURES_HAS_NEON = 0x04; - public static final int FEATURES_HAS_NEON2 = 0x08; + public static final int FEATURES_HAS_VFPv4 = 0x04; + public static final int FEATURES_HAS_NEON = 0x08; + public static final int FEATURES_HAS_NEON2 = 0x16; // X86 specific features public static final int FEATURES_HAS_SSE = 0x01; diff --git a/platforms/android/service/engine/src/org/opencv/engine/manager/ManagerActivity.java b/platforms/android/service/engine/src/org/opencv/engine/manager/ManagerActivity.java index e22f7b529..4e9050fa4 100644 --- a/platforms/android/service/engine/src/org/opencv/engine/manager/ManagerActivity.java +++ b/platforms/android/service/engine/src/org/opencv/engine/manager/ManagerActivity.java @@ -111,10 +111,14 @@ public class ManagerActivity extends Activity { HardwarePlatformView.setText("Tegra 4i"); } - else + else if (HardwareDetector.PLATFORM_TEGRA4 == Platfrom) { HardwarePlatformView.setText("Tegra 4"); } + else + { + HardwarePlatformView.setText("Tegra 5"); + } } else { @@ -478,7 +482,14 @@ public class ManagerActivity extends Activity // TODO: update if package will be published if ((features & HardwareDetector.FEATURES_HAS_NEON) == HardwareDetector.FEATURES_HAS_NEON) { - return "with Neon"; + if ((features & HardwareDetector.FEATURES_HAS_VFPv4) == HardwareDetector.FEATURES_HAS_VFPv4) + { + return "with Neon and VFPv4"; + } + else + { + return "with Neon"; + } } else if ((features & HardwareDetector.FEATURES_HAS_VFPv3) == HardwareDetector.FEATURES_HAS_VFPv3) {