Merge "QCamera2: Add more traces for reprocessing" into oc-dr1-dev
diff --git a/msm8998/QCamera2/Android.mk b/msm8998/QCamera2/Android.mk
index 04552c6..eb7132e 100755
--- a/msm8998/QCamera2/Android.mk
+++ b/msm8998/QCamera2/Android.mk
@@ -129,12 +129,13 @@
 LOCAL_CFLAGS += -DUSE_CAMERA_METABUFFER_UTILS
 
 #LOCAL_STATIC_LIBRARIES := libqcamera2_util
+LOCAL_STATIC_LIBRARIES := android.hardware.camera.common@1.0-helper
 LOCAL_C_INCLUDES += \
         $(TARGET_OUT_HEADERS)/mm-core/omxcore \
         $(TARGET_OUT_HEADERS)/qcom/display
 LOCAL_C_INCLUDES += \
         $(SRC_DISPLAY_HAL_DIR)/libqservice
-LOCAL_SHARED_LIBRARIES := libcamera_client liblog libhardware libutils libcutils libdl libsync
+LOCAL_SHARED_LIBRARIES := liblog libhardware libutils libcutils libdl libsync
 LOCAL_SHARED_LIBRARIES += libmmcamera_interface libmmjpeg_interface libui libcamera_metadata
 LOCAL_SHARED_LIBRARIES += libqdMetaData libqservice libbinder
 LOCAL_SHARED_LIBRARIES += libcutils libdl libhdrplusclient libhdrplusmessenger
diff --git a/msm8998/QCamera2/HAL/QCameraParameters.h b/msm8998/QCamera2/HAL/QCameraParameters.h
index 379ecbc..6bb0ed8 100644
--- a/msm8998/QCamera2/HAL/QCameraParameters.h
+++ b/msm8998/QCamera2/HAL/QCameraParameters.h
@@ -24,7 +24,7 @@
 #include <cutils/properties.h>
 
 // System dependencies
-#include <camera/CameraParameters.h>
+#include <CameraParameters.h>
 #include <utils/Errors.h>
 
 // Camera dependencies
@@ -39,6 +39,8 @@
 #include "mm_jpeg_interface.h"
 }
 
+using ::android::hardware::camera::common::V1_0::helper::CameraParameters;
+using ::android::hardware::camera::common::V1_0::helper::Size;
 using namespace android;
 
 namespace qcamera {
diff --git a/msm8998/QCamera2/HAL3/QCamera3Channel.cpp b/msm8998/QCamera2/HAL3/QCamera3Channel.cpp
index bb11083..56da9e3 100644
--- a/msm8998/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3Channel.cpp
@@ -890,7 +890,26 @@
            if (mOutOfSequenceBuffers.empty()) {
               stream->cancelBuffer(oldestBufIndex);
            }
-           mOutOfSequenceBuffers.push_back(super_frame);
+
+           //push in order!
+           auto itr = mOutOfSequenceBuffers.begin();
+           for (; itr != mOutOfSequenceBuffers.end(); itr++) {
+               mm_camera_super_buf_t *super_buf = *itr;
+               uint32_t buf_idx = super_buf->bufs[0]->buf_idx;
+               int32_t frame_num = mMemory.getFrameNumber(buf_idx);
+               if (resultFrameNumber < frame_num) {
+                   LOGE("Out of order frame!! set buffer status error flag!");
+                   mOutOfSequenceBuffers.insert(itr, super_frame);
+                   super_buf->bufs[0]->flags |= V4L2_BUF_FLAG_ERROR;
+                   break;
+               }
+           }
+
+           if (itr == mOutOfSequenceBuffers.end()) {
+               LOGE("Add the frame to the end of mOutOfSequenceBuffers");
+               // add the buffer
+               mOutOfSequenceBuffers.push_back(super_frame);
+           }
            return;
        }
 
@@ -2175,7 +2194,7 @@
             metadata_buffer_t->depth_data.depth_data = nullptr;
             if (mDepthDataPresent) {
                 metadata_buffer_t->depth_data.depth_data =
-                        new uint8_t[MAX_DEPTH_DATA_SIZE];
+                        new uint8_t[PD_DATA_SIZE];
             }
         } else {
             LOGE("Invalid meta buffer at index: %d", i);
@@ -5432,10 +5451,6 @@
         LOGE("Invalid depth stream!");
         return BAD_VALUE;
     }
-    if (0 == data.length) {
-        LOGE("Empty depth buffer");
-        return BAD_VALUE;
-    }
 
     ssize_t length = data.length;
     int32_t index = mGrallocMem.getBufferIndex(frameNumber);
@@ -5467,7 +5482,10 @@
                 (length + headerSize), maxBlobSize);
         return BAD_VALUE;
     }
