blob: 38c9ea7b3ce61a0829568401d668ab39e24bf1c0 [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 Kang13d8c7b2012-07-14 10:20:39 +090047 ALOGV("DEBUG(%s):", __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
154 case ANDROID_HOT_PIXEL_MODE:
155 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
156 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700157 dst->ctl.hotpixel.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700158 break;
159
160
161
162 case ANDROID_DEMOSAIC_MODE:
163 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
164 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700165 dst->ctl.demosaic.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700166 break;
167
168
169
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700170 case ANDROID_SHADING_MODE:
171 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
172 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700173 dst->ctl.shading.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700174 break;
175
176
177
178 case ANDROID_GEOMETRIC_MODE:
179 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
180 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700181 dst->ctl.geometric.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700182 break;
183
184
185
186 case ANDROID_COLOR_MODE:
187 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
188 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700189 dst->ctl.color.mode = (enum colorcorrection_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700190 break;
191
192 case ANDROID_COLOR_TRANSFORM:
193 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 9))
194 break;
195 for (i=0 ; i<curr_entry.count ; i++)
196 dst->ctl.color.transform[i] = curr_entry.data.f[i];
197 break;
198
199
200
201 case ANDROID_TONEMAP_MODE:
202 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
203 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700204 dst->ctl.tonemap.mode = (enum tonemap_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700205 break;
206
207 case ANDROID_TONEMAP_CURVE_RED:
208 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 32))
209 break;
210 for (i=0 ; i<curr_entry.count ; i++)
211 dst->ctl.tonemap.curveRed[i] = curr_entry.data.f[i];
212 break;
213
214 case ANDROID_TONEMAP_CURVE_GREEN:
215 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 32))
216 break;
217 for (i=0 ; i<curr_entry.count ; i++)
218 dst->ctl.tonemap.curveGreen[i] = curr_entry.data.f[i];
219 break;
220
221 case ANDROID_TONEMAP_CURVE_BLUE:
222 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 32))
223 break;
224 for (i=0 ; i<curr_entry.count ; i++)
225 dst->ctl.tonemap.curveBlue[i] = curr_entry.data.f[i];
226 break;
227
228
229
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700230
231 case ANDROID_SCALER_CROP_REGION:
232 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 3))
233 break;
234 for (i=0 ; i<curr_entry.count ; i++)
235 dst->ctl.scaler.cropRegion[i] = curr_entry.data.i32[i];
236 break;
237
238
239
240 case ANDROID_JPEG_QUALITY:
241 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
242 break;
243 dst->ctl.jpeg.quality= curr_entry.data.i32[0];
244 break;
245
246 case ANDROID_JPEG_THUMBNAIL_SIZE:
247 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
248 break;
249 for (i=0 ; i<curr_entry.count ; i++)
250 dst->ctl.jpeg.thumbnailSize[i] = curr_entry.data.i32[i];
251 break;
252
253 case ANDROID_JPEG_THUMBNAIL_QUALITY:
254 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
255 break;
256 dst->ctl.jpeg.thumbnailQuality= curr_entry.data.i32[0];
257 break;
258
259 case ANDROID_JPEG_GPS_COORDINATES:
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700260 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_DOUBLE, 3))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700261 break;
262 for (i=0 ; i<curr_entry.count ; i++)
263 dst->ctl.jpeg.gpsCoordinates[i] = curr_entry.data.d[i];
264 break;
265
266 case ANDROID_JPEG_GPS_PROCESSING_METHOD:
267 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 32))
268 break;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700269 for (i=0 ; i<curr_entry.count ; i++)
270 dst_ext->gpsProcessingMethod[i] = curr_entry.data.u8[i];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700271 break;
272
273 case ANDROID_JPEG_GPS_TIMESTAMP:
274 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
275 break;
276 dst->ctl.jpeg.gpsTimestamp = curr_entry.data.i64[0];
277 break;
278
279 case ANDROID_JPEG_ORIENTATION:
280 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
281 break;
282 dst->ctl.jpeg.orientation = curr_entry.data.i32[0];
283 break;
284
285
286
287 case ANDROID_STATS_FACE_DETECT_MODE:
288 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
289 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700290 dst->ctl.stats.faceDetectMode = (enum facedetect_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700291 break;
292
293 case ANDROID_STATS_HISTOGRAM_MODE:
294 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
295 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700296 dst->ctl.stats.histogramMode = (enum stats_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700297 break;
298
299 case ANDROID_STATS_SHARPNESS_MAP_MODE:
300 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
301 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700302 dst->ctl.stats.sharpnessMapMode = (enum stats_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700303 break;
304
305
306
307 case ANDROID_CONTROL_CAPTURE_INTENT:
308 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
309 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700310 dst->ctl.aa.captureIntent = (enum aa_capture_intent)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900311 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700312
313 case ANDROID_CONTROL_MODE:
314 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
315 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700316 dst->ctl.aa.mode = (enum aa_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700317 break;
318
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700319
320 case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE:
321 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
322 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700323 dst->ctl.aa.videoStabilizationMode = curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700324 break;
325
326 case ANDROID_CONTROL_AE_MODE:
327 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
328 break;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700329 dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 1);
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700330 ALOGV("DEBUG(%s): ANDROID_CONTROL_AE_MODE (%d)", __FUNCTION__, dst->ctl.aa.aeMode);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700331 break;
332
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700333
334 case ANDROID_CONTROL_AE_EXP_COMPENSATION:
335 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
336 break;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700337 dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0] + 5;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700338 break;
339
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700340
341 case ANDROID_CONTROL_AE_ANTIBANDING_MODE:
342 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
343 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700344 dst->ctl.aa.aeAntibandingMode = (enum aa_ae_antibanding_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700345 break;
346
347 case ANDROID_CONTROL_AWB_MODE:
348 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
349 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700350 dst->ctl.aa.awbMode = (enum aa_awbmode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700351 break;
352
353 case ANDROID_CONTROL_AWB_REGIONS:
354 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
355 break;
356 for (i=0 ; i<curr_entry.count ; i++)
357 dst->ctl.aa.awbRegions[i] = curr_entry.data.i32[i];
358 break;
359
360 case ANDROID_CONTROL_AF_MODE:
361 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
362 break;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700363 dst->ctl.aa.afMode = (enum aa_afmode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700364 break;
365
366 case ANDROID_CONTROL_AF_REGIONS:
367 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
368 break;
369 for (i=0 ; i<curr_entry.count ; i++)
370 dst->ctl.aa.afRegions[i] = curr_entry.data.i32[i];
371 break;
372
373
374
375 case ANDROID_REQUEST_ID:
376 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
377 break;
378 dst->ctl.request.id = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900379 ALOGV("DEBUG(%s): ANDROID_REQUEST_ID (%d)", __FUNCTION__, dst->ctl.request.id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700380 break;
381
382 case ANDROID_REQUEST_METADATA_MODE:
383 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
384 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700385 dst->ctl.request.metadataMode = (enum metadata_mode)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900386 ALOGV("DEBUG(%s): ANDROID_REQUEST_METADATA_MODE (%d)", __FUNCTION__, (int)( dst->ctl.request.metadataMode));
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700387 break;
388
389 case ANDROID_REQUEST_OUTPUT_STREAMS:
390 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
391 break;
Sungjoong Kangad378612012-08-17 12:34:33 -0700392
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900393 for (i=0 ; i<curr_entry.count ; i++) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700394 dst->ctl.request.outputStreams[i] = curr_entry.data.u8[i];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900395 ALOGV("DEBUG(%s): OUTPUT_STREAM[%d] = %d ", __FUNCTION__, i, (int)(dst->ctl.request.outputStreams[i]));
396 }
Sungjoong Kangad378612012-08-17 12:34:33 -0700397
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700398 dst->ctl.request.outputStreams[15] = curr_entry.count;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700399 break;
400
401 case ANDROID_REQUEST_FRAME_COUNT:
402 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
403 break;
404 dst->ctl.request.frameCount = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900405 ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)", __FUNCTION__, dst->ctl.request.frameCount);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700406 break;
407
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700408 case ANDROID_CONTROL_SCENE_MODE:
409 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
410 break;
411 dst->ctl.aa.sceneMode = (enum aa_scene_mode)(curr_entry.data.u8[0] + 1);
412 ALOGV("DEBUG(%s): converted ANDROID_CONTROL_SCENE_MODE (%d)", __FUNCTION__, dst->ctl.aa.sceneMode);
413 break;
414
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700415 default:
Sungjoong Kangad378612012-08-17 12:34:33 -0700416 ALOGV("DEBUG(%s):Bad Metadata tag (%d)", __FUNCTION__, curr_entry.tag);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700417 break;
418 }
419 }
420 }
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700421 if (dst->ctl.aa.mode != ANDROID_CONTROL_USE_SCENE_MODE)
422 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
423 ApplySceneModeParameters(request, dst_ext);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700424 return NO_ERROR;
425}
426
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700427status_t MetadataConverter::ApplySceneModeParameters(camera_metadata_t * request, struct camera2_shot_ext * dst_ext)
428{
429 camera_metadata_entry_t curr_entry;
430 struct camera2_shot * dst = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700431
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700432 ALOGV("DEBUG(%s):", __FUNCTION__);
433
434 dst = &(dst_ext->shot);
435
436 switch (dst->ctl.aa.sceneMode) {
437
438 case AA_SCENE_MODE_ACTION:
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_AUTO;
443 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
444 dst->ctl.aa.isoValue = 0;
445 dst->ctl.aa.aeTargetFpsRange[0] = 30;
446 dst->ctl.aa.aeTargetFpsRange[1] = 30;
447
448 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
449 dst->ctl.noise.strength = 0;
450 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
451 dst->ctl.edge.strength = 0;
452
453 dst->ctl.color.saturation = 3; // means '0'
454 // FLASH
455 // METERING
456 break;
457
458 case AA_SCENE_MODE_PARTY:
459 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
460 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
461 dst->ctl.aa.aeMode = AA_AEMODE_ON;
462 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
463 dst->ctl.aa.isoMode = AA_ISOMODE_MANUAL;
464 dst->ctl.aa.isoValue = 200;
465 dst->ctl.aa.aeTargetFpsRange[0] = 15;
466 dst->ctl.aa.aeTargetFpsRange[1] = 30;
467
468 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
469 dst->ctl.noise.strength = 0;
470 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
471 dst->ctl.edge.strength = 0;
472
473 dst->ctl.color.saturation = 4; // means '+1'
474 // FLASH
475 // METERING
476 break;
477
478 case AA_SCENE_MODE_SUNSET:
479 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
480 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
481 dst->ctl.aa.aeMode = AA_AEMODE_ON;
482 dst->ctl.aa.awbMode = AA_AWBMODE_WB_DAYLIGHT;
483 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
484 dst->ctl.aa.isoValue = 0;
485 dst->ctl.aa.aeTargetFpsRange[0] = 15;
486 dst->ctl.aa.aeTargetFpsRange[1] = 30;
487
488 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
489 dst->ctl.noise.strength = 0;
490 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
491 dst->ctl.edge.strength = 0;
492
493 dst->ctl.color.saturation = 3; // means '0'
494 // FLASH
495 // METERING
496 break;
497
498 case AA_SCENE_MODE_NIGHT:
499 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE;
500 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
501 dst->ctl.aa.aeMode = AA_AEMODE_ON;
502 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO;
503 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
504 dst->ctl.aa.isoValue = 0;
505 dst->ctl.aa.aeTargetFpsRange[0] = 2;
506 dst->ctl.aa.aeTargetFpsRange[1] = 30;
507
508 dst->ctl.noise.mode = PROCESSING_MODE_FAST;
509 dst->ctl.noise.strength = 0;
510 dst->ctl.edge.mode = PROCESSING_MODE_FAST;
511 dst->ctl.edge.strength = 0;
512
513 dst->ctl.color.saturation = 3; // means '0'
514 // FLASH
515 // METERING
516 break;
517
518 default:
519 dst->ctl.aa.mode = AA_CONTROL_AUTO;
520 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED)
521 dst->ctl.aa.aeMode = AA_AEMODE_ON;
522 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED;
523 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO;
524 dst->ctl.aa.isoValue = 0;
525 dst->ctl.noise.mode = PROCESSING_MODE_OFF;
526 dst->ctl.noise.strength = 0;
527 dst->ctl.edge.mode = PROCESSING_MODE_OFF;
528 dst->ctl.edge.strength = 0;
529 dst->ctl.color.saturation = 3; // means '0'
530 break;
531 }
532
533 return NO_ERROR;
534}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700535
536
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700537status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700538{
539 status_t res;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700540 struct camera2_shot * metadata = &metadata_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700541 uint8_t byteData;
542 uint32_t intData;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700543
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700544 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
545 &(metadata->ctl.request.id), 1))
546 return NO_MEMORY;
547
548 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
549 &(metadata->ctl.request.metadataMode), 1))
550 return NO_MEMORY;
551
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700552 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
553 &(metadata->ctl.request.frameCount), 1))
554 return NO_MEMORY;
555
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700556 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
557 &metadata->dm.sensor.timeStamp, 1))
558 return NO_MEMORY;
559
560 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_EXPOSURE_TIME,
561 &metadata->dm.sensor.exposureTime, 1))
562 return NO_MEMORY;
563
564 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
565 &metadata->dm.lens.aperture, 1))
566 return NO_MEMORY;
567
568 ALOGV("(%s): ID(%d) METAMODE(%d) FrameCnt(%d) Timestamp(%lld) exposure(%lld) aper(%f)", __FUNCTION__,
569 metadata->ctl.request.id, metadata->ctl.request.metadataMode, metadata->ctl.request.frameCount,
570 metadata->dm.sensor.timeStamp, metadata->dm.sensor.exposureTime, metadata->dm.lens.aperture);
571
572
573 byteData = metadata->dm.aa.awbMode - 1;
574 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_MODE,
575 &byteData, 1))
576 return NO_MEMORY;
577
578 byteData = metadata->dm.aa.aeMode - 1;
579 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_MODE,
580 &byteData, 1))
581 return NO_MEMORY;
582
583 byteData = metadata->ctl.aa.sceneMode - 1;
584 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_SCENE_MODE,
585 &byteData, 1))
586 return NO_MEMORY;
587
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700588 intData = metadata->ctl.aa.aeExpCompensation;
589 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_EXP_COMPENSATION,
590 &intData, 1))
591 return NO_MEMORY;
592
593
Sungjoong Kangad378612012-08-17 12:34:33 -0700594 ALOGV("(%s): AWB(%d) AE(%d) SCENE(%d) AEComp(%d)", __FUNCTION__,
595 metadata->dm.aa.awbMode - 1, metadata->dm.aa.aeMode - 1, metadata->ctl.aa.sceneMode - 1,
596 metadata->ctl.aa.aeExpCompensation );
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700597
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700598
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700599 if (metadata->ctl.request.metadataMode == METADATA_MODE_NONE) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900600 ALOGV("DEBUG(%s): METADATA_MODE_NONE", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700601 return NO_ERROR;
602 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700603 return NO_ERROR;
604
605
606}
607
608#if 0 // blocked for alpha version
609
610status_t MetadataConverter::ToDynamicMetadata(camera2_ctl_metadata_t * metadata, camera_metadata_t * dst)
611{
612 status_t res;
613
614 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
615 &(metadata->dm.request.id), 1))
616 return NO_MEMORY;
617
618 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
619 &(metadata->dm.request.metadataMode), 1))
620 return NO_MEMORY;
621
622 // needs check!
623 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
624 &(metadata->dm.request.frameCount), 1))
625 return NO_MEMORY;
626
627
628 if (metadata->dm.request.metadataMode == METADATA_MODE_NONE) {
629 ALOGD("DEBUG(%s): METADATA_MODE_NONE", __func__);
630 return NO_ERROR;
631 }
632
633 ALOGD("DEBUG(%s): METADATA_MODE_FULL", __func__);
634
635 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCUS_DISTANCE,
636 &(metadata->dm.lens.focusDistance), 1))
637 return NO_MEMORY;
638
639 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
640 &(metadata->dm.lens.aperture), 1))
641 return NO_MEMORY;
642
643 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCAL_LENGTH,
644 &(metadata->dm.lens.focalLength), 1))
645 return NO_MEMORY;
646
647 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FILTER_DENSITY,
648 &(metadata->dm.lens.filterDensity), 1))
649 return NO_MEMORY;
650
651 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
652 &(metadata->dm.lens.opticalStabilizationMode), 1))
653 return NO_MEMORY;
654
655 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
656 &(metadata->dm.lens.aperture), 1))
657 return NO_MEMORY;
658
659 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCUS_RANGE,
660 &(metadata->dm.lens.focusRange[0]), 2))
661 return NO_MEMORY;
662
663
664
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700665
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700666
667 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_FRAME_DURATION,
668 &(metadata->dm.sensor.frameDuration), 1))
669 return NO_MEMORY;
670
671 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY,
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700672 &(metadata->dm.aa.isoValue), 1))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700673 return NO_MEMORY;
674
675 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
676 &(metadata->dm.sensor.timeStamp), 1))
677 return NO_MEMORY;
678
679
680
681 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_MODE,
682 &(metadata->dm.flash.flashMode), 1))
683 return NO_MEMORY;
684
685 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_FIRING_POWER,
686 &(metadata->dm.flash.firingPower), 1))
687 return NO_MEMORY;
688
689 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_FIRING_TIME,
690 &(metadata->dm.flash.firingPower), 1))
691 return NO_MEMORY;
692
693
694
695 if (0 != add_camera_metadata_entry(dst, ANDROID_HOT_PIXEL_MODE,
696 &(metadata->dm.hotpixel.mode), 1))
697 return NO_MEMORY;
698
699
700
701 if (0 != add_camera_metadata_entry(dst, ANDROID_DEMOSAIC_MODE,
702 &(metadata->dm.demosaic.mode), 1))
703 return NO_MEMORY;
704
705
706
707 if (0 != add_camera_metadata_entry(dst, ANDROID_NOISE_MODE,
708 &(metadata->dm.noise.mode), 1))
709 return NO_MEMORY;
710
711 if (0 != add_camera_metadata_entry(dst, ANDROID_NOISE_STRENGTH,
712 &(metadata->dm.noise.strength), 1))
713 return NO_MEMORY;
714
715
716 if (0 != add_camera_metadata_entry(dst, ANDROID_SHADING_MODE,
717 &(metadata->dm.shading.mode), 1))
718 return NO_MEMORY;
719
720
721
722 if (0 != add_camera_metadata_entry(dst, ANDROID_GEOMETRIC_MODE,
723 &(metadata->dm.geometric.mode), 1))
724 return NO_MEMORY;
725
726
727
728 if (0 != add_camera_metadata_entry(dst, ANDROID_COLOR_MODE,
729 &(metadata->dm.color.mode), 1))
730 return NO_MEMORY;
731
732 if (0 != add_camera_metadata_entry(dst, ANDROID_COLOR_TRANSFORM,
733 &(metadata->dm.color.transform), 9))
734 return NO_MEMORY;
735
736
737
738 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_MODE,
739 &(metadata->dm.tonemap.mode), 1))
740 return NO_MEMORY;
741
742 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_RED,
743 &(metadata->dm.tonemap.curveRed), 32))
744 return NO_MEMORY;
745
746 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_GREEN,
747 &(metadata->dm.tonemap.curveGreen), 32))
748 return NO_MEMORY;
749
750 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_BLUE,
751 &(metadata->dm.tonemap.curveBlue), 32))
752 return NO_MEMORY;
753
754
755
756 if (0 != add_camera_metadata_entry(dst, ANDROID_EDGE_MODE,
757 &(metadata->dm.edge.mode), 1))
758 return NO_MEMORY;
759
760 if (0 != add_camera_metadata_entry(dst, ANDROID_EDGE_STRENGTH,
761 &(metadata->dm.edge.strength), 1))
762 return NO_MEMORY;
763
764
765
766 if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION,
767 &(metadata->dm.scaler.cropRegion), 3))
768 return NO_MEMORY;
769
770
771
772 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_QUALITY,
773 &(metadata->dm.jpeg.quality), 1))
774 return NO_MEMORY;
775
776 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_SIZE,
777 &(metadata->dm.jpeg.thumbnailSize), 2))
778 return NO_MEMORY;
779
780 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_QUALITY,
781 &(metadata->dm.jpeg.thumbnailQuality), 1))
782 return NO_MEMORY;
783
784 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_COORDINATES,
785 &(metadata->dm.jpeg.gpsCoordinates), 2)) // needs check
786 return NO_MEMORY;
787
788 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_PROCESSING_METHOD,
789 &(metadata->dm.jpeg.gpsProcessingMethod), 32))
790 return NO_MEMORY;
791
792 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_TIMESTAMP,
793 &(metadata->dm.jpeg.gpsTimestamp), 1))
794 return NO_MEMORY;
795
796 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_ORIENTATION,
797 &(metadata->dm.jpeg.orientation), 1))
798 return NO_MEMORY;
799
800
801
802 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_DETECT_MODE,
803 &(metadata->dm.stats.faceDetectMode), 1))
804 return NO_MEMORY;
805
806 // TODO : more stat entries
807
808
809
810 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_MODE,
811 &(metadata->dm.aa.mode), 1))
812 return NO_MEMORY;
813
814 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_CAPTURE_INTENT,
815 &(metadata->dm.aa.captureIntent), 1))
816 return NO_MEMORY;
817
818 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_EFFECT_MODE,
819 &(metadata->dm.aa.effect_mode), 1))
820 return NO_MEMORY;
821
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700822
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700823
824 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_REGIONS,
825 &(metadata->dm.aa.aeRegions), 5))
826 return NO_MEMORY;
827
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700828
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700829
830 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE,
831 &(metadata->dm.aa.aeState), 1))
832 return NO_MEMORY;
833
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700834
835 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_REGIONS,
836 &(metadata->dm.aa.awbRegions), 5))
837 return NO_MEMORY;
838
839 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE,
840 &(metadata->dm.aa.awbState), 1))
841 return NO_MEMORY;
842
843 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_MODE,
844 &(metadata->dm.aa.afMode), 1))
845 return NO_MEMORY;
846
847 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_REGIONS,
848 &(metadata->dm.aa.afRegions), 5))
849 return NO_MEMORY;
850
851 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_STATE,
852 &(metadata->dm.aa.afState), 1))
853 return NO_MEMORY;
854
855 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
856 &(metadata->dm.aa.videoStabilizationMode), 1))
857 return NO_MEMORY;
858
859
860 return NO_ERROR;
861
862/*
863typedef struct camera2_dm {
864 camera2_request_dm_t request;
865 camera2_lens_dm_t lens;
866 camera2_sensor_dm_t sensor;
867 camera2_flash_dm_t flash;
868 camera2_hotpixel_dm_t hotpixel;
869 camera2_demosaic_dm_t demosaic;
870 camera2_noisereduction_dm_t noise;
871 camera2_shading_dm_t shading;
872 camera2_geometric_dm_t geometric;
873 camera2_colorcorrection_dm_t color;
874 camera2_tonemap_dm_t tonemap;
875 camera2_edge_dm_t edge;
876 camera2_scaler_dm_t scaler;
877 camera2_jpeg_dm_t jpeg;
878 camera2_stats_dm_t stats;
879 camera2_aa_dm_t aa;
880} camera2_dm_t;
881*/
882
883}
884#endif
885
886
887}; // namespace android