summaryrefslogtreecommitdiff
path: root/camera/device/3.2/default/CameraDeviceSession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'camera/device/3.2/default/CameraDeviceSession.cpp')
-rw-r--r--camera/device/3.2/default/CameraDeviceSession.cpp95
1 files changed, 89 insertions, 6 deletions
diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp
index e9f78ff399..b7187232f8 100644
--- a/camera/device/3.2/default/CameraDeviceSession.cpp
+++ b/camera/device/3.2/default/CameraDeviceSession.cpp
@@ -46,6 +46,7 @@ CameraDeviceSession::CameraDeviceSession(
mDevice(device),
mDeviceVersion(device->common.version),
mIsAELockAvailable(false),
+ mDerivePostRawSensKey(false),
mNumPartialResults(1),
mResultBatcher(callback) {
@@ -64,6 +65,13 @@ CameraDeviceSession::CameraDeviceSession(
ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE);
}
+ // Determine whether we need to derive sensitivity boost values for older devices.
+ // If post-RAW sensitivity boost range is listed, so should post-raw sensitivity control
+ // be listed (as the default value 100)
+ if (mDeviceInfo.exists(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE)) {
+ mDerivePostRawSensKey = true;
+ }
+
mInitFail = initialize();
}
@@ -692,7 +700,22 @@ Return<void> CameraDeviceSession::constructDefaultRequestSettings(
__FUNCTION__, type);
status = Status::ILLEGAL_ARGUMENT;
} else {
- convertToHidl(rawRequest, &outMetadata);
+ mOverridenRequest.clear();
+ mOverridenRequest.append(rawRequest);
+ // Derive some new keys for backward compatibility
+ if (mDerivePostRawSensKey && !mOverridenRequest.exists(
+ ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST)) {
+ int32_t defaultBoost[1] = {100};
+ mOverridenRequest.update(
+ ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST,
+ defaultBoost, 1);
+ const camera_metadata_t *metaBuffer =
+ mOverridenRequest.getAndLock();
+ convertToHidl(metaBuffer, &outMetadata);
+ mOverridenRequest.unlock(metaBuffer);
+ } else {
+ convertToHidl(rawRequest, &outMetadata);
+ }
}
}
_hidl_cb(status, outMetadata);
@@ -752,6 +775,14 @@ Return<void> CameraDeviceSession::configureStreams(
return Void();
}
+ if (!mInflightRawBoostPresent.empty()) {
+ ALOGE("%s: trying to configureStreams while there are still %zu inflight"
+ " boost overrides!", __FUNCTION__,
+ mInflightRawBoostPresent.size());
+ _hidl_cb(Status::INTERNAL_ERROR, outStreams);
+ return Void();
+ }
+
if (status != Status::OK) {
_hidl_cb(status, outStreams);
return Void();
@@ -1051,6 +1082,11 @@ Return<void> CameraDeviceSession::close() {
"trigger overrides!", __FUNCTION__,
mInflightAETriggerOverrides.size());
}
+ if (!mInflightRawBoostPresent.empty()) {
+ ALOGE("%s: trying to close while there are still %zu inflight "
+ " RAW boost overrides!", __FUNCTION__,
+ mInflightRawBoostPresent.size());
+ }
}
@@ -1116,20 +1152,59 @@ void CameraDeviceSession::sProcessCaptureResult(
result.partialResult = hal_result->partial_result;
convertToHidl(hal_result->result, &result.result);
if (nullptr != hal_result->result) {
+ bool resultOverriden = false;
Mutex::Autolock _l(d->mInflightLock);
+
+ // Derive some new keys for backward compatibility
+ if (d->mDerivePostRawSensKey) {
+ camera_metadata_ro_entry entry;
+ if (find_camera_metadata_ro_entry(hal_result->result,
+ ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, &entry) == 0) {
+ d->mInflightRawBoostPresent[frameNumber] = true;
+ } else {
+ auto entry = d->mInflightRawBoostPresent.find(frameNumber);
+ if (d->mInflightRawBoostPresent.end() == entry) {
+ d->mInflightRawBoostPresent[frameNumber] = false;
+ }
+ }
+
+ if ((hal_result->partial_result == d->mNumPartialResults)) {
+ if (!d->mInflightRawBoostPresent[frameNumber]) {
+ if (!resultOverriden) {
+ d->mOverridenResult.clear();
+ d->mOverridenResult.append(hal_result->result);
+ resultOverriden = true;
+ }
+ int32_t defaultBoost[1] = {100};
+ d->mOverridenResult.update(
+ ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST,
+ defaultBoost, 1);
+ }
+
+ d->mInflightRawBoostPresent.erase(frameNumber);
+ }
+ }
+
auto entry = d->mInflightAETriggerOverrides.find(frameNumber);
if (d->mInflightAETriggerOverrides.end() != entry) {
- d->mOverridenResult.clear();
- d->mOverridenResult.append(hal_result->result);
+ if (!resultOverriden) {
+ d->mOverridenResult.clear();
+ d->mOverridenResult.append(hal_result->result);
+ resultOverriden = true;
+ }
d->overrideResultForPrecaptureCancelLocked(entry->second,
&d->mOverridenResult);
- const camera_metadata_t *metaBuffer = d->mOverridenResult.getAndLock();
- convertToHidl(metaBuffer, &result.result);
- d->mOverridenResult.unlock(metaBuffer);
if (hal_result->partial_result == d->mNumPartialResults) {
d->mInflightAETriggerOverrides.erase(frameNumber);
}
}
+
+ if (resultOverriden) {
+ const camera_metadata_t *metaBuffer =
+ d->mOverridenResult.getAndLock();
+ convertToHidl(metaBuffer, &result.result);
+ d->mOverridenResult.unlock(metaBuffer);
+ }
}
if (hasInputBuf) {
result.inputBuffer.streamId =
@@ -1219,6 +1294,14 @@ void CameraDeviceSession::sNotify(
d->mInflightAETriggerOverrides.erase(
hidlMsg.msg.error.frameNumber);
}
+
+ auto boostEntry = d->mInflightRawBoostPresent.find(
+ hidlMsg.msg.error.frameNumber);
+ if (d->mInflightRawBoostPresent.end() != boostEntry) {
+ d->mInflightRawBoostPresent.erase(
+ hidlMsg.msg.error.frameNumber);
+ }
+
}
break;
case ErrorCode::ERROR_BUFFER: