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. */