blob: c2e181af8eeb3196b9fb4e019392ec6823b859a1 [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;
81 camera_metadata_entry_t curr_entry;
Sungjoong Kangbe494d12012-08-04 15:36:56 -070082 struct camera2_shot * dst = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070083
Sungjoong Kangbe494d12012-08-04 15:36:56 -070084 if (request == NULL || dst_ext == NULL)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070085 return BAD_VALUE;
86
Sungjoong Kangb56dcc02012-08-08 13:38:09 -070087 memset((void*)dst_ext, 0, sizeof(struct camera2_shot_ext));
88 dst = &dst_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -070089
Sungjoong Kangb56dcc02012-08-08 13:38:09 -070090 dst->magicNumber = 0x23456789;
Sungjoong Kang2bdec062012-08-17 15:47:56 -070091 dst->ctl.aa.aeTargetFpsRange[0] = 15;
92 dst->ctl.aa.aeTargetFpsRange[1] = 30;
93 dst->ctl.aa.aeExpCompensation = 5;
94
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070095 num_entry = (uint32_t)get_camera_metadata_data_count(request);
96 for (index = 0 ; index < num_entry ; index++) {
97
98 if (get_camera_metadata_entry(request, index, &curr_entry)==0) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070099 switch (curr_entry.tag) {
100
101 case ANDROID_LENS_FOCUS_DISTANCE:
102 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
103 break;
104 dst->ctl.lens.focusDistance = curr_entry.data.f[0];
105 break;
106
107 case ANDROID_LENS_APERTURE:
108 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
109 break;
110 dst->ctl.lens.aperture = curr_entry.data.f[0];
111 break;
112
113 case ANDROID_LENS_FOCAL_LENGTH:
114 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
115 break;
116 dst->ctl.lens.focalLength = curr_entry.data.f[0];
117 break;
118
119 case ANDROID_LENS_FILTER_DENSITY:
120 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
121 break;
122 dst->ctl.lens.filterDensity = curr_entry.data.f[0];
123 break;
124
125 case ANDROID_LENS_OPTICAL_STABILIZATION_MODE:
126 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
127 break;
128 dst->ctl.lens.opticalStabilizationMode =
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700129 (enum optical_stabilization_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700130 break;
131
132
Sungjoong Kanga8be0012012-09-19 00:13:43 -0700133 case ANDROID_SENSOR_TIMESTAMP:
134 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
135 break;
136 dst->dm.sensor.timeStamp = curr_entry.data.i64[0];
Sungjoong Kanga8be0012012-09-19 00:13:43 -0700137 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700138
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700139
Sungjoong Kang69d1e6e2012-10-03 00:39:13 -0700140 case ANDROID_SENSOR_SENSITIVITY:
141 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
142 break;
143 dst->dm.aa.isoValue = curr_entry.data.i32[0];
144 break;
145
146 case ANDROID_SENSOR_EXPOSURE_TIME:
147 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
148 break;
149 dst->dm.sensor.exposureTime = curr_entry.data.i64[0];
150 break;
151
152
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700153 case ANDROID_FLASH_MODE:
154 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
155 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700156 dst->ctl.flash.flashMode = (enum flash_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700157 break;
158
159 case ANDROID_FLASH_FIRING_POWER:
160 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
161 break;
162 dst->ctl.flash.firingPower = curr_entry.data.u8[0];
163 break;
164
165 case ANDROID_FLASH_FIRING_TIME:
166 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
167 break;
168 dst->ctl.flash.firingTime = curr_entry.data.i64[0];
169 break;
170
171
172
Sungjoong Kange4657e32012-08-28 15:02:19 -0700173 case ANDROID_SCALER_CROP_REGION:
174 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 3))
175 break;
176 for (i=0 ; i<curr_entry.count ; i++)
177 dst->ctl.scaler.cropRegion[i] = ALIGN(curr_entry.data.i32[i], 2);
178 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700179
180
181 case ANDROID_JPEG_QUALITY:
182 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
183 break;
184 dst->ctl.jpeg.quality= curr_entry.data.i32[0];
185 break;
186
187 case ANDROID_JPEG_THUMBNAIL_SIZE:
188 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
189 break;
190 for (i=0 ; i<curr_entry.count ; i++)
191 dst->ctl.jpeg.thumbnailSize[i] = curr_entry.data.i32[i];
192 break;
193
194 case ANDROID_JPEG_THUMBNAIL_QUALITY:
195 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
196 break;
197 dst->ctl.jpeg.thumbnailQuality= curr_entry.data.i32[0];
198 break;
199
200 case ANDROID_JPEG_GPS_COORDINATES:
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700201 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_DOUBLE, 3))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700202 break;
203 for (i=0 ; i<curr_entry.count ; i++)
204 dst->ctl.jpeg.gpsCoordinates[i] = curr_entry.data.d[i];
205 break;
206
207 case ANDROID_JPEG_GPS_PROCESSING_METHOD:
208 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 32))
209 break;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700210 for (i=0 ; i<curr_entry.count ; i++)
211 dst_ext->gpsProcessingMethod[i] = curr_entry.data.u8[i];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700212 break;
213
214 case ANDROID_JPEG_GPS_TIMESTAMP:
215 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
216 break;
217 dst->ctl.jpeg.gpsTimestamp = curr_entry.data.i64[0];
218 break;
219
220 case ANDROID_JPEG_ORIENTATION:
221 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
222 break;
223 dst->ctl.jpeg.orientation = curr_entry.data.i32[0];
224 break;
225
226
227
228 case ANDROID_STATS_FACE_DETECT_MODE:
229 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
230 break;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700231 dst->ctl.stats.faceDetectMode = (enum facedetect_mode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700232 break;
233
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700234 case ANDROID_CONTROL_CAPTURE_INTENT:
235 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
236 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700237 dst->ctl.aa.captureIntent = (enum aa_capture_intent)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900238 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700239
240 case ANDROID_CONTROL_MODE:
241 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
242 break;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700243 dst->ctl.aa.mode = (enum aa_mode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700244 break;
245
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700246
247 case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE:
248 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
249 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700250 dst->ctl.aa.videoStabilizationMode = curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700251 break;
252
253 case ANDROID_CONTROL_AE_MODE:
254 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
255 break;
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700256 dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 2);
257 // skip locked mode
258 if (dst->ctl.aa.aeMode == AA_AEMODE_LOCKED)
259 dst->ctl.aa.aeMode = AA_AEMODE_OFF;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700260 ALOGV("DEBUG(%s): ANDROID_CONTROL_AE_MODE (%d)", __FUNCTION__, dst->ctl.aa.aeMode);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700261 break;
262
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700263 case ANDROID_CONTROL_AE_LOCK:
264 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
265 break;
266 dst_ext->ae_lock = (enum ae_lockmode)(curr_entry.data.u8[0]);
267 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700268
269 case ANDROID_CONTROL_AE_EXP_COMPENSATION:
270 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
271 break;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700272 dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0] + 5;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700273 break;
274
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700275 case ANDROID_CONTROL_AWB_MODE:
276 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
277 break;
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700278 dst->ctl.aa.awbMode = (enum aa_awbmode)(curr_entry.data.u8[0] + 2);
279 // skip locked mode
280 if (dst->ctl.aa.awbMode == AA_AWBMODE_LOCKED)
281 dst->ctl.aa.awbMode = AA_AWBMODE_OFF;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700282 dst_ext->awb_mode_dm = (enum aa_awbmode)(curr_entry.data.u8[0] + 2);
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700283 break;
284
285 case ANDROID_CONTROL_AWB_LOCK:
286 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
287 break;
288 dst_ext->awb_lock = (enum awb_lockmode)(curr_entry.data.u8[0]);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700289 break;
290
291 case ANDROID_CONTROL_AWB_REGIONS:
292 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
293 break;
294 for (i=0 ; i<curr_entry.count ; i++)
295 dst->ctl.aa.awbRegions[i] = curr_entry.data.i32[i];
296 break;
297
298 case ANDROID_CONTROL_AF_MODE:
299 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
300 break;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700301 dst->ctl.aa.afMode = (enum aa_afmode)(curr_entry.data.u8[0] + 1);
Younghwan Joofdbaf5d2012-09-15 01:22:10 -0700302 if (dst->ctl.aa.afMode == AA_AFMODE_OFF)
303 dst->ctl.aa.afMode = AA_AFMODE_MANUAL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700304 break;
305
306 case ANDROID_CONTROL_AF_REGIONS:
307 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
308 break;
309 for (i=0 ; i<curr_entry.count ; i++)
310 dst->ctl.aa.afRegions[i] = curr_entry.data.i32[i];
311 break;
312
313
314
315 case ANDROID_REQUEST_ID:
316 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
317 break;
318 dst->ctl.request.id = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900319 ALOGV("DEBUG(%s): ANDROID_REQUEST_ID (%d)", __FUNCTION__, dst->ctl.request.id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700320 break;
321
322 case ANDROID_REQUEST_METADATA_MODE:
323 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
324 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700325 dst->ctl.request.metadataMode = (enum metadata_mode)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900326 ALOGV("DEBUG(%s): ANDROID_REQUEST_METADATA_MODE (%d)", __FUNCTION__, (int)( dst->ctl.request.metadataMode));
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700327 break;
328
329 case ANDROID_REQUEST_OUTPUT_STREAMS:
330 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
331 break;
Sungjoong Kangad378612012-08-17 12:34:33 -0700332
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700333 dst->ctl.request.outputStreams[0] = 0;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900334 for (i=0 ; i<curr_entry.count ; i++) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700335 ALOGV("DEBUG(%s): OUTPUT_STREAM[%d] = %d ", __FUNCTION__, i, curr_entry.data.u8[i]);
336 dst->ctl.request.outputStreams[0] |= (1 << curr_entry.data.u8[i]);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900337 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700338 break;
339
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700340 case ANDROID_REQUEST_INPUT_STREAMS:
341 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
342 break;
343
344 for (i=0 ; i<curr_entry.count ; i++) {
345 dst_ext->reprocessInput = curr_entry.data.u8[0];
346 ALOGV("DEBUG(%s): ANDROID_REQUEST_INPUT_STREAMS[%d] = %d ", __FUNCTION__, i, dst_ext->reprocessInput);
347 }
348 break;
349
350 case ANDROID_REQUEST_TYPE:
351 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
352 break;
353 dst_ext->isReprocessing = curr_entry.data.u8[0];
354 ALOGV("DEBUG(%s): ANDROID_REQUEST_TYPE (%d)", __FUNCTION__, dst_ext->isReprocessing);
355 break;
356
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700357 case ANDROID_REQUEST_FRAME_COUNT:
358 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
359 break;
360 dst->ctl.request.frameCount = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900361 ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)", __FUNCTION__, dst->ctl.request.frameCount);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700362 break;
363
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700364 case ANDROID_CONTROL_SCENE_MODE:
365 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
366 break;
367 dst->ctl.aa.sceneMode = (enum aa_scene_mode)(curr_entry.data.u8[0] + 1);
Sungjoong Kang83bc2902012-09-29 00:21:47 -0700368 break;
369
370 case ANDROID_CONTROL_AE_TARGET_FPS_RANGE:
371 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
372 break;
373 for (i=0 ; i<curr_entry.count ; i++)
374 dst->ctl.aa.aeTargetFpsRange[i] = curr_entry.data.i32[i];
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700375 break;
376
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700377 default:
Sungjoong Kangad378612012-08-17 12:34:33 -0700378 ALOGV("DEBUG(%s):Bad Metadata tag (%d)", __FUNCTION__, curr_entry.tag);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700379 break;
380 }
381 }
382 }
Sungjoong Kang48728d42012-09-26 13:48:48 -0700383 if (dst->ctl.aa.mode != AA_CONTROL_USE_SCENE_MODE)
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700384 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
385 ApplySceneModeParameters(request, dst_ext);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700386 return NO_ERROR;
387}
388
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700389status_t MetadataConverter::ApplySceneModeParameters(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
390{
391 camera_metadata_entry_t curr_entry;
392 struct camera2_shot * dst = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700393
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700394 ALOGV("DEBUG(%s):", __FUNCTION__);
395
396 dst = &(dst_ext->shot);
397
398 switch (dst->ctl.aa.sceneMode) {
399
400 case AA_SCENE_MODE_ACTION:
401 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
402 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
403 dst->ctl.aa.aeMode = AA_AEMODE_ON;
404 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700405 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700406 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
407 dst->ctl.aa.isoValue = 0;
408 dst->ctl.aa.aeTargetFpsRange[0] = 30;
409 dst->ctl.aa.aeTargetFpsRange[1] = 30;
410
411 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
412 dst->ctl.noise.strength = 0;
413 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
414 dst->ctl.edge.strength = 0;
415
416 dst->ctl.color.saturation = 3; // means '0'
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700417 break;
418
419 case AA_SCENE_MODE_PARTY:
420 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
421 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
422 dst->ctl.aa.aeMode = AA_AEMODE_ON;
423 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700424 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700425 dst->ctl.aa.isoMode = AA_ISOMODE_MANUAL;
426 dst->ctl.aa.isoValue = 200;
427 dst->ctl.aa.aeTargetFpsRange[0] = 15;
428 dst->ctl.aa.aeTargetFpsRange[1] = 30;
429
430 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
431 dst->ctl.noise.strength = 0;
432 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
433 dst->ctl.edge.strength = 0;
434
435 dst->ctl.color.saturation = 4; // means '+1'
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700436 break;
437
438 case AA_SCENE_MODE_SUNSET:
439 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
440 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
441 dst->ctl.aa.aeMode = AA_AEMODE_ON;
442 dst->ctl.aa.awbMode = AA_AWBMODE_WB_DAYLIGHT;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700443 dst_ext->awb_mode_dm = AA_AWBMODE_WB_DAYLIGHT;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700444 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
445 dst->ctl.aa.isoValue = 0;
446 dst->ctl.aa.aeTargetFpsRange[0] = 15;
447 dst->ctl.aa.aeTargetFpsRange[1] = 30;
448
449 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
450 dst->ctl.noise.strength = 0;
451 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
452 dst->ctl.edge.strength = 0;
453
454 dst->ctl.color.saturation = 3; // means '0'
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700455 break;
456
457 case AA_SCENE_MODE_NIGHT:
458 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700459 dst->ctl.aa.aeMode = AA_AEMODE_ON; // AE_LOCK is prohibited
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700460 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700461 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700462 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
463 dst->ctl.aa.isoValue = 0;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700464 dst->ctl.aa.aeTargetFpsRange[0] = 8;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700465 dst->ctl.aa.aeTargetFpsRange[1] = 30;
466
467 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
468 dst->ctl.noise.strength = 0;
469 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
470 dst->ctl.edge.strength = 0;
471
472 dst->ctl.color.saturation = 3; // means '0'
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700473 break;
474
Younghwan Joo275c9742012-09-25 21:12:30 +0900475 case AA_SCENE_MODE_FACE_PRIORITY:
476 dst->ctl.aa.mode = AA_CONTROL_AUTO;
477 if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH))
478 dst->ctl.aa.aeMode = AA_AEMODE_ON;
479 dst->ctl.aa.sceneMode = AA_SCENE_MODE_FACE_PRIORITY;
480 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
481 dst->ctl.aa.isoValue = 0;
482 dst->ctl.noise.mode = PROCESSING_MODE_OFF;
483 dst->ctl.noise.strength = 0;
484 dst->ctl.edge.mode = PROCESSING_MODE_OFF;
485 dst->ctl.edge.strength = 0;
486 dst->ctl.color.saturation = 3; // means '0'
487 break;
488
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700489 default:
490 dst->ctl.aa.mode = AA_CONTROL_AUTO;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700491 if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH))
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700492 dst->ctl.aa.aeMode = AA_AEMODE_ON;
493 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
494 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
495 dst->ctl.aa.isoValue = 0;
496 dst->ctl.noise.mode = PROCESSING_MODE_OFF;
497 dst->ctl.noise.strength = 0;
498 dst->ctl.edge.mode = PROCESSING_MODE_OFF;
499 dst->ctl.edge.strength = 0;
500 dst->ctl.color.saturation = 3; // means '0'
501 break;
502 }
503
504 return NO_ERROR;
505}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700506
507
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700508status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700509{
510 status_t res;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700511 struct camera2_shot * metadata = &metadata_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700512 uint8_t byteData;
513 uint32_t intData;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700514
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700515 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
516 &(metadata->ctl.request.id), 1))
517 return NO_MEMORY;
518
519 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
520 &(metadata->ctl.request.metadataMode), 1))
521 return NO_MEMORY;
522
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700523 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
524 &(metadata->ctl.request.frameCount), 1))
525 return NO_MEMORY;
526
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700527 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
528 &metadata->dm.sensor.timeStamp, 1))
529 return NO_MEMORY;
530
531 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_EXPOSURE_TIME,
532 &metadata->dm.sensor.exposureTime, 1))
533 return NO_MEMORY;
534
535 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
536 &metadata->dm.lens.aperture, 1))
537 return NO_MEMORY;
538
Sungjoong Kangb8146872012-10-01 13:01:11 -0700539 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
540 &(metadata->ctl.aa.aeTargetFpsRange), 2))
541 return NO_MEMORY;
542
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700543 ALOGV("(%s): ID(%d) METAMODE(%d) FrameCnt(%d) Timestamp(%lld) exposure(%lld) aper(%f)", __FUNCTION__,
544 metadata->ctl.request.id, metadata->ctl.request.metadataMode, metadata->ctl.request.frameCount,
545 metadata->dm.sensor.timeStamp, metadata->dm.sensor.exposureTime, metadata->dm.lens.aperture);
546
547
Sungjoong Kang48728d42012-09-26 13:48:48 -0700548 byteData = metadata_ext->awb_mode_dm- 2;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700549 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_MODE,
550 &byteData, 1))
551 return NO_MEMORY;
552
553 byteData = metadata->dm.aa.aeMode - 1;
554 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_MODE,
555 &byteData, 1))
556 return NO_MEMORY;
557
Sungjoong Kang69d1e6e2012-10-03 00:39:13 -0700558 byteData = metadata->ctl.aa.afMode - 1;
Sungjoong Kang48728d42012-09-26 13:48:48 -0700559 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_MODE,
560 &byteData, 1))
561 return NO_MEMORY;
562
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700563 byteData = metadata->ctl.aa.sceneMode - 1;
564 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_SCENE_MODE,
565 &byteData, 1))
566 return NO_MEMORY;
567
Hyeonmyeong Choi8b5b8072012-09-29 17:38:37 +0900568 intData = metadata->ctl.aa.aeExpCompensation - 5;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700569 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_EXP_COMPENSATION,
570 &intData, 1))
571 return NO_MEMORY;
572
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700573 byteData = metadata->dm.stats.faceDetectMode - 1;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700574 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_DETECT_MODE,
575 &byteData, 1))
576 return NO_MEMORY;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700577
Younghwan Joof3312f82012-09-20 13:56:59 -0700578 int maxFacecount = CAMERA2_MAX_FACES;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700579 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_MAX_FACE_COUNT,
580 &maxFacecount, 1))
581 return NO_MEMORY;
582
Younghwan Joof3312f82012-09-20 13:56:59 -0700583 int tempFaceCount = 0;
584 for (int i = 0; i < CAMERA2_MAX_FACES; i++) {
Younghwan Joo1aebf6d2012-10-02 22:11:53 +0900585 if (metadata->dm.stats.faceIds[i] > 0) {
Younghwan Joof3312f82012-09-20 13:56:59 -0700586 mataFaceIds[tempFaceCount] = metadata->dm.stats.faceIds[i];
587 metaFaceScores[tempFaceCount] = metadata->dm.stats.faceScores[i];
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700588
Younghwan Joof3312f82012-09-20 13:56:59 -0700589 memcpy(&mataFaceLandmarks[tempFaceCount][0], &metadata->dm.stats.faceLandmarks[i][0], 6*sizeof(uint32_t));
590 memcpy(&metaFaceRectangles[tempFaceCount][0], &metadata->dm.stats.faceRectangles[i][0], 4*sizeof(uint32_t));
591 tempFaceCount++;
592 }
593 }
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700594
Younghwan Joof3312f82012-09-20 13:56:59 -0700595 if (tempFaceCount > 0) {
596 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_RECTANGLES,
597 &metaFaceRectangles, 4 * tempFaceCount))
598 return NO_MEMORY;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700599
Younghwan Joof3312f82012-09-20 13:56:59 -0700600 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_LANDMARKS,
601 &mataFaceLandmarks, 6 * tempFaceCount))
602 return NO_MEMORY;
603
604 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_IDS,
605 &mataFaceIds, tempFaceCount))
606 return NO_MEMORY;
607
608 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_SCORES,
609 &metaFaceScores, tempFaceCount))
610 return NO_MEMORY;
611 }
Sungjoong Kang48728d42012-09-26 13:48:48 -0700612 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY,
613 &metadata->dm.aa.isoValue, 1))
614 return NO_MEMORY;
615
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700616
Sungjoong Kangb8d41ae2012-09-13 20:49:27 -0700617 if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION,
618 &metadata->ctl.scaler.cropRegion, 3))
619 return NO_MEMORY;
620
Sungjoong Kang14dce022012-09-29 03:32:04 -0700621 byteData = metadata->dm.aa.aeState - 1;
Younghwan Joo6e33cc82012-09-14 10:36:19 -0700622 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE,
Sungjoong Kang14dce022012-09-29 03:32:04 -0700623 &byteData, 1))
Younghwan Joo6e33cc82012-09-14 10:36:19 -0700624 return NO_MEMORY;
625
626 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE,
627 &(metadata->dm.aa.awbState), 1))
628 return NO_MEMORY;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700629
Sungjoong Kang69d1e6e2012-10-03 00:39:13 -0700630
631 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_ORIENTATION,
632 &metadata->ctl.jpeg.orientation, 1))
633 return NO_MEMORY;
634
635 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_QUALITY,
636 &metadata->ctl.jpeg.quality, 1))
637 return NO_MEMORY;
638
639 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_SIZE,
640 &metadata->ctl.jpeg.thumbnailSize, 2))
641 return NO_MEMORY;
642
643 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_QUALITY,
644 &metadata->ctl.jpeg.thumbnailQuality, 1))
645 return NO_MEMORY;
646
647
Sungjoong Kang48728d42012-09-26 13:48:48 -0700648 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_COORDINATES,
649 &(metadata->ctl.jpeg.gpsCoordinates), 3))
650 return NO_MEMORY;
651
652 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_PROCESSING_METHOD,
653 &(metadata_ext->gpsProcessingMethod), 32))
654 return NO_MEMORY;
655
656 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_TIMESTAMP,
657 &(metadata->ctl.jpeg.gpsTimestamp), 1))
658 return NO_MEMORY;
659 ALOGV("(%s): AWB(%d) AE(%d) SCENE(%d) AEComp(%d) AF(%d)", __FUNCTION__,
660 metadata_ext->awb_mode_dm- 2, metadata->dm.aa.aeMode - 1, metadata->ctl.aa.sceneMode - 1,
Sungjoong Kang69d1e6e2012-10-03 00:39:13 -0700661 metadata->ctl.aa.aeExpCompensation, metadata->ctl.aa.afMode - 1);
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700662
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700663
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700664 if (metadata->ctl.request.metadataMode == METADATA_MODE_NONE) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900665 ALOGV("DEBUG(%s): METADATA_MODE_NONE", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700666 return NO_ERROR;
667 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700668 return NO_ERROR;
669
670
671}
672
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700673}; // namespace android