blob: 3976a266320283e8b15f8c12ec9499ae19400d3a [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"
35
36namespace android {
37
38
39MetadataConverter::MetadataConverter()
40{
41 return;
42}
43
44
45MetadataConverter::~MetadataConverter()
46{
Sungjoong Kang15fd8232012-08-23 16:16:44 -070047 ALOGE("DEBUG(%s)destroy!!:", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070048 return;
49}
50
51status_t MetadataConverter::CheckEntryTypeMismatch(camera_metadata_entry_t * entry,
52 uint8_t type)
53{
54 if (!(entry->type==type))
55 {
56 ALOGV("DEBUG(%s):Metadata Missmatch tag(%s) type (%d) count(%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090057 __FUNCTION__, get_camera_metadata_tag_name(entry->tag), entry->type, entry->count);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070058 return BAD_VALUE;
59 }
60 return NO_ERROR;
61}
62
63status_t MetadataConverter::CheckEntryTypeMismatch(camera_metadata_entry_t * entry,
64 uint8_t type, size_t count)
65{
66 if (!((entry->type==type)&&(entry->count==count)))
67 {
68 ALOGV("DEBUG(%s):Metadata Missmatch tag(%s) type (%d) count(%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090069 __FUNCTION__, get_camera_metadata_tag_name(entry->tag), entry->type, entry->count);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070070 return BAD_VALUE;
71 }
72 return NO_ERROR;
73}
74
Sungjoong Kangbe494d12012-08-04 15:36:56 -070075status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070076{
77 uint32_t num_entry = 0;
78 uint32_t index = 0;
79 uint32_t i = 0;
80 camera_metadata_entry_t curr_entry;
Sungjoong Kangbe494d12012-08-04 15:36:56 -070081 struct camera2_shot * dst = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070082
Sungjoong Kangbe494d12012-08-04 15:36:56 -070083 if (request == NULL || dst_ext == NULL)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070084 return BAD_VALUE;
85
Sungjoong Kangb56dcc02012-08-08 13:38:09 -070086 memset((void*)dst_ext, 0, sizeof(struct camera2_shot_ext));
87 dst = &dst_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -070088
Sungjoong Kangb56dcc02012-08-08 13:38:09 -070089 dst->magicNumber = 0x23456789;
Sungjoong Kang2bdec062012-08-17 15:47:56 -070090 dst->ctl.aa.aeTargetFpsRange[0] = 15;
91 dst->ctl.aa.aeTargetFpsRange[1] = 30;
92 dst->ctl.aa.aeExpCompensation = 5;
93
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070094 num_entry = (uint32_t)get_camera_metadata_data_count(request);
95 for (index = 0 ; index < num_entry ; index++) {
96
97 if (get_camera_metadata_entry(request, index, &curr_entry)==0) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070098 switch (curr_entry.tag) {
99
100 case ANDROID_LENS_FOCUS_DISTANCE:
101 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
102 break;
103 dst->ctl.lens.focusDistance = curr_entry.data.f[0];
104 break;
105
106 case ANDROID_LENS_APERTURE:
107 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
108 break;
109 dst->ctl.lens.aperture = curr_entry.data.f[0];
110 break;
111
112 case ANDROID_LENS_FOCAL_LENGTH:
113 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
114 break;
115 dst->ctl.lens.focalLength = curr_entry.data.f[0];
116 break;
117
118 case ANDROID_LENS_FILTER_DENSITY:
119 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
120 break;
121 dst->ctl.lens.filterDensity = curr_entry.data.f[0];
122 break;
123
124 case ANDROID_LENS_OPTICAL_STABILIZATION_MODE:
125 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
126 break;
127 dst->ctl.lens.opticalStabilizationMode =
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700128 (enum optical_stabilization_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700129 break;
130
131
132
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700133
134 case ANDROID_FLASH_MODE:
135 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
136 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700137 dst->ctl.flash.flashMode = (enum flash_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700138 break;
139
140 case ANDROID_FLASH_FIRING_POWER:
141 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
142 break;
143 dst->ctl.flash.firingPower = curr_entry.data.u8[0];
144 break;
145
146 case ANDROID_FLASH_FIRING_TIME:
147 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
148 break;
149 dst->ctl.flash.firingTime = curr_entry.data.i64[0];
150 break;
151
152
153
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700154
155
156 case ANDROID_JPEG_QUALITY:
157 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
158 break;
159 dst->ctl.jpeg.quality= curr_entry.data.i32[0];
160 break;
161
162 case ANDROID_JPEG_THUMBNAIL_SIZE:
163 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
164 break;
165 for (i=0 ; i<curr_entry.count ; i++)
166 dst->ctl.jpeg.thumbnailSize[i] = curr_entry.data.i32[i];
167 break;
168
169 case ANDROID_JPEG_THUMBNAIL_QUALITY:
170 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
171 break;
172 dst->ctl.jpeg.thumbnailQuality= curr_entry.data.i32[0];
173 break;
174
175 case ANDROID_JPEG_GPS_COORDINATES:
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700176 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_DOUBLE, 3))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700177 break;
178 for (i=0 ; i<curr_entry.count ; i++)
179 dst->ctl.jpeg.gpsCoordinates[i] = curr_entry.data.d[i];
180 break;
181
182 case ANDROID_JPEG_GPS_PROCESSING_METHOD:
183 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 32))
184 break;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700185 for (i=0 ; i<curr_entry.count ; i++)
186 dst_ext->gpsProcessingMethod[i] = curr_entry.data.u8[i];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700187 break;
188
189 case ANDROID_JPEG_GPS_TIMESTAMP:
190 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
191 break;
192 dst->ctl.jpeg.gpsTimestamp = curr_entry.data.i64[0];
193 break;
194
195 case ANDROID_JPEG_ORIENTATION:
196 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
197 break;
198 dst->ctl.jpeg.orientation = curr_entry.data.i32[0];
199 break;
200
201
202
203 case ANDROID_STATS_FACE_DETECT_MODE:
204 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
205 break;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700206 dst->ctl.stats.faceDetectMode = (enum facedetect_mode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700207 break;
208
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700209 case ANDROID_CONTROL_CAPTURE_INTENT:
210 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
211 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700212 dst->ctl.aa.captureIntent = (enum aa_capture_intent)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900213 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700214
215 case ANDROID_CONTROL_MODE:
216 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
217 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700218 dst->ctl.aa.mode = (enum aa_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700219 break;
220
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700221
222 case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE:
223 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
224 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700225 dst->ctl.aa.videoStabilizationMode = curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700226 break;
227
228 case ANDROID_CONTROL_AE_MODE:
229 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
230 break;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700231 dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 1);
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700232 ALOGV("DEBUG(%s): ANDROID_CONTROL_AE_MODE (%d)", __FUNCTION__, dst->ctl.aa.aeMode);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700233 break;
234
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700235
236 case ANDROID_CONTROL_AE_EXP_COMPENSATION:
237 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
238 break;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700239 dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0] + 5;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700240 break;
241
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700242 case ANDROID_CONTROL_AWB_MODE:
243 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
244 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700245 dst->ctl.aa.awbMode = (enum aa_awbmode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700246 break;
247
248 case ANDROID_CONTROL_AWB_REGIONS:
249 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
250 break;
251 for (i=0 ; i<curr_entry.count ; i++)
252 dst->ctl.aa.awbRegions[i] = curr_entry.data.i32[i];
253 break;
254
255 case ANDROID_CONTROL_AF_MODE:
256 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
257 break;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700258 dst->ctl.aa.afMode = (enum aa_afmode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700259 break;
260
261 case ANDROID_CONTROL_AF_REGIONS:
262 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
263 break;
264 for (i=0 ; i<curr_entry.count ; i++)
265 dst->ctl.aa.afRegions[i] = curr_entry.data.i32[i];
266 break;
267
268
269
270 case ANDROID_REQUEST_ID:
271 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
272 break;
273 dst->ctl.request.id = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900274 ALOGV("DEBUG(%s): ANDROID_REQUEST_ID (%d)", __FUNCTION__, dst->ctl.request.id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700275 break;
276
277 case ANDROID_REQUEST_METADATA_MODE:
278 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
279 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700280 dst->ctl.request.metadataMode = (enum metadata_mode)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900281 ALOGV("DEBUG(%s): ANDROID_REQUEST_METADATA_MODE (%d)", __FUNCTION__, (int)( dst->ctl.request.metadataMode));
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700282 break;
283
284 case ANDROID_REQUEST_OUTPUT_STREAMS:
285 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
286 break;
Sungjoong Kangad378612012-08-17 12:34:33 -0700287
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900288 for (i=0 ; i<curr_entry.count ; i++) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700289 dst->ctl.request.outputStreams[i] = curr_entry.data.u8[i];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900290 ALOGV("DEBUG(%s): OUTPUT_STREAM[%d] = %d ", __FUNCTION__, i, (int)(dst->ctl.request.outputStreams[i]));
291 }
Sungjoong Kangad378612012-08-17 12:34:33 -0700292
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700293 dst->ctl.request.outputStreams[15] = curr_entry.count;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700294 break;
295
296 case ANDROID_REQUEST_FRAME_COUNT:
297 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
298 break;
299 dst->ctl.request.frameCount = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900300 ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)", __FUNCTION__, dst->ctl.request.frameCount);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700301 break;
302
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700303 case ANDROID_CONTROL_SCENE_MODE:
304 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
305 break;
306 dst->ctl.aa.sceneMode = (enum aa_scene_mode)(curr_entry.data.u8[0] + 1);
307 ALOGV("DEBUG(%s): converted ANDROID_CONTROL_SCENE_MODE (%d)", __FUNCTION__, dst->ctl.aa.sceneMode);
308 break;
309
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700310 default:
Sungjoong Kangad378612012-08-17 12:34:33 -0700311 ALOGV("DEBUG(%s):Bad Metadata tag (%d)", __FUNCTION__, curr_entry.tag);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700312 break;
313 }
314 }
315 }
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700316 if (dst->ctl.aa.mode != ANDROID_CONTROL_USE_SCENE_MODE)
317 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
318 ApplySceneModeParameters(request, dst_ext);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700319 return NO_ERROR;
320}
321
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700322status_t MetadataConverter::ApplySceneModeParameters(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
323{
324 camera_metadata_entry_t curr_entry;
325 struct camera2_shot * dst = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700326
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700327 ALOGV("DEBUG(%s):", __FUNCTION__);
328
329 dst = &(dst_ext->shot);
330
331 switch (dst->ctl.aa.sceneMode) {
332
333 case AA_SCENE_MODE_ACTION:
334 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
335 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
336 dst->ctl.aa.aeMode = AA_AEMODE_ON;
337 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
338 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
339 dst->ctl.aa.isoValue = 0;
340 dst->ctl.aa.aeTargetFpsRange[0] = 30;
341 dst->ctl.aa.aeTargetFpsRange[1] = 30;
342
343 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
344 dst->ctl.noise.strength = 0;
345 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
346 dst->ctl.edge.strength = 0;
347
348 dst->ctl.color.saturation = 3; // means '0'
349 // FLASH
350 // METERING
351 break;
352
353 case AA_SCENE_MODE_PARTY:
354 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
355 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
356 dst->ctl.aa.aeMode = AA_AEMODE_ON;
357 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
358 dst->ctl.aa.isoMode = AA_ISOMODE_MANUAL;
359 dst->ctl.aa.isoValue = 200;
360 dst->ctl.aa.aeTargetFpsRange[0] = 15;
361 dst->ctl.aa.aeTargetFpsRange[1] = 30;
362
363 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
364 dst->ctl.noise.strength = 0;
365 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
366 dst->ctl.edge.strength = 0;
367
368 dst->ctl.color.saturation = 4; // means '+1'
369 // FLASH
370 // METERING
371 break;
372
373 case AA_SCENE_MODE_SUNSET:
374 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
375 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
376 dst->ctl.aa.aeMode = AA_AEMODE_ON;
377 dst->ctl.aa.awbMode = AA_AWBMODE_WB_DAYLIGHT;
378 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
379 dst->ctl.aa.isoValue = 0;
380 dst->ctl.aa.aeTargetFpsRange[0] = 15;
381 dst->ctl.aa.aeTargetFpsRange[1] = 30;
382
383 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
384 dst->ctl.noise.strength = 0;
385 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
386 dst->ctl.edge.strength = 0;
387
388 dst->ctl.color.saturation = 3; // means '0'
389 // FLASH
390 // METERING
391 break;
392
393 case AA_SCENE_MODE_NIGHT:
394 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700395 dst->ctl.aa.aeMode = AA_AEMODE_ON; // AE_LOCK is prohibited
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700396 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
397 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
398 dst->ctl.aa.isoValue = 0;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700399 dst->ctl.aa.aeTargetFpsRange[0] = 8;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700400 dst->ctl.aa.aeTargetFpsRange[1] = 30;
401
402 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
403 dst->ctl.noise.strength = 0;
404 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
405 dst->ctl.edge.strength = 0;
406
407 dst->ctl.color.saturation = 3; // means '0'
408 // FLASH
409 // METERING
410 break;
411
412 default:
413 dst->ctl.aa.mode = AA_CONTROL_AUTO;
414 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
415 dst->ctl.aa.aeMode = AA_AEMODE_ON;
416 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
417 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
418 dst->ctl.aa.isoValue = 0;
419 dst->ctl.noise.mode = PROCESSING_MODE_OFF;
420 dst->ctl.noise.strength = 0;
421 dst->ctl.edge.mode = PROCESSING_MODE_OFF;
422 dst->ctl.edge.strength = 0;
423 dst->ctl.color.saturation = 3; // means '0'
424 break;
425 }
426
427 return NO_ERROR;
428}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700429
430
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700431status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700432{
433 status_t res;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700434 struct camera2_shot * metadata = &metadata_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700435 uint8_t byteData;
436 uint32_t intData;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700437
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700438 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
439 &(metadata->ctl.request.id), 1))
440 return NO_MEMORY;
441
442 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
443 &(metadata->ctl.request.metadataMode), 1))
444 return NO_MEMORY;
445
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700446 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
447 &(metadata->ctl.request.frameCount), 1))
448 return NO_MEMORY;
449
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700450 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
451 &metadata->dm.sensor.timeStamp, 1))
452 return NO_MEMORY;
453
454 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_EXPOSURE_TIME,
455 &metadata->dm.sensor.exposureTime, 1))
456 return NO_MEMORY;
457
458 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
459 &metadata->dm.lens.aperture, 1))
460 return NO_MEMORY;
461
462 ALOGV("(%s): ID(%d) METAMODE(%d) FrameCnt(%d) Timestamp(%lld) exposure(%lld) aper(%f)", __FUNCTION__,
463 metadata->ctl.request.id, metadata->ctl.request.metadataMode, metadata->ctl.request.frameCount,
464 metadata->dm.sensor.timeStamp, metadata->dm.sensor.exposureTime, metadata->dm.lens.aperture);
465
466
467 byteData = metadata->dm.aa.awbMode - 1;
468 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_MODE,
469 &byteData, 1))
470 return NO_MEMORY;
471
472 byteData = metadata->dm.aa.aeMode - 1;
473 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_MODE,
474 &byteData, 1))
475 return NO_MEMORY;
476
477 byteData = metadata->ctl.aa.sceneMode - 1;
478 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_SCENE_MODE,
479 &byteData, 1))
480 return NO_MEMORY;
481
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700482 intData = metadata->ctl.aa.aeExpCompensation;
483 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_EXP_COMPENSATION,
484 &intData, 1))
485 return NO_MEMORY;
486
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700487 byteData = metadata->dm.stats.faceDetectMode - 1;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700488 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_DETECT_MODE,
489 &byteData, 1))
490 return NO_MEMORY;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700491
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700492 int maxFacecount = 16;
493 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_MAX_FACE_COUNT,
494 &maxFacecount, 1))
495 return NO_MEMORY;
496
497 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_RECTANGLES,
498 &metadata->dm.stats.faceRectangles, 4 * maxFacecount))
499 return NO_MEMORY;
500
501 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_LANDMARKS,
502 &metadata->dm.stats.faceLandmarks, 6 * maxFacecount))
503 return NO_MEMORY;
504
505 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_IDS,
506 &metadata->dm.stats.faceIds, maxFacecount))
507 return NO_MEMORY;
508
509 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_SCORES,
510 &metadata->dm.stats.faceScores, maxFacecount))
511 return NO_MEMORY;
512
513
Sungjoong Kangad378612012-08-17 12:34:33 -0700514 ALOGV("(%s): AWB(%d) AE(%d) SCENE(%d) AEComp(%d)", __FUNCTION__,
515 metadata->dm.aa.awbMode - 1, metadata->dm.aa.aeMode - 1, metadata->ctl.aa.sceneMode - 1,
516 metadata->ctl.aa.aeExpCompensation );
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700517
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700518
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700519 if (metadata->ctl.request.metadataMode == METADATA_MODE_NONE) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900520 ALOGV("DEBUG(%s): METADATA_MODE_NONE", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700521 return NO_ERROR;
522 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700523 return NO_ERROR;
524
525
526}
527
528#if 0 // blocked for alpha version
529
530status_t MetadataConverter::ToDynamicMetadata(camera2_ctl_metadata_t * metadata, camera_metadata_t * dst)
531{
532 status_t res;
533
534 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
535 &(metadata->dm.request.id), 1))
536 return NO_MEMORY;
537
538 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
539 &(metadata->dm.request.metadataMode), 1))
540 return NO_MEMORY;
541
542 // needs check!
543 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
544 &(metadata->dm.request.frameCount), 1))
545 return NO_MEMORY;
546
547
548 if (metadata->dm.request.metadataMode == METADATA_MODE_NONE) {
549 ALOGD("DEBUG(%s): METADATA_MODE_NONE", __func__);
550 return NO_ERROR;
551 }
552
553 ALOGD("DEBUG(%s): METADATA_MODE_FULL", __func__);
554
555 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCUS_DISTANCE,
556 &(metadata->dm.lens.focusDistance), 1))
557 return NO_MEMORY;
558
559 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
560 &(metadata->dm.lens.aperture), 1))
561 return NO_MEMORY;
562
563 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCAL_LENGTH,
564 &(metadata->dm.lens.focalLength), 1))
565 return NO_MEMORY;
566
567 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FILTER_DENSITY,
568 &(metadata->dm.lens.filterDensity), 1))
569 return NO_MEMORY;
570
571 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
572 &(metadata->dm.lens.opticalStabilizationMode), 1))
573 return NO_MEMORY;
574
575 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
576 &(metadata->dm.lens.aperture), 1))
577 return NO_MEMORY;
578
579 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCUS_RANGE,
580 &(metadata->dm.lens.focusRange[0]), 2))
581 return NO_MEMORY;
582
583
584
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700585
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700586
587 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_FRAME_DURATION,
588 &(metadata->dm.sensor.frameDuration), 1))
589 return NO_MEMORY;
590
591 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY,
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700592 &(metadata->dm.aa.isoValue), 1))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700593 return NO_MEMORY;
594
595 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
596 &(metadata->dm.sensor.timeStamp), 1))
597 return NO_MEMORY;
598
599
600
601 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_MODE,
602 &(metadata->dm.flash.flashMode), 1))
603 return NO_MEMORY;
604
605 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_FIRING_POWER,
606 &(metadata->dm.flash.firingPower), 1))
607 return NO_MEMORY;
608
609 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_FIRING_TIME,
610 &(metadata->dm.flash.firingPower), 1))
611 return NO_MEMORY;
612
613
614
615 if (0 != add_camera_metadata_entry(dst, ANDROID_HOT_PIXEL_MODE,
616 &(metadata->dm.hotpixel.mode), 1))
617 return NO_MEMORY;
618
619
620
621 if (0 != add_camera_metadata_entry(dst, ANDROID_DEMOSAIC_MODE,
622 &(metadata->dm.demosaic.mode), 1))
623 return NO_MEMORY;
624
625
626
627 if (0 != add_camera_metadata_entry(dst, ANDROID_NOISE_MODE,
628 &(metadata->dm.noise.mode), 1))
629 return NO_MEMORY;
630
631 if (0 != add_camera_metadata_entry(dst, ANDROID_NOISE_STRENGTH,
632 &(metadata->dm.noise.strength), 1))
633 return NO_MEMORY;
634
635
636 if (0 != add_camera_metadata_entry(dst, ANDROID_SHADING_MODE,
637 &(metadata->dm.shading.mode), 1))
638 return NO_MEMORY;
639
640
641
642 if (0 != add_camera_metadata_entry(dst, ANDROID_GEOMETRIC_MODE,
643 &(metadata->dm.geometric.mode), 1))
644 return NO_MEMORY;
645
646
647
648 if (0 != add_camera_metadata_entry(dst, ANDROID_COLOR_MODE,
649 &(metadata->dm.color.mode), 1))
650 return NO_MEMORY;
651
652 if (0 != add_camera_metadata_entry(dst, ANDROID_COLOR_TRANSFORM,
653 &(metadata->dm.color.transform), 9))
654 return NO_MEMORY;
655
656
657
658 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_MODE,
659 &(metadata->dm.tonemap.mode), 1))
660 return NO_MEMORY;
661
662 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_RED,
663 &(metadata->dm.tonemap.curveRed), 32))
664 return NO_MEMORY;
665
666 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_GREEN,
667 &(metadata->dm.tonemap.curveGreen), 32))
668 return NO_MEMORY;
669
670 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_BLUE,
671 &(metadata->dm.tonemap.curveBlue), 32))
672 return NO_MEMORY;
673
674
675
676 if (0 != add_camera_metadata_entry(dst, ANDROID_EDGE_MODE,
677 &(metadata->dm.edge.mode), 1))
678 return NO_MEMORY;
679
680 if (0 != add_camera_metadata_entry(dst, ANDROID_EDGE_STRENGTH,
681 &(metadata->dm.edge.strength), 1))
682 return NO_MEMORY;
683
684
685
686 if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION,
687 &(metadata->dm.scaler.cropRegion), 3))
688 return NO_MEMORY;
689
690
691
692 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_QUALITY,
693 &(metadata->dm.jpeg.quality), 1))
694 return NO_MEMORY;
695
696 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_SIZE,
697 &(metadata->dm.jpeg.thumbnailSize), 2))
698 return NO_MEMORY;
699
700 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_QUALITY,
701 &(metadata->dm.jpeg.thumbnailQuality), 1))
702 return NO_MEMORY;
703
704 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_COORDINATES,
705 &(metadata->dm.jpeg.gpsCoordinates), 2)) // needs check
706 return NO_MEMORY;
707
708 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_PROCESSING_METHOD,
709 &(metadata->dm.jpeg.gpsProcessingMethod), 32))
710 return NO_MEMORY;
711
712 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_TIMESTAMP,
713 &(metadata->dm.jpeg.gpsTimestamp), 1))
714 return NO_MEMORY;
715
716 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_ORIENTATION,
717 &(metadata->dm.jpeg.orientation), 1))
718 return NO_MEMORY;
719
720
721
722 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_DETECT_MODE,
723 &(metadata->dm.stats.faceDetectMode), 1))
724 return NO_MEMORY;
725
726 // TODO : more stat entries
727
728
729
730 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_MODE,
731 &(metadata->dm.aa.mode), 1))
732 return NO_MEMORY;
733
734 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_CAPTURE_INTENT,
735 &(metadata->dm.aa.captureIntent), 1))
736 return NO_MEMORY;
737
738 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_EFFECT_MODE,
739 &(metadata->dm.aa.effect_mode), 1))
740 return NO_MEMORY;
741
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700742
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700743
744 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_REGIONS,
745 &(metadata->dm.aa.aeRegions), 5))
746 return NO_MEMORY;
747
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700748
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700749
750 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE,
751 &(metadata->dm.aa.aeState), 1))
752 return NO_MEMORY;
753
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700754
755 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_REGIONS,
756 &(metadata->dm.aa.awbRegions), 5))
757 return NO_MEMORY;
758
759 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE,
760 &(metadata->dm.aa.awbState), 1))
761 return NO_MEMORY;
762
763 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_MODE,
764 &(metadata->dm.aa.afMode), 1))
765 return NO_MEMORY;
766
767 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_REGIONS,
768 &(metadata->dm.aa.afRegions), 5))
769 return NO_MEMORY;
770
771 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_STATE,
772 &(metadata->dm.aa.afState), 1))
773 return NO_MEMORY;
774
775 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
776 &(metadata->dm.aa.videoStabilizationMode), 1))
777 return NO_MEMORY;
778
779
780 return NO_ERROR;
781
782/*
783typedef struct camera2_dm {
784 camera2_request_dm_t request;
785 camera2_lens_dm_t lens;
786 camera2_sensor_dm_t sensor;
787 camera2_flash_dm_t flash;
788 camera2_hotpixel_dm_t hotpixel;
789 camera2_demosaic_dm_t demosaic;
790 camera2_noisereduction_dm_t noise;
791 camera2_shading_dm_t shading;
792 camera2_geometric_dm_t geometric;
793 camera2_colorcorrection_dm_t color;
794 camera2_tonemap_dm_t tonemap;
795 camera2_edge_dm_t edge;
796 camera2_scaler_dm_t scaler;
797 camera2_jpeg_dm_t jpeg;
798 camera2_stats_dm_t stats;
799 camera2_aa_dm_t aa;
800} camera2_dm_t;
801*/
802
803}
804#endif
805
806
807}; // namespace android