ExynosCamera2.cpp revision e4657e32d8ce4a88f2c15de1de60e27f3d1778ab
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 ExynosCamera2.cpp 21 * \brief source file for static information of camera2 22 * \author Sungjoong Kang(sj3.kang@samsung.com) 23 * \date 2012/08/06 24 * 25 * <b>Revision History: </b> 26 * - 2012/08/06 : Sungjoong Kang(sj3.kang@samsung.com) \n 27 * Initial Release 28 * 29 */ 30 31//#define LOG_NDEBUG 0 32#define LOG_TAG "ExynosCamera2" 33#include <utils/Log.h> 34 35#include "ExynosCamera2.h" 36 37#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) 38 39namespace android { 40 41class Sensor { 42public: 43 /** 44 * Static sensor characteristics 45 */ 46 static const unsigned int kResolution[2][2]; 47 48 static const nsecs_t kExposureTimeRange[2]; 49 static const nsecs_t kFrameDurationRange[2]; 50 static const nsecs_t kMinVerticalBlank; 51 52 static const uint8_t kColorFilterArrangement; 53 54 // Output image data characteristics 55 static const uint32_t kMaxRawValue; 56 static const uint32_t kBlackLevel; 57 // Sensor sensitivity, approximate 58 59 static const float kSaturationVoltage; 60 static const uint32_t kSaturationElectrons; 61 static const float kVoltsPerLuxSecond; 62 static const float kElectronsPerLuxSecond; 63 64 static const float kBaseGainFactor; 65 66 static const float kReadNoiseStddevBeforeGain; // In electrons 67 static const float kReadNoiseStddevAfterGain; // In raw digital units 68 static const float kReadNoiseVarBeforeGain; 69 static const float kReadNoiseVarAfterGain; 70 71 // While each row has to read out, reset, and then expose, the (reset + 72 // expose) sequence can be overlapped by other row readouts, so the final 73 // minimum frame duration is purely a function of row readout time, at least 74 // if there's a reasonable number of rows. 75 static const nsecs_t kRowReadoutTime; 76 77 static const uint32_t kAvailableSensitivities[5]; 78 static const uint32_t kDefaultSensitivity; 79 80}; 81 82 83 84const uint32_t Sensor::kAvailableSensitivities[5] = 85 {100, 200, 400, 800, 1600}; 86const nsecs_t Sensor::kExposureTimeRange[2] = 87 {1000L, 30000000000L} ; // 1 us - 30 sec 88const nsecs_t Sensor::kFrameDurationRange[2] = 89 {33331760L, 30000000000L}; // ~1/30 s - 30 sec 90 91const uint8_t Sensor::kColorFilterArrangement = ANDROID_SENSOR_RGGB; 92 93const uint32_t kAvailableFormats[5] = { 94 HAL_PIXEL_FORMAT_RAW_SENSOR, 95 HAL_PIXEL_FORMAT_BLOB, 96 HAL_PIXEL_FORMAT_RGBA_8888, 97 HAL_PIXEL_FORMAT_YV12, 98 HAL_PIXEL_FORMAT_YCrCb_420_SP 99}; 100 101// Output image data characteristics 102const uint32_t Sensor::kMaxRawValue = 4000; 103const uint32_t Sensor::kBlackLevel = 1000; 104 105const uint64_t kAvailableRawMinDurations[1] = { 106 Sensor::kFrameDurationRange[0] 107}; 108 109const uint64_t kAvailableProcessedMinDurations[1] = { 110 Sensor::kFrameDurationRange[0] 111}; 112const uint64_t kAvailableJpegMinDurations[1] = { 113 Sensor::kFrameDurationRange[0] 114}; 115 116const int32_t scalerResolutionS5K4E5[] = 117{ 118 1920, 1080, 119 1440, 1080, 120 1280, 1024, 121 1280, 720, 122 640, 480, 123 320, 240, 124 176, 144, 125}; 126 127const int32_t jpegResolutionS5K4E5[] = 128{ 129 2560, 1920, 130 2560, 1440, 131 2048, 1536, 132 1600, 1200, 133 1280, 1024, 134 1280, 960, 135 1152, 864, 136 640, 480, 137 320, 240, 138}; 139 140ExynosCamera2InfoS5K4E5::ExynosCamera2InfoS5K4E5() 141{ 142 sensorW = 2560; 143 sensorH = 1920; 144 sensorRawW = (2560 + 16); 145 sensorRawH = (1920 + 10); 146 numScalerResolution = ARRAY_SIZE(scalerResolutionS5K4E5)/2; 147 scalerResolutions = scalerResolutionS5K4E5; 148 numJpegResolution = ARRAY_SIZE(jpegResolutionS5K4E5)/2; 149 jpegResolutions = jpegResolutionS5K4E5; 150 minFocusDistance = 0.1f; 151 focalLength = 3.43f; 152 aperture = 2.7f; 153} 154 155ExynosCamera2InfoS5K4E5::~ExynosCamera2InfoS5K4E5() 156{ 157 ALOGV("%s", __FUNCTION__); 158} 159const int32_t scalerResolutionS5K6A3[] = 160{ 161 1392, 1392, 162 1280, 1024, 163 1280, 960, 164 1280, 720, 165 640, 480, 166 176, 144, 167}; 168 169const int32_t jpegResolutionS5K6A3[] = 170{ 171 1392, 1392, 172 1392, 1040, 173 1392, 784, 174 1280, 1024, 175 1280, 960, 176 1280, 720, 177 1152, 864, 178 640, 480, 179 320, 240, 180}; 181 182ExynosCamera2InfoS5K6A3::ExynosCamera2InfoS5K6A3() 183{ 184 sensorW = 1392; 185 sensorH = 1392; 186 sensorRawW = (1392 + 16); 187 sensorRawH = (1392 + 10); 188 numScalerResolution = ARRAY_SIZE(scalerResolutionS5K6A3)/2; 189 scalerResolutions = scalerResolutionS5K6A3; 190 numJpegResolution = ARRAY_SIZE(jpegResolutionS5K6A3)/2; 191 jpegResolutions = jpegResolutionS5K6A3; 192 minFocusDistance = 0.0f; 193 focalLength = 2.73f; 194 aperture = 2.8f; 195} 196 197ExynosCamera2InfoS5K6A3::~ExynosCamera2InfoS5K6A3() 198{ 199 ALOGV("%s", __FUNCTION__); 200} 201ExynosCamera2::ExynosCamera2(int cameraId): 202 m_cameraId(cameraId) 203{ 204 if (cameraId == 0) 205 m_curCameraInfo = new ExynosCamera2InfoS5K4E5; 206 else 207 m_curCameraInfo = new ExynosCamera2InfoS5K6A3; 208} 209 210ExynosCamera2::~ExynosCamera2() 211{ 212 ALOGV("%s", __FUNCTION__); 213 delete m_curCameraInfo; 214 m_curCameraInfo = NULL; 215} 216 217int32_t ExynosCamera2::getSensorW() 218{ 219 return m_curCameraInfo->sensorW; 220} 221 222int32_t ExynosCamera2::getSensorH() 223{ 224 return m_curCameraInfo->sensorH; 225} 226 227int32_t ExynosCamera2::getSensorRawW() 228{ 229 return m_curCameraInfo->sensorRawW; 230} 231 232int32_t ExynosCamera2::getSensorRawH() 233{ 234 return m_curCameraInfo->sensorRawH; 235} 236 237bool ExynosCamera2::isSupportedResolution(int width, int height) 238{ 239 int i; 240 for (i = 0 ; i < m_curCameraInfo->numScalerResolution ; i++) { 241 if (m_curCameraInfo->scalerResolutions[2*i] == width 242 && m_curCameraInfo->scalerResolutions[2*i+1] == height) { 243 return true; 244 } 245 } 246 return false; 247} 248 249bool ExynosCamera2::isSupportedJpegResolution(int width, int height) 250{ 251 int i; 252 for (i = 0 ; i < m_curCameraInfo->numJpegResolution ; i++) { 253 if (m_curCameraInfo->jpegResolutions[2*i] == width 254 && m_curCameraInfo->jpegResolutions[2*i+1] == height) { 255 return true; 256 } 257 } 258 return false; 259} 260 261status_t addOrSize(camera_metadata_t *request, 262 bool sizeRequest, 263 size_t *entryCount, 264 size_t *dataCount, 265 uint32_t tag, 266 const void *entryData, 267 size_t entryDataCount) { 268 status_t res; 269 if (!sizeRequest) { 270 return add_camera_metadata_entry(request, tag, entryData, 271 entryDataCount); 272 } else { 273 int type = get_camera_metadata_tag_type(tag); 274 if (type < 0 ) return BAD_VALUE; 275 (*entryCount)++; 276 (*dataCount) += calculate_camera_metadata_entry_data_size(type, 277 entryDataCount); 278 return OK; 279 } 280} 281 282status_t ExynosCamera2::constructStaticInfo(camera_metadata_t **info, 283 int cameraId, bool sizeRequest) { 284 285 size_t entryCount = 0; 286 size_t dataCount = 0; 287 status_t ret; 288 289#define ADD_OR_SIZE( tag, data, count ) \ 290 if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \ 291 tag, data, count) ) != OK ) return ret 292 293 // android.lens 294 295 ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 296 &(m_curCameraInfo->minFocusDistance), 1); 297 ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE, 298 &(m_curCameraInfo->minFocusDistance), 1); 299 300 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS, 301 &m_curCameraInfo->focalLength, 1); 302 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES, 303 &m_curCameraInfo->aperture, 1); 304 305 static const float filterDensity = 0; 306 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY, 307 &filterDensity, 1); 308 static const uint8_t availableOpticalStabilization = 309 ANDROID_LENS_OPTICAL_STABILIZATION_OFF; 310 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION, 311 &availableOpticalStabilization, 1); 312 313 static const int32_t lensShadingMapSize[] = {1, 1}; 314 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize, 315 sizeof(lensShadingMapSize)/sizeof(int32_t)); 316 317 static const float lensShadingMap[3 * 1 * 1 ] = 318 { 1.f, 1.f, 1.f }; 319 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap, 320 sizeof(lensShadingMap)/sizeof(float)); 321 322 int32_t lensFacing = cameraId ? 323 ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK; 324 ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1); 325 326 // android.sensor 327 ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE, 328 Sensor::kExposureTimeRange, 2); 329 330 ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION, 331 &Sensor::kFrameDurationRange[1], 1); 332 333 ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES, 334 Sensor::kAvailableSensitivities, 335 sizeof(Sensor::kAvailableSensitivities) 336 /sizeof(uint32_t)); 337 338 ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT, 339 &Sensor::kColorFilterArrangement, 1); 340 341 static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm 342 ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE, 343 sensorPhysicalSize, 2); 344 345 int32_t pixelArraySize[2] = { 346 m_curCameraInfo->sensorW, m_curCameraInfo->sensorH 347 }; 348 ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE, pixelArraySize, 2); 349 ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, pixelArraySize,2); 350 351 ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL, 352 &Sensor::kMaxRawValue, 1); 353 354 static const int32_t blackLevelPattern[4] = { 355 Sensor::kBlackLevel, Sensor::kBlackLevel, 356 Sensor::kBlackLevel, Sensor::kBlackLevel 357 }; 358 ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 359 blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t)); 360 361 //TODO: sensor color calibration fields 362 363 // android.flash 364 static const uint8_t flashAvailable = 1; 365 ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1); 366 367 static const int64_t flashChargeDuration = 0; 368 ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1); 369 370 // android.tonemap 371 372 static const int32_t tonemapCurvePoints = 128; 373 ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1); 374 375 // android.scaler 376 377 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS, 378 kAvailableFormats, 379 sizeof(kAvailableFormats)/sizeof(uint32_t)); 380 381 int32_t availableRawSizes[2] = { 382 m_curCameraInfo->sensorRawW, m_curCameraInfo->sensorRawH 383 }; 384 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 385 availableRawSizes, 2); 386 387 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 388 kAvailableRawMinDurations, 389 sizeof(kAvailableRawMinDurations)/sizeof(uint64_t)); 390 391 392 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 393 m_curCameraInfo->scalerResolutions, 394 (m_curCameraInfo->numScalerResolution)*2); 395 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 396 m_curCameraInfo->jpegResolutions, 397 (m_curCameraInfo->numJpegResolution)*2); 398 399 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 400 kAvailableProcessedMinDurations, 401 sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t)); 402 403 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 404 kAvailableJpegMinDurations, 405 sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t)); 406 407 static const float maxZoom = 4; 408 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxZoom, 1); 409 410 // android.jpeg 411 412 static const int32_t jpegThumbnailSizes[] = { 413 160, 120, 414 320, 240, 415 640, 480 416 }; 417 418 ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 419 jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t)); 420 421 static const int32_t jpegMaxSize = 5*1024*1024; 422 ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1); 423 424 // android.stats 425 426 static const uint8_t availableFaceDetectModes[] = { 427 ANDROID_STATS_FACE_DETECTION_OFF, 428 ANDROID_STATS_FACE_DETECTION_FULL 429 }; 430 ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES, 431 availableFaceDetectModes, 432 sizeof(availableFaceDetectModes)); 433 434 m_curCameraInfo->maxFaceCount = 16; 435 ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT, 436 &(m_curCameraInfo->maxFaceCount), 1); 437 438 static const int32_t histogramSize = 64; 439 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT, 440 &histogramSize, 1); 441 442 static const int32_t maxHistogramCount = 1000; 443 ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT, 444 &maxHistogramCount, 1); 445 446 static const int32_t sharpnessMapSize[2] = {64, 64}; 447 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE, 448 sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t)); 449 450 static const int32_t maxSharpnessMapValue = 1000; 451 ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE, 452 &maxSharpnessMapValue, 1); 453 454 // android.control 455 456 static const uint8_t availableSceneModes[] = { 457 ANDROID_CONTROL_SCENE_MODE_ACTION, 458 ANDROID_CONTROL_SCENE_MODE_NIGHT, 459 ANDROID_CONTROL_SCENE_MODE_SUNSET, 460 ANDROID_CONTROL_SCENE_MODE_PARTY 461 }; 462 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 463 availableSceneModes, sizeof(availableSceneModes)); 464 465 static const uint8_t availableEffects[] = { 466 ANDROID_CONTROL_EFFECT_OFF 467 }; 468 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS, 469 availableEffects, sizeof(availableEffects)); 470 471 int32_t max3aRegions = 1; 472 ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS, 473 &max3aRegions, 1); 474 475 static const uint8_t availableAeModes[] = { 476 ANDROID_CONTROL_AE_OFF, 477 ANDROID_CONTROL_AE_ON, 478 ANDROID_CONTROL_AE_ON_AUTO_FLASH 479 }; 480 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES, 481 availableAeModes, sizeof(availableAeModes)); 482 483 static const camera_metadata_rational exposureCompensationStep = { 484 1, 1 485 }; 486 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 487 &exposureCompensationStep, 1); 488 489 int32_t exposureCompensationRange[] = {-3, 3}; 490 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 491 exposureCompensationRange, 492 sizeof(exposureCompensationRange)/sizeof(int32_t)); 493 494 static const int32_t availableTargetFpsRanges[] = { 495 5, 30, 30, 30 496 }; 497 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 498 availableTargetFpsRanges, 499 sizeof(availableTargetFpsRanges)/sizeof(int32_t)); 500 501 static const uint8_t availableAntibandingModes[] = { 502 ANDROID_CONTROL_AE_ANTIBANDING_OFF, 503 ANDROID_CONTROL_AE_ANTIBANDING_AUTO 504 }; 505 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 506 availableAntibandingModes, sizeof(availableAntibandingModes)); 507 508 static const uint8_t availableAwbModes[] = { 509 ANDROID_CONTROL_AWB_OFF, 510 ANDROID_CONTROL_AWB_AUTO, 511 ANDROID_CONTROL_AWB_INCANDESCENT, 512 ANDROID_CONTROL_AWB_FLUORESCENT, 513 ANDROID_CONTROL_AWB_DAYLIGHT, 514 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT 515 }; 516 ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 517 availableAwbModes, sizeof(availableAwbModes)); 518 519 static const uint8_t availableAfModes[] = { 520 ANDROID_CONTROL_AF_OFF, 521 ANDROID_CONTROL_AF_AUTO, 522 ANDROID_CONTROL_AF_MACRO, 523 ANDROID_CONTROL_AF_CONTINUOUS_PICTURE, 524 ANDROID_CONTROL_AF_CONTINUOUS_VIDEO 525 }; 526 ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES, 527 availableAfModes, sizeof(availableAfModes)); 528 529 static const uint8_t availableVstabModes[] = { 530 ANDROID_CONTROL_VIDEO_STABILIZATION_OFF 531 }; 532 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 533 availableVstabModes, sizeof(availableVstabModes)); 534 535#undef ADD_OR_SIZE 536 /** Allocate metadata if sizing */ 537 if (sizeRequest) { 538 ALOGV("Allocating %d entries, %d extra bytes for " 539 "static camera info", 540 entryCount, dataCount); 541 *info = allocate_camera_metadata(entryCount, dataCount); 542 if (*info == NULL) { 543 ALOGE("Unable to allocate camera static info" 544 "(%d entries, %d bytes extra data)", 545 entryCount, dataCount); 546 return NO_MEMORY; 547 } 548 } 549 return OK; 550} 551 552status_t ExynosCamera2::constructDefaultRequest( 553 int request_template, 554 camera_metadata_t **request, 555 bool sizeRequest) { 556 557 size_t entryCount = 0; 558 size_t dataCount = 0; 559 status_t ret; 560 561#define ADD_OR_SIZE( tag, data, count ) \ 562 if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \ 563 tag, data, count) ) != OK ) return ret 564 565 static const int64_t USEC = 1000LL; 566 static const int64_t MSEC = USEC * 1000LL; 567 static const int64_t SEC = MSEC * 1000LL; 568 569 /** android.request */ 570 571 static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE; 572 ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1); 573 574 static const int32_t id = 0; 575 ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1); 576 577 static const int32_t frameCount = 0; 578 ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1); 579 580 // OUTPUT_STREAMS set by user 581 entryCount += 1; 582 dataCount += 5; // TODO: Should be maximum stream number 583 584 /** android.lens */ 585 586 static const float focusDistance = 0; 587 ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 588 589 ADD_OR_SIZE(ANDROID_LENS_APERTURE, &m_curCameraInfo->aperture, 1); 590 591 ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &m_curCameraInfo->focalLength, 1); 592 593 static const float filterDensity = 0; 594 ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1); 595 596 static const uint8_t opticalStabilizationMode = 597 ANDROID_LENS_OPTICAL_STABILIZATION_OFF; 598 ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, 599 &opticalStabilizationMode, 1); 600 601 602 /** android.sensor */ 603 604 605 static const int64_t frameDuration = 33333333L; // 1/30 s 606 ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1); 607 608 609 /** android.flash */ 610 611 static const uint8_t flashMode = ANDROID_FLASH_OFF; 612 ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1); 613 614 static const uint8_t flashPower = 10; 615 ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1); 616 617 static const int64_t firingTime = 0; 618 ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1); 619 620 /** Processing block modes */ 621 uint8_t hotPixelMode = 0; 622 uint8_t demosaicMode = 0; 623 uint8_t noiseMode = 0; 624 uint8_t shadingMode = 0; 625 uint8_t geometricMode = 0; 626 uint8_t colorMode = 0; 627 uint8_t tonemapMode = 0; 628 uint8_t edgeMode = 0; 629 switch (request_template) { 630 case CAMERA2_TEMPLATE_PREVIEW: 631 hotPixelMode = ANDROID_PROCESSING_FAST; 632 demosaicMode = ANDROID_PROCESSING_FAST; 633 noiseMode = ANDROID_PROCESSING_FAST; 634 shadingMode = ANDROID_PROCESSING_FAST; 635 geometricMode = ANDROID_PROCESSING_FAST; 636 colorMode = ANDROID_PROCESSING_FAST; 637 tonemapMode = ANDROID_PROCESSING_FAST; 638 edgeMode = ANDROID_PROCESSING_FAST; 639 break; 640 case CAMERA2_TEMPLATE_STILL_CAPTURE: 641 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; 642 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; 643 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; 644 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; 645 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; 646 colorMode = ANDROID_PROCESSING_HIGH_QUALITY; 647 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; 648 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; 649 break; 650 case CAMERA2_TEMPLATE_VIDEO_RECORD: 651 hotPixelMode = ANDROID_PROCESSING_FAST; 652 demosaicMode = ANDROID_PROCESSING_FAST; 653 noiseMode = ANDROID_PROCESSING_FAST; 654 shadingMode = ANDROID_PROCESSING_FAST; 655 geometricMode = ANDROID_PROCESSING_FAST; 656 colorMode = ANDROID_PROCESSING_FAST; 657 tonemapMode = ANDROID_PROCESSING_FAST; 658 edgeMode = ANDROID_PROCESSING_FAST; 659 break; 660 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 661 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; 662 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; 663 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; 664 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; 665 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; 666 colorMode = ANDROID_PROCESSING_HIGH_QUALITY; 667 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; 668 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; 669 break; 670 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 671 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; 672 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; 673 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; 674 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; 675 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; 676 colorMode = ANDROID_PROCESSING_HIGH_QUALITY; 677 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; 678 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; 679 break; 680 default: 681 hotPixelMode = ANDROID_PROCESSING_FAST; 682 demosaicMode = ANDROID_PROCESSING_FAST; 683 noiseMode = ANDROID_PROCESSING_FAST; 684 shadingMode = ANDROID_PROCESSING_FAST; 685 geometricMode = ANDROID_PROCESSING_FAST; 686 colorMode = ANDROID_PROCESSING_FAST; 687 tonemapMode = ANDROID_PROCESSING_FAST; 688 edgeMode = ANDROID_PROCESSING_FAST; 689 break; 690 } 691 ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); 692 ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1); 693 ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1); 694 ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1); 695 ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1); 696 ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1); 697 ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1); 698 ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1); 699 700 /** android.noise */ 701 static const uint8_t noiseStrength = 5; 702 ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1); 703 704 /** android.color */ 705 static const float colorTransform[9] = { 706 1.0f, 0.f, 0.f, 707 0.f, 1.f, 0.f, 708 0.f, 0.f, 1.f 709 }; 710 ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9); 711 712 /** android.tonemap */ 713 static const float tonemapCurve[4] = { 714 0.f, 0.f, 715 1.f, 1.f 716 }; 717 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 32); // sungjoong 718 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 32); 719 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 32); 720 721 /** android.edge */ 722 static const uint8_t edgeStrength = 5; 723 ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); 724 725 /** android.scaler */ 726 int32_t cropRegion[3] = { 727 0, 0, m_curCameraInfo->sensorW 728 }; 729 ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3); 730 731 /** android.jpeg */ 732 static const int32_t jpegQuality = 80; 733 ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1); 734 735 static const int32_t thumbnailSize[2] = { 736 640, 480 737 }; 738 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2); 739 740 static const int32_t thumbnailQuality = 80; 741 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1); 742 743 static const double gpsCoordinates[3] = { 744 0, 0, 0 745 }; 746 ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3); 747 748 static const uint8_t gpsProcessingMethod[32] = "None"; 749 ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32); 750 751 static const int64_t gpsTimestamp = 0; 752 ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1); 753 754 static const int32_t jpegOrientation = 0; 755 ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1); 756 757 /** android.stats */ 758 759 static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_FULL; 760 ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1); 761 762 static const uint8_t histogramMode = ANDROID_STATS_OFF; 763 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1); 764 765 static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF; 766 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); 767 768 769 /** android.control */ 770 771 uint8_t controlIntent = 0; 772 switch (request_template) { 773 case CAMERA2_TEMPLATE_PREVIEW: 774 controlIntent = ANDROID_CONTROL_INTENT_PREVIEW; 775 break; 776 case CAMERA2_TEMPLATE_STILL_CAPTURE: 777 controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE; 778 break; 779 case CAMERA2_TEMPLATE_VIDEO_RECORD: 780 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD; 781 break; 782 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 783 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT; 784 break; 785 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 786 controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG; 787 break; 788 default: 789 controlIntent = ANDROID_CONTROL_INTENT_CUSTOM; 790 break; 791 } 792 ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 793 794 static const uint8_t controlMode = ANDROID_CONTROL_AUTO; 795 ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1); 796 797 static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF; 798 ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 799 800 static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 801 ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 802 803 static const uint8_t aeMode = ANDROID_CONTROL_AE_ON; 804 ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 805 806 int32_t controlRegions[5] = { 807 0, 0, m_curCameraInfo->sensorW, m_curCameraInfo->sensorH, 1000 808 }; 809 ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5); 810 811 static const int32_t aeExpCompensation = 0; 812 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1); 813 814 static const int32_t aeTargetFpsRange[2] = { 815 10, 30 816 }; 817 ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2); 818 819 static const uint8_t aeAntibandingMode = 820 ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 821 ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1); 822 823 static const uint8_t awbMode = 824 ANDROID_CONTROL_AWB_AUTO; 825 ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 826 827 ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5); 828 829 uint8_t afMode = 0; 830 switch (request_template) { 831 case CAMERA2_TEMPLATE_PREVIEW: 832 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE; 833 break; 834 case CAMERA2_TEMPLATE_STILL_CAPTURE: 835 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE; 836 break; 837 case CAMERA2_TEMPLATE_VIDEO_RECORD: 838 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO; 839 break; 840 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 841 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO; 842 break; 843 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 844 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE; 845 break; 846 default: 847 afMode = ANDROID_CONTROL_AF_AUTO; 848 break; 849 } 850 ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1); 851 852 ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5); 853 854 static const uint8_t vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 855 ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1); 856 857 if (sizeRequest) { 858 ALOGV("Allocating %d entries, %d extra bytes for " 859 "request template type %d", 860 entryCount, dataCount, request_template); 861 *request = allocate_camera_metadata(entryCount, dataCount); 862 if (*request == NULL) { 863 ALOGE("Unable to allocate new request template type %d " 864 "(%d entries, %d bytes extra data)", request_template, 865 entryCount, dataCount); 866 return NO_MEMORY; 867 } 868 } 869 return OK; 870#undef ADD_OR_SIZE 871} 872 873} 874