From f49f8b0bad0c6cd5db1b603233ad008c5bac4a60 Mon Sep 17 00:00:00 2001 From: Mikael Persson Date: Thu, 26 Nov 2015 12:34:29 +0100 Subject: [PATCH] Camera2: create new streams if surface size has changed When a new capture session is created, the old streams are re-used if same surface and rotation. However, if the surface has changed size, we must re-create the stream to ensure HAL is configured properly, which includes setting up proper sensor resolution. This is an issue in e.g. CTS testNoiseReductionModes and testEdgeModeControl, where a new preview with different size can be setup without first stopping the previous one. The same preview surface is used here, but with changed size. Change-Id: I3b88a95209e83cf1cef0f4d1f791c87b0feb093f Signed-off-by: Mikael Persson Signed-off-by: Zhiquan Liu --- .../hardware/camera2/impl/CameraDeviceImpl.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 6e02df1f71313..8bfcc708f8347 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -95,6 +95,8 @@ public class CameraDeviceImpl extends CameraDevice { new SimpleEntry<>(REQUEST_ID_NONE, null); private final SparseArray mConfiguredOutputs = new SparseArray<>(); + private final SparseArray mConfiguredOutputSizes = + new SparseArray<>(); private final String mCameraId; private final CameraCharacteristics mCharacteristics; @@ -388,7 +390,14 @@ public class CameraDeviceImpl extends CameraDevice { if (!outputs.contains(outConfig)) { deleteList.add(streamId); } else { - addSet.remove(outConfig); // Don't create a stream previously created + // Even if same surface and rotation, the surface can have re-sized. + // If so, we must create a new stream to ensure HAL is configured correctly. + Size outSize = SurfaceUtils.getSurfaceSize(outConfig.getSurface()); + if (!outSize.equals(mConfiguredOutputSizes.valueAt(i))) { + deleteList.add(streamId); + } else { + addSet.remove(outConfig); // Don't create a stream previously created + } } } @@ -421,13 +430,16 @@ public class CameraDeviceImpl extends CameraDevice { for (Integer streamId : deleteList) { mRemoteDevice.deleteStream(streamId); mConfiguredOutputs.delete(streamId); + mConfiguredOutputSizes.delete(streamId); } // Add all new streams for (OutputConfiguration outConfig : outputs) { if (addSet.contains(outConfig)) { int streamId = mRemoteDevice.createStream(outConfig); + Size outSize = SurfaceUtils.getSurfaceSize(outConfig.getSurface()); mConfiguredOutputs.put(streamId, outConfig); + mConfiguredOutputSizes.put(streamId, outSize); } }