Merge "QCamera2: HAL3: Synchronize access to offline buffers" into oc-dr1-dev
am: d7db181d69
Change-Id: Ie4f5b90242b7aeffad935ea7a23fb6a11db695ac
diff --git a/msm8998/QCamera2/Android.mk b/msm8998/QCamera2/Android.mk
index 0f70e6a..65645f7 100755
--- a/msm8998/QCamera2/Android.mk
+++ b/msm8998/QCamera2/Android.mk
@@ -143,6 +143,7 @@
ifeq ($(TARGET_TS_MAKEUP),true)
LOCAL_SHARED_LIBRARIES += libts_face_beautify_hal libts_detected_face_hal
endif
+LOCAL_HEADER_LIBRARIES := libhardware_headers media_plugin_headers
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_MODULE := camera.$(TARGET_BOARD_PLATFORM)
diff --git a/msm8998/QCamera2/HAL/test/qcamera_test.cpp b/msm8998/QCamera2/HAL/test/qcamera_test.cpp
index 932724a..90d4969 100644
--- a/msm8998/QCamera2/HAL/test/qcamera_test.cpp
+++ b/msm8998/QCamera2/HAL/test/qcamera_test.cpp
@@ -369,12 +369,6 @@
}
break;
- case kIndex_8_SkColorType:
- {
- mfmtMultiplier = 4;
- }
- break;
-
case kAlpha_8_SkColorType:
{
mfmtMultiplier = 4;
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index cbc0aba..2fd04fc 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -133,9 +133,6 @@
// Max preferred zoom
#define MAX_PREFERRED_ZOOM_RATIO 7.0
-// TODO: Enable HDR+ for front camera after it's supported. b/37100623.
-#define ENABLE_HDRPLUS_FOR_FRONT_CAMERA 0
-
// Whether to check for the GPU stride padding, or use the default
//#define CHECK_GPU_PIXEL_ALIGNMENT
@@ -151,13 +148,14 @@
bool EaselManagerClientOpened = false; // If gEaselManagerClient is opened.
std::unique_ptr<HdrPlusClient> gHdrPlusClient = nullptr;
bool gHdrPlusClientOpening = false; // If HDR+ client is being opened.
+std::condition_variable gHdrPlusClientOpenCond; // Used to synchronize HDR+ client opening.
bool gEaselProfilingEnabled = false; // If Easel profiling is enabled.
bool gExposeEnableZslKey = false; // If HAL makes android.control.enableZsl available.
// If Easel is in bypass only mode. If true, Easel HDR+ won't be enabled.
bool gEaselBypassOnly;
-Mutex gHdrPlusClientLock; // Protect above Easel related variables.
+std::mutex gHdrPlusClientLock; // Protect above Easel related variables.
const QCamera3HardwareInterface::QCameraPropMap QCamera3HardwareInterface::CDS_MAP [] = {
@@ -506,6 +504,7 @@
mInstantAECSettledFrameNumber(0),
mAecSkipDisplayFrameBound(0),
mInstantAecFrameIdxCount(0),
+ mLastRequestedLensShadingMapMode(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF),
mCurrFeatureState(0),
mLdafCalibExist(false),
mLastCustIntentFrmNum(-1),
@@ -875,7 +874,7 @@
}
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (gEaselManagerClient != nullptr && gEaselManagerClient->isEaselPresentOnDevice()) {
logEaselEvent("EASEL_STARTUP_LATENCY", "Resume");
rc = gEaselManagerClient->resume(this);
@@ -894,7 +893,7 @@
// Suspend Easel because opening camera failed.
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (gEaselManagerClient != nullptr && gEaselManagerClient->isEaselPresentOnDevice()) {
status_t suspendErr = gEaselManagerClient->suspend();
if (suspendErr != 0) {
@@ -1090,7 +1089,8 @@
mCameraId, rc);
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
+ finishHdrPlusClientOpeningLocked(l);
if (gHdrPlusClient != nullptr) {
// Disable HDR+ mode.
disableHdrPlusModeLocked();
@@ -1821,6 +1821,8 @@
pthread_mutex_lock(&mMutex);
+ mPictureChannel = NULL;
+
// Check state
switch (mState) {
case INITIALIZED:
@@ -3030,7 +3032,8 @@
// Disable HRD+ if it's enabled;
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
+ finishHdrPlusClientOpeningLocked(l);
disableHdrPlusModeLocked();
}
@@ -3531,7 +3534,7 @@
result.partial_result = requestIter->partial_result_cnt;
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (gHdrPlusClient != nullptr && mHdrPlusModeEnabled) {
// Notify HDR+ client about the partial metadata.
gHdrPlusClient->notifyFrameMetadata(result.frame_number, *result.result,
@@ -3689,7 +3692,7 @@
LOGD("Iterator Frame = %d urgent frame = %d",
i->frame_number, urgent_frame_number);
- if ((!i->input_buffer) && (i->frame_number < urgent_frame_number) &&
+ if ((!i->input_buffer) && (!i->hdrplus) && (i->frame_number < urgent_frame_number) &&
(i->partial_result_cnt == 0)) {
LOGE("Error: HAL missed urgent metadata for frame number %d",
i->frame_number);
@@ -4162,7 +4165,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();
@@ -4194,7 +4197,7 @@
mPendingLiveRequest--;
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
// For a live request, send the metadata to HDR+ client.
if (gHdrPlusClient != nullptr && mHdrPlusModeEnabled) {
gHdrPlusClient->notifyFrameMetadata(frameNumber, *resultMetadata,
@@ -4203,6 +4206,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);
}
@@ -5336,11 +5350,20 @@
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 = {};
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
// If this request has a still capture intent, try to submit an HDR+ request.
if (gHdrPlusClient != nullptr && mHdrPlusModeEnabled &&
mCaptureIntent == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) {
@@ -5373,6 +5396,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.
@@ -5433,6 +5466,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));
@@ -5967,7 +6001,7 @@
{
// Configure Easel for stream on.
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
// Now that sensor mode should have been selected, get the selected sensor mode
// info.
@@ -6001,18 +6035,21 @@
}
// Enable HDR+ mode for the first PREVIEW_INTENT request.
- if (ENABLE_HDRPLUS_FOR_FRONT_CAMERA || mCameraId == 0) {
- Mutex::Autolock l(gHdrPlusClientLock);
- if (gEaselManagerClient != nullptr && gEaselManagerClient->isEaselPresentOnDevice() &&
+ {
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
+ if (gEaselManagerClient != nullptr && gEaselManagerClient->isEaselPresentOnDevice() &&
!gEaselBypassOnly && !mFirstPreviewIntentSeen &&
meta.exists(ANDROID_CONTROL_CAPTURE_INTENT) &&
meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0] ==
ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW) {
- rc = enableHdrPlusModeLocked();
- if (rc != OK) {
- LOGE("%s: Failed to open HDR+ asynchronously", __FUNCTION__);
- pthread_mutex_unlock(&mMutex);
- return rc;
+
+ if (isSessionHdrPlusModeCompatible()) {
+ rc = enableHdrPlusModeLocked();
+ if (rc != OK) {
+ LOGE("%s: Failed to open HDR+ asynchronously", __FUNCTION__);
+ pthread_mutex_unlock(&mMutex);
+ return rc;
+ }
}
mFirstPreviewIntentSeen = true;
@@ -10123,9 +10160,7 @@
}
if (gExposeEnableZslKey) {
- if (ENABLE_HDRPLUS_FOR_FRONT_CAMERA || cameraId == 0) {
- available_request_keys.add(ANDROID_CONTROL_ENABLE_ZSL);
- }
+ available_request_keys.add(ANDROID_CONTROL_ENABLE_ZSL);
}
staticInfo.update(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,
@@ -10873,7 +10908,7 @@
pthread_mutex_lock(&gCamLock);
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
rc = initHdrPlusClientLocked();
if (rc != OK) {
ALOGE("%s: initHdrPlusClientLocked failed: %s (%d)", __FUNCTION__, strerror(-rc), rc);
@@ -14531,7 +14566,7 @@
pbcamera::StreamBuffer buffer;
buffer.streamId = kPbYuvOutputStreamId;
buffer.dmaBufFd = yuvBuffer->fd;
- buffer.data = yuvBuffer->buffer;
+ buffer.data = yuvBuffer->fd == -1 ? yuvBuffer->buffer : nullptr;
buffer.dataSize = yuvBuffer->frame_len;
pbcamera::CaptureRequest pbRequest;
@@ -14539,7 +14574,7 @@
pbRequest.outputBuffers.push_back(buffer);
// Submit an HDR+ capture request to HDR+ service.
- res = gHdrPlusClient->submitCaptureRequest(&pbRequest);
+ res = gHdrPlusClient->submitCaptureRequest(&pbRequest, metadata);
if (res != OK) {
ALOGE("%s: %d: Submitting a capture request failed: %s (%d)", __FUNCTION__, __LINE__,
strerror(-res), res);
@@ -14616,6 +14651,13 @@
return OK;
}
+void QCamera3HardwareInterface::finishHdrPlusClientOpeningLocked(std::unique_lock<std::mutex> &lock)
+{
+ if (gHdrPlusClientOpening) {
+ gHdrPlusClientOpenCond.wait(lock, [&] { return !gHdrPlusClientOpening; });
+ }
+}
+
void QCamera3HardwareInterface::disableHdrPlusModeLocked()
{
// Disable HDR+ mode.
@@ -14631,10 +14673,20 @@
}
mHdrPlusModeEnabled = false;
- gHdrPlusClientOpening = false;
ALOGD("%s: HDR+ mode disabled", __FUNCTION__);
}
+bool QCamera3HardwareInterface::isSessionHdrPlusModeCompatible()
+{
+ // Check if mPictureChannel is valid.
+ // TODO: Support YUV (b/36693254) and RAW (b/36690506)
+ if (mPictureChannel == nullptr) {
+ return false;
+ }
+
+ return true;
+}
+
status_t QCamera3HardwareInterface::configureHdrPlusStreamsLocked()
{
pbcamera::InputConfiguration inputConfig;
@@ -14725,7 +14777,7 @@
logEaselEvent("EASEL_STARTUP_LATENCY", "HDR+ client opened.");
ALOGI("%s: HDR+ client opened.", __FUNCTION__);
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (!gHdrPlusClientOpening) {
ALOGW("%s: HDR+ is disabled while HDR+ client is being opened.", __FUNCTION__);
return;
@@ -14733,6 +14785,7 @@
gHdrPlusClient = std::move(client);
gHdrPlusClientOpening = false;
+ gHdrPlusClientOpenCond.notify_one();
// Set static metadata.
status_t res = gHdrPlusClient->setStaticMetadata(*gStaticMetadata[mCameraId]);
@@ -14754,8 +14807,9 @@
void QCamera3HardwareInterface::onOpenFailed(status_t err)
{
ALOGE("%s: Opening HDR+ client failed: %s (%d)", __FUNCTION__, strerror(-err), err);
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
gHdrPlusClientOpening = false;
+ gHdrPlusClientOpenCond.notify_one();
}
void QCamera3HardwareInterface::onFatalError()
@@ -14770,6 +14824,14 @@
handleCameraDeviceError(/*stopChannelImmediately*/true);
}
+void QCamera3HardwareInterface::onShutter(uint32_t requestId, int64_t apSensorTimestampNs)
+{
+ ALOGV("%s: %d: Received a shutter for HDR+ request %d timestamp %" PRId64, __FUNCTION__,
+ __LINE__, requestId, apSensorTimestampNs);
+
+ mShutterDispatcher.markShutterReady(requestId, apSensorTimestampNs);
+}
+
void QCamera3HardwareInterface::onCaptureResult(pbcamera::CaptureResult *result,
const camera_metadata_t &resultMetadata)
{
@@ -14849,17 +14911,6 @@
strerror(-res), res);
}
- // Find the timestamp
- camera_metadata_ro_entry_t entry;
- res = find_camera_metadata_ro_entry(updatedResultMetadata,
- ANDROID_SENSOR_TIMESTAMP, &entry);
- if (res != OK) {
- ALOGE("%s: Cannot find sensor timestamp for frame number %d: %s (%d)",
- __FUNCTION__, result->requestId, strerror(-res), res);
- } else {
- mShutterDispatcher.markShutterReady(result->requestId, entry.data.i64[0]);
- }
-
// Send HDR+ metadata to framework.
{
pthread_mutex_lock(&mMutex);
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.h b/msm8998/QCamera2/HAL3/QCamera3HWI.h
index ecc36ce..108b8c0 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.h
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.h
@@ -430,7 +430,7 @@
// Handle pending results when a new result metadata of a frame is received.
// metadata callbacks are invoked in the order of frame number.
void handlePendingResultMetadataWithLock(uint32_t frameNumber,
- const camera_metadata_t *resultMetadata);
+ camera_metadata_t *resultMetadata);
// Going through pending request list and send out result metadata for requests
// that are ready.
// frameNumber is the lastest frame whose result metadata is ready.
@@ -597,6 +597,7 @@
bool enableZsl; // If ZSL is enabled.
bool hdrplus; // If this is an HDR+ request.
+ uint8_t requestedLensShadingMapMode; // Lens shading map mode for this request.
} PendingRequestInfo;
typedef struct {
uint32_t frame_number;
@@ -682,6 +683,8 @@
uint8_t mInstantAecFrameIdxCount;
/* sensor output size with current stream configuration */
QCamera3CropRegionMapper mCropRegionMapper;
+ // Last lens shading map mode framework requsted.
+ uint8_t mLastRequestedLensShadingMapMode;
cam_feature_mask_t mCurrFeatureState;
/* Ldaf calibration data */
@@ -795,6 +798,9 @@
// Disable HDR+ mode. Easel will stop capturing ZSL buffers.
void disableHdrPlusModeLocked();
+ // Return if current session with configured streams is compatible with HDR+ mode.
+ bool isSessionHdrPlusModeCompatible();
+
// Configure streams for HDR+.
status_t configureHdrPlusStreamsLocked();
@@ -808,6 +814,8 @@
void updateHdrPlusResultMetadata(CameraMetadata &resultMetadata,
std::shared_ptr<metadata_buffer_t> settings);
+ // Wait until opening HDR+ client completes if it's being opened.
+ void finishHdrPlusClientOpeningLocked(std::unique_lock<std::mutex> &lock);
// Easel manager client callbacks.
void onEaselFatalError(std::string errMsg);
@@ -818,6 +826,7 @@
void onCaptureResult(pbcamera::CaptureResult *result,
const camera_metadata_t &resultMetadata) override;
void onFailedCaptureResult(pbcamera::CaptureResult *failedResult) override;
+ void onShutter(uint32_t requestId, int64_t apSensorTimestampNs) override;
// Map from frame number to frame. Must be protected by mHdrPlusPendingRequestsLock.
std::map<uint32_t, HdrPlusPendingRequest> mHdrPlusPendingRequests;
diff --git a/msm8998/QCamera2/stack/mm-camera-interface/Android.mk b/msm8998/QCamera2/stack/mm-camera-interface/Android.mk
index 708b94b..a7cfbd4 100644
--- a/msm8998/QCamera2/stack/mm-camera-interface/Android.mk
+++ b/msm8998/QCamera2/stack/mm-camera-interface/Android.mk
@@ -61,6 +61,7 @@
LOCAL_MODULE := libmmcamera_interface
LOCAL_SHARED_LIBRARIES := libdl libcutils liblog libutils
+LOCAL_HEADER_LIBRARIES := libhardware_headers
LOCAL_MODULE_TAGS := optional
LOCAL_VENDOR_MODULE := true
diff --git a/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera.c b/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera.c
index 03b6055..59e0ae4 100644
--- a/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera.c
+++ b/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera.c
@@ -36,6 +36,8 @@
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
#include <dlfcn.h>
#define IOCTL_H <SYSTEM_HEADER_PREFIX/ioctl.h>
#include IOCTL_H
diff --git a/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c b/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c
index 2b6e7ce..2c97a56 100644
--- a/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c
+++ b/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c
@@ -38,6 +38,7 @@
#include <linux/media.h>
#include <media/msm_cam_sensor.h>
#include <dlfcn.h>
+#include <unistd.h>
#define IOCTL_H <SYSTEM_HEADER_PREFIX/ioctl.h>
#include IOCTL_H
diff --git a/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_sock.c b/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_sock.c
index 85a5d3b..3ff18bd 100644
--- a/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_sock.c
+++ b/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_sock.c
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include <errno.h>
#include <string.h>
+#include <unistd.h>
// Camera dependencies
#include "mm_camera_dbg.h"
diff --git a/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c b/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
index a49fab1..652238b 100644
--- a/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
+++ b/msm8998/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
@@ -34,6 +34,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/prctl.h>
+#include <unistd.h>
#include <fcntl.h>
#include <poll.h>
#include <cam_semaphore.h>
diff --git a/msm8998/QCamera2/util/QCameraTrace.cpp b/msm8998/QCamera2/util/QCameraTrace.cpp
index 1aac6a0..3d5f4a3 100644
--- a/msm8998/QCamera2/util/QCameraTrace.cpp
+++ b/msm8998/QCamera2/util/QCameraTrace.cpp
@@ -29,6 +29,8 @@
// Camera dependencies
#include <stdlib.h>
+#include <pthread.h>
+
#include "QCameraTrace.h"
#define CAMSCOPE_MEMSTORE_SIZE 0x00100000 // 1MB