summaryrefslogtreecommitdiffstats
path: root/services/camera/libcameraservice/device3/Camera3Device.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/camera/libcameraservice/device3/Camera3Device.cpp')
-rw-r--r--services/camera/libcameraservice/device3/Camera3Device.cpp31
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);