Camera3: Correct min frame duration and sensitivity range

1. Use min frame duration for each scaler sizes
2. Use sensitivity range
3. Add multiple JPEG frame duration support

Change-Id: Ia89a9a6ebccc66e3cd8dfefcf19f5d01a9d8e3b7
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 0a513c7..3530ce7 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -1825,6 +1825,9 @@
     staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
                 available_processed_sizes,
                 (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2);
+    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
+                      &gCamCapability[cameraId]->min_duration[0],
+                      gCamCapability[cameraId]->supported_sizes_tbl_cnt);
 
     int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
     makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
@@ -2027,15 +2030,9 @@
                       avail_ae_modes,
                       size);
 
-    int32_t min = INT_MAX, max = INT_MIN;
-    for (int i = 0; i < gCamCapability[cameraId]->supported_iso_modes_cnt; i++) {
-        int32_t sensitivity = getSensorSensitivity(gCamCapability[cameraId]->supported_iso_modes[i]);
-        if (sensitivity != -1) {
-            min = (sensitivity >= min) ? min : sensitivity;
-            max = (sensitivity <= max) ? max : sensitivity;
-        }
-    }
-    int32_t sensitivity_range[] = {min, max};
+    int32_t sensitivity_range[2];
+    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
+    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
     staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
                       sensitivity_range,
                       sizeof(sensitivity_range) / sizeof(int32_t));
@@ -2043,12 +2040,9 @@
     staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
                       &gCamCapability[cameraId]->max_analog_sensitivity,
                       sizeof(int32_t) );
-    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
-                      &gCamCapability[cameraId]->processed_min_duration,
-                      sizeof(int32_t));
     staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
-                      &gCamCapability[cameraId]->jpeg_min_duration,
-                      sizeof(int32_t));
+                      &gCamCapability[cameraId]->jpeg_min_duration[0],
+                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
 
     gStaticMetadata[cameraId] = staticInfo.release();
     return rc;
@@ -2566,7 +2560,12 @@
     }
 
     if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
-        int32_t expCompensation = frame_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
+        int32_t expCompensation = frame_settings.find(
+            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
+        if (expCompensation < gCamCapability[mCameraId]->exposure_time_range[0])
+            expCompensation = gCamCapability[mCameraId]->exposure_time_range[0];
+        if (expCompensation > gCamCapability[mCameraId]->exposure_time_range[1])
+            expCompensation = gCamCapability[mCameraId]->exposure_time_range[1];
         rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
           sizeof(expCompensation), &expCompensation);
     }
@@ -2853,6 +2852,8 @@
     if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
         int64_t sensorFrameDuration =
             frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
+        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
+            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
         rc = AddSetParmEntryToBatch(mParameters,
                 CAM_INTF_META_SENSOR_FRAME_DURATION,
                 sizeof(sensorFrameDuration), &sensorFrameDuration);
@@ -2861,6 +2862,14 @@
     if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
         int32_t sensorSensitivity =
             frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
+        if (sensorSensitivity <
+                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
+            sensorSensitivity =
+                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
+        if (sensorSensitivity >
+                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
+            sensorSensitivity =
+                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
         rc = AddSetParmEntryToBatch(mParameters,
                 CAM_INTF_META_SENSOR_SENSITIVITY,
                 sizeof(sensorSensitivity), &sensorSensitivity);
diff --git a/camera/QCamera2/stack/common/cam_intf.h b/camera/QCamera2/stack/common/cam_intf.h
index 889352f..3044360 100644
--- a/camera/QCamera2/stack/common/cam_intf.h
+++ b/camera/QCamera2/stack/common/cam_intf.h
@@ -108,6 +108,9 @@
 
     uint8_t video_stablization_supported; /* flag id video stablization is supported */
 
+    uint8_t picture_sizes_tbl_cnt;                          /* picture sizes table size */
+    cam_dimension_t picture_sizes_tbl[MAX_SIZES_CNT];       /* picture sizes table */
+
     /* capabilities specific to HAL 1 */
 
     int modes_supported;                                    /* mask of modes supported: 2D, 3D */
@@ -123,8 +126,6 @@
     uint8_t video_sizes_tbl_cnt;                            /* video sizes table size */
     cam_dimension_t video_sizes_tbl[MAX_SIZES_CNT];         /* video sizes table */
 
-    uint8_t picture_sizes_tbl_cnt;                          /* picture sizes table size */
-    cam_dimension_t picture_sizes_tbl[MAX_SIZES_CNT];       /* picture sizes table */
 
     uint8_t livesnapshot_sizes_tbl_cnt;                     /* livesnapshot sizes table size */
     cam_dimension_t livesnapshot_sizes_tbl[MAX_SIZES_CNT];  /* livesnapshot sizes table */
@@ -268,9 +269,11 @@
     /*Autoexposure modes for camera 3 api*/
     uint8_t supported_ae_modes_cnt;
     cam_ae_mode_type supported_ae_modes[CAM_AE_MODE_MAX];
+
+    int64_t jpeg_min_duration[MAX_SIZES_CNT];
+
+    cam_sensitivity_range_t sensitivity_range;
     int32_t max_analog_sensitivity;
-    int32_t processed_min_duration;
-    int32_t jpeg_min_duration;
 
 } cam_capability_t;
 
diff --git a/camera/QCamera2/stack/common/cam_types.h b/camera/QCamera2/stack/common/cam_types.h
index a87a0e5..eb7ae7d 100644
--- a/camera/QCamera2/stack/common/cam_types.h
+++ b/camera/QCamera2/stack/common/cam_types.h
@@ -315,6 +315,11 @@
     float max_fps;
 } cam_fps_range_t;
 
+typedef struct {
+    int32_t min_sensitivity;
+    int32_t max_sensitivity;
+} cam_sensitivity_range_t;
+
 typedef enum {
     CAM_HFR_MODE_OFF,
     CAM_HFR_MODE_60FPS,