diff options
Diffstat (limited to 'services/camera/libcameraservice/device3/Camera3Device.cpp')
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 9e73b5c..3afbd89 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -1384,6 +1384,37 @@ status_t Camera3Device::prepare(int streamId) { return mPreparerThread->prepare(stream); } +status_t Camera3Device::tearDown(int streamId) { + ATRACE_CALL(); + ALOGV("%s: Camera %d: Tearing down stream %d", __FUNCTION__, mId, streamId); + Mutex::Autolock il(mInterfaceLock); + Mutex::Autolock l(mLock); + + // Teardown can only be accomplished on devices that don't require register_stream_buffers, + // since we cannot call register_stream_buffers except right after configure_streams. + if (mHal3Device->common.version < CAMERA_DEVICE_API_VERSION_3_2) { + ALOGE("%s: Unable to tear down streams on device HAL v%x", + __FUNCTION__, mHal3Device->common.version); + return NO_INIT; + } + + sp<Camera3StreamInterface> stream; + ssize_t outputStreamIdx = mOutputStreams.indexOfKey(streamId); + if (outputStreamIdx == NAME_NOT_FOUND) { + CLOGE("Stream %d does not exist", streamId); + return BAD_VALUE; + } + + stream = mOutputStreams.editValueAt(outputStreamIdx); + + if (stream->hasOutstandingBuffers() || mRequestThread->isStreamPending(stream)) { + CLOGE("Stream %d is a target of a in-progress request", streamId); + return BAD_VALUE; + } + + return stream->tearDown(); +} + uint32_t Camera3Device::getDeviceVersion() { ATRACE_CALL(); Mutex::Autolock il(mInterfaceLock); |