summaryrefslogtreecommitdiff
path: root/camera/device/3.2/default/CameraDeviceSession.cpp
diff options
context:
space:
mode:
authorEmilian Peev <epeev@google.com>2017-04-10 12:02:17 +0100
committerEmilian Peev <epeev@google.com>2017-04-25 20:04:25 +0100
commita13ac99f3472e015c24b5a2999a9b7fda1f56a45 (patch)
tree8aa603c85d2db57d33c6f9f4a513cf208f97a4c7 /camera/device/3.2/default/CameraDeviceSession.cpp
parentcf5813702a0c282889cc99ac40a34754f13bcb39 (diff)
Camera: Insert default RAW boost if needed
RAW boost key inside result and request metadata could be absent depending on CameraHal. In case RAW boost range is supported, the RAW boost value must always be present. Bug: 34392075 Test: runtest -x cts/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java Change-Id: I4c27b3fe5228ff604e3f2796abc670be5c17da67
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: