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);  | 
