From a94c6033452b465a28d6bd76015d4a1de6b1bd29 Mon Sep 17 00:00:00 2001 From: Ruben Brunk Date: Wed, 10 Jun 2015 16:44:28 -0700 Subject: Set scaling mode for legacy device surfaces. Bug: 19371754 Change-Id: I0dd762e7b1485ba2d3bec9604407125c35ad1218 --- .../hardware/camera2/legacy/LegacyCameraDevice.java | 12 ++++++++++++ .../camera2/legacy/RequestThreadManager.java | 2 ++ ...id_hardware_camera2_legacy_LegacyCameraDevice.cpp | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java index b5a019dafeb5..9864f8ad1194 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java +++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java @@ -87,6 +87,9 @@ public class LegacyCameraDevice implements AutoCloseable { public static final int MAX_DIMEN_FOR_ROUNDING = 1080; // maximum allowed width for rounding + // Keep up to date with values in system/core/include/system/window.h + public static final int NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW = 1; + private CaptureResultExtras getExtrasFromRequest(RequestHolder holder) { if (holder == null) { return new CaptureResultExtras(ILLEGAL_VALUE, ILLEGAL_VALUE, ILLEGAL_VALUE, @@ -654,6 +657,13 @@ public class LegacyCameraDevice implements AutoCloseable { LegacyExceptionUtils.throwOnError(nativeSetNextTimestamp(surface, timestamp)); } + static void setScalingMode(Surface surface, int mode) + throws BufferQueueAbandonedException { + checkNotNull(surface); + LegacyExceptionUtils.throwOnError(nativeSetScalingMode(surface, mode)); + } + + private static native int nativeDetectSurfaceType(Surface surface); private static native int nativeDetectSurfaceDimens(Surface surface, @@ -681,5 +691,7 @@ public class LegacyCameraDevice implements AutoCloseable { private static native int nativeDetectSurfaceUsageFlags(Surface surface); + private static native int nativeSetScalingMode(Surface surface, int scalingMode); + static native int nativeGetJpegFooterSize(); } diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java index 691798f71991..f935b6dc2dda 100644 --- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java +++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java @@ -385,6 +385,8 @@ public class RequestThreadManager { callbackOutputSizes.add(outSize); break; default: + LegacyCameraDevice.setScalingMode(s, LegacyCameraDevice. + NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); mPreviewOutputs.add(s); previewOutputSizes.add(outSize); break; diff --git a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp index afdfd8f13909..5bef65370aac 100644 --- a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp +++ b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp @@ -689,6 +689,23 @@ static jint LegacyCameraDevice_nativeSetNextTimestamp(JNIEnv* env, jobject thiz, return NO_ERROR; } +static jint LegacyCameraDevice_nativeSetScalingMode(JNIEnv* env, jobject thiz, jobject surface, + jint mode) { + ALOGV("nativeSetScalingMode"); + sp anw; + if ((anw = getNativeWindow(env, surface)) == NULL) { + ALOGE("%s: Could not retrieve native window from surface.", __FUNCTION__); + return BAD_VALUE; + } + status_t err = NO_ERROR; + if ((err = native_window_set_scaling_mode(anw.get(), static_cast(mode))) != NO_ERROR) { + ALOGE("%s: Unable to set surface scaling mode, error %s (%d)", __FUNCTION__, + strerror(-err), err); + return err; + } + return NO_ERROR; +} + static jint LegacyCameraDevice_nativeGetJpegFooterSize(JNIEnv* env, jobject thiz) { ALOGV("nativeGetJpegFooterSize"); return static_cast(sizeof(struct camera3_jpeg_blob)); @@ -733,6 +750,9 @@ static JNINativeMethod gCameraDeviceMethods[] = { { "nativeDetectSurfaceUsageFlags", "(Landroid/view/Surface;)I", (void *)LegacyCameraDevice_nativeDetectSurfaceUsageFlags }, + { "nativeSetScalingMode", + "(Landroid/view/Surface;I)I", + (void *)LegacyCameraDevice_nativeSetScalingMode }, }; // Get all the required offsets in java class and register native functions -- cgit v1.2.3-59-g8ed1b