summaryrefslogtreecommitdiff
path: root/camera/device/3.4/default/CameraDeviceSession.cpp
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2019-07-02 07:41:24 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-07-02 07:41:24 +0000
commit26f1b51bfbd5e8d2d2e55247a8bae49ccd52872d (patch)
tree0d99225e22e2956cf075fcf48527d0e17e872c0f /camera/device/3.4/default/CameraDeviceSession.cpp
parent3adfddb29552dbf79387c23e10a9960d1f9c2f79 (diff)
parent8b76f6692c718c21272d3585541b72fed7ac93f0 (diff)
Merge "DO NOT MERGE - Merge qt-dev-plus-aosp-without-vendor (5699924) into stage-aosp-master" into stage-aosp-master
Diffstat (limited to 'camera/device/3.4/default/CameraDeviceSession.cpp')
-rw-r--r--camera/device/3.4/default/CameraDeviceSession.cpp89
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];
}