From 0d0191e6788af367ca6c3a563c8085ccac458341 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Tue, 21 Apr 2020 17:01:18 -0700 Subject: [PATCH] Camera: Skip session parameters in case of abandoned streams Session parameter application may require an internal stream re-configuration. Sometimes clients can abandon one ore more registered outputs before changing a session parameter value. Even if the new capture request doesn't reference the abandoned surfaces the session parameter cannot be properly configured. Keep the camera service behavior consistent with older versions by skipping the internal stream re-configuration. Bug: 113513019 Test: Camera CTS Change-Id: I8fb49b59ae0aecf537484a7238fe7a8a5d3efe64 --- .../device3/Camera3Device.cpp | 21 +++++++++++++++++++ .../libcameraservice/device3/Camera3Device.h | 6 ++++++ 2 files changed, 27 insertions(+) diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 2d46122626..b00a2d95cd 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -2344,6 +2344,21 @@ void Camera3Device::cancelStreamsConfigurationLocked() { } } +bool Camera3Device::checkAbandonedStreamsLocked() { + if ((mInputStream.get() != nullptr) && (mInputStream->isAbandoned())) { + return true; + } + + for (size_t i = 0; i < mOutputStreams.size(); i++) { + auto stream = mOutputStreams[i]; + if ((stream.get() != nullptr) && (stream->isAbandoned())) { + return true; + } + } + + return false; +} + bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams) { ATRACE_CALL(); bool ret = false; @@ -2352,6 +2367,12 @@ bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams) { nsecs_t maxExpectedDuration = getExpectedInFlightDuration(); Mutex::Autolock l(mLock); + if (checkAbandonedStreamsLocked()) { + ALOGW("%s: Abandoned stream detected, session parameters can't be applied correctly!", + __FUNCTION__); + return true; + } + auto rc = internalPauseAndWaitLocked(maxExpectedDuration); if (rc == NO_ERROR) { mNeedConfig = true; diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index b373a64826..19ecf4b794 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -647,6 +647,12 @@ class Camera3Device : */ bool reconfigureCamera(const CameraMetadata& sessionParams); + /** + * Return true in case of any output or input abandoned streams, + * otherwise return false. + */ + bool checkAbandonedStreamsLocked(); + /** * Filter stream session parameters and configure camera HAL. */