1 /* 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 (at) samsung.com) 23 * \date 2012/05/31 24 * 25 * <b>Revision History: </b> 26 * - 2012/05/31 : Sungjoong Kang(sj3.kang (at) samsung.com) \n 27 * Initial Release 28 */ 29 30 //#define LOG_NDEBUG 0 31 #define LOG_TAG "MetadataConverter" 32 #include <utils/Log.h> 33 34 #include "MetadataConverter.h" 35 #include "exynos_format.h" 36 37 namespace android { 38 39 40 MetadataConverter::MetadataConverter() 41 { 42 return; 43 } 44 45 46 MetadataConverter::~MetadataConverter() 47 { 48 ALOGV("DEBUG(%s)destroy!!:", __FUNCTION__); 49 return; 50 } 51 52 status_t MetadataConverter::CheckEntryTypeMismatch(camera_metadata_entry_t * entry, 53 uint8_t type) 54 { 55 if (!(entry->type==type)) 56 { 57 ALOGV("DEBUG(%s):Metadata Missmatch tag(%s) type (%d) count(%d)", 58 __FUNCTION__, get_camera_metadata_tag_name(entry->tag), entry->type, entry->count); 59 return BAD_VALUE; 60 } 61 return NO_ERROR; 62 } 63 64 status_t MetadataConverter::CheckEntryTypeMismatch(camera_metadata_entry_t * entry, 65 uint8_t type, size_t count) 66 { 67 if (!((entry->type==type)&&(entry->count==count))) 68 { 69 ALOGV("DEBUG(%s):Metadata Missmatch tag(%s) type (%d) count(%d)", 70 __FUNCTION__, get_camera_metadata_tag_name(entry->tag), entry->type, entry->count); 71 return BAD_VALUE; 72 } 73 return NO_ERROR; 74 } 75 76 status_t MetadataConverter::ToInternalShot(camera_metadata_t * request, struct camera2_shot_ext * dst_ext) 77 { 78 uint32_t num_entry = 0; 79 uint32_t index = 0; 80 uint32_t i = 0; 81 uint32_t cnt = 0; 82 camera_metadata_entry_t curr_entry; 83 struct camera2_shot * dst = NULL; 84 85 if (request == NULL || dst_ext == NULL) 86 return BAD_VALUE; 87 88 memset((void*)dst_ext, 0, sizeof(struct camera2_shot_ext)); 89 dst = &dst_ext->shot; 90 91 dst->magicNumber = 0x23456789; 92 dst->ctl.aa.aeTargetFpsRange[0] = 15; 93 dst->ctl.aa.aeTargetFpsRange[1] = 30; 94 dst->ctl.aa.aeExpCompensation = 5; 95 96 num_entry = (uint32_t)get_camera_metadata_entry_count(request); 97 for (index = 0 ; index < num_entry ; index++) { 98 99 if (get_camera_metadata_entry(request, index, &curr_entry)==0) { 100 switch (curr_entry.tag) { 101 102 case ANDROID_LENS_FOCUS_DISTANCE: 103 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1)) 104 break; 105 dst->ctl.lens.focusDistance = curr_entry.data.f[0]; 106 break; 107 108 case ANDROID_LENS_APERTURE: 109 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1)) 110 break; 111 dst->ctl.lens.aperture = curr_entry.data.f[0]; 112 break; 113 114 case ANDROID_LENS_FOCAL_LENGTH: 115 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1)) 116 break; 117 dst->ctl.lens.focalLength = curr_entry.data.f[0]; 118 break; 119 120 case ANDROID_LENS_FILTER_DENSITY: 121 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_FLOAT, 1)) 122 break; 123 dst->ctl.lens.filterDensity = curr_entry.data.f[0]; 124 break; 125 126 case ANDROID_LENS_OPTICAL_STABILIZATION_MODE: 127 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 128 break; 129 dst->ctl.lens.opticalStabilizationMode = 130 (enum optical_stabilization_mode)curr_entry.data.u8[0]; 131 break; 132 133 134 case ANDROID_SENSOR_TIMESTAMP: 135 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1)) 136 break; 137 dst->dm.sensor.timeStamp = curr_entry.data.i64[0]; 138 break; 139 140 141 case ANDROID_SENSOR_SENSITIVITY: 142 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1)) 143 break; 144 dst->dm.aa.isoValue = curr_entry.data.i32[0]; 145 break; 146 147 case ANDROID_SENSOR_EXPOSURE_TIME: 148 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1)) 149 break; 150 dst->dm.sensor.exposureTime = curr_entry.data.i64[0]; 151 break; 152 153 154 case ANDROID_FLASH_MODE: 155 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 156 break; 157 dst->ctl.flash.flashMode = (enum flash_mode)(curr_entry.data.u8[0] + 1); 158 break; 159 160 case ANDROID_FLASH_FIRING_POWER: 161 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 162 break; 163 dst->ctl.flash.firingPower = curr_entry.data.u8[0]; 164 break; 165 166 case ANDROID_FLASH_FIRING_TIME: 167 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1)) 168 break; 169 dst->ctl.flash.firingTime = curr_entry.data.i64[0]; 170 break; 171 172 173 174 case ANDROID_SCALER_CROP_REGION: 175 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 4)) 176 break; 177 for (i=0 ; i<3; i++) 178 dst->ctl.scaler.cropRegion[i] = ALIGN(curr_entry.data.i32[i], 2); 179 break; 180 181 182 case ANDROID_JPEG_QUALITY: 183 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1)) 184 break; 185 dst->ctl.jpeg.quality= curr_entry.data.i32[0]; 186 break; 187 188 case ANDROID_JPEG_THUMBNAIL_SIZE: 189 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2)) 190 break; 191 for (i=0 ; i<curr_entry.count ; i++) 192 dst->ctl.jpeg.thumbnailSize[i] = curr_entry.data.i32[i]; 193 break; 194 195 case ANDROID_JPEG_THUMBNAIL_QUALITY: 196 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1)) 197 break; 198 dst->ctl.jpeg.thumbnailQuality= curr_entry.data.i32[0]; 199 break; 200 201 case ANDROID_JPEG_GPS_COORDINATES: 202 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_DOUBLE, 3)) 203 break; 204 for (i=0 ; i<curr_entry.count ; i++) 205 dst->ctl.jpeg.gpsCoordinates[i] = curr_entry.data.d[i]; 206 break; 207 208 case ANDROID_JPEG_GPS_PROCESSING_METHOD: 209 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE)) 210 break; 211 if (curr_entry.count > 32) 212 cnt = 32; 213 else 214 cnt = curr_entry.count; 215 for (i = 0 ; i < cnt ; i++) 216 dst_ext->gpsProcessingMethod[i] = curr_entry.data.u8[i]; 217 break; 218 219 case ANDROID_JPEG_GPS_TIMESTAMP: 220 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT64, 1)) 221 break; 222 dst->ctl.jpeg.gpsTimestamp = curr_entry.data.i64[0]; 223 break; 224 225 case ANDROID_JPEG_ORIENTATION: 226 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1)) 227 break; 228 dst->ctl.jpeg.orientation = curr_entry.data.i32[0]; 229 break; 230 231 232 233 case ANDROID_STATISTICS_FACE_DETECT_MODE: 234 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 235 break; 236 dst->ctl.stats.faceDetectMode = (enum facedetect_mode)(curr_entry.data.u8[0] + 1); 237 break; 238 239 case ANDROID_CONTROL_CAPTURE_INTENT: 240 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 241 break; 242 dst->ctl.aa.captureIntent = (enum aa_capture_intent)curr_entry.data.u8[0]; 243 break; 244 245 case ANDROID_CONTROL_MODE: 246 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 247 break; 248 dst->ctl.aa.mode = (enum aa_mode)(curr_entry.data.u8[0] + 1); 249 break; 250 251 252 case ANDROID_CONTROL_VIDEO_STABILIZATION_MODE: 253 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 254 break; 255 dst->ctl.aa.videoStabilizationMode = curr_entry.data.u8[0]; 256 break; 257 258 case ANDROID_CONTROL_AE_MODE: 259 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 260 break; 261 dst->ctl.aa.aeMode = (enum aa_aemode)(curr_entry.data.u8[0] + 2); 262 // skip locked mode 263 if (dst->ctl.aa.aeMode == AA_AEMODE_LOCKED) 264 dst->ctl.aa.aeMode = AA_AEMODE_OFF; 265 ALOGV("DEBUG(%s): ANDROID_CONTROL_AE_MODE (%d)", __FUNCTION__, dst->ctl.aa.aeMode); 266 break; 267 268 case ANDROID_CONTROL_AE_LOCK: 269 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 270 break; 271 dst_ext->ae_lock = (enum ae_lockmode)(curr_entry.data.u8[0]); 272 break; 273 274 case ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION: 275 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1)) 276 break; 277 dst->ctl.aa.aeExpCompensation = curr_entry.data.i32[0] + 5; 278 break; 279 280 case ANDROID_CONTROL_AWB_MODE: 281 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 282 break; 283 dst->ctl.aa.awbMode = (enum aa_awbmode)(curr_entry.data.u8[0] + 2); 284 // skip locked mode 285 if (dst->ctl.aa.awbMode == AA_AWBMODE_LOCKED) 286 dst->ctl.aa.awbMode = AA_AWBMODE_OFF; 287 dst_ext->awb_mode_dm = (enum aa_awbmode)(curr_entry.data.u8[0] + 2); 288 break; 289 290 case ANDROID_CONTROL_AWB_LOCK: 291 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 292 break; 293 dst_ext->awb_lock = (enum awb_lockmode)(curr_entry.data.u8[0]); 294 break; 295 296 case ANDROID_CONTROL_AF_MODE: 297 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 298 break; 299 dst->ctl.aa.afMode = (enum aa_afmode)(curr_entry.data.u8[0] + 1); 300 if (dst->ctl.aa.afMode == AA_AFMODE_OFF) 301 dst->ctl.aa.afMode = AA_AFMODE_MANUAL; 302 break; 303 304 case ANDROID_CONTROL_AF_REGIONS: 305 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5)) 306 break; 307 for (i=0 ; i<curr_entry.count ; i++) 308 dst->ctl.aa.afRegions[i] = curr_entry.data.i32[i]; 309 break; 310 311 case ANDROID_CONTROL_AE_REGIONS: 312 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 5)) 313 break; 314 for (i=0 ; i<curr_entry.count ; i++) 315 dst->ctl.aa.aeRegions[i] = curr_entry.data.i32[i]; 316 break; 317 318 319 case ANDROID_REQUEST_ID: 320 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1)) 321 break; 322 dst->ctl.request.id = curr_entry.data.i32[0]; 323 ALOGV("DEBUG(%s): ANDROID_REQUEST_ID (%d)", __FUNCTION__, dst->ctl.request.id); 324 break; 325 326 case ANDROID_REQUEST_METADATA_MODE: 327 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 328 break; 329 dst->ctl.request.metadataMode = (enum metadata_mode)curr_entry.data.u8[0]; 330 ALOGV("DEBUG(%s): ANDROID_REQUEST_METADATA_MODE (%d)", __FUNCTION__, (int)( dst->ctl.request.metadataMode)); 331 break; 332 333 case ANDROID_REQUEST_OUTPUT_STREAMS: 334 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32)) 335 break; 336 337 dst->ctl.request.outputStreams[0] = 0; 338 for (i=0 ; i<curr_entry.count ; i++) { 339 ALOGV("DEBUG(%s): OUTPUT_STREAM[%d] = %d ", __FUNCTION__, i, curr_entry.data.i32[i]); 340 dst->ctl.request.outputStreams[0] |= (1 << curr_entry.data.i32[i]); 341 } 342 break; 343 344 case ANDROID_REQUEST_INPUT_STREAMS: 345 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32)) 346 break; 347 348 for (i=0 ; i<curr_entry.count ; i++) { 349 dst_ext->reprocessInput = curr_entry.data.i32[0]; 350 ALOGV("DEBUG(%s): ANDROID_REQUEST_INPUT_STREAMS[%d] = %d ", __FUNCTION__, i, dst_ext->reprocessInput); 351 } 352 break; 353 354 case ANDROID_REQUEST_TYPE: 355 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 356 break; 357 dst_ext->isReprocessing = curr_entry.data.u8[0]; 358 ALOGV("DEBUG(%s): ANDROID_REQUEST_TYPE (%d)", __FUNCTION__, dst_ext->isReprocessing); 359 break; 360 361 case ANDROID_REQUEST_FRAME_COUNT: 362 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 1)) 363 break; 364 dst->ctl.request.frameCount = curr_entry.data.i32[0]; 365 ALOGV("DEBUG(%s): ANDROID_REQUEST_FRAME_COUNT (%d)", __FUNCTION__, dst->ctl.request.frameCount); 366 break; 367 368 case ANDROID_CONTROL_SCENE_MODE: 369 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_BYTE, 1)) 370 break; 371 dst->ctl.aa.sceneMode = (enum aa_scene_mode)(curr_entry.data.u8[0] + 1); 372 break; 373 374 case ANDROID_CONTROL_AE_TARGET_FPS_RANGE: 375 if (NO_ERROR != CheckEntryTypeMismatch(&curr_entry, TYPE_INT32, 2)) 376 break; 377 for (i=0 ; i<curr_entry.count ; i++) 378 dst->ctl.aa.aeTargetFpsRange[i] = curr_entry.data.i32[i]; 379 break; 380 381 default: 382 ALOGV("DEBUG(%s):Bad Metadata tag (%d)", __FUNCTION__, curr_entry.tag); 383 break; 384 } 385 } 386 } 387 if (dst->ctl.aa.mode != AA_CONTROL_USE_SCENE_MODE) 388 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED; 389 ApplySceneModeParameters(request, dst_ext); 390 return NO_ERROR; 391 } 392 393 status_t MetadataConverter::ApplySceneModeParameters(camera_metadata_t * request, struct camera2_shot_ext * dst_ext) 394 { 395 camera_metadata_entry_t curr_entry; 396 struct camera2_shot * dst = NULL; 397 398 ALOGV("DEBUG(%s):", __FUNCTION__); 399 400 dst = &(dst_ext->shot); 401 402 switch (dst->ctl.aa.sceneMode) { 403 404 case AA_SCENE_MODE_ACTION: 405 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE; 406 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) 407 dst->ctl.aa.aeMode = AA_AEMODE_ON; 408 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO; 409 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO; 410 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO; 411 dst->ctl.aa.isoValue = 0; 412 dst->ctl.aa.aeTargetFpsRange[0] = 30; 413 dst->ctl.aa.aeTargetFpsRange[1] = 30; 414 415 dst->ctl.noise.mode = PROCESSING_MODE_FAST; 416 dst->ctl.noise.strength = 0; 417 dst->ctl.edge.mode = PROCESSING_MODE_FAST; 418 dst->ctl.edge.strength = 0; 419 420 dst->ctl.color.saturation = 3; // means '0' 421 break; 422 423 case AA_SCENE_MODE_PARTY: 424 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE; 425 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) 426 dst->ctl.aa.aeMode = AA_AEMODE_ON; 427 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO; 428 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO; 429 dst->ctl.aa.isoMode = AA_ISOMODE_MANUAL; 430 dst->ctl.aa.isoValue = 200; 431 dst->ctl.aa.aeTargetFpsRange[0] = 15; 432 dst->ctl.aa.aeTargetFpsRange[1] = 30; 433 434 dst->ctl.noise.mode = PROCESSING_MODE_FAST; 435 dst->ctl.noise.strength = 0; 436 dst->ctl.edge.mode = PROCESSING_MODE_FAST; 437 dst->ctl.edge.strength = 0; 438 439 dst->ctl.color.saturation = 4; // means '+1' 440 break; 441 442 case AA_SCENE_MODE_SUNSET: 443 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE; 444 if (dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) 445 dst->ctl.aa.aeMode = AA_AEMODE_ON; 446 dst->ctl.aa.awbMode = AA_AWBMODE_WB_DAYLIGHT; 447 dst_ext->awb_mode_dm = AA_AWBMODE_WB_DAYLIGHT; 448 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO; 449 dst->ctl.aa.isoValue = 0; 450 dst->ctl.aa.aeTargetFpsRange[0] = 15; 451 dst->ctl.aa.aeTargetFpsRange[1] = 30; 452 453 dst->ctl.noise.mode = PROCESSING_MODE_FAST; 454 dst->ctl.noise.strength = 0; 455 dst->ctl.edge.mode = PROCESSING_MODE_FAST; 456 dst->ctl.edge.strength = 0; 457 458 dst->ctl.color.saturation = 3; // means '0' 459 break; 460 461 case AA_SCENE_MODE_NIGHT: 462 dst->ctl.aa.mode = AA_CONTROL_USE_SCENE_MODE; 463 dst->ctl.aa.aeMode = AA_AEMODE_ON; // AE_LOCK is prohibited 464 dst->ctl.aa.awbMode = AA_AWBMODE_WB_AUTO; 465 dst_ext->awb_mode_dm = AA_AWBMODE_WB_AUTO; 466 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO; 467 dst->ctl.aa.isoValue = 0; 468 dst->ctl.aa.aeTargetFpsRange[0] = 8; 469 dst->ctl.aa.aeTargetFpsRange[1] = 30; 470 471 dst->ctl.noise.mode = PROCESSING_MODE_FAST; 472 dst->ctl.noise.strength = 0; 473 dst->ctl.edge.mode = PROCESSING_MODE_FAST; 474 dst->ctl.edge.strength = 0; 475 476 dst->ctl.color.saturation = 3; // means '0' 477 break; 478 479 case AA_SCENE_MODE_FACE_PRIORITY: 480 dst->ctl.aa.mode = AA_CONTROL_AUTO; 481 if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH)) 482 dst->ctl.aa.aeMode = AA_AEMODE_ON; 483 dst->ctl.aa.sceneMode = AA_SCENE_MODE_FACE_PRIORITY; 484 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO; 485 dst->ctl.aa.isoValue = 0; 486 dst->ctl.noise.mode = PROCESSING_MODE_OFF; 487 dst->ctl.noise.strength = 0; 488 dst->ctl.edge.mode = PROCESSING_MODE_OFF; 489 dst->ctl.edge.strength = 0; 490 dst->ctl.color.saturation = 3; // means '0' 491 break; 492 493 default: 494 dst->ctl.aa.mode = AA_CONTROL_AUTO; 495 if ((dst->ctl.aa.aeMode != AA_AEMODE_LOCKED) && (dst->ctl.aa.aeMode < AA_AEMODE_ON_AUTO_FLASH)) 496 dst->ctl.aa.aeMode = AA_AEMODE_ON; 497 dst->ctl.aa.sceneMode = AA_SCENE_MODE_UNSUPPORTED; 498 dst->ctl.aa.isoMode = AA_ISOMODE_AUTO; 499 dst->ctl.aa.isoValue = 0; 500 dst->ctl.noise.mode = PROCESSING_MODE_OFF; 501 dst->ctl.noise.strength = 0; 502 dst->ctl.edge.mode = PROCESSING_MODE_OFF; 503 dst->ctl.edge.strength = 0; 504 dst->ctl.color.saturation = 3; // means '0' 505 break; 506 } 507 508 return NO_ERROR; 509 } 510 511 512 status_t MetadataConverter::ToDynamicMetadata(struct camera2_shot_ext * metadata_ext, camera_metadata_t * dst) 513 { 514 status_t res; 515 struct camera2_shot * metadata = &metadata_ext->shot; 516 uint8_t byteData; 517 uint32_t intData; 518 519 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_ID, 520 &(metadata->ctl.request.id), 1)) 521 return NO_MEMORY; 522 523 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_METADATA_MODE, 524 &(metadata->ctl.request.metadataMode), 1)) 525 return NO_MEMORY; 526 527 if (0 != add_camera_metadata_entry(dst, ANDROID_REQUEST_FRAME_COUNT, 528 &(metadata->ctl.request.frameCount), 1)) 529 return NO_MEMORY; 530 531 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_TIMESTAMP, 532 &metadata->dm.sensor.timeStamp, 1)) 533 return NO_MEMORY; 534 535 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_EXPOSURE_TIME, 536 &metadata->dm.sensor.exposureTime, 1)) 537 return NO_MEMORY; 538 539 if (0 != add_camera_metadata_entry(dst, ANDROID_LENS_APERTURE, 540 &metadata->dm.lens.aperture, 1)) 541 return NO_MEMORY; 542 543 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 544 &(metadata->ctl.aa.aeTargetFpsRange), 2)) 545 return NO_MEMORY; 546 547 ALOGV("(%s): ID(%d) METAMODE(%d) FrameCnt(%d) Timestamp(%lld) exposure(%lld) aper(%f)", __FUNCTION__, 548 metadata->ctl.request.id, metadata->ctl.request.metadataMode, metadata->ctl.request.frameCount, 549 metadata->dm.sensor.timeStamp, metadata->dm.sensor.exposureTime, metadata->dm.lens.aperture); 550 551 552 byteData = metadata_ext->awb_mode_dm- 2; 553 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_MODE, 554 &byteData, 1)) 555 return NO_MEMORY; 556 557 byteData = metadata->dm.aa.aeMode - 1; 558 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_MODE, 559 &byteData, 1)) 560 return NO_MEMORY; 561 562 byteData = metadata->ctl.aa.afMode - 1; 563 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AF_MODE, 564 &byteData, 1)) 565 return NO_MEMORY; 566 567 byteData = metadata->ctl.aa.sceneMode - 1; 568 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_SCENE_MODE, 569 &byteData, 1)) 570 return NO_MEMORY; 571 572 intData = metadata->ctl.aa.aeExpCompensation - 5; 573 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 574 &intData, 1)) 575 return NO_MEMORY; 576 577 byteData = metadata->dm.stats.faceDetectMode - 1; 578 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_DETECT_MODE, 579 &byteData, 1)) 580 return NO_MEMORY; 581 582 int maxFacecount = CAMERA2_MAX_FACES; 583 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 584 &maxFacecount, 1)) 585 return NO_MEMORY; 586 587 int tempFaceCount = 0; 588 for (int i = 0; i < CAMERA2_MAX_FACES; i++) { 589 if (metadata->dm.stats.faceIds[i] > 0) { 590 mataFaceIds[tempFaceCount] = metadata->dm.stats.faceIds[i]; 591 // clipping fd score because the max face score of android is 100 592 if (metadata->dm.stats.faceScores[i] > 100) 593 metaFaceScores[tempFaceCount] = 100; 594 else 595 metaFaceScores[tempFaceCount] = metadata->dm.stats.faceScores[i]; 596 597 memcpy(&mataFaceLandmarks[tempFaceCount][0], &metadata->dm.stats.faceLandmarks[i][0], 6*sizeof(uint32_t)); 598 memcpy(&metaFaceRectangles[tempFaceCount][0], &metadata->dm.stats.faceRectangles[i][0], 4*sizeof(uint32_t)); 599 tempFaceCount++; 600 } 601 } 602 603 if (tempFaceCount > 0) { 604 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_RECTANGLES, 605 &metaFaceRectangles, 4 * tempFaceCount)) 606 return NO_MEMORY; 607 608 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_LANDMARKS, 609 &mataFaceLandmarks, 6 * tempFaceCount)) 610 return NO_MEMORY; 611 612 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_IDS, 613 &mataFaceIds, tempFaceCount)) 614 return NO_MEMORY; 615 616 if (0 != add_camera_metadata_entry(dst, ANDROID_STATISTICS_FACE_SCORES, 617 &metaFaceScores, tempFaceCount)) 618 return NO_MEMORY; 619 } 620 if (0 != add_camera_metadata_entry(dst, ANDROID_SENSOR_SENSITIVITY, 621 &metadata->dm.aa.isoValue, 1)) 622 return NO_MEMORY; 623 624 // Need a four-entry crop region 625 uint32_t cropRegion[4] = { 626 metadata->ctl.scaler.cropRegion[0], 627 metadata->ctl.scaler.cropRegion[1], 628 metadata->ctl.scaler.cropRegion[2], 629 0 630 }; 631 if (0 != add_camera_metadata_entry(dst, ANDROID_SCALER_CROP_REGION, 632 cropRegion, 4)) 633 return NO_MEMORY; 634 635 byteData = metadata->dm.aa.aeState - 1; 636 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AE_STATE, 637 &byteData, 1)) 638 return NO_MEMORY; 639 640 if (0 != add_camera_metadata_entry(dst, ANDROID_CONTROL_AWB_STATE, 641 &(metadata->dm.aa.awbState), 1)) 642 return NO_MEMORY; 643 644 645 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_ORIENTATION, 646 &metadata->ctl.jpeg.orientation, 1)) 647 return NO_MEMORY; 648 649 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_QUALITY, 650 &metadata->ctl.jpeg.quality, 1)) 651 return NO_MEMORY; 652 653 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_SIZE, 654 &metadata->ctl.jpeg.thumbnailSize, 2)) 655 return NO_MEMORY; 656 657 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_THUMBNAIL_QUALITY, 658 &metadata->ctl.jpeg.thumbnailQuality, 1)) 659 return NO_MEMORY; 660 661 662 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_COORDINATES, 663 &(metadata->ctl.jpeg.gpsCoordinates), 3)) 664 return NO_MEMORY; 665 666 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_PROCESSING_METHOD, 667 &(metadata_ext->gpsProcessingMethod), 32)) 668 return NO_MEMORY; 669 670 if (0 != add_camera_metadata_entry(dst, ANDROID_JPEG_GPS_TIMESTAMP, 671 &(metadata->ctl.jpeg.gpsTimestamp), 1)) 672 return NO_MEMORY; 673 ALOGV("(%s): AWB(%d) AE(%d) SCENE(%d) AEComp(%d) AF(%d)", __FUNCTION__, 674 metadata_ext->awb_mode_dm- 2, metadata->dm.aa.aeMode - 1, metadata->ctl.aa.sceneMode - 1, 675 metadata->ctl.aa.aeExpCompensation, metadata->ctl.aa.afMode - 1); 676 677 678 if (metadata->ctl.request.metadataMode == METADATA_MODE_NONE) { 679 ALOGV("DEBUG(%s): METADATA_MODE_NONE", __FUNCTION__); 680 return NO_ERROR; 681 } 682 return NO_ERROR; 683 684 685 } 686 687 }; // namespace android 688