blob: 9d1a3cffce544c5383f9d07589a612267e4a345f [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
133
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700134
135 case ANDROID_FLASH_MODE:
136 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
137 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700138 dst->ctl.flash.flashMode = (enum flash_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700139 break;
140
141 case ANDROID_FLASH_FIRING_POWER:
142 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
143 break;
144 dst->ctl.flash.firingPower = curr_entry.data.u8[0];
145 break;
146
147 case ANDROID_FLASH_FIRING_TIME:
148 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
149 break;
150 dst->ctl.flash.firingTime = curr_entry.data.i64[0];
151 break;
152
153
154
Sungjoong Kange4657e32012-08-28 15:02:19 -0700155 case ANDROID_SCALER_CROP_REGION:
156 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 3))
157 break;
158 for (i=0 ; i<curr_entry.count ; i++)
159 dst->ctl.scaler.cropRegion[i] = ALIGN(curr_entry.data.i32[i], 2);
160 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700161
162
163 case ANDROID_JPEG_QUALITY:
164 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
165 break;
166 dst->ctl.jpeg.quality= curr_entry.data.i32[0];
167 break;
168
169 case ANDROID_JPEG_THUMBNAIL_SIZE:
170 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
171 break;
172 for (i=0 ; i<curr_entry.count ; i++)
173 dst->ctl.jpeg.thumbnailSize[i] = curr_entry.data.i32[i];
174 break;
175
176 case ANDROID_JPEG_THUMBNAIL_QUALITY:
177 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
178 break;
179 dst->ctl.jpeg.thumbnailQuality= curr_entry.data.i32[0];
180 break;
181
182 case ANDROID_JPEG_GPS_COORDINATES:
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700183 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_DOUBLE, 3))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700184 break;
185 for (i=0 ; i<curr_entry.count ; i++)
186 dst->ctl.jpeg.gpsCoordinates[i] = curr_entry.data.d[i];
187 break;
188
189 case ANDROID_JPEG_GPS_PROCESSING_METHOD:
190 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 32))
191 break;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700192 for (i=0 ; i<curr_entry.count ; i++)
193 dst_ext->gpsProcessingMethod[i] = curr_entry.data.u8[i];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700194 break;
195
196 case ANDROID_JPEG_GPS_TIMESTAMP:
197 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
198 break;
199 dst->ctl.jpeg.gpsTimestamp = curr_entry.data.i64[0];
200 break;
201
202 case ANDROID_JPEG_ORIENTATION:
203 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
204 break;
205 dst->ctl.jpeg.orientation = curr_entry.data.i32[0];
206 break;
207
208
209
210 case ANDROID_STATS_FACE_DETECT_MODE:
211 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
212 break;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700213 dst->ctl.stats.faceDetectMode = (enum facedetect_mode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700214 break;
215
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700216 case ANDROID_CONTROL_CAPTURE_INTENT:
217 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
218 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700219 dst->ctl.aa.captureIntent = (enum aa_capture_intent)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900220 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700221
222 case ANDROID_CONTROL_MODE:
223 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
224 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700225 dst->ctl.aa.mode = (enum aa_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700226 break;
227
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700228
229 case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE:
230 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
231 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700232 dst->ctl.aa.videoStabilizationMode = curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700233 break;
234
235 case ANDROID_CONTROL_AE_MODE:
236 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
237 break;
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700238 dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 2);
239 // skip locked mode
240 if (dst->ctl.aa.aeMode == AA_AEMODE_LOCKED)
241 dst->ctl.aa.aeMode = AA_AEMODE_OFF;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700242 ALOGV("DEBUG(%s): ANDROID_CONTROL_AE_MODE (%d)", __FUNCTION__, dst->ctl.aa.aeMode);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700243 break;
244
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700245 case ANDROID_CONTROL_AE_LOCK:
246 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
247 break;
248 dst_ext->ae_lock = (enum ae_lockmode)(curr_entry.data.u8[0]);
249 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700250
251 case ANDROID_CONTROL_AE_EXP_COMPENSATION:
252 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
253 break;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700254 dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0] + 5;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700255 break;
256
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700257 case ANDROID_CONTROL_AWB_MODE:
258 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
259 break;
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700260 dst->ctl.aa.awbMode = (enum aa_awbmode)(curr_entry.data.u8[0] + 2);
261 // skip locked mode
262 if (dst->ctl.aa.awbMode == AA_AWBMODE_LOCKED)
263 dst->ctl.aa.awbMode = AA_AWBMODE_OFF;
264 break;
265
266 case ANDROID_CONTROL_AWB_LOCK:
267 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
268 break;
269 dst_ext->awb_lock = (enum awb_lockmode)(curr_entry.data.u8[0]);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700270 break;
271
272 case ANDROID_CONTROL_AWB_REGIONS:
273 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
274 break;
275 for (i=0 ; i<curr_entry.count ; i++)
276 dst->ctl.aa.awbRegions[i] = curr_entry.data.i32[i];
277 break;
278
279 case ANDROID_CONTROL_AF_MODE:
280 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
281 break;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700282 dst->ctl.aa.afMode = (enum aa_afmode)(curr_entry.data.u8[0] + 1);
Younghwan Joofdbaf5d2012-09-15 01:22:10 -0700283 if (dst->ctl.aa.afMode == AA_AFMODE_OFF)
284 dst->ctl.aa.afMode = AA_AFMODE_MANUAL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700285 break;
286
287 case ANDROID_CONTROL_AF_REGIONS:
288 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
289 break;
290 for (i=0 ; i<curr_entry.count ; i++)
291 dst->ctl.aa.afRegions[i] = curr_entry.data.i32[i];
292 break;
293
294
295
296 case ANDROID_REQUEST_ID:
297 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
298 break;
299 dst->ctl.request.id = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900300 ALOGV("DEBUG(%s): ANDROID_REQUEST_ID (%d)", __FUNCTION__, dst->ctl.request.id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700301 break;
302
303 case ANDROID_REQUEST_METADATA_MODE:
304 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
305 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700306 dst->ctl.request.metadataMode = (enum metadata_mode)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900307 ALOGV("DEBUG(%s): ANDROID_REQUEST_METADATA_MODE (%d)", __FUNCTION__, (int)( dst->ctl.request.metadataMode));
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700308 break;
309
310 case ANDROID_REQUEST_OUTPUT_STREAMS:
311 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
312 break;
Sungjoong Kangad378612012-08-17 12:34:33 -0700313
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700314 dst->ctl.request.outputStreams[0] = 0;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900315 for (i=0 ; i<curr_entry.count ; i++) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700316 ALOGV("DEBUG(%s): OUTPUT_STREAM[%d] = %d ", __FUNCTION__, i, curr_entry.data.u8[i]);
317 dst->ctl.request.outputStreams[0] |= (1 << curr_entry.data.u8[i]);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900318 }
Sungjoong Kangad378612012-08-17 12:34:33 -0700319
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700320 dst->ctl.request.outputStreams[15] = curr_entry.count;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700321 break;
322
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700323 case ANDROID_REQUEST_INPUT_STREAMS:
324 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
325 break;
326
327 for (i=0 ; i<curr_entry.count ; i++) {
328 dst_ext->reprocessInput = curr_entry.data.u8[0];
329 ALOGV("DEBUG(%s): ANDROID_REQUEST_INPUT_STREAMS[%d] = %d ", __FUNCTION__, i, dst_ext->reprocessInput);
330 }
331 break;
332
333 case ANDROID_REQUEST_TYPE:
334 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
335 break;
336 dst_ext->isReprocessing = curr_entry.data.u8[0];
337 ALOGV("DEBUG(%s): ANDROID_REQUEST_TYPE (%d)", __FUNCTION__, dst_ext->isReprocessing);
338 break;
339
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700340 case ANDROID_REQUEST_FRAME_COUNT:
341 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
342 break;
343 dst->ctl.request.frameCount = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900344 ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)", __FUNCTION__, dst->ctl.request.frameCount);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700345 break;
346
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700347 case ANDROID_CONTROL_SCENE_MODE:
348 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
349 break;
350 dst->ctl.aa.sceneMode = (enum aa_scene_mode)(curr_entry.data.u8[0] + 1);
351 ALOGV("DEBUG(%s): converted ANDROID_CONTROL_SCENE_MODE (%d)", __FUNCTION__, dst->ctl.aa.sceneMode);
352 break;
353
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700354 default:
Sungjoong Kangad378612012-08-17 12:34:33 -0700355 ALOGV("DEBUG(%s):Bad Metadata tag (%d)", __FUNCTION__, curr_entry.tag);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700356 break;
357 }
358 }
359 }
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700360 if (dst->ctl.aa.mode != ANDROID_CONTROL_USE_SCENE_MODE)
361 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
362 ApplySceneModeParameters(request, dst_ext);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700363 return NO_ERROR;
364}
365
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700366status_t MetadataConverter::ApplySceneModeParameters(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
367{
368 camera_metadata_entry_t curr_entry;
369 struct camera2_shot * dst = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700370
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700371 ALOGV("DEBUG(%s):", __FUNCTION__);
372
373 dst = &(dst_ext->shot);
374
375 switch (dst->ctl.aa.sceneMode) {
376
377 case AA_SCENE_MODE_ACTION:
378 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
379 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
380 dst->ctl.aa.aeMode = AA_AEMODE_ON;
381 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
382 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
383 dst->ctl.aa.isoValue = 0;
384 dst->ctl.aa.aeTargetFpsRange[0] = 30;
385 dst->ctl.aa.aeTargetFpsRange[1] = 30;
386
387 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
388 dst->ctl.noise.strength = 0;
389 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
390 dst->ctl.edge.strength = 0;
391
392 dst->ctl.color.saturation = 3; // means '0'
393 // FLASH
394 // METERING
395 break;
396
397 case AA_SCENE_MODE_PARTY:
398 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
399 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
400 dst->ctl.aa.aeMode = AA_AEMODE_ON;
401 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
402 dst->ctl.aa.isoMode = AA_ISOMODE_MANUAL;
403 dst->ctl.aa.isoValue = 200;
404 dst->ctl.aa.aeTargetFpsRange[0] = 15;
405 dst->ctl.aa.aeTargetFpsRange[1] = 30;
406
407 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
408 dst->ctl.noise.strength = 0;
409 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
410 dst->ctl.edge.strength = 0;
411
412 dst->ctl.color.saturation = 4; // means '+1'
413 // FLASH
414 // METERING
415 break;
416
417 case AA_SCENE_MODE_SUNSET:
418 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
419 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
420 dst->ctl.aa.aeMode = AA_AEMODE_ON;
421 dst->ctl.aa.awbMode = AA_AWBMODE_WB_DAYLIGHT;
422 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
423 dst->ctl.aa.isoValue = 0;
424 dst->ctl.aa.aeTargetFpsRange[0] = 15;
425 dst->ctl.aa.aeTargetFpsRange[1] = 30;
426
427 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
428 dst->ctl.noise.strength = 0;
429 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
430 dst->ctl.edge.strength = 0;
431
432 dst->ctl.color.saturation = 3; // means '0'
433 // FLASH
434 // METERING
435 break;
436
437 case AA_SCENE_MODE_NIGHT:
438 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700439 dst->ctl.aa.aeMode = AA_AEMODE_ON; // AE_LOCK is prohibited
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700440 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
441 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
442 dst->ctl.aa.isoValue = 0;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700443 dst->ctl.aa.aeTargetFpsRange[0] = 8;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700444 dst->ctl.aa.aeTargetFpsRange[1] = 30;
445
446 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
447 dst->ctl.noise.strength = 0;
448 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
449 dst->ctl.edge.strength = 0;
450
451 dst->ctl.color.saturation = 3; // means '0'
452 // FLASH
453 // METERING
454 break;
455
456 default:
457 dst->ctl.aa.mode = AA_CONTROL_AUTO;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700458 if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH))
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700459 dst->ctl.aa.aeMode = AA_AEMODE_ON;
460 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
461 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
462 dst->ctl.aa.isoValue = 0;
463 dst->ctl.noise.mode = PROCESSING_MODE_OFF;
464 dst->ctl.noise.strength = 0;
465 dst->ctl.edge.mode = PROCESSING_MODE_OFF;
466 dst->ctl.edge.strength = 0;
467 dst->ctl.color.saturation = 3; // means '0'
468 break;
469 }
470
471 return NO_ERROR;
472}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700473
474
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700475status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700476{
477 status_t res;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700478 struct camera2_shot * metadata = &metadata_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700479 uint8_t byteData;
480 uint32_t intData;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700481
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700482 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
483 &(metadata->ctl.request.id), 1))
484 return NO_MEMORY;
485
486 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
487 &(metadata->ctl.request.metadataMode), 1))
488 return NO_MEMORY;
489
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700490 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
491 &(metadata->ctl.request.frameCount), 1))
492 return NO_MEMORY;
493
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700494 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
495 &metadata->dm.sensor.timeStamp, 1))
496 return NO_MEMORY;
497
498 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_EXPOSURE_TIME,
499 &metadata->dm.sensor.exposureTime, 1))
500 return NO_MEMORY;
501
502 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
503 &metadata->dm.lens.aperture, 1))
504 return NO_MEMORY;
505
506 ALOGV("(%s): ID(%d) METAMODE(%d) FrameCnt(%d) Timestamp(%lld) exposure(%lld) aper(%f)", __FUNCTION__,
507 metadata->ctl.request.id, metadata->ctl.request.metadataMode, metadata->ctl.request.frameCount,
508 metadata->dm.sensor.timeStamp, metadata->dm.sensor.exposureTime, metadata->dm.lens.aperture);
509
510
511 byteData = metadata->dm.aa.awbMode - 1;
512 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_MODE,
513 &byteData, 1))
514 return NO_MEMORY;
515
516 byteData = metadata->dm.aa.aeMode - 1;
517 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_MODE,
518 &byteData, 1))
519 return NO_MEMORY;
520
521 byteData = metadata->ctl.aa.sceneMode - 1;
522 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_SCENE_MODE,
523 &byteData, 1))
524 return NO_MEMORY;
525
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700526 intData = metadata->ctl.aa.aeExpCompensation;
527 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_EXP_COMPENSATION,
528 &intData, 1))
529 return NO_MEMORY;
530
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700531 byteData = metadata->dm.stats.faceDetectMode - 1;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700532 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_DETECT_MODE,
533 &byteData, 1))
534 return NO_MEMORY;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700535
hyeonmyeong Choif85c3f02012-09-09 14:37:06 -0700536 int maxFacecount = 16;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700537 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_MAX_FACE_COUNT,
538 &maxFacecount, 1))
539 return NO_MEMORY;
540
541 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_RECTANGLES,
542 &metadata->dm.stats.faceRectangles, 4 * maxFacecount))
543 return NO_MEMORY;
544
545 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_LANDMARKS,
546 &metadata->dm.stats.faceLandmarks, 6 * maxFacecount))
547 return NO_MEMORY;
548
549 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_IDS,
550 &metadata->dm.stats.faceIds, maxFacecount))
551 return NO_MEMORY;
552
553 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_SCORES,
554 &metadata->dm.stats.faceScores, maxFacecount))
555 return NO_MEMORY;
556
Sungjoong Kangb8d41ae2012-09-13 20:49:27 -0700557 if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION,
558 &metadata->ctl.scaler.cropRegion, 3))
559 return NO_MEMORY;
560
Younghwan Joo6e33cc82012-09-14 10:36:19 -0700561 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE,
562 &(metadata->dm.aa.aeState), 1))
563 return NO_MEMORY;
564
565 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE,
566 &(metadata->dm.aa.awbState), 1))
567 return NO_MEMORY;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700568
Sungjoong Kangad378612012-08-17 12:34:33 -0700569 ALOGV("(%s): AWB(%d) AE(%d) SCENE(%d) AEComp(%d)", __FUNCTION__,
570 metadata->dm.aa.awbMode - 1, metadata->dm.aa.aeMode - 1, metadata->ctl.aa.sceneMode - 1,
571 metadata->ctl.aa.aeExpCompensation );
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700572
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700573
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700574 if (metadata->ctl.request.metadataMode == METADATA_MODE_NONE) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900575 ALOGV("DEBUG(%s): METADATA_MODE_NONE", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700576 return NO_ERROR;
577 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700578 return NO_ERROR;
579
580
581}
582
583#if 0 // blocked for alpha version
584
585status_t MetadataConverter::ToDynamicMetadata(camera2_ctl_metadata_t * metadata, camera_metadata_t * dst)
586{
587 status_t res;
588
589 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
590 &(metadata->dm.request.id), 1))
591 return NO_MEMORY;
592
593 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
594 &(metadata->dm.request.metadataMode), 1))
595 return NO_MEMORY;
596
597 // needs check!
598 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
599 &(metadata->dm.request.frameCount), 1))
600 return NO_MEMORY;
601
602
603 if (metadata->dm.request.metadataMode == METADATA_MODE_NONE) {
604 ALOGD("DEBUG(%s): METADATA_MODE_NONE", __func__);
605 return NO_ERROR;
606 }
607
608 ALOGD("DEBUG(%s): METADATA_MODE_FULL", __func__);
609
610 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCUS_DISTANCE,
611 &(metadata->dm.lens.focusDistance), 1))
612 return NO_MEMORY;
613
614 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
615 &(metadata->dm.lens.aperture), 1))
616 return NO_MEMORY;
617
618 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCAL_LENGTH,
619 &(metadata->dm.lens.focalLength), 1))
620 return NO_MEMORY;
621
622 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FILTER_DENSITY,
623 &(metadata->dm.lens.filterDensity), 1))
624 return NO_MEMORY;
625
626 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
627 &(metadata->dm.lens.opticalStabilizationMode), 1))
628 return NO_MEMORY;
629
630 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
631 &(metadata->dm.lens.aperture), 1))
632 return NO_MEMORY;
633
634 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCUS_RANGE,
635 &(metadata->dm.lens.focusRange[0]), 2))
636 return NO_MEMORY;
637
638
639
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700640
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700641
642 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_FRAME_DURATION,
643 &(metadata->dm.sensor.frameDuration), 1))
644 return NO_MEMORY;
645
646 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY,
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700647 &(metadata->dm.aa.isoValue), 1))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700648 return NO_MEMORY;
649
650 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
651 &(metadata->dm.sensor.timeStamp), 1))
652 return NO_MEMORY;
653
654
655
656 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_MODE,
657 &(metadata->dm.flash.flashMode), 1))
658 return NO_MEMORY;
659
660 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_FIRING_POWER,
661 &(metadata->dm.flash.firingPower), 1))
662 return NO_MEMORY;
663
664 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_FIRING_TIME,
665 &(metadata->dm.flash.firingPower), 1))
666 return NO_MEMORY;
667
668
669
670 if (0 != add_camera_metadata_entry(dst, ANDROID_HOT_PIXEL_MODE,
671 &(metadata->dm.hotpixel.mode), 1))
672 return NO_MEMORY;
673
674
675
676 if (0 != add_camera_metadata_entry(dst, ANDROID_DEMOSAIC_MODE,
677 &(metadata->dm.demosaic.mode), 1))
678 return NO_MEMORY;
679
680
681
682 if (0 != add_camera_metadata_entry(dst, ANDROID_NOISE_MODE,
683 &(metadata->dm.noise.mode), 1))
684 return NO_MEMORY;
685
686 if (0 != add_camera_metadata_entry(dst, ANDROID_NOISE_STRENGTH,
687 &(metadata->dm.noise.strength), 1))
688 return NO_MEMORY;
689
690
691 if (0 != add_camera_metadata_entry(dst, ANDROID_SHADING_MODE,
692 &(metadata->dm.shading.mode), 1))
693 return NO_MEMORY;
694
695
696
697 if (0 != add_camera_metadata_entry(dst, ANDROID_GEOMETRIC_MODE,
698 &(metadata->dm.geometric.mode), 1))
699 return NO_MEMORY;
700
701
702
703 if (0 != add_camera_metadata_entry(dst, ANDROID_COLOR_MODE,
704 &(metadata->dm.color.mode), 1))
705 return NO_MEMORY;
706
707 if (0 != add_camera_metadata_entry(dst, ANDROID_COLOR_TRANSFORM,
708 &(metadata->dm.color.transform), 9))
709 return NO_MEMORY;
710
711
712
713 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_MODE,
714 &(metadata->dm.tonemap.mode), 1))
715 return NO_MEMORY;
716
717 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_RED,
718 &(metadata->dm.tonemap.curveRed), 32))
719 return NO_MEMORY;
720
721 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_GREEN,
722 &(metadata->dm.tonemap.curveGreen), 32))
723 return NO_MEMORY;
724
725 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_BLUE,
726 &(metadata->dm.tonemap.curveBlue), 32))
727 return NO_MEMORY;
728
729
730
731 if (0 != add_camera_metadata_entry(dst, ANDROID_EDGE_MODE,
732 &(metadata->dm.edge.mode), 1))
733 return NO_MEMORY;
734
735 if (0 != add_camera_metadata_entry(dst, ANDROID_EDGE_STRENGTH,
736 &(metadata->dm.edge.strength), 1))
737 return NO_MEMORY;
738
739
740
741 if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION,
742 &(metadata->dm.scaler.cropRegion), 3))
743 return NO_MEMORY;
744
745
746
747 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_QUALITY,
748 &(metadata->dm.jpeg.quality), 1))
749 return NO_MEMORY;
750
751 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_SIZE,
752 &(metadata->dm.jpeg.thumbnailSize), 2))
753 return NO_MEMORY;
754
755 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_QUALITY,
756 &(metadata->dm.jpeg.thumbnailQuality), 1))
757 return NO_MEMORY;
758
759 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_COORDINATES,
760 &(metadata->dm.jpeg.gpsCoordinates), 2)) // needs check
761 return NO_MEMORY;
762
763 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_PROCESSING_METHOD,
764 &(metadata->dm.jpeg.gpsProcessingMethod), 32))
765 return NO_MEMORY;
766
767 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_TIMESTAMP,
768 &(metadata->dm.jpeg.gpsTimestamp), 1))
769 return NO_MEMORY;
770
771 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_ORIENTATION,
772 &(metadata->dm.jpeg.orientation), 1))
773 return NO_MEMORY;
774
775
776
777 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_DETECT_MODE,
778 &(metadata->dm.stats.faceDetectMode), 1))
779 return NO_MEMORY;
780
781 // TODO : more stat entries
782
783
784
785 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_MODE,
786 &(metadata->dm.aa.mode), 1))
787 return NO_MEMORY;
788
789 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_CAPTURE_INTENT,
790 &(metadata->dm.aa.captureIntent), 1))
791 return NO_MEMORY;
792
793 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_EFFECT_MODE,
794 &(metadata->dm.aa.effect_mode), 1))
795 return NO_MEMORY;
796
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700797
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700798
799 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_REGIONS,
800 &(metadata->dm.aa.aeRegions), 5))
801 return NO_MEMORY;
802
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700803
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700804
805 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE,
806 &(metadata->dm.aa.aeState), 1))
807 return NO_MEMORY;
808
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700809
810 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_REGIONS,
811 &(metadata->dm.aa.awbRegions), 5))
812 return NO_MEMORY;
813
814 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE,
815 &(metadata->dm.aa.awbState), 1))
816 return NO_MEMORY;
817
818 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_MODE,
819 &(metadata->dm.aa.afMode), 1))
820 return NO_MEMORY;
821
822 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_REGIONS,
823 &(metadata->dm.aa.afRegions), 5))
824 return NO_MEMORY;
825
826 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_STATE,
827 &(metadata->dm.aa.afState), 1))
828 return NO_MEMORY;
829
830 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
831 &(metadata->dm.aa.videoStabilizationMode), 1))
832 return NO_MEMORY;
833
834
835 return NO_ERROR;
836
837/*
838typedef struct camera2_dm {
839 camera2_request_dm_t request;
840 camera2_lens_dm_t lens;
841 camera2_sensor_dm_t sensor;
842 camera2_flash_dm_t flash;
843 camera2_hotpixel_dm_t hotpixel;
844 camera2_demosaic_dm_t demosaic;
845 camera2_noisereduction_dm_t noise;
846 camera2_shading_dm_t shading;
847 camera2_geometric_dm_t geometric;
848 camera2_colorcorrection_dm_t color;
849 camera2_tonemap_dm_t tonemap;
850 camera2_edge_dm_t edge;
851 camera2_scaler_dm_t scaler;
852 camera2_jpeg_dm_t jpeg;
853 camera2_stats_dm_t stats;
854 camera2_aa_dm_t aa;
855} camera2_dm_t;
856*/
857
858}
859#endif
860
861
862}; // namespace android