diff --git a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp index d0d8514b74..bb0a34cca8 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 1dda8bd14b..1e14ba7015 100644 --- a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h +++ b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h @@ -14,8 +14,10 @@ #define FEATURES_HAS_VFPv3d16 1L #define FEATURES_HAS_VFPv3 2L -#define FEATURES_HAS_NEON 4L -#define FEATURES_HAS_NEON2 8L +#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 @@ -24,10 +26,12 @@ // TODO: Do not forget to add Platrfom name to PackageInfo::PlatformNameMap // in method PackageInfo::InitPlatformNameMap() #define PLATFORM_UNKNOWN 0L -#define PLATFORM_TEGRA 1L -#define PLATFORM_TEGRA2 2L -#define PLATFORM_TEGRA3 3L -#define PLATFORM_TEGRA4 4L +#define PLATFORM_TEGRA 1L +#define PLATFORM_TEGRA2 2L +#define PLATFORM_TEGRA3 3L +#define PLATFORM_TEGRA4i 4L +#define PLATFORM_TEGRA4 5L +#define PLATFORM_TEGRA5 6L int DetectKnownPlatforms(); int GetProcessorCount(); diff --git a/platforms/android/service/engine/jni/BinderComponent/ProcReader.h b/platforms/android/service/engine/jni/BinderComponent/ProcReader.h index f703ccf9cd..5eff3610aa 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 eaa03d4d82..5c5022ff48 100644 --- a/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp +++ b/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp @@ -187,17 +187,26 @@ 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_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_TEGRA4, 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)); + result.push_back(std::pair(PLATFORM_TEGRA5, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); return result; } diff --git a/platforms/android/service/engine/jni/NativeService/PackageInfo.cpp b/platforms/android/service/engine/jni/NativeService/PackageInfo.cpp index 2f8dde043a..64ea70dae8 100644 --- a/platforms/android/service/engine/jni/NativeService/PackageInfo.cpp +++ b/platforms/android/service/engine/jni/NativeService/PackageInfo.cpp @@ -19,6 +19,8 @@ map PackageInfo::InitPlatformNameMap() result[PLATFORM_TEGRA2] = PLATFORM_TEGRA2_NAME; result[PLATFORM_TEGRA3] = PLATFORM_TEGRA3_NAME; result[PLATFORM_TEGRA4] = PLATFORM_TEGRA4_NAME; + result[PLATFORM_TEGRA4i] = PLATFORM_TEGRA4_NAME; + result[PLATFORM_TEGRA5] = PLATFORM_TEGRA5_NAME; return result; } diff --git a/platforms/android/service/engine/jni/NativeService/PackageInfo.h b/platforms/android/service/engine/jni/NativeService/PackageInfo.h index 2ce561e2f3..f94f0f3827 100644 --- a/platforms/android/service/engine/jni/NativeService/PackageInfo.h +++ b/platforms/android/service/engine/jni/NativeService/PackageInfo.h @@ -21,10 +21,12 @@ #define FEATURES_HAS_SSSE3_NAME "ssse3" #define FEATURES_HAS_GPU_NAME "gpu" +// TODO: Do not forget to update PackageInfo::InitPlatformNameMap() after constant changes #define PLATFORM_TEGRA_NAME "tegra" #define PLATFORM_TEGRA2_NAME "tegra2" #define PLATFORM_TEGRA3_NAME "tegra3" #define PLATFORM_TEGRA4_NAME "tegra4" +#define PLATFORM_TEGRA5_NAME "tegra5" class PackageInfo { diff --git a/platforms/android/service/engine/jni/Tests/OpenCVEngineTest.cpp b/platforms/android/service/engine/jni/Tests/OpenCVEngineTest.cpp index 7473387a04..b0bb6d58e0 100644 --- a/platforms/android/service/engine/jni/Tests/OpenCVEngineTest.cpp +++ b/platforms/android/service/engine/jni/Tests/OpenCVEngineTest.cpp @@ -20,16 +20,16 @@ class ServiceStarter public: ServiceStarter() { - PackageManager = new PackageManagerStub(); - Engine = new OpenCVEngine(PackageManager); + PackageManager = new PackageManagerStub(); + Engine = new OpenCVEngine(PackageManager); - defaultServiceManager()->addService(IOpenCVEngine::descriptor, Engine); - LOGI("OpenCVEngine native service started successfully"); - ProcessState::self()->startThreadPool(); + defaultServiceManager()->addService(IOpenCVEngine::descriptor, Engine); + LOGI("OpenCVEngine native service started successfully"); + ProcessState::self()->startThreadPool(); } ~ServiceStarter() { - delete PackageManager; + delete PackageManager; } PackageManagerStub* PackageManager; @@ -46,9 +46,9 @@ sp InitConnect() do { - EngineService = ServiceManager->getService(IOpenCVEngine::descriptor); - if (EngineService != 0) break; - usleep(500000); // 0.5 s + EngineService = ServiceManager->getService(IOpenCVEngine::descriptor); + if (EngineService != 0) break; + usleep(500000); // 0.5 s } while(true); Engine = interface_cast(EngineService); @@ -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 36fdae764f..de6b224536 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 61d6e01c24..952af62801 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 dc82ec30cc..1d52f0cf0f 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 e22f7b5298..4e9050fa4d 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) {