blob: a23546105c255fb5031943ccc7f9b787836d0083 [file] [log] [blame]
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001/*
2**
3** Copyright 2008, The Android Open Source Project
4** Copyright 2012, Samsung Electronics Co. LTD
5**
6** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
9**
10** http://www.apache.org/licenses/LICENSE-2.0
11**
12** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
16** limitations under the License.
17*/
18
19/*!
20 * \file MetadataConverter.cpp
21 * \brief source file for Metadata converter ( for camera hal2 implementation )
22 * \author Sungjoong Kang(sj3.kang@samsung.com)
23 * \date 2012/05/31
24 *
25 * <b>Revision History: </b>
26 * - 2012/05/31 : Sungjoong Kang(sj3.kang@samsung.com) \n
27 * Initial Release
28 */
29
Sungjoong Kangad378612012-08-17 12:34:33 -070030//#define LOG_NDEBUG 0
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070031#define LOG_TAG "MetadataConverter"
32#include <utils/Log.h>
33
34#include "MetadataConverter.h"
Sungjoong Kange4657e32012-08-28 15:02:19 -070035#include "exynos_format.h"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070036
37namespace android {
38
39
40MetadataConverter::MetadataConverter()
41{
42 return;
43}
44
45
46MetadataConverter::~MetadataConverter()
47{
Sungjoong Kanged4ad5f2012-09-14 13:50:31 -070048 ALOGV("DEBUG(%s)destroy!!:", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070049 return;
50}
51
52status_t MetadataConverter::CheckEntryTypeMismatch(camera_metadata_entry_t * entry,
53 uint8_t type)
54{
55 if (!(entry->type==type))
56 {
57 ALOGV("DEBUG(%s):Metadata Missmatch tag(%s) type (%d) count(%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090058 __FUNCTION__, get_camera_metadata_tag_name(entry->tag), entry->type, entry->count);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070059 return BAD_VALUE;
60 }
61 return NO_ERROR;
62}
63
64status_t MetadataConverter::CheckEntryTypeMismatch(camera_metadata_entry_t * entry,
65 uint8_t type, size_t count)
66{
67 if (!((entry->type==type)&&(entry->count==count)))
68 {
69 ALOGV("DEBUG(%s):Metadata Missmatch tag(%s) type (%d) count(%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090070 __FUNCTION__, get_camera_metadata_tag_name(entry->tag), entry->type, entry->count);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070071 return BAD_VALUE;
72 }
73 return NO_ERROR;
74}
75
Sungjoong Kangbe494d12012-08-04 15:36:56 -070076status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070077{
78 uint32_t num_entry = 0;
79 uint32_t index = 0;
80 uint32_t i = 0;
Sungjoong Kang07ed0352012-10-09 21:12:15 -070081 uint32_t cnt = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070082 camera_metadata_entry_t curr_entry;
Sungjoong Kangbe494d12012-08-04 15:36:56 -070083 struct camera2_shot * dst = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070084
Sungjoong Kangbe494d12012-08-04 15:36:56 -070085 if (request == NULL || dst_ext == NULL)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070086 return BAD_VALUE;
87
Sungjoong Kangb56dcc02012-08-08 13:38:09 -070088 memset((void*)dst_ext, 0, sizeof(struct camera2_shot_ext));
89 dst = &dst_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -070090
Sungjoong Kangb56dcc02012-08-08 13:38:09 -070091 dst->magicNumber = 0x23456789;
Sungjoong Kang2bdec062012-08-17 15:47:56 -070092 dst->ctl.aa.aeTargetFpsRange[0] = 15;
93 dst->ctl.aa.aeTargetFpsRange[1] = 30;
94 dst->ctl.aa.aeExpCompensation = 5;
95
Sungjoong Kang07ed0352012-10-09 21:12:15 -070096 num_entry = (uint32_t)get_camera_metadata_entry_count(request);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070097 for (index = 0 ; index < num_entry ; index++) {
98
99 if (get_camera_metadata_entry(request, index, &curr_entry)==0) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700100 switch (curr_entry.tag) {
101
102 case ANDROID_LENS_FOCUS_DISTANCE:
103 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
104 break;
105 dst->ctl.lens.focusDistance = curr_entry.data.f[0];
106 break;
107
108 case ANDROID_LENS_APERTURE:
109 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
110 break;
111 dst->ctl.lens.aperture = curr_entry.data.f[0];
112 break;
113
114 case ANDROID_LENS_FOCAL_LENGTH:
115 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
116 break;
117 dst->ctl.lens.focalLength = curr_entry.data.f[0];
118 break;
119
120 case ANDROID_LENS_FILTER_DENSITY:
121 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
122 break;
123 dst->ctl.lens.filterDensity = curr_entry.data.f[0];
124 break;
125
126 case ANDROID_LENS_OPTICAL_STABILIZATION_MODE:
127 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
128 break;
129 dst->ctl.lens.opticalStabilizationMode =
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700130 (enum optical_stabilization_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700131 break;
132
133
Sungjoong Kanga8be0012012-09-19 00:13:43 -0700134 case ANDROID_SENSOR_TIMESTAMP:
135 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
136 break;
137 dst->dm.sensor.timeStamp = curr_entry.data.i64[0];
Sungjoong Kanga8be0012012-09-19 00:13:43 -0700138 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700139
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700140
Sungjoong Kang69d1e6e2012-10-03 00:39:13 -0700141 case ANDROID_SENSOR_SENSITIVITY:
142 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
143 break;
144 dst->dm.aa.isoValue = curr_entry.data.i32[0];
145 break;
146
147 case ANDROID_SENSOR_EXPOSURE_TIME:
148 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
149 break;
150 dst->dm.sensor.exposureTime = curr_entry.data.i64[0];
151 break;
152
153
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700154 case ANDROID_FLASH_MODE:
155 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
156 break;
Sungjoong Kang34d2b942012-10-24 23:55:16 -0700157 dst->ctl.flash.flashMode = (enum flash_mode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700158 break;
159
160 case ANDROID_FLASH_FIRING_POWER:
161 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
162 break;
163 dst->ctl.flash.firingPower = curr_entry.data.u8[0];
164 break;
165
166 case ANDROID_FLASH_FIRING_TIME:
167 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
168 break;
169 dst->ctl.flash.firingTime = curr_entry.data.i64[0];
170 break;
171
172
173
Sungjoong Kange4657e32012-08-28 15:02:19 -0700174 case ANDROID_SCALER_CROP_REGION:
Igor Murashkina40ca072013-05-07 16:40:33 -0700175 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 4))
Sungjoong Kange4657e32012-08-28 15:02:19 -0700176 break;
Igor Murashkina40ca072013-05-07 16:40:33 -0700177 for (i=0 ; i<3; i++)
Sungjoong Kange4657e32012-08-28 15:02:19 -0700178 dst->ctl.scaler.cropRegion[i] = ALIGN(curr_entry.data.i32[i], 2);
179 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700180
181
182 case ANDROID_JPEG_QUALITY:
183 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
184 break;
185 dst->ctl.jpeg.quality= curr_entry.data.i32[0];
186 break;
187
188 case ANDROID_JPEG_THUMBNAIL_SIZE:
189 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
190 break;
191 for (i=0 ; i<curr_entry.count ; i++)
192 dst->ctl.jpeg.thumbnailSize[i] = curr_entry.data.i32[i];
193 break;
194
195 case ANDROID_JPEG_THUMBNAIL_QUALITY:
196 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
197 break;
198 dst->ctl.jpeg.thumbnailQuality= curr_entry.data.i32[0];
199 break;
200
201 case ANDROID_JPEG_GPS_COORDINATES:
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700202 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_DOUBLE, 3))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700203 break;
204 for (i=0 ; i<curr_entry.count ; i++)
205 dst->ctl.jpeg.gpsCoordinates[i] = curr_entry.data.d[i];
206 break;
207
208 case ANDROID_JPEG_GPS_PROCESSING_METHOD:
Sungjoong Kang07ed0352012-10-09 21:12:15 -0700209 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700210 break;
Sungjoong Kang07ed0352012-10-09 21:12:15 -0700211 if (curr_entry.count > 32)
212 cnt = 32;
213 else
214 cnt = curr_entry.count;
215 for (i = 0 ; i < cnt ; i++)
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700216 dst_ext->gpsProcessingMethod[i] = curr_entry.data.u8[i];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700217 break;
218
219 case ANDROID_JPEG_GPS_TIMESTAMP:
220 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
221 break;
222 dst->ctl.jpeg.gpsTimestamp = curr_entry.data.i64[0];
223 break;
224
225 case ANDROID_JPEG_ORIENTATION:
226 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
227 break;
228 dst->ctl.jpeg.orientation = curr_entry.data.i32[0];
229 break;
230
231
232
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800233 case ANDROID_STATISTICS_FACE_DETECT_MODE:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700234 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
235 break;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700236 dst->ctl.stats.faceDetectMode = (enum facedetect_mode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700237 break;
238
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700239 case ANDROID_CONTROL_CAPTURE_INTENT:
240 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
241 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700242 dst->ctl.aa.captureIntent = (enum aa_capture_intent)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900243 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700244
245 case ANDROID_CONTROL_MODE:
246 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
247 break;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700248 dst->ctl.aa.mode = (enum aa_mode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700249 break;
250
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700251
252 case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE:
253 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
254 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700255 dst->ctl.aa.videoStabilizationMode = curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700256 break;
257
258 case ANDROID_CONTROL_AE_MODE:
259 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
260 break;
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700261 dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 2);
262 // skip locked mode
263 if (dst->ctl.aa.aeMode == AA_AEMODE_LOCKED)
264 dst->ctl.aa.aeMode = AA_AEMODE_OFF;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700265 ALOGV("DEBUG(%s): ANDROID_CONTROL_AE_MODE (%d)", __FUNCTION__, dst->ctl.aa.aeMode);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700266 break;
267
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700268 case ANDROID_CONTROL_AE_LOCK:
269 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
270 break;
271 dst_ext->ae_lock = (enum ae_lockmode)(curr_entry.data.u8[0]);
272 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700273
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800274 case ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700275 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
276 break;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700277 dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0] + 5;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700278 break;
279
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700280 case ANDROID_CONTROL_AWB_MODE:
281 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
282 break;
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700283 dst->ctl.aa.awbMode = (enum aa_awbmode)(curr_entry.data.u8[0] + 2);
284 // skip locked mode
285 if (dst->ctl.aa.awbMode == AA_AWBMODE_LOCKED)
286 dst->ctl.aa.awbMode = AA_AWBMODE_OFF;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700287 dst_ext->awb_mode_dm = (enum aa_awbmode)(curr_entry.data.u8[0] + 2);
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700288 break;
289
290 case ANDROID_CONTROL_AWB_LOCK:
291 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
292 break;
293 dst_ext->awb_lock = (enum awb_lockmode)(curr_entry.data.u8[0]);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700294 break;
295
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700296 case ANDROID_CONTROL_AF_MODE:
297 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
298 break;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700299 dst->ctl.aa.afMode = (enum aa_afmode)(curr_entry.data.u8[0] + 1);
Younghwan Joofdbaf5d2012-09-15 01:22:10 -0700300 if (dst->ctl.aa.afMode == AA_AFMODE_OFF)
301 dst->ctl.aa.afMode = AA_AFMODE_MANUAL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700302 break;
303
304 case ANDROID_CONTROL_AF_REGIONS:
305 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
306 break;
307 for (i=0 ; i<curr_entry.count ; i++)
308 dst->ctl.aa.afRegions[i] = curr_entry.data.i32[i];
309 break;
310
Sungjoong Kangca31bf22012-10-04 19:38:41 -0700311 case ANDROID_CONTROL_AE_REGIONS:
312 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
313 break;
314 for (i=0 ; i<curr_entry.count ; i++)
315 dst->ctl.aa.aeRegions[i] = curr_entry.data.i32[i];
316 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700317
318
319 case ANDROID_REQUEST_ID:
320 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
321 break;
322 dst->ctl.request.id = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900323 ALOGV("DEBUG(%s): ANDROID_REQUEST_ID (%d)", __FUNCTION__, dst->ctl.request.id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700324 break;
325
326 case ANDROID_REQUEST_METADATA_MODE:
327 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
328 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700329 dst->ctl.request.metadataMode = (enum metadata_mode)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900330 ALOGV("DEBUG(%s): ANDROID_REQUEST_METADATA_MODE (%d)", __FUNCTION__, (int)( dst->ctl.request.metadataMode));
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700331 break;
332
333 case ANDROID_REQUEST_OUTPUT_STREAMS:
Zhijun He0c5aeec2013-09-06 17:52:02 -0700334 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700335 break;
Sungjoong Kangad378612012-08-17 12:34:33 -0700336
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700337 dst->ctl.request.outputStreams[0] = 0;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900338 for (i=0 ; i<curr_entry.count ; i++) {
Zhijun He0c5aeec2013-09-06 17:52:02 -0700339 ALOGV("DEBUG(%s): OUTPUT_STREAM[%d] = %d ", __FUNCTION__, i, curr_entry.data.i32[i]);
340 dst->ctl.request.outputStreams[0] |= (1 << curr_entry.data.i32[i]);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900341 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700342 break;
343
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700344 case ANDROID_REQUEST_INPUT_STREAMS:
Zhijun He0c5aeec2013-09-06 17:52:02 -0700345 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32))
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700346 break;
347
348 for (i=0 ; i<curr_entry.count ; i++) {
Zhijun He0c5aeec2013-09-06 17:52:02 -0700349 dst_ext->reprocessInput = curr_entry.data.i32[0];
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700350 ALOGV("DEBUG(%s): ANDROID_REQUEST_INPUT_STREAMS[%d] = %d ", __FUNCTION__, i, dst_ext->reprocessInput);
351 }
352 break;
353
354 case ANDROID_REQUEST_TYPE:
355 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
356 break;
357 dst_ext->isReprocessing = curr_entry.data.u8[0];
358 ALOGV("DEBUG(%s): ANDROID_REQUEST_TYPE (%d)", __FUNCTION__, dst_ext->isReprocessing);
359 break;
360
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700361 case ANDROID_REQUEST_FRAME_COUNT:
362 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
363 break;
364 dst->ctl.request.frameCount = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900365 ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)", __FUNCTION__, dst->ctl.request.frameCount);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700366 break;
367
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700368 case ANDROID_CONTROL_SCENE_MODE:
369 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
370 break;
371 dst->ctl.aa.sceneMode = (enum aa_scene_mode)(curr_entry.data.u8[0] + 1);
Sungjoong Kang83bc2902012-09-29 00:21:47 -0700372 break;
373
374 case ANDROID_CONTROL_AE_TARGET_FPS_RANGE:
375 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
376 break;
377 for (i=0 ; i<curr_entry.count ; i++)
378 dst->ctl.aa.aeTargetFpsRange[i] = curr_entry.data.i32[i];
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700379 break;
380
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700381 default:
Sungjoong Kangad378612012-08-17 12:34:33 -0700382 ALOGV("DEBUG(%s):Bad Metadata tag (%d)", __FUNCTION__, curr_entry.tag);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700383 break;
384 }
385 }
386 }
Sungjoong Kang48728d42012-09-26 13:48:48 -0700387 if (dst->ctl.aa.mode != AA_CONTROL_USE_SCENE_MODE)
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700388 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
389 ApplySceneModeParameters(request, dst_ext);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700390 return NO_ERROR;
391}
392
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700393status_t MetadataConverter::ApplySceneModeParameters(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
394{
395 camera_metadata_entry_t curr_entry;
396 struct camera2_shot * dst = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700397
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700398 ALOGV("DEBUG(%s):", __FUNCTION__);
399
400 dst = &(dst_ext->shot);
401
402 switch (dst->ctl.aa.sceneMode) {
403
404 case AA_SCENE_MODE_ACTION:
405 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
406 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
407 dst->ctl.aa.aeMode = AA_AEMODE_ON;
408 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700409 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700410 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
411 dst->ctl.aa.isoValue = 0;
412 dst->ctl.aa.aeTargetFpsRange[0] = 30;
413 dst->ctl.aa.aeTargetFpsRange[1] = 30;
414
415 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
416 dst->ctl.noise.strength = 0;
417 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
418 dst->ctl.edge.strength = 0;
419
420 dst->ctl.color.saturation = 3; // means '0'
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700421 break;
422
423 case AA_SCENE_MODE_PARTY:
424 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
425 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
426 dst->ctl.aa.aeMode = AA_AEMODE_ON;
427 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700428 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700429 dst->ctl.aa.isoMode = AA_ISOMODE_MANUAL;
430 dst->ctl.aa.isoValue = 200;
431 dst->ctl.aa.aeTargetFpsRange[0] = 15;
432 dst->ctl.aa.aeTargetFpsRange[1] = 30;
433
434 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
435 dst->ctl.noise.strength = 0;
436 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
437 dst->ctl.edge.strength = 0;
438
439 dst->ctl.color.saturation = 4; // means '+1'
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700440 break;
441
442 case AA_SCENE_MODE_SUNSET:
443 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
444 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
445 dst->ctl.aa.aeMode = AA_AEMODE_ON;
446 dst->ctl.aa.awbMode = AA_AWBMODE_WB_DAYLIGHT;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700447 dst_ext->awb_mode_dm = AA_AWBMODE_WB_DAYLIGHT;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700448 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
449 dst->ctl.aa.isoValue = 0;
450 dst->ctl.aa.aeTargetFpsRange[0] = 15;
451 dst->ctl.aa.aeTargetFpsRange[1] = 30;
452
453 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
454 dst->ctl.noise.strength = 0;
455 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
456 dst->ctl.edge.strength = 0;
457
458 dst->ctl.color.saturation = 3; // means '0'
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700459 break;
460
461 case AA_SCENE_MODE_NIGHT:
462 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700463 dst->ctl.aa.aeMode = AA_AEMODE_ON; // AE_LOCK is prohibited
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700464 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700465 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700466 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
467 dst->ctl.aa.isoValue = 0;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700468 dst->ctl.aa.aeTargetFpsRange[0] = 8;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700469 dst->ctl.aa.aeTargetFpsRange[1] = 30;
470
471 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
472 dst->ctl.noise.strength = 0;
473 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
474 dst->ctl.edge.strength = 0;
475
476 dst->ctl.color.saturation = 3; // means '0'
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700477 break;
478
Younghwan Joo275c9742012-09-25 21:12:30 +0900479 case AA_SCENE_MODE_FACE_PRIORITY:
480 dst->ctl.aa.mode = AA_CONTROL_AUTO;
481 if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH))
482 dst->ctl.aa.aeMode = AA_AEMODE_ON;
483 dst->ctl.aa.sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
484 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
485 dst->ctl.aa.isoValue = 0;
486 dst->ctl.noise.mode = PROCESSING_MODE_OFF;
487 dst->ctl.noise.strength = 0;
488 dst->ctl.edge.mode = PROCESSING_MODE_OFF;
489 dst->ctl.edge.strength = 0;
490 dst->ctl.color.saturation = 3; // means '0'
491 break;
492
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700493 default:
494 dst->ctl.aa.mode = AA_CONTROL_AUTO;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700495 if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH))
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700496 dst->ctl.aa.aeMode = AA_AEMODE_ON;
497 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
498 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
499 dst->ctl.aa.isoValue = 0;
500 dst->ctl.noise.mode = PROCESSING_MODE_OFF;
501 dst->ctl.noise.strength = 0;
502 dst->ctl.edge.mode = PROCESSING_MODE_OFF;
503 dst->ctl.edge.strength = 0;
504 dst->ctl.color.saturation = 3; // means '0'
505 break;
506 }
507
508 return NO_ERROR;
509}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700510
511
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700512status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700513{
514 status_t res;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700515 struct camera2_shot * metadata = &metadata_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700516 uint8_t byteData;
517 uint32_t intData;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700518
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700519 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
520 &(metadata->ctl.request.id), 1))
521 return NO_MEMORY;
522
523 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
524 &(metadata->ctl.request.metadataMode), 1))
525 return NO_MEMORY;
526
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700527 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
528 &(metadata->ctl.request.frameCount), 1))
529 return NO_MEMORY;
530
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700531 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
532 &metadata->dm.sensor.timeStamp, 1))
533 return NO_MEMORY;
534
535 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_EXPOSURE_TIME,
536 &metadata->dm.sensor.exposureTime, 1))
537 return NO_MEMORY;
538
539 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
540 &metadata->dm.lens.aperture, 1))
541 return NO_MEMORY;
542
Sungjoong Kangb8146872012-10-01 13:01:11 -0700543 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
544 &(metadata->ctl.aa.aeTargetFpsRange), 2))
545 return NO_MEMORY;
546
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700547 ALOGV("(%s): ID(%d) METAMODE(%d) FrameCnt(%d) Timestamp(%lld) exposure(%lld) aper(%f)", __FUNCTION__,
548 metadata->ctl.request.id, metadata->ctl.request.metadataMode, metadata->ctl.request.frameCount,
549 metadata->dm.sensor.timeStamp, metadata->dm.sensor.exposureTime, metadata->dm.lens.aperture);
550
551
Sungjoong Kang48728d42012-09-26 13:48:48 -0700552 byteData = metadata_ext->awb_mode_dm- 2;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700553 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_MODE,
554 &byteData, 1))
555 return NO_MEMORY;
556
557 byteData = metadata->dm.aa.aeMode - 1;
558 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_MODE,
559 &byteData, 1))
560 return NO_MEMORY;
561
Sungjoong Kang69d1e6e2012-10-03 00:39:13 -0700562 byteData = metadata->ctl.aa.afMode - 1;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700563 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_MODE,
564 &byteData, 1))
565 return NO_MEMORY;
566
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700567 byteData = metadata->ctl.aa.sceneMode - 1;
568 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_SCENE_MODE,
569 &byteData, 1))
570 return NO_MEMORY;
571
Hyeonmyeong Choi8b5b8072012-09-29 17:38:37 +0900572 intData = metadata->ctl.aa.aeExpCompensation - 5;
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800573 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700574 &intData, 1))
575 return NO_MEMORY;
576
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700577 byteData = metadata->dm.stats.faceDetectMode - 1;
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800578 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_DETECT_MODE,
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700579 &byteData, 1))
580 return NO_MEMORY;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700581
Younghwan Joof3312f82012-09-20 13:56:59 -0700582 int maxFacecount = CAMERA2_MAX_FACES;
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800583 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700584 &maxFacecount, 1))
585 return NO_MEMORY;
586
Younghwan Joof3312f82012-09-20 13:56:59 -0700587 int tempFaceCount = 0;
588 for (int i = 0; i < CAMERA2_MAX_FACES; i++) {
Younghwan Joo1aebf6d2012-10-02 22:11:53 +0900589 if (metadata->dm.stats.faceIds[i] > 0) {
Younghwan Joof3312f82012-09-20 13:56:59 -0700590 mataFaceIds[tempFaceCount] = metadata->dm.stats.faceIds[i];
Younghwan Joo6a87e472012-10-18 15:21:19 +0900591 // clipping fd score because the max face score of android is 100
592 if (metadata->dm.stats.faceScores[i] > 100)
593 metaFaceScores[tempFaceCount] = 100;
594 else
595 metaFaceScores[tempFaceCount] = metadata->dm.stats.faceScores[i];
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700596
Younghwan Joof3312f82012-09-20 13:56:59 -0700597 memcpy(&mataFaceLandmarks[tempFaceCount][0], &metadata->dm.stats.faceLandmarks[i][0], 6*sizeof(uint32_t));
598 memcpy(&metaFaceRectangles[tempFaceCount][0], &metadata->dm.stats.faceRectangles[i][0], 4*sizeof(uint32_t));
599 tempFaceCount++;
600 }
601 }
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700602
Younghwan Joof3312f82012-09-20 13:56:59 -0700603 if (tempFaceCount > 0) {
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800604 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_RECTANGLES,
Younghwan Joof3312f82012-09-20 13:56:59 -0700605 &metaFaceRectangles, 4 * tempFaceCount))
606 return NO_MEMORY;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700607
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800608 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_LANDMARKS,
Younghwan Joof3312f82012-09-20 13:56:59 -0700609 &mataFaceLandmarks, 6 * tempFaceCount))
610 return NO_MEMORY;
611
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800612 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_IDS,
Younghwan Joof3312f82012-09-20 13:56:59 -0700613 &mataFaceIds, tempFaceCount))
614 return NO_MEMORY;
615
Igor Murashkinfd1276b2012-11-27 16:24:58 -0800616 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_SCORES,
Younghwan Joof3312f82012-09-20 13:56:59 -0700617 &metaFaceScores, tempFaceCount))
618 return NO_MEMORY;
619 }
Sungjoong Kang48728d42012-09-26 13:48:48 -0700620 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY,
621 &metadata->dm.aa.isoValue, 1))
622 return NO_MEMORY;
623
Eino-Ville Talvala39ed5162013-05-16 17:33:06 -0700624 // Need a four-entry crop region
625 uint32_t cropRegion[4] = {
626 metadata->ctl.scaler.cropRegion[0],
627 metadata->ctl.scaler.cropRegion[1],
628 metadata->ctl.scaler.cropRegion[2],
629 0
630 };
Sungjoong Kangb8d41ae2012-09-13 20:49:27 -0700631 if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION,
Eino-Ville Talvala39ed5162013-05-16 17:33:06 -0700632 cropRegion, 4))
Sungjoong Kangb8d41ae2012-09-13 20:49:27 -0700633 return NO_MEMORY;
634
Sungjoong Kang14dce022012-09-29 03:32:04 -0700635 byteData = metadata->dm.aa.aeState - 1;
Younghwan Joo6e33cc82012-09-14 10:36:19 -0700636 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE,
Sungjoong Kang14dce022012-09-29 03:32:04 -0700637 &byteData, 1))
Younghwan Joo6e33cc82012-09-14 10:36:19 -0700638 return NO_MEMORY;
639
640 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE,
641 &(metadata->dm.aa.awbState), 1))
642 return NO_MEMORY;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700643
Sungjoong Kang69d1e6e2012-10-03 00:39:13 -0700644
645 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_ORIENTATION,
646 &metadata->ctl.jpeg.orientation, 1))
647 return NO_MEMORY;
648
649 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_QUALITY,
650 &metadata->ctl.jpeg.quality, 1))
651 return NO_MEMORY;
652
653 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_SIZE,
654 &metadata->ctl.jpeg.thumbnailSize, 2))
655 return NO_MEMORY;
656
657 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_QUALITY,
658 &metadata->ctl.jpeg.thumbnailQuality, 1))
659 return NO_MEMORY;
660
661
Sungjoong Kang48728d42012-09-26 13:48:48 -0700662 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_COORDINATES,
663 &(metadata->ctl.jpeg.gpsCoordinates), 3))
664 return NO_MEMORY;
665
666 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_PROCESSING_METHOD,
667 &(metadata_ext->gpsProcessingMethod), 32))
668 return NO_MEMORY;
669
670 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_TIMESTAMP,
671 &(metadata->ctl.jpeg.gpsTimestamp), 1))
672 return NO_MEMORY;
673 ALOGV("(%s): AWB(%d) AE(%d) SCENE(%d) AEComp(%d) AF(%d)", __FUNCTION__,
674 metadata_ext->awb_mode_dm- 2, metadata->dm.aa.aeMode - 1, metadata->ctl.aa.sceneMode - 1,
Sungjoong Kang69d1e6e2012-10-03 00:39:13 -0700675 metadata->ctl.aa.aeExpCompensation, metadata->ctl.aa.afMode - 1);
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700676
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700677
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700678 if (metadata->ctl.request.metadataMode == METADATA_MODE_NONE) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900679 ALOGV("DEBUG(%s): METADATA_MODE_NONE", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700680 return NO_ERROR;
681 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700682 return NO_ERROR;
683
684
685}
686
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700687}; // namespace android