summaryrefslogtreecommitdiff
path: root/libcamera2/MetadataConverter.cpp
diff options
context:
space:
mode:
authorSungjoong Kang <sj3.kang@samsung.com>2012-08-17 15:47:56 -0700
committerRebecca Schultz Zavin <rebecca@android.com>2012-08-21 17:22:22 -0700
commit2bdec0603559f57a420e8926da22cc437e1336ec (patch)
tree8f5cf41183a32113a269a26e13a5432e6b4ef136 /libcamera2/MetadataConverter.cpp
parent0f26b20fd328df0ad1cfed28eb456217b22d7780 (diff)
downloadexynos5-2bdec0603559f57a420e8926da22cc437e1336ec.tar.gz
hardware: samsung_slsi: libcamera2: Add SceneMode support
This patch enables SceneMode feature. Requires camera 4th release. Change-Id: I52e67161f0b89b4d05147d04f4f4a68b54c4e89c Signed-off-by: Sungjoong Kang <sj3.kang@samsung.com>
Diffstat (limited to 'libcamera2/MetadataConverter.cpp')
-rw-r--r--libcamera2/MetadataConverter.cpp185
1 files changed, 124 insertions, 61 deletions
diff --git a/libcamera2/MetadataConverter.cpp b/libcamera2/MetadataConverter.cpp
index 2110bbb..38c9ea7 100644
--- a/libcamera2/MetadataConverter.cpp
+++ b/libcamera2/MetadataConverter.cpp
@@ -87,6 +87,10 @@ status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct c
dst = &dst_ext->shot;
dst->magicNumber = 0x23456789;
+ dst->ctl.aa.aeTargetFpsRange[0] = 15;
+ dst->ctl.aa.aeTargetFpsRange[1] = 30;
+ dst->ctl.aa.aeExpCompensation = 5;
+
num_entry = (uint32_t)get_camera_metadata_data_count(request);
for (index = 0 ; index < num_entry ; index++) {
@@ -126,25 +130,6 @@ status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct c
- case ANDROID_SENSOR_EXPOSURE_TIME:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
- break;
- dst->ctl.sensor.exposureTime = curr_entry.data.i64[0];
- break;
-
- case ANDROID_SENSOR_FRAME_DURATION:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
- break;
- dst->ctl.sensor.frameDuration = curr_entry.data.i64[0];
- break;
-
- case ANDROID_SENSOR_SENSITIVITY:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
- break;
- dst->ctl.sensor.sensitivity = curr_entry.data.i32[0];
- break;
-
-
case ANDROID_FLASH_MODE:
if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
@@ -182,20 +167,6 @@ status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct c
- case ANDROID_NOISE_MODE:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
- break;
- dst->ctl.noise.mode = (enum processing_mode)curr_entry.data.u8[0];
- break;
-
- case ANDROID_NOISE_STRENGTH:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
- break;
- dst->ctl.noise.strength= curr_entry.data.u8[0];
- break;
-
-
-
case ANDROID_SHADING_MODE:
if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
break;
@@ -256,19 +227,6 @@ status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct c
- case ANDROID_EDGE_MODE:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
- break;
- dst->ctl.edge.mode = (enum processing_mode)curr_entry.data.u8[0];
- break;
-
- case ANDROID_EDGE_STRENGTH:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
- break;
- dst->ctl.edge.strength = curr_entry.data.u8[0];
- break;
-
-
case ANDROID_SCALER_CROP_REGION:
if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 3))
@@ -369,27 +327,16 @@ status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct c
if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
break;
dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 1);
+ ALOGV("DEBUG(%s): ANDROID_CONTROL_AE_MODE (%d)", __FUNCTION__, dst->ctl.aa.aeMode);
break;
- case ANDROID_CONTROL_AE_REGIONS:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
- break;
- for (i=0 ; i<curr_entry.count ; i++)
- dst->ctl.aa.aeRegions[i] = curr_entry.data.i32[i];
- break;
case ANDROID_CONTROL_AE_EXP_COMPENSATION:
if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
break;
- dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0];
+ dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0] + 5;
break;
- case ANDROID_CONTROL_AE_TARGET_FPS_RANGE:
- if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
- break;
- for (i=0 ; i<curr_entry.count ; i++)
- dst->ctl.aa.aeTargetFpsRange[i] = curr_entry.data.i32[i];
- break;
case ANDROID_CONTROL_AE_ANTIBANDING_MODE:
if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
@@ -458,17 +405,133 @@ status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct c
ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)", __FUNCTION__, dst->ctl.request.frameCount);
break;
+ case ANDROID_CONTROL_SCENE_MODE:
+ if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
+ break;
+ dst->ctl.aa.sceneMode = (enum aa_scene_mode)(curr_entry.data.u8[0] + 1);
+ ALOGV("DEBUG(%s): converted ANDROID_CONTROL_SCENE_MODE (%d)", __FUNCTION__, dst->ctl.aa.sceneMode);
+ break;
+
default:
ALOGV("DEBUG(%s):Bad Metadata tag (%d)", __FUNCTION__, curr_entry.tag);
break;
}
}
}
-
+ if (dst->ctl.aa.mode != ANDROID_CONTROL_USE_SCENE_MODE)
+ dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
+ ApplySceneModeParameters(request, dst_ext);
return NO_ERROR;
}
+status_t MetadataConverter::ApplySceneModeParameters(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
+{
+ camera_metadata_entry_t curr_entry;
+ struct camera2_shot * dst = NULL;
+ ALOGV("DEBUG(%s):", __FUNCTION__);
+
+ dst = &(dst_ext->shot);
+
+ switch (dst->ctl.aa.sceneMode) {
+
+ case AA_SCENE_MODE_ACTION:
+ dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
+ if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
+ dst->ctl.aa.aeMode = AA_AEMODE_ON;
+ dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
+ dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
+ dst->ctl.aa.isoValue = 0;
+ dst->ctl.aa.aeTargetFpsRange[0] = 30;
+ dst->ctl.aa.aeTargetFpsRange[1] = 30;
+
+ dst->ctl.noise.mode = PROCESSING_MODE_FAST;
+ dst->ctl.noise.strength = 0;
+ dst->ctl.edge.mode = PROCESSING_MODE_FAST;
+ dst->ctl.edge.strength = 0;
+
+ dst->ctl.color.saturation = 3; // means '0'
+ // FLASH
+ // METERING
+ break;
+
+ case AA_SCENE_MODE_PARTY:
+ dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
+ if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
+ dst->ctl.aa.aeMode = AA_AEMODE_ON;
+ dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
+ dst->ctl.aa.isoMode = AA_ISOMODE_MANUAL;
+ dst->ctl.aa.isoValue = 200;
+ dst->ctl.aa.aeTargetFpsRange[0] = 15;
+ dst->ctl.aa.aeTargetFpsRange[1] = 30;
+
+ dst->ctl.noise.mode = PROCESSING_MODE_FAST;
+ dst->ctl.noise.strength = 0;
+ dst->ctl.edge.mode = PROCESSING_MODE_FAST;
+ dst->ctl.edge.strength = 0;
+
+ dst->ctl.color.saturation = 4; // means '+1'
+ // FLASH
+ // METERING
+ break;
+
+ case AA_SCENE_MODE_SUNSET:
+ dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
+ if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
+ dst->ctl.aa.aeMode = AA_AEMODE_ON;
+ dst->ctl.aa.awbMode = AA_AWBMODE_WB_DAYLIGHT;
+ dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
+ dst->ctl.aa.isoValue = 0;
+ dst->ctl.aa.aeTargetFpsRange[0] = 15;
+ dst->ctl.aa.aeTargetFpsRange[1] = 30;
+
+ dst->ctl.noise.mode = PROCESSING_MODE_FAST;
+ dst->ctl.noise.strength = 0;
+ dst->ctl.edge.mode = PROCESSING_MODE_FAST;
+ dst->ctl.edge.strength = 0;
+
+ dst->ctl.color.saturation = 3; // means '0'
+ // FLASH
+ // METERING
+ break;
+
+ case AA_SCENE_MODE_NIGHT:
+ dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
+ if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
+ dst->ctl.aa.aeMode = AA_AEMODE_ON;
+ dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
+ dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
+ dst->ctl.aa.isoValue = 0;
+ dst->ctl.aa.aeTargetFpsRange[0] = 2;
+ dst->ctl.aa.aeTargetFpsRange[1] = 30;
+
+ dst->ctl.noise.mode = PROCESSING_MODE_FAST;
+ dst->ctl.noise.strength = 0;
+ dst->ctl.edge.mode = PROCESSING_MODE_FAST;
+ dst->ctl.edge.strength = 0;
+
+ dst->ctl.color.saturation = 3; // means '0'
+ // FLASH
+ // METERING
+ break;
+
+ default:
+ dst->ctl.aa.mode = AA_CONTROL_AUTO;
+ if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
+ dst->ctl.aa.aeMode = AA_AEMODE_ON;
+ dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
+ dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
+ dst->ctl.aa.isoValue = 0;
+ dst->ctl.noise.mode = PROCESSING_MODE_OFF;
+ dst->ctl.noise.strength = 0;
+ dst->ctl.edge.mode = PROCESSING_MODE_OFF;
+ dst->ctl.edge.strength = 0;
+ dst->ctl.color.saturation = 3; // means '0'
+ break;
+ }
+
+ return NO_ERROR;
+}
status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst)
@@ -606,7 +669,7 @@ status_t MetadataConverter::ToDynamicMetadata(camera2_ctl_metadata_t * metadata,
return NO_MEMORY;
if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY,
- &(metadata->dm.sensor.sensitivity), 1))
+ &(metadata->dm.aa.isoValue), 1))
return NO_MEMORY;
if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,