Merge "QCamera2: HAL3: Remove unnecessary cache ops for raw stream" into oc-dr1-dev
am: 617ff4b614

Change-Id: Ib01518ec06f319b22bf3e7007e230a49200d4fc0
diff --git a/msm8998/QCamera2/Android.mk b/msm8998/QCamera2/Android.mk
index 37eeb23..8bfa474 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 d4af546..a6b8d88 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -132,9 +132,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
 
@@ -150,13 +147,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 [] = {
@@ -507,6 +505,7 @@
       mInstantAECSettledFrameNumber(0),
       mAecSkipDisplayFrameBound(0),
       mInstantAecFrameIdxCount(0),
+      mLastRequestedLensShadingMapMode(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF),
       mCurrFeatureState(0),
       mLdafCalibExist(false),
       mLastCustIntentFrmNum(-1),
@@ -886,7 +885,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);
@@ -905,7 +904,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) {
@@ -1101,7 +1100,8 @@
          mCameraId, rc);
 
     {
-        Mutex::Autolock l(gHdrPlusClientLock);
+        std::unique_lock<std::mutex> l(gHdrPlusClientLock);
+        finishHdrPlusClientOpeningLocked(l);
         if (gHdrPlusClient != nullptr) {
             // Disable HDR+ mode.
             disableHdrPlusModeLocked();
@@ -1832,6 +1832,8 @@
 
     pthread_mutex_lock(&mMutex);
 
+    mPictureChannel = NULL;
+
     // Check state
     switch (mState) {
         case INITIALIZED:
@@ -3043,7 +3045,8 @@
 
     // Disable HRD+ if it's enabled;
     {
-        Mutex::Autolock l(gHdrPlusClientLock);
+        std::unique_lock<std::mutex> l(gHdrPlusClientLock);
+        finishHdrPlusClientOpeningLocked(l);
         disableHdrPlusModeLocked();
     }
 
@@ -3549,7 +3552,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,
@@ -3711,7 +3714,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);
@@ -4186,7 +4189,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();
@@ -4218,7 +4221,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,
@@ -4227,6 +4230,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);
 }
 
@@ -5360,11 +5374,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) {
@@ -5397,6 +5420,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.
@@ -5457,6 +5490,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));
@@ -5993,7 +6027,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.
@@ -6027,18 +6061,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;
@@ -10175,9 +10212,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,
@@ -10930,7 +10965,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);
@@ -14667,7 +14702,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;
@@ -14675,7 +14710,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);
@@ -14752,6 +14787,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.
@@ -14767,10 +14809,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;
@@ -14861,7 +14913,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;
@@ -14869,6 +14921,7 @@
 
     gHdrPlusClient = std::move(client);
     gHdrPlusClientOpening = false;
+    gHdrPlusClientOpenCond.notify_one();
 
     // Set static metadata.
     status_t res = gHdrPlusClient->setStaticMetadata(*gStaticMetadata[mCameraId]);
@@ -14890,8 +14943,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()
@@ -14906,6 +14960,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)
 {
@@ -14985,17 +15047,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 9ef806f..9e59bba 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.
@@ -599,6 +599,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;
@@ -687,6 +688,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 */
@@ -800,6 +803,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();
 
@@ -813,6 +819,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);
 
@@ -823,6 +831,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;
 
     nsecs_t calculateMaxExpectedDuration(const camera_metadata_t *request);
     void getExpectedFrameDuration(const camera_metadata_t *request, nsecs_t *frameDuration);
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