diff options
Diffstat (limited to 'core/jni')
-rw-r--r-- | core/jni/Android.mk | 4 | ||||
-rw-r--r-- | core/jni/android_hardware_SensorManager.cpp | 2 | ||||
-rw-r--r-- | core/jni/android_hardware_camera2_DngCreator.cpp | 43 | ||||
-rw-r--r-- | core/jni/com_android_internal_os_Zygote.cpp | 31 |
4 files changed, 77 insertions, 3 deletions
diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 6b07a47..fc15b964 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -20,6 +20,10 @@ ifneq ($(ENABLE_CPUSETS),) LOCAL_CFLAGS += -DENABLE_CPUSETS endif +ifneq ($(ENABLE_SCHED_BOOST),) + LOCAL_CFLAGS += -DENABLE_SCHED_BOOST +endif + LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES LOCAL_CFLAGS += -DU_USING_ICU_NAMESPACE=0 diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp index ec56507..7d0afdc 100644 --- a/core/jni/android_hardware_SensorManager.cpp +++ b/core/jni/android_hardware_SensorManager.cpp @@ -138,7 +138,7 @@ nativeCreate (JNIEnv *env, jclass clazz, jstring opPackageName) { ScopedUtfChars opPackageNameUtf(env, opPackageName); - return (jlong) new SensorManager(String16(opPackageNameUtf.c_str())); + return (jlong) &SensorManager::getInstanceForPackage(String16(opPackageNameUtf.c_str())); } static jboolean diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp index ba08237..e10a644 100644 --- a/core/jni/android_hardware_camera2_DngCreator.cpp +++ b/core/jni/android_hardware_camera2_DngCreator.cpp @@ -20,6 +20,7 @@ #include <string.h> #include <algorithm> #include <memory> +#include <vector> #include <utils/Log.h> #include <utils/Errors.h> @@ -1659,8 +1660,7 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image lsmHeight = static_cast<uint32_t>(entry1.data.i32[1]); } - camera_metadata_entry entry2 = - results.find(ANDROID_STATISTICS_LENS_SHADING_MAP); + camera_metadata_entry entry2 = results.find(ANDROID_STATISTICS_LENS_SHADING_MAP); camera_metadata_entry entry = characteristics.find(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE); @@ -1685,6 +1685,45 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image } } + + // Set up bad pixel correction list + camera_metadata_entry entry3 = characteristics.find(ANDROID_STATISTICS_HOT_PIXEL_MAP); + + if ((entry3.count % 2) != 0) { + ALOGE("%s: Hot pixel map contains odd number of values, cannot map to pairs!", + __FUNCTION__); + jniThrowRuntimeException(env, "failed to add hotpixel map."); + return nullptr; + } + + // Adjust the bad pixel coordinates to be relative to the origin of the active area DNG tag + std::vector<uint32_t> v; + for (size_t i = 0; i < entry3.count; i+=2) { + int32_t x = entry3.data.i32[i]; + int32_t y = entry3.data.i32[i + 1]; + x -= static_cast<int32_t>(xmin); + y -= static_cast<int32_t>(ymin); + if (x < 0 || y < 0 || static_cast<uint32_t>(x) >= width || + static_cast<uint32_t>(y) >= width) { + continue; + } + v.push_back(x); + v.push_back(y); + } + const uint32_t* badPixels = &v[0]; + uint32_t badPixelCount = v.size(); + + if (badPixelCount > 0) { + err = builder.addBadPixelListForMetadata(badPixels, badPixelCount, opcodeCfaLayout); + + if (err != OK) { + ALOGE("%s: Could not add hotpixel map.", __FUNCTION__); + jniThrowRuntimeException(env, "failed to add hotpixel map."); + return nullptr; + } + } + + size_t listSize = builder.getSize(); uint8_t opcodeListBuf[listSize]; err = builder.buildOpList(opcodeListBuf); diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 7a725ae..4c920dc 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -408,6 +408,27 @@ void SetThreadName(const char* thread_name) { } } +#ifdef ENABLE_SCHED_BOOST +static void SetForkLoad(bool boost) { + // set scheduler knob to boost forked processes + pid_t currentPid = getpid(); + // fits at most "/proc/XXXXXXX/sched_init_task_load\0" + char schedPath[35]; + snprintf(schedPath, sizeof(schedPath), "/proc/%u/sched_init_task_load", currentPid); + int schedBoostFile = open(schedPath, O_WRONLY); + if (schedBoostFile < 0) { + ALOGW("Unable to set zygote scheduler boost"); + return; + } + if (boost) { + write(schedBoostFile, "100\0", 4); + } else { + write(schedBoostFile, "0\0", 2); + } + close(schedBoostFile); +} +#endif + // Utility routine to fork zygote and specialize the child process. static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids, jint debug_flags, jobjectArray javaRlimits, @@ -418,6 +439,10 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra jstring instructionSet, jstring dataDir) { SetSigChldHandler(); +#ifdef ENABLE_SCHED_BOOST + SetForkLoad(true); +#endif + pid_t pid = fork(); if (pid == 0) { @@ -558,6 +583,12 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra } } else if (pid > 0) { // the parent process + +#ifdef ENABLE_SCHED_BOOST + // unset scheduler knob + SetForkLoad(false); +#endif + } return pid; } |