Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f49f8b0b authored by Mikael Persson's avatar Mikael Persson Committed by Zhiquan Liu
Browse files

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: default avatarMikael Persson <mikael.persson@intel.com>
Signed-off-by: default avatarZhiquan Liu <zhiquan.liu@intel.com>
parent cb299b85
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ public class CameraDeviceImpl extends CameraDevice {
            new SimpleEntry<>(REQUEST_ID_NONE, null);
    private final SparseArray<OutputConfiguration> mConfiguredOutputs =
            new SparseArray<>();
    private final SparseArray<Size> mConfiguredOutputSizes =
            new SparseArray<>();

    private final String mCameraId;
    private final CameraCharacteristics mCharacteristics;
@@ -387,10 +389,17 @@ public class CameraDeviceImpl extends CameraDevice {

                if (!outputs.contains(outConfig)) {
                    deleteList.add(streamId);
                } else {
                    // 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
                    }
                }
            }

            mDeviceHandler.post(mCallOnBusy);
            stopRepeating();
@@ -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);
                    }
                }