QCamera3: Enable lens shading map mode for HDR+
Enable lens shading map mode in HDR+. If framework doesn't
enable it, remove lens shading map from the result metadata
before sending back to framework.
Test: Camera CTS
Bug: 36693254
Change-Id: I0e714212d1736ba78521f4ef668f05b924a6287a
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index 4029354..2d9a52a 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -505,6 +505,7 @@
mInstantAECSettledFrameNumber(0),
mAecSkipDisplayFrameBound(0),
mInstantAecFrameIdxCount(0),
+ mLastRequestedLensShadingMapMode(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF),
mCurrFeatureState(0),
mLdafCalibExist(false),
mLastCustIntentFrmNum(-1),
@@ -4171,7 +4172,7 @@
}
void QCamera3HardwareInterface::handlePendingResultMetadataWithLock(uint32_t frameNumber,
- const camera_metadata_t *resultMetadata)
+ camera_metadata_t *resultMetadata)
{
// Find the pending request for this result metadata.
auto requestIter = mPendingRequestsList.begin();
@@ -4212,6 +4213,17 @@
}
}
+ // Remove len shading map if it's not requested.
+ if (requestIter->requestedLensShadingMapMode == ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF) {
+ CameraMetadata metadata;
+ metadata.acquire(resultMetadata);
+ metadata.erase(ANDROID_STATISTICS_LENS_SHADING_MAP);
+ metadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE,
+ &requestIter->requestedLensShadingMapMode, 1);
+
+ requestIter->resultMetadata = metadata.release();
+ }
+
dispatchResultMetadataWithLock(frameNumber, liveRequest);
}
@@ -5345,6 +5357,15 @@
meta.find(ANDROID_COLOR_CORRECTION_ABERRATION_MODE).data.u8[0];
}
+ uint8_t requestedLensShadingMapMode;
+ // Get the shading map mode.
+ if (meta.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) {
+ mLastRequestedLensShadingMapMode = requestedLensShadingMapMode =
+ meta.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0];
+ } else {
+ requestedLensShadingMapMode = mLastRequestedLensShadingMapMode;
+ }
+
bool hdrPlusRequest = false;
HdrPlusPendingRequest pendingHdrPlusRequest = {};
@@ -5382,6 +5403,16 @@
pthread_mutex_unlock(&mMutex);
return rc;
}
+
+ {
+ // If HDR+ mode is enabled, override lens shading mode to ON so lens shading map
+ // will be reported in result metadata.
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
+ if (mHdrPlusModeEnabled) {
+ ADD_SET_PARAM_ENTRY_TO_BATCH(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE,
+ ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_ON);
+ }
+ }
}
/* For batchMode HFR, setFrameParameters is not called for every
* request. But only frame number of the latest request is parsed.
@@ -5442,6 +5473,7 @@
pendingRequest.request_id = request_id;
pendingRequest.blob_request = blob_request;
pendingRequest.timestamp = 0;
+ pendingRequest.requestedLensShadingMapMode = requestedLensShadingMapMode;
if (request->input_buffer) {
pendingRequest.input_buffer =
(camera3_stream_buffer_t*)malloc(sizeof(camera3_stream_buffer_t));