From 443ab2c7dbe2a3a482892f3171882572f10eab9a Mon Sep 17 00:00:00 2001 From: Ruben Brunk Date: Thu, 12 Mar 2015 20:54:03 -0700 Subject: camera2: Release surface in ImageReader#close and fix legacy cleanup Bug: 19694090 Change-Id: I344ad707dbd414db023e4770769b5237bd3bbb4e --- core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java | 6 +++++- core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java | 2 +- core/java/android/hardware/camera2/legacy/RequestThreadManager.java | 4 ++++ core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp | 3 +-- media/java/android/media/ImageReader.java | 1 + 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java index 367a078c3d74..b5a019dafeb5 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java +++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java @@ -292,6 +292,10 @@ public class LegacyCameraDevice implements AutoCloseable { Log.e(TAG, "configureOutputs - null outputs are not allowed"); return BAD_VALUE; } + if (!output.isValid()) { + Log.e(TAG, "configureOutputs - invalid output surfaces are not allowed"); + return BAD_VALUE; + } StreamConfigurationMap streamConfigurations = mStaticCharacteristics. get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); @@ -522,7 +526,7 @@ public class LegacyCameraDevice implements AutoCloseable { * @return the width and height of the surface * * @throws NullPointerException if the {@code surface} was {@code null} - * @throws IllegalStateException if the {@code surface} was invalid + * @throws BufferQueueAbandonedException if the {@code surface} was invalid */ public static Size getSurfaceSize(Surface surface) throws BufferQueueAbandonedException { checkNotNull(surface); diff --git a/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java b/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java index 7e0c01b14917..4b7cfbf79b77 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java +++ b/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java @@ -60,7 +60,7 @@ public class LegacyExceptionUtils { case CameraBinderDecorator.NO_ERROR: { return CameraBinderDecorator.NO_ERROR; } - case CameraBinderDecorator.ENODEV: { + case CameraBinderDecorator.BAD_VALUE: { throw new BufferQueueAbandonedException(); } } diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java index f1f2f0c466c4..70471a56c6a4 100644 --- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java +++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java @@ -501,6 +501,10 @@ public class RequestThreadManager { return; } for(Surface s : surfaces) { + if (s == null || !s.isValid()) { + Log.w(TAG, "Jpeg surface is invalid, skipping..."); + continue; + } try { LegacyCameraDevice.setSurfaceFormat(s, LegacyMetadataMapper.HAL_PIXEL_FORMAT_BLOB); } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) { diff --git a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp index 0a6fb9db9527..8f38ae5974fc 100644 --- a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp +++ b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp @@ -373,8 +373,7 @@ static sp getNativeWindow(JNIEnv* env, jobject surface) { return NULL; } if (anw == NULL) { - jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", - "Surface had no valid native window."); + ALOGE("%s: Surface had no valid native window.", __FUNCTION__); return NULL; } return anw; diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java index 8d6a5883c6c4..a965e2b9cb1f 100644 --- a/media/java/android/media/ImageReader.java +++ b/media/java/android/media/ImageReader.java @@ -443,6 +443,7 @@ public class ImageReader implements AutoCloseable { @Override public void close() { setOnImageAvailableListener(null, null); + if (mSurface != null) mSurface.release(); nativeClose(); } -- cgit v1.2.3-59-g8ed1b