Camera2Client.cpp revision 611f61998863d3a3ffae4e5f2b723b7319c59ddf
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "Camera2Client" 18//#define LOG_NDEBUG 0 19#include <utils/Log.h> 20 21#include <cutils/properties.h> 22#include <gui/SurfaceTextureClient.h> 23#include <gui/Surface.h> 24 25#include <math.h> 26 27#include "Camera2Client.h" 28 29namespace android { 30 31#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 32#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 33 34#define ALOG1_ENTRY \ 35 int callingPid = getCallingPid(); \ 36 ALOG1("%s: E (pid %d, id %d) ", __FUNCTION__, \ 37 callingPid, mCameraId) 38 39#define ALOG1_EXIT \ 40 ALOG1("%s: X (pid %d, id %d) ", __FUNCTION__, \ 41 callingPid, mCameraId) 42 43static int getCallingPid() { 44 return IPCThreadState::self()->getCallingPid(); 45} 46 47static int getCallingUid() { 48 return IPCThreadState::self()->getCallingUid(); 49} 50 51// Interface used by CameraService 52 53Camera2Client::Camera2Client(const sp<CameraService>& cameraService, 54 const sp<ICameraClient>& cameraClient, 55 int cameraId, 56 int cameraFacing, 57 int clientPid): 58 Client(cameraService, cameraClient, 59 cameraId, cameraFacing, clientPid), 60 mParams(NULL) 61{ 62 ALOG1_ENTRY; 63 64 mDevice = new Camera2Device(cameraId); 65 66 ALOG1_EXIT; 67} 68 69status_t Camera2Client::initialize(camera_module_t *module) 70{ 71 ALOG1_ENTRY; 72 status_t res; 73 74 res = mDevice->initialize(module); 75 if (res != OK) { 76 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 77 __FUNCTION__, mCameraId, strerror(-res), res); 78 return NO_INIT; 79 } 80 81 res = buildDefaultParameters(); 82 if (res != OK) { 83 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 84 __FUNCTION__, mCameraId, strerror(-res), res); 85 return NO_INIT; 86 } 87 if (gLogLevel >= 1) { 88 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 89 mCameraId); 90 mParams->dump(); 91 } 92 93 ALOG1_EXIT; 94 return OK; 95} 96 97Camera2Client::~Camera2Client() { 98 mDestructionStarted = true; 99 100 if (mParams) delete mParams; 101 102 disconnect(); 103} 104 105status_t Camera2Client::dump(int fd, const Vector<String16>& args) { 106 String8 result; 107 result.appendFormat("Client2[%d] (%p) PID: %d:\n", 108 mCameraId, 109 getCameraClient()->asBinder().get(), 110 mClientPid); 111 write(fd, result.string(), result.size()); 112 return NO_ERROR; 113} 114 115// ICamera interface 116 117void Camera2Client::disconnect() { 118 119 if (mDevice == 0) return; 120 121 mDevice->setStreamingRequest(NULL); 122 123 CameraService::Client::disconnect(); 124} 125 126status_t Camera2Client::connect(const sp<ICameraClient>& client) { 127 return BAD_VALUE; 128} 129 130status_t Camera2Client::lock() { 131 return BAD_VALUE; 132} 133 134status_t Camera2Client::unlock() { 135 return BAD_VALUE; 136} 137 138status_t Camera2Client::setPreviewDisplay(const sp<Surface>& surface) { 139 return BAD_VALUE; 140} 141 142status_t Camera2Client::setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture) { 143 return BAD_VALUE; 144} 145 146void Camera2Client::setPreviewCallbackFlag(int flag) { 147 148} 149 150status_t Camera2Client::startPreview() { 151 return BAD_VALUE; 152} 153 154void Camera2Client::stopPreview() { 155 156} 157 158bool Camera2Client::previewEnabled() { 159 return false; 160} 161 162status_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 163 return BAD_VALUE; 164} 165 166status_t Camera2Client::startRecording() { 167 return BAD_VALUE; 168} 169 170void Camera2Client::stopRecording() { 171} 172 173bool Camera2Client::recordingEnabled() { 174 return BAD_VALUE; 175} 176 177void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 178 179} 180 181status_t Camera2Client::autoFocus() { 182 return BAD_VALUE; 183} 184 185status_t Camera2Client::cancelAutoFocus() { 186 return BAD_VALUE; 187} 188 189status_t Camera2Client::takePicture(int msgType) { 190 return BAD_VALUE; 191} 192 193status_t Camera2Client::setParameters(const String8& params) { 194 return BAD_VALUE; 195} 196 197String8 Camera2Client::getParameters() const { 198 return mParams->flatten(); 199} 200 201status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 202 return BAD_VALUE; 203} 204 205// private methods 206 207status_t Camera2Client::buildDefaultParameters() { 208 status_t res; 209 if (mParams) { 210 delete mParams; 211 } 212 mParams = new CameraParameters; 213 214 camera_metadata_entry_t availableProcessedSizes; 215 res = find_camera_metadata_entry(mDevice->info(), 216 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 217 &availableProcessedSizes); 218 if (res != OK) return res; 219 if (availableProcessedSizes.count < 2) { 220 ALOGE("%s: Camera %d: " 221 "Malformed %s entry", 222 __FUNCTION__, mCameraId, 223 get_camera_metadata_tag_name( 224 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES)); 225 return NO_INIT; 226 } 227 228 // TODO: Pick more intelligently 229 int previewWidth = availableProcessedSizes.data.i32[0]; 230 int previewHeight = availableProcessedSizes.data.i32[1]; 231 232 mParams->setPreviewSize(previewWidth, previewHeight); 233 mParams->setVideoSize(previewWidth, previewHeight); 234 mParams->set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 235 String8::format("%dx%d",previewWidth,previewHeight)); 236 { 237 String8 supportedPreviewSizes; 238 for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 239 if (i != 0) supportedPreviewSizes += ","; 240 supportedPreviewSizes += String8::format("%dx%d", 241 availableProcessedSizes.data.i32[i], 242 availableProcessedSizes.data.i32[i+1]); 243 } 244 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 245 supportedPreviewSizes); 246 mParams->set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 247 supportedPreviewSizes); 248 } 249 250 camera_metadata_entry_t availableFpsRanges; 251 res = find_camera_metadata_entry(mDevice->info(), 252 ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 253 &availableFpsRanges); 254 if (res != OK) return res; 255 if (availableFpsRanges.count < 2) { 256 ALOGE("%s: Camera %d: " 257 "Malformed %s entry", 258 __FUNCTION__, mCameraId, 259 get_camera_metadata_tag_name( 260 ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES)); 261 return NO_INIT; 262 } 263 264 int previewFpsRangeMin = availableFpsRanges.data.i32[0]; 265 int previewFpsRangeMax = availableFpsRanges.data.i32[1]; 266 267 mParams->set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 268 String8::format("%d,%d", previewFpsRangeMin, previewFpsRangeMax)); 269 270 { 271 String8 supportedPreviewFpsRange; 272 for (size_t i=0; i < availableFpsRanges.count; i += 2) { 273 if (i != 0) supportedPreviewFpsRange += ","; 274 supportedPreviewFpsRange += String8::format("(%d,%d)", 275 availableFpsRanges.data.i32[i], 276 availableFpsRanges.data.i32[i+1]); 277 } 278 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 279 supportedPreviewFpsRange); 280 } 281 282 mParams->set(CameraParameters::KEY_PREVIEW_FORMAT, 283 "yuv420sp"); // NV21 284 285 camera_metadata_entry_t availableFormats; 286 res = find_camera_metadata_entry(mDevice->info(), 287 ANDROID_SCALER_AVAILABLE_FORMATS, 288 &availableFormats); 289 { 290 String8 supportedPreviewFormats; 291 bool addComma = false; 292 for (size_t i=0; i < availableFormats.count; i++) { 293 if (addComma) supportedPreviewFormats += ","; 294 addComma = true; 295 switch (availableFormats.data.i32[i]) { 296 case HAL_PIXEL_FORMAT_YCbCr_422_SP: 297 supportedPreviewFormats += "yuv422sp"; 298 break; 299 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 300 supportedPreviewFormats += "yuv420sp"; 301 break; 302 case HAL_PIXEL_FORMAT_YCbCr_422_I: 303 supportedPreviewFormats += "yuv422i-yuyv"; 304 break; 305 case HAL_PIXEL_FORMAT_YV12: 306 supportedPreviewFormats += "yuv420p"; 307 break; 308 case HAL_PIXEL_FORMAT_RGB_565: 309 supportedPreviewFormats += "rgb565"; 310 break; 311 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 312 case HAL_PIXEL_FORMAT_RAW_SENSOR: 313 addComma = false; 314 break; 315 default: 316 ALOGW("%s: Camera %d: Unknown preview format: %x", 317 __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 318 addComma = false; 319 break; 320 } 321 } 322 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 323 supportedPreviewFormats); 324 } 325 326 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 327 // still have to do something sane for them 328 329 mParams->set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 330 previewFpsRangeMin); 331 332 { 333 String8 supportedPreviewFrameRates; 334 for (size_t i=0; i < availableFpsRanges.count; i += 2) { 335 if (i != 0) supportedPreviewFrameRates += ","; 336 supportedPreviewFrameRates += String8::format("%d", 337 availableFpsRanges.data.i32[i]); 338 } 339 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 340 supportedPreviewFrameRates); 341 } 342 343 camera_metadata_entry_t availableJpegSizes; 344 res = find_camera_metadata_entry(mDevice->info(), 345 ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 346 &availableJpegSizes); 347 if (res != OK) return res; 348 if (availableJpegSizes.count < 2) { 349 ALOGE("%s: Camera %d: " 350 "Malformed %s entry", 351 __FUNCTION__, mCameraId, 352 get_camera_metadata_tag_name( 353 ANDROID_SCALER_AVAILABLE_JPEG_SIZES)); 354 return NO_INIT; 355 } 356 357 // TODO: Pick maximum 358 int32_t pictureWidth = availableJpegSizes.data.i32[0]; 359 int32_t pictureHeight = availableJpegSizes.data.i32[1]; 360 361 mParams->setPictureSize(pictureWidth, pictureHeight); 362 363 { 364 String8 supportedPictureSizes; 365 for (size_t i=0; i < availableJpegSizes.count; i += 2) { 366 if (i != 0) supportedPictureSizes += ","; 367 supportedPictureSizes += String8::format("%dx%d", 368 availableJpegSizes.data.i32[i], 369 availableJpegSizes.data.i32[i+1]); 370 } 371 mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 372 supportedPictureSizes); 373 } 374 375 mParams->setPictureFormat("jpeg"); 376 377 mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 378 "jpeg"); 379 380 camera_metadata_entry_t availableJpegThumbnailSizes; 381 res = find_camera_metadata_entry(mDevice->info(), 382 ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 383 &availableJpegThumbnailSizes); 384 if (res != OK) return res; 385 if (availableJpegThumbnailSizes.count < 2) { 386 ALOGE("%s: Camera %d: " 387 "Malformed %s entry", 388 __FUNCTION__, mCameraId, 389 get_camera_metadata_tag_name( 390 ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES)); 391 return NO_INIT; 392 } 393 394 // TODO: Pick default thumbnail size sensibly 395 int32_t jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0]; 396 int32_t jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1]; 397 398 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 399 jpegThumbWidth); 400 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 401 jpegThumbHeight); 402 403 { 404 String8 supportedJpegThumbSizes; 405 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 406 if (i != 0) supportedJpegThumbSizes += ","; 407 supportedJpegThumbSizes += String8::format("%dx%d", 408 availableJpegThumbnailSizes.data.i32[i], 409 availableJpegThumbnailSizes.data.i32[i+1]); 410 } 411 mParams->set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 412 supportedJpegThumbSizes); 413 } 414 415 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 416 "90"); 417 mParams->set(CameraParameters::KEY_JPEG_QUALITY, 418 "90"); 419 mParams->set(CameraParameters::KEY_ROTATION, 420 "0"); 421 // Not settting GPS fields 422 423 mParams->set(CameraParameters::KEY_WHITE_BALANCE, 424 "auto"); 425 426 camera_metadata_entry_t availableWhiteBalanceModes; 427 res = find_camera_metadata_entry(mDevice->info(), 428 ANDROID_CONTROL_AWB_AVAILABLE_MODES, 429 &availableWhiteBalanceModes); 430 { 431 String8 supportedWhiteBalance; 432 bool addComma = false; 433 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 434 if (addComma) supportedWhiteBalance += ","; 435 addComma = true; 436 switch (availableWhiteBalanceModes.data.u8[i]) { 437 case ANDROID_CONTROL_AWB_AUTO: 438 supportedWhiteBalance += "auto"; 439 break; 440 case ANDROID_CONTROL_AWB_INCANDESCENT: 441 supportedWhiteBalance += "incandescent"; 442 break; 443 case ANDROID_CONTROL_AWB_FLUORESCENT: 444 supportedWhiteBalance += "fluorescent"; 445 break; 446 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 447 supportedWhiteBalance += "warm-fluorescent"; 448 break; 449 case ANDROID_CONTROL_AWB_DAYLIGHT: 450 supportedWhiteBalance += "daylight"; 451 break; 452 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 453 supportedWhiteBalance += "cloudy-daylight"; 454 break; 455 case ANDROID_CONTROL_AWB_TWILIGHT: 456 supportedWhiteBalance += "twilight"; 457 break; 458 case ANDROID_CONTROL_AWB_SHADE: 459 supportedWhiteBalance += "shade"; 460 break; 461 // Skipping values not mappable to v1 API 462 case ANDROID_CONTROL_AWB_OFF: 463 addComma = false; 464 break; 465 default: 466 ALOGW("%s: Camera %d: Unknown white balance value: %d", 467 __FUNCTION__, mCameraId, 468 availableWhiteBalanceModes.data.u8[i]); 469 addComma = false; 470 break; 471 } 472 } 473 mParams->set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 474 supportedWhiteBalance); 475 } 476 477 mParams->set(CameraParameters::KEY_EFFECT, "none"); 478 camera_metadata_entry_t availableEffects; 479 res = find_camera_metadata_entry(mDevice->info(), 480 ANDROID_CONTROL_AVAILABLE_EFFECTS, 481 &availableEffects); 482 if (res != OK) return res; 483 { 484 String8 supportedEffects; 485 bool addComma = false; 486 for (size_t i=0; i < availableEffects.count; i++) { 487 if (addComma) supportedEffects += ","; 488 addComma = true; 489 switch (availableEffects.data.u8[i]) { 490 case ANDROID_CONTROL_EFFECT_OFF: 491 supportedEffects += "none"; 492 break; 493 case ANDROID_CONTROL_EFFECT_MONO: 494 supportedEffects += "mono"; 495 case ANDROID_CONTROL_EFFECT_NEGATIVE: 496 supportedEffects += "negative"; 497 break; 498 case ANDROID_CONTROL_EFFECT_SOLARIZE: 499 supportedEffects += "solarize"; 500 break; 501 case ANDROID_CONTROL_EFFECT_SEPIA: 502 supportedEffects += "sepia"; 503 break; 504 case ANDROID_CONTROL_EFFECT_POSTERIZE: 505 supportedEffects += "posterize"; 506 break; 507 case ANDROID_CONTROL_EFFECT_WHITEBOARD: 508 supportedEffects += "whiteboard"; 509 break; 510 case ANDROID_CONTROL_EFFECT_BLACKBOARD: 511 supportedEffects += "blackboard"; 512 break; 513 case ANDROID_CONTROL_EFFECT_AQUA: 514 supportedEffects += "aqua"; 515 break; 516 default: 517 ALOGW("%s: Camera %d: Unknown effect value: %d", 518 __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 519 addComma = false; 520 break; 521 } 522 } 523 mParams->set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 524 } 525 526 mParams->set(CameraParameters::KEY_ANTIBANDING, "auto"); 527 camera_metadata_entry_t availableAntibandingModes; 528 res = find_camera_metadata_entry(mDevice->info(), 529 ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 530 &availableAntibandingModes); 531 if (res != OK) return res; 532 { 533 String8 supportedAntibanding; 534 bool addComma = false; 535 for (size_t i=0; i < availableAntibandingModes.count; i++) { 536 if (addComma) supportedAntibanding += ","; 537 addComma = true; 538 switch (availableAntibandingModes.data.u8[i]) { 539 case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 540 supportedAntibanding += "off"; 541 break; 542 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 543 supportedAntibanding += "50hz"; 544 break; 545 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 546 supportedAntibanding += "60hz"; 547 break; 548 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 549 supportedAntibanding += "auto"; 550 break; 551 default: 552 ALOGW("%s: Camera %d: Unknown antibanding value: %d", 553 __FUNCTION__, mCameraId, 554 availableAntibandingModes.data.u8[i]); 555 addComma = false; 556 break; 557 } 558 } 559 mParams->set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 560 supportedAntibanding); 561 } 562 563 mParams->set(CameraParameters::KEY_SCENE_MODE, "auto"); 564 camera_metadata_entry_t availableSceneModes; 565 res = find_camera_metadata_entry(mDevice->info(), 566 ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 567 &availableSceneModes); 568 if (res != OK) return res; 569 { 570 String8 supportedSceneModes("auto"); 571 bool addComma = true; 572 bool noSceneModes = false; 573 for (size_t i=0; i < availableSceneModes.count; i++) { 574 if (addComma) supportedSceneModes += ","; 575 addComma = true; 576 switch (availableSceneModes.data.u8[i]) { 577 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 578 noSceneModes = true; 579 break; 580 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 581 // Not in old API 582 addComma = false; 583 break; 584 case ANDROID_CONTROL_SCENE_MODE_ACTION: 585 supportedSceneModes += "action"; 586 break; 587 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 588 supportedSceneModes += "portrait"; 589 break; 590 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 591 supportedSceneModes += "landscape"; 592 break; 593 case ANDROID_CONTROL_SCENE_MODE_NIGHT: 594 supportedSceneModes += "night"; 595 break; 596 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 597 supportedSceneModes += "night-portrait"; 598 break; 599 case ANDROID_CONTROL_SCENE_MODE_THEATRE: 600 supportedSceneModes += "theatre"; 601 break; 602 case ANDROID_CONTROL_SCENE_MODE_BEACH: 603 supportedSceneModes += "beach"; 604 break; 605 case ANDROID_CONTROL_SCENE_MODE_SNOW: 606 supportedSceneModes += "snow"; 607 break; 608 case ANDROID_CONTROL_SCENE_MODE_SUNSET: 609 supportedSceneModes += "sunset"; 610 break; 611 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 612 supportedSceneModes += "steadyphoto"; 613 break; 614 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 615 supportedSceneModes += "fireworks"; 616 break; 617 case ANDROID_CONTROL_SCENE_MODE_SPORTS: 618 supportedSceneModes += "sports"; 619 break; 620 case ANDROID_CONTROL_SCENE_MODE_PARTY: 621 supportedSceneModes += "party"; 622 break; 623 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 624 supportedSceneModes += "candlelight"; 625 break; 626 case ANDROID_CONTROL_SCENE_MODE_BARCODE: 627 supportedSceneModes += "barcode"; 628 break; 629 default: 630 ALOGW("%s: Camera %d: Unknown scene mode value: %d", 631 __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]); 632 addComma = false; 633 break; 634 } 635 } 636 if (!noSceneModes) { 637 mParams->set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 638 supportedSceneModes); 639 } 640 } 641 642 camera_metadata_entry_t flashAvailable; 643 res = find_camera_metadata_entry(mDevice->info(), 644 ANDROID_FLASH_AVAILABLE, &flashAvailable); 645 if (res != OK) return res; 646 647 camera_metadata_entry_t availableAeModes; 648 res = find_camera_metadata_entry(mDevice->info(), 649 ANDROID_CONTROL_AE_AVAILABLE_MODES, 650 &availableAeModes); 651 if (res != OK) return res; 652 653 if (flashAvailable.data.u8[0]) { 654 mParams->set(CameraParameters::KEY_FLASH_MODE, "auto"); 655 String8 supportedFlashModes("off,auto,on,torch"); 656 for (size_t i=0; i < availableAeModes.count; i++) { 657 if (availableAeModes.data.u8[i] == 658 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 659 supportedFlashModes += ",red-eye"; 660 break; 661 } 662 } 663 mParams->set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 664 supportedFlashModes); 665 } 666 667 camera_metadata_entry_t minFocusDistance; 668 res = find_camera_metadata_entry(mDevice->info(), 669 ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 670 &minFocusDistance); 671 if (res != OK) return res; 672 camera_metadata_entry_t availableAfModes; 673 res = find_camera_metadata_entry(mDevice->info(), 674 ANDROID_CONTROL_AF_AVAILABLE_MODES, 675 &availableAfModes); 676 if (res != OK) return res; 677 if (minFocusDistance.data.f[0] == 0) { 678 // Fixed-focus lens 679 mParams->set(CameraParameters::KEY_FOCUS_MODE, "fixed"); 680 mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, "fixed"); 681 } else { 682 mParams->set(CameraParameters::KEY_FOCUS_MODE, "auto"); 683 String8 supportedFocusModes("fixed,infinity"); 684 bool addComma = true; 685 for (size_t i=0; i < availableAfModes.count; i++) { 686 if (addComma) supportedFocusModes += ","; 687 addComma = true; 688 switch (availableAfModes.data.u8[i]) { 689 case ANDROID_CONTROL_AF_AUTO: 690 supportedFocusModes += "auto"; 691 break; 692 case ANDROID_CONTROL_AF_MACRO: 693 supportedFocusModes += "macro"; 694 break; 695 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 696 supportedFocusModes += "continuous-video"; 697 break; 698 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 699 supportedFocusModes += "continuous-picture"; 700 break; 701 case ANDROID_CONTROL_AF_EDOF: 702 supportedFocusModes += "edof"; 703 break; 704 // Not supported in v1 API 705 case ANDROID_CONTROL_AF_OFF: 706 addComma = false; 707 break; 708 default: 709 ALOGW("%s: Camera %d: Unknown AF mode value: %d", 710 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 711 addComma = false; 712 break; 713 } 714 } 715 mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 716 supportedFocusModes); 717 } 718 719 camera_metadata_entry_t max3aRegions; 720 res = find_camera_metadata_entry(mDevice->info(), 721 ANDROID_CONTROL_MAX_REGIONS, &max3aRegions); 722 if (res != OK) return res; 723 724 mParams->set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 725 max3aRegions.data.i32[0]); 726 mParams->set(CameraParameters::KEY_FOCUS_AREAS, 727 "(0,0,0,0,0)"); 728 729 camera_metadata_entry_t availableFocalLengths; 730 res = find_camera_metadata_entry(mDevice->info(), 731 ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS, 732 &availableFocalLengths); 733 if (res != OK) return res; 734 float minFocalLength = availableFocalLengths.data.f[0]; 735 mParams->setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 736 737 camera_metadata_entry_t sensorSize; 738 res = find_camera_metadata_entry(mDevice->info(), 739 ANDROID_SENSOR_PHYSICAL_SIZE, 740 &sensorSize); 741 if (res != OK) return res; 742 743 // The fields of view here assume infinity focus, maximum wide angle 744 float horizFov = 180 / M_PI * 745 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 746 float vertFov = 180 / M_PI * 747 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 748 mParams->setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 749 mParams->setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 750 751 mParams->set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 0); 752 753 camera_metadata_entry_t exposureCompensationRange; 754 res = find_camera_metadata_entry(mDevice->info(), 755 ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 756 &exposureCompensationRange); 757 if (res != OK) return res; 758 mParams->set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 759 exposureCompensationRange.data.i32[1]); 760 mParams->set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 761 exposureCompensationRange.data.i32[0]); 762 763 camera_metadata_entry_t exposureCompensationStep; 764 res = find_camera_metadata_entry(mDevice->info(), 765 ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 766 &exposureCompensationStep); 767 if (res != OK) return res; 768 mParams->setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 769 exposureCompensationStep.data.r[0].numerator / 770 exposureCompensationStep.data.r[0].denominator); 771 772 mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false"); 773 mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true"); 774 775 mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false"); 776 mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true"); 777 778 mParams->set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 779 max3aRegions.data.i32[0]); 780 mParams->set(CameraParameters::KEY_METERING_AREAS, 781 "(0,0,0,0,0)"); 782 783 mParams->set(CameraParameters::KEY_ZOOM, 0); 784 mParams->set(CameraParameters::KEY_MAX_ZOOM, kNumZoomSteps - 1); 785 786 camera_metadata_entry_t maxDigitalZoom; 787 res = find_camera_metadata_entry(mDevice->info(), 788 ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxDigitalZoom); 789 if (res != OK) return res; 790 791 { 792 String8 zoomRatios; 793 float zoom = 1.f; 794 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 795 (kNumZoomSteps-1); 796 bool addComma = false; 797 for (size_t i=0; i < kNumZoomSteps; i++) { 798 if (addComma) zoomRatios += ","; 799 addComma = true; 800 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 801 zoom += zoomIncrement; 802 } 803 mParams->set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 804 } 805 806 mParams->set(CameraParameters::KEY_ZOOM_SUPPORTED, "true"); 807 mParams->set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true"); 808 809 mParams->set(CameraParameters::KEY_FOCUS_DISTANCES, 810 "Infinity,Infinity,Infinity"); 811 812 camera_metadata_entry_t maxFacesDetected; 813 res = find_camera_metadata_entry(mDevice->info(), 814 ANDROID_STATS_MAX_FACE_COUNT, 815 &maxFacesDetected); 816 mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 817 maxFacesDetected.data.i32[0]); 818 mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 819 0); 820 821 mParams->set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 822 "yuv420sp"); 823 824 mParams->set(CameraParameters::KEY_RECORDING_HINT, 825 "false"); 826 827 mParams->set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 828 "true"); 829 830 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION, 831 "false"); 832 833 camera_metadata_entry_t availableVideoStabilizationModes; 834 res = find_camera_metadata_entry(mDevice->info(), 835 ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 836 &availableVideoStabilizationModes); 837 if (res != OK) return res; 838 if (availableVideoStabilizationModes.count > 1) { 839 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 840 "true"); 841 } else { 842 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 843 "false"); 844 } 845 846 return OK; 847} 848 849} // namespace android 850