-    memcpy(dst, data.depth_data, length);
+
+    if (0 < length) {
+        memcpy(dst, data.depth_data, length);
+    }
 
     memset(&jpegHeader, 0, headerSize);
     jpegHeader.jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index f06e0c3..9003437 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -65,6 +65,7 @@
 }
 #include "cam_cond.h"
 
+using ::android::hardware::camera::common::V1_0::helper::CameraMetadata;
 using namespace android;
 
 namespace qcamera {
@@ -459,6 +460,7 @@
       mHdrPlusRawSrcChannel(NULL),
       mDummyBatchChannel(NULL),
       mDepthChannel(NULL),
+      mDepthCloudMode(CAM_PD_DATA_SKIP),
       mPerfLockMgr(),
       mChannelHandle(0),
       mFirstConfiguration(true),
@@ -2273,6 +2275,7 @@
     if (mDepthChannel) {
         mDepthChannel = NULL;
     }
+    mDepthCloudMode = CAM_PD_DATA_SKIP;
 
     mShutterDispatcher.clear();
     mOutputBufferDispatcher.clear();
@@ -5759,13 +5762,34 @@
             return -EINVAL;
         }
 
-        int32_t pdafEnable = depthRequestPresent ? 1 : 0;
+        cam_sensor_pd_data_t pdafEnable = (nullptr != mDepthChannel) ?
+                CAM_PD_DATA_SKIP : CAM_PD_DATA_DISABLED;
+        if (depthRequestPresent && mDepthChannel) {
+            if (request->settings) {
+                camera_metadata_ro_entry entry;
+                if (find_camera_metadata_ro_entry(request->settings,
+                        NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE, &entry) == 0) {
+                    if (entry.data.u8[0]) {
+                        pdafEnable = CAM_PD_DATA_ENABLED;
+                    } else {
+                        pdafEnable = CAM_PD_DATA_SKIP;
+                    }
+                    mDepthCloudMode = pdafEnable;
+                } else {
+                    pdafEnable = mDepthCloudMode;
+                }
+            } else {
+                pdafEnable = mDepthCloudMode;
+            }
+        }
+
         if (ADD_SET_PARAM_ENTRY_TO_BATCH(mParameters,
                 CAM_INTF_META_PDAF_DATA_ENABLE, pdafEnable)) {
             LOGE("%s: Failed to enable PDAF data in parameters!", __func__);
             pthread_mutex_unlock(&mMutex);
             return BAD_VALUE;
         }
