diff options
Diffstat (limited to 'camera/device/3.4/default/CameraDeviceSession.cpp')
| -rw-r--r-- | camera/device/3.4/default/CameraDeviceSession.cpp | 89 |
1 files changed, 49 insertions, 40 deletions
diff --git a/camera/device/3.4/default/CameraDeviceSession.cpp b/camera/device/3.4/default/CameraDeviceSession.cpp index f2e031c674..b4ebe22701 100644 --- a/camera/device/3.4/default/CameraDeviceSession.cpp +++ b/camera/device/3.4/default/CameraDeviceSession.cpp @@ -22,6 +22,7 @@ #include <hardware/gralloc.h> #include <hardware/gralloc1.h> #include "CameraDeviceSession.h" +#include "CameraModule.h" namespace android { namespace hardware { @@ -30,6 +31,8 @@ namespace device { namespace V3_4 { namespace implementation { +using ::android::hardware::camera::common::V1_0::helper::CameraModule; + CameraDeviceSession::CameraDeviceSession( camera3_device_t* device, const camera_metadata_t* deviceInfo, @@ -54,31 +57,9 @@ CameraDeviceSession::CameraDeviceSession( mResultBatcher_3_4.setNumPartialResults(mNumPartialResults); - camera_metadata_entry_t capabilities = - mDeviceInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); - bool isLogicalMultiCamera = false; - for (size_t i = 0; i < capabilities.count; i++) { - if (capabilities.data.u8[i] == - ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) { - isLogicalMultiCamera = true; - break; - } - } - if (isLogicalMultiCamera) { - camera_metadata_entry entry = - mDeviceInfo.find(ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS); - const uint8_t* ids = entry.data.u8; - size_t start = 0; - for (size_t i = 0; i < entry.count; ++i) { - if (ids[i] == '\0') { - if (start != i) { - const char* physicalId = reinterpret_cast<const char*>(ids+start); - mPhysicalCameraIds.emplace(physicalId); - } - start = i + 1; - } - } - } + // Parse and store current logical camera's physical ids. + (void)CameraModule::isLogicalMultiCamera(mDeviceInfo, &mPhysicalCameraIds); + } CameraDeviceSession::~CameraDeviceSession() { @@ -87,6 +68,14 @@ CameraDeviceSession::~CameraDeviceSession() { Return<void> CameraDeviceSession::configureStreams_3_4( const StreamConfiguration& requestedConfiguration, ICameraDeviceSession::configureStreams_3_4_cb _hidl_cb) { + configureStreams_3_4_Impl(requestedConfiguration, _hidl_cb); + return Void(); +} + +void CameraDeviceSession::configureStreams_3_4_Impl( + const StreamConfiguration& requestedConfiguration, + ICameraDeviceSession::configureStreams_3_4_cb _hidl_cb, + uint32_t streamConfigCounter, bool useOverriddenFields) { Status status = initStatus(); HalStreamConfiguration outStreams; @@ -97,7 +86,7 @@ Return<void> CameraDeviceSession::configureStreams_3_4( ALOGE("%s: trying to configureStreams with physical camera id with V3.2 callback", __FUNCTION__); _hidl_cb(Status::INTERNAL_ERROR, outStreams); - return Void(); + return; } } } @@ -109,7 +98,7 @@ Return<void> CameraDeviceSession::configureStreams_3_4( ALOGE("%s: trying to configureStreams while there are still %zu inflight buffers!", __FUNCTION__, mInflightBuffers.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); - return Void(); + return; } if (!mInflightAETriggerOverrides.empty()) { @@ -117,7 +106,7 @@ Return<void> CameraDeviceSession::configureStreams_3_4( " trigger overrides!", __FUNCTION__, mInflightAETriggerOverrides.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); - return Void(); + return; } if (!mInflightRawBoostPresent.empty()) { @@ -125,12 +114,12 @@ Return<void> CameraDeviceSession::configureStreams_3_4( " boost overrides!", __FUNCTION__, mInflightRawBoostPresent.size()); _hidl_cb(Status::INTERNAL_ERROR, outStreams); - return Void(); + return; } if (status != Status::OK) { _hidl_cb(status, outStreams); - return Void(); + return; } const camera_metadata_t *paramBuffer = nullptr; @@ -139,11 +128,15 @@ Return<void> CameraDeviceSession::configureStreams_3_4( } camera3_stream_configuration_t stream_list{}; + // Block reading mStreamConfigCounter until configureStream returns + Mutex::Autolock _sccl(mStreamConfigCounterLock); + mStreamConfigCounter = streamConfigCounter; hidl_vec<camera3_stream_t*> streams; stream_list.session_parameters = paramBuffer; - if (!preProcessConfigurationLocked_3_4(requestedConfiguration, &stream_list, &streams)) { + if (!preProcessConfigurationLocked_3_4(requestedConfiguration, + useOverriddenFields, &stream_list, &streams)) { _hidl_cb(Status::INTERNAL_ERROR, outStreams); - return Void(); + return; } ATRACE_BEGIN("camera3->configure_streams"); @@ -168,11 +161,11 @@ Return<void> CameraDeviceSession::configureStreams_3_4( } _hidl_cb(status, outStreams); - return Void(); + return; } bool CameraDeviceSession::preProcessConfigurationLocked_3_4( - const StreamConfiguration& requestedConfiguration, + const StreamConfiguration& requestedConfiguration, bool useOverriddenFields, camera3_stream_configuration_t *stream_list /*out*/, hidl_vec<camera3_stream_t*> *streams /*out*/) { @@ -195,25 +188,41 @@ bool CameraDeviceSession::preProcessConfigurationLocked_3_4( mPhysicalCameraIdMap[id] = requestedConfiguration.streams[i].physicalCameraId; mStreamMap[id].data_space = mapToLegacyDataspace( mStreamMap[id].data_space); - mStreamMap[id].physical_camera_id = mPhysicalCameraIdMap[id].c_str(); mCirculatingBuffers.emplace(stream.mId, CirculatingBuffers{}); } else { - // width/height/format must not change, but usage/rotation might need to change + // width/height/format must not change, but usage/rotation might need to change. + // format and data_space may change. if (mStreamMap[id].stream_type != (int) requestedConfiguration.streams[i].v3_2.streamType || mStreamMap[id].width != requestedConfiguration.streams[i].v3_2.width || mStreamMap[id].height != requestedConfiguration.streams[i].v3_2.height || - mStreamMap[id].format != (int) requestedConfiguration.streams[i].v3_2.format || - mStreamMap[id].data_space != - mapToLegacyDataspace( static_cast<android_dataspace_t> ( - requestedConfiguration.streams[i].v3_2.dataSpace)) || mPhysicalCameraIdMap[id] != requestedConfiguration.streams[i].physicalCameraId) { ALOGE("%s: stream %d configuration changed!", __FUNCTION__, id); return false; } + if (useOverriddenFields) { + android_dataspace_t requestedDataSpace = + mapToLegacyDataspace(static_cast<android_dataspace_t>( + requestedConfiguration.streams[i].v3_2.dataSpace)); + if (mStreamMap[id].format != (int) requestedConfiguration.streams[i].v3_2.format || + mStreamMap[id].data_space != requestedDataSpace) { + ALOGE("%s: stream %d configuration changed!", __FUNCTION__, id); + return false; + } + } else { + mStreamMap[id].format = + (int) requestedConfiguration.streams[i].v3_2.format; + mStreamMap[id].data_space = (android_dataspace_t) + requestedConfiguration.streams[i].v3_2.dataSpace; + } mStreamMap[id].rotation = (int) requestedConfiguration.streams[i].v3_2.rotation; mStreamMap[id].usage = (uint32_t) requestedConfiguration.streams[i].v3_2.usage; } + // It is possible for the entry in 'mStreamMap' to get initialized by an older + // HIDL API. Make sure that the physical id is always initialized when using + // a more recent API call. + mStreamMap[id].physical_camera_id = mPhysicalCameraIdMap[id].c_str(); + (*streams)[i] = &mStreamMap[id]; } |
