diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp index 69f853562c..fd785df1a9 100644 --- a/camera/device/3.2/default/CameraDeviceSession.cpp +++ b/camera/device/3.2/default/CameraDeviceSession.cpp @@ -53,6 +53,7 @@ CameraDeviceSession::CameraDeviceSession( camera3_callback_ops({&sProcessCaptureResult, &sNotify}), mDevice(device), mDeviceVersion(device->common.version), + mFreeBufEarly(shouldFreeBufEarly()), mIsAELockAvailable(false), mDerivePostRawSensKey(false), mNumPartialResults(1), @@ -129,6 +130,10 @@ bool CameraDeviceSession::initialize() { return false; } +bool CameraDeviceSession::shouldFreeBufEarly() { + return property_get_bool("ro.vendor.camera.free_buf_early", 0) == 1; +} + CameraDeviceSession::~CameraDeviceSession() { if (!isClosed()) { ALOGE("CameraDeviceSession deleted before close!"); @@ -887,6 +892,24 @@ bool CameraDeviceSession::preProcessConfigurationLocked( (*streams)[i] = &mStreamMap[id]; } + if (mFreeBufEarly) { + // Remove buffers of deleted streams + for(auto it = mStreamMap.begin(); it != mStreamMap.end(); it++) { + int id = it->first; + bool found = false; + for (const auto& stream : requestedConfiguration.streams) { + if (id == stream.id) { + found = true; + break; + } + } + if (!found) { + // Unmap all buffers of deleted stream + cleanupBuffersLocked(id); + } + } + } + return true; } @@ -908,7 +931,9 @@ void CameraDeviceSession::postProcessConfigurationLocked( // Unmap all buffers of deleted stream // in case the configuration call succeeds and HAL // is able to release the corresponding resources too. - cleanupBuffersLocked(id); + if (!mFreeBufEarly) { + cleanupBuffersLocked(id); + } it = mStreamMap.erase(it); } else { ++it; @@ -927,6 +952,27 @@ void CameraDeviceSession::postProcessConfigurationLocked( mResultBatcher.setBatchedStreams(mVideoStreamIds); } + +void CameraDeviceSession::postProcessConfigurationFailureLocked( + const StreamConfiguration& requestedConfiguration) { + if (mFreeBufEarly) { + // Re-build the buf cache entry for deleted streams + for(auto it = mStreamMap.begin(); it != mStreamMap.end(); it++) { + int id = it->first; + bool found = false; + for (const auto& stream : requestedConfiguration.streams) { + if (id == stream.id) { + found = true; + break; + } + } + if (!found) { + mCirculatingBuffers.emplace(id, CirculatingBuffers{}); + } + } + } +} + Return CameraDeviceSession::configureStreams( const StreamConfiguration& requestedConfiguration, ICameraDeviceSession::configureStreams_cb _hidl_cb) { @@ -979,6 +1025,8 @@ Return CameraDeviceSession::configureStreams( // the corresponding resources of the deleted streams. if (ret == OK) { postProcessConfigurationLocked(requestedConfiguration); + } else { + postProcessConfigurationFailureLocked(requestedConfiguration); } if (ret == -EINVAL) { diff --git a/camera/device/3.2/default/CameraDeviceSession.h b/camera/device/3.2/default/CameraDeviceSession.h index af90e5a00f..bcee259fbd 100644 --- a/camera/device/3.2/default/CameraDeviceSession.h +++ b/camera/device/3.2/default/CameraDeviceSession.h @@ -120,6 +120,8 @@ protected: hidl_vec *streams /*out*/); void postProcessConfigurationLocked(const StreamConfiguration& requestedConfiguration); + void postProcessConfigurationFailureLocked(const StreamConfiguration& requestedConfiguration); + protected: // protecting mClosed/mDisconnected/mInitFail @@ -142,6 +144,7 @@ protected: camera3_device_t* mDevice; const uint32_t mDeviceVersion; + const bool mFreeBufEarly; bool mIsAELockAvailable; bool mDerivePostRawSensKey; uint32_t mNumPartialResults; @@ -293,6 +296,8 @@ protected: bool initialize(); + static bool shouldFreeBufEarly(); + Status initStatus() const; // Validate and import request's input buffer and acquire fence diff --git a/camera/device/3.3/default/CameraDeviceSession.cpp b/camera/device/3.3/default/CameraDeviceSession.cpp index d36e9ed4a0..60174fb92d 100644 --- a/camera/device/3.3/default/CameraDeviceSession.cpp +++ b/camera/device/3.3/default/CameraDeviceSession.cpp @@ -92,6 +92,8 @@ Return CameraDeviceSession::configureStreams_3_3( // the corresponding resources of the deleted streams. if (ret == OK) { postProcessConfigurationLocked(requestedConfiguration); + } else { + postProcessConfigurationFailureLocked(requestedConfiguration); } if (ret == -EINVAL) { diff --git a/camera/device/3.4/default/CameraDeviceSession.cpp b/camera/device/3.4/default/CameraDeviceSession.cpp index 6a18161f20..f2e031c674 100644 --- a/camera/device/3.4/default/CameraDeviceSession.cpp +++ b/camera/device/3.4/default/CameraDeviceSession.cpp @@ -154,6 +154,8 @@ Return CameraDeviceSession::configureStreams_3_4( // the corresponding resources of the deleted streams. if (ret == OK) { postProcessConfigurationLocked_3_4(requestedConfiguration); + } else { + postProcessConfigurationFailureLocked_3_4(requestedConfiguration); } if (ret == -EINVAL) { @@ -215,6 +217,23 @@ bool CameraDeviceSession::preProcessConfigurationLocked_3_4( (*streams)[i] = &mStreamMap[id]; } + if (mFreeBufEarly) { + // Remove buffers of deleted streams + for(auto it = mStreamMap.begin(); it != mStreamMap.end(); it++) { + int id = it->first; + bool found = false; + for (const auto& stream : requestedConfiguration.streams) { + if (id == stream.v3_2.id) { + found = true; + break; + } + } + if (!found) { + // Unmap all buffers of deleted stream + cleanupBuffersLocked(id); + } + } + } return true; } @@ -236,7 +255,9 @@ void CameraDeviceSession::postProcessConfigurationLocked_3_4( // Unmap all buffers of deleted stream // in case the configuration call succeeds and HAL // is able to release the corresponding resources too. - cleanupBuffersLocked(id); + if (!mFreeBufEarly) { + cleanupBuffersLocked(id); + } it = mStreamMap.erase(it); } else { ++it; @@ -255,6 +276,26 @@ void CameraDeviceSession::postProcessConfigurationLocked_3_4( mResultBatcher_3_4.setBatchedStreams(mVideoStreamIds); } +void CameraDeviceSession::postProcessConfigurationFailureLocked_3_4( + const StreamConfiguration& requestedConfiguration) { + if (mFreeBufEarly) { + // Re-build the buf cache entry for deleted streams + for(auto it = mStreamMap.begin(); it != mStreamMap.end(); it++) { + int id = it->first; + bool found = false; + for (const auto& stream : requestedConfiguration.streams) { + if (id == stream.v3_2.id) { + found = true; + break; + } + } + if (!found) { + mCirculatingBuffers.emplace(id, CirculatingBuffers{}); + } + } + } +} + Return CameraDeviceSession::processCaptureRequest_3_4( const hidl_vec& requests, const hidl_vec& cachesToRemove, diff --git a/camera/device/3.4/default/include/device_v3_4_impl/CameraDeviceSession.h b/camera/device/3.4/default/include/device_v3_4_impl/CameraDeviceSession.h index 5d6a112e37..fdc8a5afd2 100644 --- a/camera/device/3.4/default/include/device_v3_4_impl/CameraDeviceSession.h +++ b/camera/device/3.4/default/include/device_v3_4_impl/CameraDeviceSession.h @@ -84,6 +84,8 @@ protected: camera3_stream_configuration_t *stream_list /*out*/, hidl_vec *streams /*out*/); void postProcessConfigurationLocked_3_4(const StreamConfiguration& requestedConfiguration); + void postProcessConfigurationFailureLocked_3_4( + const StreamConfiguration& requestedConfiguration); Return processCaptureRequest_3_4( const hidl_vec& requests,