+
         if (request->input_buffer == NULL) {
             /* Set the parameters to backend:
              * - For every request in NORMAL MODE
@@ -9259,6 +9283,8 @@
                 gCamCapability[cameraId]->raw_meta_dim[indexPD].width;
         int32_t depthHeight =
                 gCamCapability[cameraId]->raw_meta_dim[indexPD].height;
+        int32_t depthStride =
+                gCamCapability[cameraId]->raw_meta_dim[indexPD].width * 2;
         int32_t depthSamplesCount = (depthWidth * depthHeight * 2) / 16;
         assert(0 < depthSamplesCount);
         staticInfo.update(ANDROID_DEPTH_MAX_DEPTH_SAMPLES,
@@ -9288,6 +9314,10 @@
 
         uint8_t depthExclusive = ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE_FALSE;
         staticInfo.update(ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE, &depthExclusive, 1);
+
+        int32_t pd_dimensions [] = {depthWidth, depthHeight, depthStride};
+        staticInfo.update(NEXUS_EXPERIMENTAL_2017_PD_DATA_DIMENSIONS,
+                pd_dimensions, sizeof(pd_dimensions) / sizeof(pd_dimensions[0]));
     }
 
     int32_t scalar_formats[] = {
@@ -10035,6 +10065,7 @@
        NEXUS_EXPERIMENTAL_2017_HISTOGRAM_BINS,
        TANGO_MODE_DATA_SENSOR_FULLFOV,
        NEXUS_EXPERIMENTAL_2017_TRACKING_AF_TRIGGER,
+       NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE,
        };
 
     size_t request_keys_cnt =
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.h b/msm8998/QCamera2/HAL3/QCamera3HWI.h
index 90644b7..f38927d 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.h
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.h
@@ -31,7 +31,7 @@
 #define __QCAMERA3HARDWAREINTERFACE_H__
 
 // System dependencies
-#include <camera/CameraMetadata.h>
+#include <CameraMetadata.h>
 #include <pthread.h>
 #include <utils/KeyedVector.h>
 #include <utils/List.h>
@@ -54,6 +54,7 @@
 #include "mm_jpeg_interface.h"
 }
 
+using ::android::hardware::camera::common::V1_0::helper::CameraMetadata;
 using namespace android;
 
 namespace qcamera {
@@ -519,6 +520,7 @@
     QCamera3HdrPlusRawSrcChannel *mHdrPlusRawSrcChannel;
     QCamera3RegularChannel *mDummyBatchChannel;
     QCamera3DepthChannel *mDepthChannel;
+    cam_sensor_pd_data_t mDepthCloudMode; //Cache last configured mode
     QCameraPerfLockMgr mPerfLockMgr;
 
     uint32_t mChannelHandle;
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
index 08bebd0..07915ed 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
@@ -353,6 +353,8 @@
     { "stats.ois_timestamps_boottime", TYPE_INT64 },
     { "stats.ois_shift_x", TYPE_INT32 },
     { "stats.ois_shift_y", TYPE_INT32 },
+    { "sensor.pd_data_dimensions", TYPE_INT32},
+    { "sensor.pd_data_enable", TYPE_BYTE},
 };
 
 vendor_tag_info_t tango_mode_data[TANGO_MODE_DATA_END -
@@ -582,6 +584,8 @@
     (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_TIMESTAMPS_BOOTTIME,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_X,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_Y,
+    (uint32_t)NEXUS_EXPERIMENTAL_2017_PD_DATA_DIMENSIONS,
+    (uint32_t)NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE,
 
     //TANGO_MODE
     (uint32_t)TANGO_MODE_DATA_SENSOR_FULLFOV,
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
index 2711215..cbc57df 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
@@ -432,6 +432,9 @@
     NEXUS_EXPERIMENTAL_2017_OIS_TIMESTAMPS_BOOTTIME,
     NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_X,
     NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_Y,
+    /* PD plumbing */
+    NEXUS_EXPERIMENTAL_2017_PD_DATA_DIMENSIONS,
+    NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE,
     NEXUS_EXPERIMENTAL_2017_END,
 
     /* Select sensor mode for tango */
diff --git a/msm8998/QCamera2/stack/common/cam_intf.h b/msm8998/QCamera2/stack/common/cam_intf.h
index fce52aa..fa23bec 100644
--- a/msm8998/QCamera2/stack/common/cam_intf.h
+++ b/msm8998/QCamera2/stack/common/cam_intf.h
@@ -1211,7 +1211,7 @@
     INCLUDE(CAM_INTF_META_BINNING_CORRECTION_MODE,      cam_binning_correction_mode_t,  1);
     INCLUDE(CAM_INTF_META_OIS_READ_DATA,                cam_ois_data_t,              1);
     INCLUDE(CAM_INTF_META_FRAME_OIS_DATA,               cam_frame_ois_info_t,        1);
-    INCLUDE(CAM_INTF_META_PDAF_DATA_ENABLE,             int32_t,                     1);
+    INCLUDE(CAM_INTF_META_PDAF_DATA_ENABLE,             cam_sensor_pd_data_t,        1);
     INCLUDE(CAM_INTF_META_STATS_HISTOGRAM_BINS,         int32_t,                     1);
     INCLUDE(CAM_INTF_META_TRACKING_AF_TRIGGER,          uint8_t,                     1);
     INCLUDE(CAM_INTF_META_AF_REGIONS_CONFIDENCE,        int32_t,                     1);
diff --git a/msm8998/QCamera2/stack/common/cam_types.h b/msm8998/QCamera2/stack/common/cam_types.h
index ab7a96d..5c9fc3a 100644
--- a/msm8998/QCamera2/stack/common/cam_types.h
+++ b/msm8998/QCamera2/stack/common/cam_types.h
@@ -47,7 +47,7 @@
 #define OIS_DATA_MAX_SIZE                 (32)
 #define MAX_OIS_SAMPLE_NUM_PER_FRAME      (10)
 
-#define MAX_DEPTH_DATA_SIZE               (4032*2*756)
+#define PD_DATA_SIZE                      (4032*2*758)
 
 #define CEILING64(X) (((X) + 0x0003F) & 0xFFFFFFC0)
 #define CEILING32(X) (((X) + 0x0001F) & 0xFFFFFFE0)
@@ -237,6 +237,12 @@
 } cam_flicker_t;
 
 typedef enum {
+    CAM_PD_DATA_DISABLED = 0,
+    CAM_PD_DATA_ENABLED = 1,
+    CAM_PD_DATA_SKIP = 2,
+} cam_sensor_pd_data_t;
+
+typedef enum {
     CAM_FORMAT_JPEG = 0,
     CAM_FORMAT_YUV_420_NV12 = 1,
     CAM_FORMAT_YUV_420_NV21,
diff --git a/msm8998/QCameraParameters.h b/msm8998/QCameraParameters.h
index 391ca44..dd3b365 100644
--- a/msm8998/QCameraParameters.h
+++ b/msm8998/QCameraParameters.h
@@ -18,7 +18,10 @@
 #define ANDROID_HARDWARE_QCAMERA_PARAMETERS_H
 
 // Camera dependencies
-#include <camera/CameraParameters.h>
+#include <CameraParameters.h>
+
+using ::android::hardware::camera::common::V1_0::helper::CameraParameters;
+using ::android::hardware::camera::common::V1_0::helper::Size;
 
 namespace android {