blob: 42bdf6f7f950d63dc504991857c4b1a4ab7e2878 [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 Kang13d8c7b2012-07-14 10:20:39 +090083 ALOGV("DEBUG(%s):", __FUNCTION__);
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;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070091 num_entry = (uint32_t)get_camera_metadata_data_count(request);
92 for (index = 0 ; index < num_entry ; index++) {
93
94 if (get_camera_metadata_entry(request, index, &curr_entry)==0) {
95 //ALOGV("### MetadataConverter.ToInternalCtl. tag(%x)", curr_entry.tag);
96 switch (curr_entry.tag) {
97
98 case ANDROID_LENS_FOCUS_DISTANCE:
99 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
100 break;
101 dst->ctl.lens.focusDistance = curr_entry.data.f[0];
102 break;
103
104 case ANDROID_LENS_APERTURE:
105 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
106 break;
107 dst->ctl.lens.aperture = curr_entry.data.f[0];
108 break;
109
110 case ANDROID_LENS_FOCAL_LENGTH:
111 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
112 break;
113 dst->ctl.lens.focalLength = curr_entry.data.f[0];
114 break;
115
116 case ANDROID_LENS_FILTER_DENSITY:
117 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1))
118 break;
119 dst->ctl.lens.filterDensity = curr_entry.data.f[0];
120 break;
121
122 case ANDROID_LENS_OPTICAL_STABILIZATION_MODE:
123 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
124 break;
125 dst->ctl.lens.opticalStabilizationMode =
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700126 (enum optical_stabilization_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700127 break;
128
129
130
131 case ANDROID_SENSOR_EXPOSURE_TIME:
132 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
133 break;
134 dst->ctl.sensor.exposureTime = curr_entry.data.i64[0];
135 break;
136
137 case ANDROID_SENSOR_FRAME_DURATION:
138 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
139 break;
140 dst->ctl.sensor.frameDuration = curr_entry.data.i64[0];
141 break;
142
143 case ANDROID_SENSOR_SENSITIVITY:
144 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
145 break;
146 dst->ctl.sensor.sensitivity = curr_entry.data.i32[0];
147 break;
148
149
150
151 case ANDROID_FLASH_MODE:
152 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
153 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700154 dst->ctl.flash.flashMode = (enum flash_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700155 break;
156
157 case ANDROID_FLASH_FIRING_POWER:
158 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
159 break;
160 dst->ctl.flash.firingPower = curr_entry.data.u8[0];
161 break;
162
163 case ANDROID_FLASH_FIRING_TIME:
164 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
165 break;
166 dst->ctl.flash.firingTime = curr_entry.data.i64[0];
167 break;
168
169
170
171 case ANDROID_HOT_PIXEL_MODE:
172 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
173 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700174 dst->ctl.hotpixel.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700175 break;
176
177
178
179 case ANDROID_DEMOSAIC_MODE:
180 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
181 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700182 dst->ctl.demosaic.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700183 break;
184
185
186
187 case ANDROID_NOISE_MODE:
188 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
189 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700190 dst->ctl.noise.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700191 break;
192
193 case ANDROID_NOISE_STRENGTH:
194 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
195 break;
196 dst->ctl.noise.strength= curr_entry.data.u8[0];
197 break;
198
199
200
201 case ANDROID_SHADING_MODE:
202 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
203 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700204 dst->ctl.shading.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700205 break;
206
207
208
209 case ANDROID_GEOMETRIC_MODE:
210 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
211 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700212 dst->ctl.geometric.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700213 break;
214
215
216
217 case ANDROID_COLOR_MODE:
218 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
219 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700220 dst->ctl.color.mode = (enum colorcorrection_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700221 break;
222
223 case ANDROID_COLOR_TRANSFORM:
224 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 9))
225 break;
226 for (i=0 ; i<curr_entry.count ; i++)
227 dst->ctl.color.transform[i] = curr_entry.data.f[i];
228 break;
229
230
231
232 case ANDROID_TONEMAP_MODE:
233 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
234 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700235 dst->ctl.tonemap.mode = (enum tonemap_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700236 break;
237
238 case ANDROID_TONEMAP_CURVE_RED:
239 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 32))
240 break;
241 for (i=0 ; i<curr_entry.count ; i++)
242 dst->ctl.tonemap.curveRed[i] = curr_entry.data.f[i];
243 break;
244
245 case ANDROID_TONEMAP_CURVE_GREEN:
246 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 32))
247 break;
248 for (i=0 ; i<curr_entry.count ; i++)
249 dst->ctl.tonemap.curveGreen[i] = curr_entry.data.f[i];
250 break;
251
252 case ANDROID_TONEMAP_CURVE_BLUE:
253 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 32))
254 break;
255 for (i=0 ; i<curr_entry.count ; i++)
256 dst->ctl.tonemap.curveBlue[i] = curr_entry.data.f[i];
257 break;
258
259
260
261 case ANDROID_EDGE_MODE:
262 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
263 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700264 dst->ctl.edge.mode = (enum processing_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700265 break;
266
267 case ANDROID_EDGE_STRENGTH:
268 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
269 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700270 dst->ctl.edge.strength = curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700271 break;
272
273
274
275 case ANDROID_SCALER_CROP_REGION:
276 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 3))
277 break;
278 for (i=0 ; i<curr_entry.count ; i++)
279 dst->ctl.scaler.cropRegion[i] = curr_entry.data.i32[i];
280 break;
281
282
283
284 case ANDROID_JPEG_QUALITY:
285 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
286 break;
287 dst->ctl.jpeg.quality= curr_entry.data.i32[0];
288 break;
289
290 case ANDROID_JPEG_THUMBNAIL_SIZE:
291 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
292 break;
293 for (i=0 ; i<curr_entry.count ; i++)
294 dst->ctl.jpeg.thumbnailSize[i] = curr_entry.data.i32[i];
295 break;
296
297 case ANDROID_JPEG_THUMBNAIL_QUALITY:
298 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
299 break;
300 dst->ctl.jpeg.thumbnailQuality= curr_entry.data.i32[0];
301 break;
302
303 case ANDROID_JPEG_GPS_COORDINATES:
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700304 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_DOUBLE, 3))
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700305 break;
306 for (i=0 ; i<curr_entry.count ; i++)
307 dst->ctl.jpeg.gpsCoordinates[i] = curr_entry.data.d[i];
308 break;
309
310 case ANDROID_JPEG_GPS_PROCESSING_METHOD:
311 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 32))
312 break;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700313 for (i=0 ; i<curr_entry.count ; i++)
314 dst_ext->gpsProcessingMethod[i] = curr_entry.data.u8[i];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700315 break;
316
317 case ANDROID_JPEG_GPS_TIMESTAMP:
318 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1))
319 break;
320 dst->ctl.jpeg.gpsTimestamp = curr_entry.data.i64[0];
321 break;
322
323 case ANDROID_JPEG_ORIENTATION:
324 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
325 break;
326 dst->ctl.jpeg.orientation = curr_entry.data.i32[0];
327 break;
328
329
330
331 case ANDROID_STATS_FACE_DETECT_MODE:
332 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
333 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700334 dst->ctl.stats.faceDetectMode = (enum facedetect_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700335 break;
336
337 case ANDROID_STATS_HISTOGRAM_MODE:
338 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
339 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700340 dst->ctl.stats.histogramMode = (enum stats_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700341 break;
342
343 case ANDROID_STATS_SHARPNESS_MAP_MODE:
344 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
345 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700346 dst->ctl.stats.sharpnessMapMode = (enum stats_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700347 break;
348
349
350
351 case ANDROID_CONTROL_CAPTURE_INTENT:
352 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
353 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700354 dst->ctl.aa.captureIntent = (enum aa_capture_intent)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900355 break;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700356
357 case ANDROID_CONTROL_MODE:
358 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
359 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700360 dst->ctl.aa.mode = (enum aa_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700361 break;
362
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700363
364 case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE:
365 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
366 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700367 dst->ctl.aa.videoStabilizationMode = curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700368 break;
369
370 case ANDROID_CONTROL_AE_MODE:
371 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
372 break;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700373 dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700374 break;
375
376 case ANDROID_CONTROL_AE_REGIONS:
377 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
378 break;
379 for (i=0 ; i<curr_entry.count ; i++)
380 dst->ctl.aa.aeRegions[i] = curr_entry.data.i32[i];
381 break;
382
383 case ANDROID_CONTROL_AE_EXP_COMPENSATION:
384 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
385 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700386 dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700387 break;
388
389 case ANDROID_CONTROL_AE_TARGET_FPS_RANGE:
390 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2))
391 break;
392 for (i=0 ; i<curr_entry.count ; i++)
393 dst->ctl.aa.aeTargetFpsRange[i] = curr_entry.data.i32[i];
394 break;
395
396 case ANDROID_CONTROL_AE_ANTIBANDING_MODE:
397 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
398 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700399 dst->ctl.aa.aeAntibandingMode = (enum aa_ae_antibanding_mode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700400 break;
401
402 case ANDROID_CONTROL_AWB_MODE:
403 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
404 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700405 dst->ctl.aa.awbMode = (enum aa_awbmode)(curr_entry.data.u8[0] + 1);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700406 break;
407
408 case ANDROID_CONTROL_AWB_REGIONS:
409 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
410 break;
411 for (i=0 ; i<curr_entry.count ; i++)
412 dst->ctl.aa.awbRegions[i] = curr_entry.data.i32[i];
413 break;
414
415 case ANDROID_CONTROL_AF_MODE:
416 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
417 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700418 dst->ctl.aa.afMode = (enum aa_afmode)curr_entry.data.u8[0];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700419 break;
420
421 case ANDROID_CONTROL_AF_REGIONS:
422 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5))
423 break;
424 for (i=0 ; i<curr_entry.count ; i++)
425 dst->ctl.aa.afRegions[i] = curr_entry.data.i32[i];
426 break;
427
428
429
430 case ANDROID_REQUEST_ID:
431 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
432 break;
433 dst->ctl.request.id = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900434 ALOGV("DEBUG(%s): ANDROID_REQUEST_ID (%d)", __FUNCTION__, dst->ctl.request.id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700435 break;
436
437 case ANDROID_REQUEST_METADATA_MODE:
438 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1))
439 break;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700440 dst->ctl.request.metadataMode = (enum metadata_mode)curr_entry.data.u8[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900441 ALOGV("DEBUG(%s): ANDROID_REQUEST_METADATA_MODE (%d)", __FUNCTION__, (int)( dst->ctl.request.metadataMode));
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700442 break;
443
444 case ANDROID_REQUEST_OUTPUT_STREAMS:
445 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE))
446 break;
Sungjoong Kangad378612012-08-17 12:34:33 -0700447
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900448 for (i=0 ; i<curr_entry.count ; i++) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700449 dst->ctl.request.outputStreams[i] = curr_entry.data.u8[i];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900450 ALOGV("DEBUG(%s): OUTPUT_STREAM[%d] = %d ", __FUNCTION__, i, (int)(dst->ctl.request.outputStreams[i]));
451 }
Sungjoong Kangad378612012-08-17 12:34:33 -0700452
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700453 dst->ctl.request.outputStreams[15] = curr_entry.count;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700454 break;
455
456 case ANDROID_REQUEST_FRAME_COUNT:
457 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1))
458 break;
459 dst->ctl.request.frameCount = curr_entry.data.i32[0];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900460 ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)", __FUNCTION__, dst->ctl.request.frameCount);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700461 break;
462
463 default:
Sungjoong Kangad378612012-08-17 12:34:33 -0700464 ALOGV("DEBUG(%s):Bad Metadata tag (%d)", __FUNCTION__, curr_entry.tag);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700465 break;
466 }
467 }
468 }
469
470 return NO_ERROR;
471}
472
473
474
475
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700476status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700477{
478 status_t res;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700479 struct camera2_shot * metadata = &metadata_ext->shot;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700480 uint8_t byteData;
481 uint32_t intData;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700482
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700483 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
484 &(metadata->ctl.request.id), 1))
485 return NO_MEMORY;
486
487 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
488 &(metadata->ctl.request.metadataMode), 1))
489 return NO_MEMORY;
490
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700491 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
492 &(metadata->ctl.request.frameCount), 1))
493 return NO_MEMORY;
494
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700495 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
496 &metadata->dm.sensor.timeStamp, 1))
497 return NO_MEMORY;
498
499 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_EXPOSURE_TIME,
500 &metadata->dm.sensor.exposureTime, 1))
501 return NO_MEMORY;
502
503 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
504 &metadata->dm.lens.aperture, 1))
505 return NO_MEMORY;
506
507 ALOGV("(%s): ID(%d) METAMODE(%d) FrameCnt(%d) Timestamp(%lld) exposure(%lld) aper(%f)", __FUNCTION__,
508 metadata->ctl.request.id, metadata->ctl.request.metadataMode, metadata->ctl.request.frameCount,
509 metadata->dm.sensor.timeStamp, metadata->dm.sensor.exposureTime, metadata->dm.lens.aperture);
510
511
512 byteData = metadata->dm.aa.awbMode - 1;
513 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_MODE,
514 &byteData, 1))
515 return NO_MEMORY;
516
517 byteData = metadata->dm.aa.aeMode - 1;
518 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_MODE,
519 &byteData, 1))
520 return NO_MEMORY;
521
522 byteData = metadata->ctl.aa.sceneMode - 1;
523 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_SCENE_MODE,
524 &byteData, 1))
525 return NO_MEMORY;
526
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700527 intData = metadata->ctl.aa.aeExpCompensation;
528 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_EXP_COMPENSATION,
529 &intData, 1))
530 return NO_MEMORY;
531
532
Sungjoong Kangad378612012-08-17 12:34:33 -0700533 ALOGV("(%s): AWB(%d) AE(%d) SCENE(%d) AEComp(%d)", __FUNCTION__,
534 metadata->dm.aa.awbMode - 1, metadata->dm.aa.aeMode - 1, metadata->ctl.aa.sceneMode - 1,
535 metadata->ctl.aa.aeExpCompensation );
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700536
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700537
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700538 if (metadata->ctl.request.metadataMode == METADATA_MODE_NONE) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900539 ALOGV("DEBUG(%s): METADATA_MODE_NONE", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700540 return NO_ERROR;
541 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700542 return NO_ERROR;
543
544
545}
546
547#if 0 // blocked for alpha version
548
549status_t MetadataConverter::ToDynamicMetadata(camera2_ctl_metadata_t * metadata, camera_metadata_t * dst)
550{
551 status_t res;
552
553 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID,
554 &(metadata->dm.request.id), 1))
555 return NO_MEMORY;
556
557 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE,
558 &(metadata->dm.request.metadataMode), 1))
559 return NO_MEMORY;
560
561 // needs check!
562 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT,
563 &(metadata->dm.request.frameCount), 1))
564 return NO_MEMORY;
565
566
567 if (metadata->dm.request.metadataMode == METADATA_MODE_NONE) {
568 ALOGD("DEBUG(%s): METADATA_MODE_NONE", __func__);
569 return NO_ERROR;
570 }
571
572 ALOGD("DEBUG(%s): METADATA_MODE_FULL", __func__);
573
574 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCUS_DISTANCE,
575 &(metadata->dm.lens.focusDistance), 1))
576 return NO_MEMORY;
577
578 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
579 &(metadata->dm.lens.aperture), 1))
580 return NO_MEMORY;
581
582 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCAL_LENGTH,
583 &(metadata->dm.lens.focalLength), 1))
584 return NO_MEMORY;
585
586 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FILTER_DENSITY,
587 &(metadata->dm.lens.filterDensity), 1))
588 return NO_MEMORY;
589
590 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
591 &(metadata->dm.lens.opticalStabilizationMode), 1))
592 return NO_MEMORY;
593
594 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE,
595 &(metadata->dm.lens.aperture), 1))
596 return NO_MEMORY;
597
598 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_FOCUS_RANGE,
599 &(metadata->dm.lens.focusRange[0]), 2))
600 return NO_MEMORY;
601
602
603
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700604
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700605
606 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_FRAME_DURATION,
607 &(metadata->dm.sensor.frameDuration), 1))
608 return NO_MEMORY;
609
610 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY,
611 &(metadata->dm.sensor.sensitivity), 1))
612 return NO_MEMORY;
613
614 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP,
615 &(metadata->dm.sensor.timeStamp), 1))
616 return NO_MEMORY;
617
618
619
620 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_MODE,
621 &(metadata->dm.flash.flashMode), 1))
622 return NO_MEMORY;
623
624 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_FIRING_POWER,
625 &(metadata->dm.flash.firingPower), 1))
626 return NO_MEMORY;
627
628 if (0 != add_camera_metadata_entry(dst, ANDROID_FLASH_FIRING_TIME,
629 &(metadata->dm.flash.firingPower), 1))
630 return NO_MEMORY;
631
632
633
634 if (0 != add_camera_metadata_entry(dst, ANDROID_HOT_PIXEL_MODE,
635 &(metadata->dm.hotpixel.mode), 1))
636 return NO_MEMORY;
637
638
639
640 if (0 != add_camera_metadata_entry(dst, ANDROID_DEMOSAIC_MODE,
641 &(metadata->dm.demosaic.mode), 1))
642 return NO_MEMORY;
643
644
645
646 if (0 != add_camera_metadata_entry(dst, ANDROID_NOISE_MODE,
647 &(metadata->dm.noise.mode), 1))
648 return NO_MEMORY;
649
650 if (0 != add_camera_metadata_entry(dst, ANDROID_NOISE_STRENGTH,
651 &(metadata->dm.noise.strength), 1))
652 return NO_MEMORY;
653
654
655 if (0 != add_camera_metadata_entry(dst, ANDROID_SHADING_MODE,
656 &(metadata->dm.shading.mode), 1))
657 return NO_MEMORY;
658
659
660
661 if (0 != add_camera_metadata_entry(dst, ANDROID_GEOMETRIC_MODE,
662 &(metadata->dm.geometric.mode), 1))
663 return NO_MEMORY;
664
665
666
667 if (0 != add_camera_metadata_entry(dst, ANDROID_COLOR_MODE,
668 &(metadata->dm.color.mode), 1))
669 return NO_MEMORY;
670
671 if (0 != add_camera_metadata_entry(dst, ANDROID_COLOR_TRANSFORM,
672 &(metadata->dm.color.transform), 9))
673 return NO_MEMORY;
674
675
676
677 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_MODE,
678 &(metadata->dm.tonemap.mode), 1))
679 return NO_MEMORY;
680
681 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_RED,
682 &(metadata->dm.tonemap.curveRed), 32))
683 return NO_MEMORY;
684
685 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_GREEN,
686 &(metadata->dm.tonemap.curveGreen), 32))
687 return NO_MEMORY;
688
689 if (0 != add_camera_metadata_entry(dst, ANDROID_TONEMAP_CURVE_BLUE,
690 &(metadata->dm.tonemap.curveBlue), 32))
691 return NO_MEMORY;
692
693
694
695 if (0 != add_camera_metadata_entry(dst, ANDROID_EDGE_MODE,
696 &(metadata->dm.edge.mode), 1))
697 return NO_MEMORY;
698
699 if (0 != add_camera_metadata_entry(dst, ANDROID_EDGE_STRENGTH,
700 &(metadata->dm.edge.strength), 1))
701 return NO_MEMORY;
702
703
704
705 if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION,
706 &(metadata->dm.scaler.cropRegion), 3))
707 return NO_MEMORY;
708
709
710
711 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_QUALITY,
712 &(metadata->dm.jpeg.quality), 1))
713 return NO_MEMORY;
714
715 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_SIZE,
716 &(metadata->dm.jpeg.thumbnailSize), 2))
717 return NO_MEMORY;
718
719 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_QUALITY,
720 &(metadata->dm.jpeg.thumbnailQuality), 1))
721 return NO_MEMORY;
722
723 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_COORDINATES,
724 &(metadata->dm.jpeg.gpsCoordinates), 2)) // needs check
725 return NO_MEMORY;
726
727 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_PROCESSING_METHOD,
728 &(metadata->dm.jpeg.gpsProcessingMethod), 32))
729 return NO_MEMORY;
730
731 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_TIMESTAMP,
732 &(metadata->dm.jpeg.gpsTimestamp), 1))
733 return NO_MEMORY;
734
735 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_ORIENTATION,
736 &(metadata->dm.jpeg.orientation), 1))
737 return NO_MEMORY;
738
739
740
741 if (0 != add_camera_metadata_entry(dst, ANDROID_STATS_FACE_DETECT_MODE,
742 &(metadata->dm.stats.faceDetectMode), 1))
743 return NO_MEMORY;
744
745 // TODO : more stat entries
746
747
748
749 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_MODE,
750 &(metadata->dm.aa.mode), 1))
751 return NO_MEMORY;
752
753 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_CAPTURE_INTENT,
754 &(metadata->dm.aa.captureIntent), 1))
755 return NO_MEMORY;
756
757 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_EFFECT_MODE,
758 &(metadata->dm.aa.effect_mode), 1))
759 return NO_MEMORY;
760
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700761
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700762
763 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_REGIONS,
764 &(metadata->dm.aa.aeRegions), 5))
765 return NO_MEMORY;
766
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700767
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700768
769 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE,
770 &(metadata->dm.aa.aeState), 1))
771 return NO_MEMORY;
772
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700773
774 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_REGIONS,
775 &(metadata->dm.aa.awbRegions), 5))
776 return NO_MEMORY;
777
778 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE,
779 &(metadata->dm.aa.awbState), 1))
780 return NO_MEMORY;
781
782 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_MODE,
783 &(metadata->dm.aa.afMode), 1))
784 return NO_MEMORY;
785
786 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_REGIONS,
787 &(metadata->dm.aa.afRegions), 5))
788 return NO_MEMORY;
789
790 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_STATE,
791 &(metadata->dm.aa.afState), 1))
792 return NO_MEMORY;
793
794 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
795 &(metadata->dm.aa.videoStabilizationMode), 1))
796 return NO_MEMORY;
797
798
799 return NO_ERROR;
800
801/*
802typedef struct camera2_dm {
803 camera2_request_dm_t request;
804 camera2_lens_dm_t lens;
805 camera2_sensor_dm_t sensor;
806 camera2_flash_dm_t flash;
807 camera2_hotpixel_dm_t hotpixel;
808 camera2_demosaic_dm_t demosaic;
809 camera2_noisereduction_dm_t noise;
810 camera2_shading_dm_t shading;
811 camera2_geometric_dm_t geometric;
812 camera2_colorcorrection_dm_t color;
813 camera2_tonemap_dm_t tonemap;
814 camera2_edge_dm_t edge;
815 camera2_scaler_dm_t scaler;
816 camera2_jpeg_dm_t jpeg;
817 camera2_stats_dm_t stats;
818 camera2_aa_dm_t aa;
819} camera2_dm_t;
820*/
821
822}
823#endif
824
825
826}; // namespace android