Camera2Client.cpp revision 11b7cdef9726f8270f12f6c393600e8fb3c469de
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 ATRACE_TAG ATRACE_TAG_CAMERA 19//#define LOG_NDEBUG 0 20 21#include <utils/Log.h> 22#include <utils/Trace.h> 23 24#include <cutils/properties.h> 25#include <gui/SurfaceTextureClient.h> 26#include <gui/Surface.h> 27 28#include <math.h> 29 30#include "Camera2Client.h" 31 32namespace android { 33 34#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 35#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 36 37static int getCallingPid() { 38 return IPCThreadState::self()->getCallingPid(); 39} 40 41static int getCallingUid() { 42 return IPCThreadState::self()->getCallingUid(); 43} 44 45// Interface used by CameraService 46 47Camera2Client::Camera2Client(const sp<CameraService>& cameraService, 48 const sp<ICameraClient>& cameraClient, 49 int cameraId, 50 int cameraFacing, 51 int clientPid): 52 Client(cameraService, cameraClient, 53 cameraId, cameraFacing, clientPid), 54 mState(NOT_INITIALIZED), 55 mPreviewStreamId(NO_STREAM), 56 mPreviewRequest(NULL), 57 mCaptureStreamId(NO_STREAM), 58 mCaptureRequest(NULL) 59{ 60 ATRACE_CALL(); 61 62 mDevice = new Camera2Device(cameraId); 63} 64 65status_t Camera2Client::initialize(camera_module_t *module) 66{ 67 ATRACE_CALL(); 68 status_t res; 69 70 res = mDevice->initialize(module); 71 if (res != OK) { 72 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 73 __FUNCTION__, mCameraId, strerror(-res), res); 74 return NO_INIT; 75 } 76 77 res = buildDefaultParameters(); 78 if (res != OK) { 79 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 80 __FUNCTION__, mCameraId, strerror(-res), res); 81 return NO_INIT; 82 } 83 84 if (gLogLevel >= 1) { 85 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 86 mCameraId); 87 ALOGD("%s", mParamsFlattened.string()); 88 } 89 90 mState = STOPPED; 91 92 return OK; 93} 94 95Camera2Client::~Camera2Client() { 96 ATRACE_CALL(); 97 ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId); 98 99 mDestructionStarted = true; 100 101 disconnect(); 102 103} 104 105status_t Camera2Client::dump(int fd, const Vector<String16>& args) { 106 String8 result; 107 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 108 mCameraId, 109 getCameraClient()->asBinder().get(), 110 mClientPid); 111 result.append(" State: "); 112#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 113 114 result.append(getStateName(mState)); 115 116 result.append("\n Current parameters:\n"); 117 result.appendFormat(" Preview size: %d x %d\n", 118 mParameters.previewWidth, mParameters.previewHeight); 119 result.appendFormat(" Preview FPS range: %d - %d\n", 120 mParameters.previewFpsRange[0], mParameters.previewFpsRange[1]); 121 result.appendFormat(" Preview HAL pixel format: 0x%x\n", 122 mParameters.previewFormat); 123 result.appendFormat(" Preview transform: %x\n", 124 mParameters.previewTransform); 125 result.appendFormat(" Picture size: %d x %d\n", 126 mParameters.pictureWidth, mParameters.pictureHeight); 127 result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 128 mParameters.jpegThumbSize[0], mParameters.jpegThumbSize[1]); 129 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 130 mParameters.jpegQuality, mParameters.jpegThumbQuality); 131 result.appendFormat(" Jpeg rotation: %d\n", mParameters.jpegRotation); 132 result.appendFormat(" GPS tags %s\n", 133 mParameters.gpsEnabled ? "enabled" : "disabled"); 134 if (mParameters.gpsEnabled) { 135 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 136 mParameters.gpsCoordinates[0], mParameters.gpsCoordinates[1], 137 mParameters.gpsCoordinates[2]); 138 result.appendFormat(" GPS timestamp: %lld\n", 139 mParameters.gpsTimestamp); 140 result.appendFormat(" GPS processing method: %s\n", 141 mParameters.gpsProcessingMethod.string()); 142 } 143 144 result.append(" White balance mode: "); 145 switch (mParameters.wbMode) { 146 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 147 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 148 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 149 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 150 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 151 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 152 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 153 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 154 default: result.append("UNKNOWN\n"); 155 } 156 157 result.append(" Effect mode: "); 158 switch (mParameters.effectMode) { 159 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 160 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 161 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 162 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 163 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 164 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 165 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 166 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 167 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 168 default: result.append("UNKNOWN\n"); 169 } 170 171 result.append(" Antibanding mode: "); 172 switch (mParameters.antibandingMode) { 173 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 174 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 175 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 176 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 177 default: result.append("UNKNOWN\n"); 178 } 179 180 result.append(" Scene mode: "); 181 switch (mParameters.sceneMode) { 182 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 183 result.append("AUTO\n"); break; 184 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 185 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 186 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 187 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 188 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 189 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 190 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 191 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 192 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 193 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 194 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 195 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 196 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 197 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 198 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 199 default: result.append("UNKNOWN\n"); 200 } 201 202 result.append(" Flash mode: "); 203 switch (mParameters.flashMode) { 204 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 205 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 206 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 207 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 208 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 209 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 210 default: result.append("UNKNOWN\n"); 211 } 212 213 result.append(" Focus mode: "); 214 switch (mParameters.focusMode) { 215 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 216 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 217 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 218 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 219 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 220 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 221 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 222 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 223 default: result.append("UNKNOWN\n"); 224 } 225 226 result.append(" Focusing areas:\n"); 227 for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) { 228 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 229 mParameters.focusingAreas[i].left, 230 mParameters.focusingAreas[i].top, 231 mParameters.focusingAreas[i].right, 232 mParameters.focusingAreas[i].bottom, 233 mParameters.focusingAreas[i].weight); 234 } 235 236 result.appendFormat(" Exposure compensation index: %d\n", 237 mParameters.exposureCompensation); 238 239 result.appendFormat(" AE lock %s, AWB lock %s\n", 240 mParameters.autoExposureLock ? "enabled" : "disabled", 241 mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" ); 242 243 result.appendFormat(" Metering areas:\n"); 244 for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) { 245 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 246 mParameters.meteringAreas[i].left, 247 mParameters.meteringAreas[i].top, 248 mParameters.meteringAreas[i].right, 249 mParameters.meteringAreas[i].bottom, 250 mParameters.meteringAreas[i].weight); 251 } 252 253 result.appendFormat(" Zoom index: %d\n", mParameters.zoom); 254 result.appendFormat(" Video size: %d x %d\n", mParameters.videoWidth, 255 mParameters.videoHeight); 256 257 result.appendFormat(" Recording hint is %s\n", 258 mParameters.recordingHint ? "set" : "not set"); 259 260 result.appendFormat(" Video stabilization is %s\n", 261 mParameters.videoStabilization ? "enabled" : "disabled"); 262 263 result.append(" Current streams:\n"); 264 result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId); 265 result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId); 266 267 result.append(" Current requests:\n"); 268 if (mPreviewRequest != NULL) { 269 result.append(" Preview request:\n"); 270 write(fd, result.string(), result.size()); 271 dump_camera_metadata(mPreviewRequest, fd, 2); 272 } else { 273 result.append(" Preview request: undefined\n"); 274 write(fd, result.string(), result.size()); 275 } 276 277 if (mCaptureRequest != NULL) { 278 result = " Capture request:\n"; 279 write(fd, result.string(), result.size()); 280 dump_camera_metadata(mCaptureRequest, fd, 2); 281 } else { 282 result = " Capture request: undefined\n"; 283 write(fd, result.string(), result.size()); 284 } 285 286 result = " Device dump:\n"; 287 write(fd, result.string(), result.size()); 288 289 status_t res = mDevice->dump(fd, args); 290 if (res != OK) { 291 result = String8::format(" Error dumping device: %s (%d)", 292 strerror(-res), res); 293 write(fd, result.string(), result.size()); 294 } 295 296#undef CASE_APPEND_ENUM 297 return NO_ERROR; 298} 299 300const char* Camera2Client::getStateName(State state) { 301#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 302 switch(state) { 303 CASE_ENUM_TO_CHAR(NOT_INITIALIZED) 304 CASE_ENUM_TO_CHAR(STOPPED) 305 CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 306 CASE_ENUM_TO_CHAR(PREVIEW) 307 CASE_ENUM_TO_CHAR(RECORD) 308 CASE_ENUM_TO_CHAR(STILL_CAPTURE) 309 CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 310 default: 311 return "Unknown state!"; 312 break; 313 } 314#undef CASE_ENUM_TO_CHAR 315} 316 317// ICamera interface 318 319void Camera2Client::disconnect() { 320 ATRACE_CALL(); 321 Mutex::Autolock icl(mICameraLock); 322 323 if (mDevice == 0) return; 324 325 stopPreviewLocked(); 326 327 mDevice->waitUntilDrained(); 328 329 if (mPreviewStreamId != NO_STREAM) { 330 mDevice->deleteStream(mPreviewStreamId); 331 mPreviewStreamId = NO_STREAM; 332 } 333 334 if (mCaptureStreamId != NO_STREAM) { 335 mDevice->deleteStream(mCaptureStreamId); 336 mCaptureStreamId = NO_STREAM; 337 } 338 339 CameraService::Client::disconnect(); 340} 341 342status_t Camera2Client::connect(const sp<ICameraClient>& client) { 343 ATRACE_CALL(); 344 Mutex::Autolock icl(mICameraLock); 345 346 return BAD_VALUE; 347} 348 349status_t Camera2Client::lock() { 350 ATRACE_CALL(); 351 Mutex::Autolock icl(mICameraLock); 352 353 return BAD_VALUE; 354} 355 356status_t Camera2Client::unlock() { 357 ATRACE_CALL(); 358 Mutex::Autolock icl(mICameraLock); 359 360 return BAD_VALUE; 361} 362 363status_t Camera2Client::setPreviewDisplay( 364 const sp<Surface>& surface) { 365 ATRACE_CALL(); 366 Mutex::Autolock icl(mICameraLock); 367 368 if (mState >= PREVIEW) return INVALID_OPERATION; 369 370 sp<IBinder> binder; 371 sp<ANativeWindow> window; 372 if (surface != 0) { 373 binder = surface->asBinder(); 374 window = surface; 375 } 376 377 return setPreviewWindowLocked(binder,window); 378} 379 380status_t Camera2Client::setPreviewTexture( 381 const sp<ISurfaceTexture>& surfaceTexture) { 382 ATRACE_CALL(); 383 Mutex::Autolock icl(mICameraLock); 384 385 if (mState >= PREVIEW) return INVALID_OPERATION; 386 387 sp<IBinder> binder; 388 sp<ANativeWindow> window; 389 if (surfaceTexture != 0) { 390 binder = surfaceTexture->asBinder(); 391 window = new SurfaceTextureClient(surfaceTexture); 392 } 393 return setPreviewWindowLocked(binder, window); 394} 395 396status_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder, 397 const sp<ANativeWindow>& window) { 398 ATRACE_CALL(); 399 status_t res; 400 401 if (binder == mPreviewSurface) { 402 return NO_ERROR; 403 } 404 405 // TODO: Should wait until HAL has no remaining requests 406 407 if (mPreviewStreamId != NO_STREAM) { 408 res = mDevice->deleteStream(mPreviewStreamId); 409 if (res != OK) { 410 return res; 411 } 412 } 413 res = mDevice->createStream(window, 414 mParameters.previewWidth, mParameters.previewHeight, 415 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, 416 &mPreviewStreamId); 417 if (res != OK) { 418 return res; 419 } 420 421 mPreviewSurface = binder; 422 423 if (mState == WAITING_FOR_PREVIEW_WINDOW) { 424 return startPreviewLocked(); 425 } 426 427 return OK; 428} 429 430void Camera2Client::setPreviewCallbackFlag(int flag) { 431 ATRACE_CALL(); 432 Mutex::Autolock icl(mICameraLock); 433} 434 435status_t Camera2Client::startPreview() { 436 ATRACE_CALL(); 437 Mutex::Autolock icl(mICameraLock); 438 return startPreviewLocked(); 439} 440 441status_t Camera2Client::startPreviewLocked() { 442 ATRACE_CALL(); 443 status_t res; 444 if (mState >= PREVIEW) { 445 ALOGE("%s: Can't start preview in state %s", 446 __FUNCTION__, getStateName(mState)); 447 return INVALID_OPERATION; 448 } 449 450 if (mPreviewStreamId == NO_STREAM) { 451 mState = WAITING_FOR_PREVIEW_WINDOW; 452 return OK; 453 } 454 455 if (mPreviewRequest == NULL) { 456 updatePreviewRequest(); 457 } 458 459 uint8_t outputStream = mPreviewStreamId; 460 461 camera_metadata_entry_t outputStreams; 462 res = find_camera_metadata_entry(mPreviewRequest, 463 ANDROID_REQUEST_OUTPUT_STREAMS, 464 &outputStreams); 465 if (res == NAME_NOT_FOUND) { 466 res = add_camera_metadata_entry(mPreviewRequest, 467 ANDROID_REQUEST_OUTPUT_STREAMS, 468 &outputStream, 1); 469 } else if (res == OK) { 470 res = update_camera_metadata_entry(mPreviewRequest, 471 outputStreams.index, &outputStream, 1, NULL); 472 } 473 474 if (res != OK) { 475 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 476 __FUNCTION__, mCameraId, strerror(-res), res); 477 mState = STOPPED; 478 return res; 479 } 480 481 res = mDevice->setStreamingRequest(mPreviewRequest); 482 if (res != OK) { 483 ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 484 "%s (%d)", 485 __FUNCTION__, mCameraId, strerror(-res), res); 486 mState = STOPPED; 487 return res; 488 } 489 mState = PREVIEW; 490 491 return OK; 492} 493 494void Camera2Client::stopPreview() { 495 ATRACE_CALL(); 496 Mutex::Autolock icl(mICameraLock); 497 stopPreviewLocked(); 498} 499 500void Camera2Client::stopPreviewLocked() { 501 ATRACE_CALL(); 502 switch (mState) { 503 case NOT_INITIALIZED: 504 ALOGE("%s: Camera %d: Call before initialized", 505 __FUNCTION__, mCameraId); 506 break; 507 case STOPPED: 508 break; 509 case STILL_CAPTURE: 510 ALOGE("%s: Camera %d: Cannot stop preview during still capture.", 511 __FUNCTION__, mCameraId); 512 break; 513 case RECORD: 514 // TODO: Handle record stop here 515 case PREVIEW: 516 mDevice->setStreamingRequest(NULL); 517 case WAITING_FOR_PREVIEW_WINDOW: 518 mState = STOPPED; 519 break; 520 default: 521 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 522 mState); 523 } 524} 525 526bool Camera2Client::previewEnabled() { 527 ATRACE_CALL(); 528 Mutex::Autolock icl(mICameraLock); 529 return mState == PREVIEW; 530} 531 532status_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 533 ATRACE_CALL(); 534 Mutex::Autolock icl(mICameraLock); 535 return BAD_VALUE; 536} 537 538status_t Camera2Client::startRecording() { 539 ATRACE_CALL(); 540 Mutex::Autolock icl(mICameraLock); 541 return BAD_VALUE; 542} 543 544void Camera2Client::stopRecording() { 545 ATRACE_CALL(); 546 Mutex::Autolock icl(mICameraLock); 547} 548 549bool Camera2Client::recordingEnabled() { 550 ATRACE_CALL(); 551 Mutex::Autolock icl(mICameraLock); 552 return BAD_VALUE; 553} 554 555void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 556 ATRACE_CALL(); 557 Mutex::Autolock icl(mICameraLock); 558} 559 560status_t Camera2Client::autoFocus() { 561 ATRACE_CALL(); 562 Mutex::Autolock icl(mICameraLock); 563 return OK; 564} 565 566status_t Camera2Client::cancelAutoFocus() { 567 ATRACE_CALL(); 568 Mutex::Autolock icl(mICameraLock); 569 return OK; 570} 571 572status_t Camera2Client::takePicture(int msgType) { 573 ATRACE_CALL(); 574 Mutex::Autolock icl(mICameraLock); 575 status_t res; 576 577 switch (mState) { 578 case NOT_INITIALIZED: 579 case STOPPED: 580 case WAITING_FOR_PREVIEW_WINDOW: 581 ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 582 __FUNCTION__, mCameraId); 583 return INVALID_OPERATION; 584 case PREVIEW: 585 case RECORD: 586 // Good to go for takePicture 587 break; 588 case STILL_CAPTURE: 589 case VIDEO_SNAPSHOT: 590 ALOGE("%s: Camera %d: Already taking a picture", 591 __FUNCTION__, mCameraId); 592 return INVALID_OPERATION; 593 } 594 595 Mutex::Autolock pl(mParamsLock); 596 597 res = updateCaptureStream(); 598 if (res != OK) { 599 ALOGE("%s: Can't set up still image stream: %s (%d)", 600 __FUNCTION__, strerror(-res), res); 601 return res; 602 } 603 604 if (mCaptureRequest == NULL) { 605 res = updateCaptureRequest(); 606 if (res != OK) { 607 ALOGE("%s: Can't set up still image capture request: %s (%d)", 608 __FUNCTION__, strerror(-res), res); 609 return res; 610 } 611 } 612 613 // TODO: For video snapshot, need 3 streams here 614 camera_metadata_entry_t outputStreams; 615 uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId }; 616 res = find_camera_metadata_entry(mCaptureRequest, 617 ANDROID_REQUEST_OUTPUT_STREAMS, 618 &outputStreams); 619 if (res == NAME_NOT_FOUND) { 620 res = add_camera_metadata_entry(mCaptureRequest, 621 ANDROID_REQUEST_OUTPUT_STREAMS, 622 streamIds, 2); 623 } else if (res == OK) { 624 res = update_camera_metadata_entry(mCaptureRequest, 625 outputStreams.index, streamIds, 2, NULL); 626 } 627 628 if (res != OK) { 629 ALOGE("%s: Camera %d: Unable to set up still image capture request: " 630 "%s (%d)", 631 __FUNCTION__, mCameraId, strerror(-res), res); 632 return res; 633 } 634 635 camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest); 636 if (captureCopy == NULL) { 637 ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 638 __FUNCTION__, mCameraId); 639 return NO_MEMORY; 640 } 641 642 if (mState == PREVIEW) { 643 res = mDevice->setStreamingRequest(NULL); 644 if (res != OK) { 645 ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 646 "%s (%d)", 647 __FUNCTION__, mCameraId, strerror(-res), res); 648 return res; 649 } 650 } 651 652 res = mDevice->capture(captureCopy); 653 if (res != OK) { 654 ALOGE("%s: Camera %d: Unable to submit still image capture request: " 655 "%s (%d)", 656 __FUNCTION__, mCameraId, strerror(-res), res); 657 return res; 658 } 659 660 switch (mState) { 661 case PREVIEW: 662 mState = STILL_CAPTURE; 663 break; 664 case RECORD: 665 mState = VIDEO_SNAPSHOT; 666 break; 667 default: 668 ALOGE("%s: Camera %d: Unknown state for still capture!", 669 __FUNCTION__, mCameraId); 670 return INVALID_OPERATION; 671 } 672 673 return OK; 674} 675 676status_t Camera2Client::setParameters(const String8& params) { 677 ATRACE_CALL(); 678 Mutex::Autolock icl(mICameraLock); 679 Mutex::Autolock pl(mParamsLock); 680 status_t res; 681 682 CameraParameters newParams(params); 683 684 // TODO: Currently ignoring any changes to supposedly read-only 685 // parameters such as supported preview sizes, etc. Should probably 686 // produce an error if they're changed. 687 688 /** Extract and verify new parameters */ 689 690 size_t i; 691 692 // PREVIEW_SIZE 693 int previewWidth, previewHeight; 694 newParams.getPreviewSize(&previewWidth, &previewHeight); 695 696 if (previewWidth != mParameters.previewWidth || 697 previewHeight != mParameters.previewHeight) { 698 if (mState >= PREVIEW) { 699 ALOGE("%s: Preview size cannot be updated when preview " 700 "is active!", __FUNCTION__); 701 return BAD_VALUE; 702 } 703 camera_metadata_entry_t availablePreviewSizes = 704 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 705 for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 706 if (availablePreviewSizes.data.i32[i] == previewWidth && 707 availablePreviewSizes.data.i32[i+1] == previewHeight) break; 708 } 709 if (i == availablePreviewSizes.count) { 710 ALOGE("%s: Requested preview size %d x %d is not supported", 711 __FUNCTION__, previewWidth, previewHeight); 712 return BAD_VALUE; 713 } 714 } 715 716 // PREVIEW_FPS_RANGE 717 int previewFpsRange[2]; 718 int previewFps = 0; 719 bool fpsRangeChanged = false; 720 newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]); 721 if (previewFpsRange[0] != mParameters.previewFpsRange[0] || 722 previewFpsRange[1] != mParameters.previewFpsRange[1]) { 723 fpsRangeChanged = true; 724 camera_metadata_entry_t availablePreviewFpsRanges = 725 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 726 for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 727 if ((availablePreviewFpsRanges.data.i32[i] == 728 previewFpsRange[0]) && 729 (availablePreviewFpsRanges.data.i32[i+1] == 730 previewFpsRange[1]) ) { 731 break; 732 } 733 } 734 if (i == availablePreviewFpsRanges.count) { 735 ALOGE("%s: Requested preview FPS range %d - %d is not supported", 736 __FUNCTION__, previewFpsRange[0], previewFpsRange[1]); 737 return BAD_VALUE; 738 } 739 previewFps = previewFpsRange[0]; 740 } 741 742 // PREVIEW_FORMAT 743 int previewFormat = formatStringToEnum(newParams.getPreviewFormat()); 744 if (previewFormat != mParameters.previewFormat) { 745 if (mState >= PREVIEW) { 746 ALOGE("%s: Preview format cannot be updated when preview " 747 "is active!", __FUNCTION__); 748 return BAD_VALUE; 749 } 750 camera_metadata_entry_t availableFormats = 751 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 752 for (i = 0; i < availableFormats.count; i++) { 753 if (availableFormats.data.i32[i] == previewFormat) break; 754 } 755 if (i == availableFormats.count) { 756 ALOGE("%s: Requested preview format %s (0x%x) is not supported", 757 __FUNCTION__, newParams.getPreviewFormat(), previewFormat); 758 return BAD_VALUE; 759 } 760 } 761 762 // PREVIEW_FRAME_RATE 763 // Deprecated, only use if the preview fps range is unchanged this time. 764 // The single-value FPS is the same as the minimum of the range. 765 if (!fpsRangeChanged) { 766 previewFps = newParams.getPreviewFrameRate(); 767 if (previewFps != mParameters.previewFps) { 768 camera_metadata_entry_t availableFrameRates = 769 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 770 for (i = 0; i < availableFrameRates.count; i+=2) { 771 if (availableFrameRates.data.i32[i] == previewFps) break; 772 } 773 if (i == availableFrameRates.count) { 774 ALOGE("%s: Requested preview frame rate %d is not supported", 775 __FUNCTION__, previewFps); 776 return BAD_VALUE; 777 } 778 previewFpsRange[0] = availableFrameRates.data.i32[i]; 779 previewFpsRange[1] = availableFrameRates.data.i32[i+1]; 780 } 781 } 782 783 // PICTURE_SIZE 784 int pictureWidth, pictureHeight; 785 newParams.getPictureSize(&pictureWidth, &pictureHeight); 786 if (pictureWidth == mParameters.pictureWidth || 787 pictureHeight == mParameters.pictureHeight) { 788 camera_metadata_entry_t availablePictureSizes = 789 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 790 for (i = 0; i < availablePictureSizes.count; i+=2) { 791 if (availablePictureSizes.data.i32[i] == pictureWidth && 792 availablePictureSizes.data.i32[i+1] == pictureHeight) break; 793 } 794 if (i == availablePictureSizes.count) { 795 ALOGE("%s: Requested picture size %d x %d is not supported", 796 __FUNCTION__, pictureWidth, pictureHeight); 797 return BAD_VALUE; 798 } 799 } 800 801 // JPEG_THUMBNAIL_WIDTH/HEIGHT 802 int jpegThumbSize[2]; 803 jpegThumbSize[0] = 804 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 805 jpegThumbSize[1] = 806 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 807 if (jpegThumbSize[0] != mParameters.jpegThumbSize[0] || 808 jpegThumbSize[1] != mParameters.jpegThumbSize[1]) { 809 camera_metadata_entry_t availableJpegThumbSizes = 810 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 811 for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 812 if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] && 813 availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) { 814 break; 815 } 816 } 817 if (i == availableJpegThumbSizes.count) { 818 ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 819 __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]); 820 return BAD_VALUE; 821 } 822 } 823 824 // JPEG_THUMBNAIL_QUALITY 825 int jpegThumbQuality = 826 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 827 if (jpegThumbQuality < 0 || jpegThumbQuality > 100) { 828 ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 829 __FUNCTION__, jpegThumbQuality); 830 return BAD_VALUE; 831 } 832 833 // JPEG_QUALITY 834 int jpegQuality = 835 newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 836 if (jpegQuality < 0 || jpegQuality > 100) { 837 ALOGE("%s: Requested JPEG quality %d is not supported", 838 __FUNCTION__, jpegQuality); 839 return BAD_VALUE; 840 } 841 842 // ROTATION 843 int jpegRotation = 844 newParams.getInt(CameraParameters::KEY_ROTATION); 845 if (jpegRotation != 0 && 846 jpegRotation != 90 && 847 jpegRotation != 180 && 848 jpegRotation != 270) { 849 ALOGE("%s: Requested picture rotation angle %d is not supported", 850 __FUNCTION__, jpegRotation); 851 return BAD_VALUE; 852 } 853 854 // GPS 855 bool gpsEnabled = false; 856 double gpsCoordinates[3] = {0,0,0}; 857 int64_t gpsTimestamp = 0; 858 String8 gpsProcessingMethod; 859 const char *gpsLatStr = 860 newParams.get(CameraParameters::KEY_GPS_LATITUDE); 861 if (gpsLatStr != NULL) { 862 const char *gpsLongStr = 863 newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 864 const char *gpsAltitudeStr = 865 newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 866 const char *gpsTimeStr = 867 newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 868 const char *gpsProcMethodStr = 869 newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 870 if (gpsLongStr == NULL || 871 gpsAltitudeStr == NULL || 872 gpsTimeStr == NULL || 873 gpsProcMethodStr == NULL) { 874 ALOGE("%s: Incomplete set of GPS parameters provided", 875 __FUNCTION__); 876 return BAD_VALUE; 877 } 878 char *endPtr; 879 errno = 0; 880 gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 881 if (errno || endPtr == gpsLatStr) { 882 ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 883 return BAD_VALUE; 884 } 885 errno = 0; 886 gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 887 if (errno || endPtr == gpsLongStr) { 888 ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 889 return BAD_VALUE; 890 } 891 errno = 0; 892 gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 893 if (errno || endPtr == gpsAltitudeStr) { 894 ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 895 gpsAltitudeStr); 896 return BAD_VALUE; 897 } 898 errno = 0; 899 gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 900 if (errno || endPtr == gpsTimeStr) { 901 ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 902 return BAD_VALUE; 903 } 904 gpsProcessingMethod = gpsProcMethodStr; 905 906 gpsEnabled = true; 907 } 908 909 // WHITE_BALANCE 910 int wbMode = wbModeStringToEnum( 911 newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 912 if (wbMode != mParameters.wbMode) { 913 camera_metadata_entry_t availableWbModes = 914 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 915 for (i = 0; i < availableWbModes.count; i++) { 916 if (wbMode == availableWbModes.data.u8[i]) break; 917 } 918 if (i == availableWbModes.count) { 919 ALOGE("%s: Requested white balance mode %s is not supported", 920 __FUNCTION__, 921 newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 922 return BAD_VALUE; 923 } 924 } 925 926 // EFFECT 927 int effectMode = effectModeStringToEnum( 928 newParams.get(CameraParameters::KEY_EFFECT) ); 929 if (effectMode != mParameters.effectMode) { 930 camera_metadata_entry_t availableEffectModes = 931 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 932 for (i = 0; i < availableEffectModes.count; i++) { 933 if (effectMode == availableEffectModes.data.u8[i]) break; 934 } 935 if (i == availableEffectModes.count) { 936 ALOGE("%s: Requested effect mode \"%s\" is not supported", 937 __FUNCTION__, 938 newParams.get(CameraParameters::KEY_EFFECT) ); 939 return BAD_VALUE; 940 } 941 } 942 943 // ANTIBANDING 944 int antibandingMode = abModeStringToEnum( 945 newParams.get(CameraParameters::KEY_ANTIBANDING) ); 946 if (antibandingMode != mParameters.antibandingMode) { 947 camera_metadata_entry_t availableAbModes = 948 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 949 for (i = 0; i < availableAbModes.count; i++) { 950 if (antibandingMode == availableAbModes.data.u8[i]) break; 951 } 952 if (i == availableAbModes.count) { 953 ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 954 __FUNCTION__, 955 newParams.get(CameraParameters::KEY_ANTIBANDING)); 956 return BAD_VALUE; 957 } 958 } 959 960 // SCENE_MODE 961 int sceneMode = sceneModeStringToEnum( 962 newParams.get(CameraParameters::KEY_SCENE_MODE) ); 963 if (sceneMode != mParameters.sceneMode) { 964 camera_metadata_entry_t availableSceneModes = 965 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 966 for (i = 0; i < availableSceneModes.count; i++) { 967 if (sceneMode == availableSceneModes.data.u8[i]) break; 968 } 969 if (i == availableSceneModes.count) { 970 ALOGE("%s: Requested scene mode \"%s\" is not supported", 971 __FUNCTION__, 972 newParams.get(CameraParameters::KEY_SCENE_MODE)); 973 return BAD_VALUE; 974 } 975 } 976 977 // FLASH_MODE 978 Parameters::flashMode_t flashMode = flashModeStringToEnum( 979 newParams.get(CameraParameters::KEY_FLASH_MODE) ); 980 if (flashMode != mParameters.flashMode) { 981 camera_metadata_entry_t flashAvailable = 982 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 983 if (!flashAvailable.data.u8[0] && 984 flashMode != Parameters::FLASH_MODE_OFF) { 985 ALOGE("%s: Requested flash mode \"%s\" is not supported: " 986 "No flash on device", __FUNCTION__, 987 newParams.get(CameraParameters::KEY_FLASH_MODE)); 988 return BAD_VALUE; 989 } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) { 990 camera_metadata_entry_t availableAeModes = 991 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 992 for (i = 0; i < availableAeModes.count; i++) { 993 if (flashMode == availableAeModes.data.u8[i]) break; 994 } 995 if (i == availableAeModes.count) { 996 ALOGE("%s: Requested flash mode \"%s\" is not supported", 997 __FUNCTION__, 998 newParams.get(CameraParameters::KEY_FLASH_MODE)); 999 return BAD_VALUE; 1000 } 1001 } else if (flashMode == -1) { 1002 ALOGE("%s: Requested flash mode \"%s\" is unknown", 1003 __FUNCTION__, 1004 newParams.get(CameraParameters::KEY_FLASH_MODE)); 1005 return BAD_VALUE; 1006 } 1007 } 1008 1009 // FOCUS_MODE 1010 Parameters::focusMode_t focusMode = focusModeStringToEnum( 1011 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1012 if (focusMode != mParameters.focusMode) { 1013 if (focusMode != Parameters::FOCUS_MODE_FIXED) { 1014 camera_metadata_entry_t minFocusDistance = 1015 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 1016 if (minFocusDistance.data.f[0] == 0) { 1017 ALOGE("%s: Requested focus mode \"%s\" is not available: " 1018 "fixed focus lens", 1019 __FUNCTION__, 1020 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1021 return BAD_VALUE; 1022 } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) { 1023 camera_metadata_entry_t availableFocusModes = 1024 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 1025 for (i = 0; i < availableFocusModes.count; i++) { 1026 if (focusMode == availableFocusModes.data.u8[i]) break; 1027 } 1028 if (i == availableFocusModes.count) { 1029 ALOGE("%s: Requested focus mode \"%s\" is not supported", 1030 __FUNCTION__, 1031 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1032 return BAD_VALUE; 1033 } 1034 } 1035 } 1036 } 1037 1038 // FOCUS_AREAS 1039 Vector<Parameters::Area> focusingAreas; 1040 res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 1041 &focusingAreas); 1042 size_t max3aRegions = 1043 (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 1044 if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 1045 if (res != OK) { 1046 ALOGE("%s: Requested focus areas are malformed: %s", 1047 __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 1048 return BAD_VALUE; 1049 } 1050 1051 // EXPOSURE_COMPENSATION 1052 int exposureCompensation = 1053 newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 1054 camera_metadata_entry_t exposureCompensationRange = 1055 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 1056 if (exposureCompensation < exposureCompensationRange.data.i32[0] || 1057 exposureCompensation > exposureCompensationRange.data.i32[1]) { 1058 ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 1059 __FUNCTION__, exposureCompensation); 1060 return BAD_VALUE; 1061 } 1062 1063 // AUTO_EXPOSURE_LOCK (always supported) 1064 bool autoExposureLock = boolFromString( 1065 newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 1066 1067 // AUTO_WHITEBALANCE_LOCK (always supported) 1068 bool autoWhiteBalanceLock = boolFromString( 1069 newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 1070 1071 // METERING_AREAS 1072 Vector<Parameters::Area> meteringAreas; 1073 res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 1074 &meteringAreas); 1075 if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 1076 if (res != OK) { 1077 ALOGE("%s: Requested metering areas are malformed: %s", 1078 __FUNCTION__, 1079 newParams.get(CameraParameters::KEY_METERING_AREAS)); 1080 return BAD_VALUE; 1081 } 1082 1083 // ZOOM 1084 int zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 1085 if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) { 1086 ALOGE("%s: Requested zoom level %d is not supported", 1087 __FUNCTION__, zoom); 1088 return BAD_VALUE; 1089 } 1090 1091 // VIDEO_SIZE 1092 int videoWidth, videoHeight; 1093 newParams.getVideoSize(&videoWidth, &videoHeight); 1094 if (videoWidth != mParameters.videoWidth || 1095 videoHeight != mParameters.videoHeight) { 1096 if (mState == RECORD) { 1097 ALOGE("%s: Video size cannot be updated when recording is active!", 1098 __FUNCTION__); 1099 return BAD_VALUE; 1100 } 1101 camera_metadata_entry_t availableVideoSizes = 1102 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 1103 for (i = 0; i < availableVideoSizes.count; i += 2 ) { 1104 if (availableVideoSizes.data.i32[i] == videoWidth && 1105 availableVideoSizes.data.i32[i+1] == videoHeight) break; 1106 } 1107 if (i == availableVideoSizes.count) { 1108 ALOGE("%s: Requested video size %d x %d is not supported", 1109 __FUNCTION__, videoWidth, videoHeight); 1110 return BAD_VALUE; 1111 } 1112 } 1113 1114 // RECORDING_HINT (always supported) 1115 bool recordingHint = boolFromString( 1116 newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 1117 1118 // VIDEO_STABILIZATION 1119 bool videoStabilization = boolFromString( 1120 newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 1121 camera_metadata_entry_t availableVideoStabilizationModes = 1122 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 1123 if (videoStabilization && availableVideoStabilizationModes.count == 1) { 1124 ALOGE("%s: Video stabilization not supported", __FUNCTION__); 1125 } 1126 1127 /** Update internal parameters */ 1128 mParameters.previewWidth = previewWidth; 1129 mParameters.previewHeight = previewHeight; 1130 mParameters.previewFpsRange[0] = previewFpsRange[0]; 1131 mParameters.previewFpsRange[1] = previewFpsRange[1]; 1132 mParameters.previewFps = previewFps; 1133 mParameters.previewFormat = previewFormat; 1134 1135 mParameters.pictureWidth = pictureWidth; 1136 mParameters.pictureHeight = pictureHeight; 1137 1138 mParameters.jpegThumbSize[0] = jpegThumbSize[0]; 1139 mParameters.jpegThumbSize[1] = jpegThumbSize[1]; 1140 mParameters.jpegQuality = jpegQuality; 1141 mParameters.jpegThumbQuality = jpegThumbQuality; 1142 1143 mParameters.gpsEnabled = gpsEnabled; 1144 mParameters.gpsCoordinates[0] = gpsCoordinates[0]; 1145 mParameters.gpsCoordinates[1] = gpsCoordinates[1]; 1146 mParameters.gpsCoordinates[2] = gpsCoordinates[2]; 1147 mParameters.gpsTimestamp = gpsTimestamp; 1148 mParameters.gpsProcessingMethod = gpsProcessingMethod; 1149 1150 mParameters.wbMode = wbMode; 1151 mParameters.effectMode = effectMode; 1152 mParameters.antibandingMode = antibandingMode; 1153 mParameters.sceneMode = sceneMode; 1154 1155 mParameters.flashMode = flashMode; 1156 mParameters.focusMode = focusMode; 1157 1158 mParameters.focusingAreas = focusingAreas; 1159 mParameters.exposureCompensation = exposureCompensation; 1160 mParameters.autoExposureLock = autoExposureLock; 1161 mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock; 1162 mParameters.meteringAreas = meteringAreas; 1163 mParameters.zoom = zoom; 1164 1165 mParameters.videoWidth = videoWidth; 1166 mParameters.videoHeight = videoHeight; 1167 1168 mParameters.recordingHint = recordingHint; 1169 mParameters.videoStabilization = videoStabilization; 1170 1171 updatePreviewRequest(); 1172 updateCaptureRequest(); 1173 1174 return OK; 1175} 1176 1177String8 Camera2Client::getParameters() const { 1178 ATRACE_CALL(); 1179 Mutex::Autolock icl(mICameraLock); 1180 1181 Mutex::Autolock pl(mParamsLock); 1182 1183 // TODO: Deal with focus distances 1184 return mParamsFlattened; 1185} 1186 1187status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1188 ATRACE_CALL(); 1189 Mutex::Autolock icl(mICameraLock); 1190 return OK; 1191} 1192 1193/** Device-related methods */ 1194 1195void Camera2Client::onCaptureAvailable() { 1196 ATRACE_CALL(); 1197 status_t res; 1198 sp<ICameraClient> currentClient; 1199 CpuConsumer::LockedBuffer imgBuffer; 1200 { 1201 Mutex::Autolock icl(mICameraLock); 1202 1203 // TODO: Signal errors here upstream 1204 if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) { 1205 ALOGE("%s: Camera %d: Still image produced unexpectedly!", 1206 __FUNCTION__, mCameraId); 1207 return; 1208 } 1209 1210 res = mCaptureConsumer->lockNextBuffer(&imgBuffer); 1211 if (res != OK) { 1212 ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)", 1213 __FUNCTION__, mCameraId, strerror(-res), res); 1214 return; 1215 } 1216 1217 if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) { 1218 ALOGE("%s: Camera %d: Unexpected format for still image: " 1219 "%x, expected %x", __FUNCTION__, mCameraId, 1220 imgBuffer.format, 1221 HAL_PIXEL_FORMAT_BLOB); 1222 mCaptureConsumer->unlockBuffer(imgBuffer); 1223 return; 1224 } 1225 1226 // TODO: Optimize this to avoid memcopy 1227 void* captureMemory = mCaptureHeap->getBase(); 1228 size_t size = mCaptureHeap->getSize(); 1229 memcpy(captureMemory, imgBuffer.data, size); 1230 1231 mCaptureConsumer->unlockBuffer(imgBuffer); 1232 1233 currentClient = mCameraClient; 1234 switch (mState) { 1235 case STILL_CAPTURE: 1236 mState = STOPPED; 1237 break; 1238 case VIDEO_SNAPSHOT: 1239 mState = RECORD; 1240 break; 1241 default: 1242 ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__, 1243 mCameraId, mState); 1244 break; 1245 } 1246 } 1247 // Call outside mICameraLock to allow re-entrancy from notification 1248 if (currentClient != 0) { 1249 currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 1250 mCaptureMemory, NULL); 1251 } 1252} 1253 1254camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag, 1255 size_t minCount, size_t maxCount) { 1256 status_t res; 1257 camera_metadata_entry_t entry; 1258 res = find_camera_metadata_entry(mDevice->info(), 1259 tag, 1260 &entry); 1261 if (CC_UNLIKELY( res != OK )) { 1262 const char* tagSection = get_camera_metadata_section_name(tag); 1263 if (tagSection == NULL) tagSection = "<unknown>"; 1264 const char* tagName = get_camera_metadata_tag_name(tag); 1265 if (tagName == NULL) tagName = "<unknown>"; 1266 1267 ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)", 1268 tagSection, tagName, tag, strerror(-res), res); 1269 entry.count = 0; 1270 entry.data.u8 = NULL; 1271 } else if (CC_UNLIKELY( 1272 (minCount != 0 && entry.count < minCount) || 1273 (maxCount != 0 && entry.count > maxCount) ) ) { 1274 const char* tagSection = get_camera_metadata_section_name(tag); 1275 if (tagSection == NULL) tagSection = "<unknown>"; 1276 const char* tagName = get_camera_metadata_tag_name(tag); 1277 if (tagName == NULL) tagName = "<unknown>"; 1278 ALOGE("Malformed static metadata entry '%s.%s' (%x):" 1279 "Expected between %d and %d values, but got %d values", 1280 tagSection, tagName, tag, minCount, maxCount, entry.count); 1281 entry.count = 0; 1282 entry.data.u8 = NULL; 1283 } 1284 1285 return entry; 1286} 1287 1288/** Utility methods */ 1289 1290 1291status_t Camera2Client::buildDefaultParameters() { 1292 ATRACE_CALL(); 1293 Mutex::Autolock pl(mParamsLock); 1294 1295 status_t res; 1296 CameraParameters params; 1297 1298 camera_metadata_entry_t availableProcessedSizes = 1299 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 1300 if (!availableProcessedSizes.count) return NO_INIT; 1301 1302 // TODO: Pick more intelligently 1303 mParameters.previewWidth = availableProcessedSizes.data.i32[0]; 1304 mParameters.previewHeight = availableProcessedSizes.data.i32[1]; 1305 mParameters.videoWidth = mParameters.previewWidth; 1306 mParameters.videoHeight = mParameters.previewHeight; 1307 1308 params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight); 1309 params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight); 1310 params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 1311 String8::format("%dx%d", 1312 mParameters.previewWidth, mParameters.previewHeight)); 1313 { 1314 String8 supportedPreviewSizes; 1315 for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 1316 if (i != 0) supportedPreviewSizes += ","; 1317 supportedPreviewSizes += String8::format("%dx%d", 1318 availableProcessedSizes.data.i32[i], 1319 availableProcessedSizes.data.i32[i+1]); 1320 } 1321 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 1322 supportedPreviewSizes); 1323 params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 1324 supportedPreviewSizes); 1325 } 1326 1327 camera_metadata_entry_t availableFpsRanges = 1328 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 1329 if (!availableFpsRanges.count) return NO_INIT; 1330 1331 mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0]; 1332 mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1]; 1333 1334 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 1335 String8::format("%d,%d", 1336 mParameters.previewFpsRange[0], 1337 mParameters.previewFpsRange[1])); 1338 1339 { 1340 String8 supportedPreviewFpsRange; 1341 for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1342 if (i != 0) supportedPreviewFpsRange += ","; 1343 supportedPreviewFpsRange += String8::format("(%d,%d)", 1344 availableFpsRanges.data.i32[i], 1345 availableFpsRanges.data.i32[i+1]); 1346 } 1347 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 1348 supportedPreviewFpsRange); 1349 } 1350 1351 mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1352 params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1353 formatEnumToString(mParameters.previewFormat)); // NV21 1354 1355 camera_metadata_entry_t availableFormats = 1356 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 1357 1358 { 1359 String8 supportedPreviewFormats; 1360 bool addComma = false; 1361 for (size_t i=0; i < availableFormats.count; i++) { 1362 if (addComma) supportedPreviewFormats += ","; 1363 addComma = true; 1364 switch (availableFormats.data.i32[i]) { 1365 case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1366 supportedPreviewFormats += 1367 CameraParameters::PIXEL_FORMAT_YUV422SP; 1368 break; 1369 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1370 supportedPreviewFormats += 1371 CameraParameters::PIXEL_FORMAT_YUV420SP; 1372 break; 1373 case HAL_PIXEL_FORMAT_YCbCr_422_I: 1374 supportedPreviewFormats += 1375 CameraParameters::PIXEL_FORMAT_YUV422I; 1376 break; 1377 case HAL_PIXEL_FORMAT_YV12: 1378 supportedPreviewFormats += 1379 CameraParameters::PIXEL_FORMAT_YUV420P; 1380 break; 1381 case HAL_PIXEL_FORMAT_RGB_565: 1382 supportedPreviewFormats += 1383 CameraParameters::PIXEL_FORMAT_RGB565; 1384 break; 1385 case HAL_PIXEL_FORMAT_RGBA_8888: 1386 supportedPreviewFormats += 1387 CameraParameters::PIXEL_FORMAT_RGBA8888; 1388 break; 1389 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1390 case HAL_PIXEL_FORMAT_RAW_SENSOR: 1391 case HAL_PIXEL_FORMAT_BLOB: 1392 addComma = false; 1393 break; 1394 1395 default: 1396 ALOGW("%s: Camera %d: Unknown preview format: %x", 1397 __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 1398 addComma = false; 1399 break; 1400 } 1401 } 1402 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1403 supportedPreviewFormats); 1404 } 1405 1406 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1407 // still have to do something sane for them 1408 1409 params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 1410 mParameters.previewFpsRange[0]); 1411 1412 { 1413 String8 supportedPreviewFrameRates; 1414 for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1415 if (i != 0) supportedPreviewFrameRates += ","; 1416 supportedPreviewFrameRates += String8::format("%d", 1417 availableFpsRanges.data.i32[i]); 1418 } 1419 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 1420 supportedPreviewFrameRates); 1421 } 1422 1423 camera_metadata_entry_t availableJpegSizes = 1424 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 1425 if (!availableJpegSizes.count) return NO_INIT; 1426 1427 // TODO: Pick maximum 1428 mParameters.pictureWidth = availableJpegSizes.data.i32[0]; 1429 mParameters.pictureHeight = availableJpegSizes.data.i32[1]; 1430 1431 params.setPictureSize(mParameters.pictureWidth, 1432 mParameters.pictureHeight); 1433 1434 { 1435 String8 supportedPictureSizes; 1436 for (size_t i=0; i < availableJpegSizes.count; i += 2) { 1437 if (i != 0) supportedPictureSizes += ","; 1438 supportedPictureSizes += String8::format("%dx%d", 1439 availableJpegSizes.data.i32[i], 1440 availableJpegSizes.data.i32[i+1]); 1441 } 1442 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 1443 supportedPictureSizes); 1444 } 1445 1446 params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 1447 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 1448 CameraParameters::PIXEL_FORMAT_JPEG); 1449 1450 camera_metadata_entry_t availableJpegThumbnailSizes = 1451 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2); 1452 if (!availableJpegThumbnailSizes.count) return NO_INIT; 1453 1454 // TODO: Pick default thumbnail size sensibly 1455 mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 1456 mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 1457 1458 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 1459 mParameters.jpegThumbSize[0]); 1460 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 1461 mParameters.jpegThumbSize[1]); 1462 1463 { 1464 String8 supportedJpegThumbSizes; 1465 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 1466 if (i != 0) supportedJpegThumbSizes += ","; 1467 supportedJpegThumbSizes += String8::format("%dx%d", 1468 availableJpegThumbnailSizes.data.i32[i], 1469 availableJpegThumbnailSizes.data.i32[i+1]); 1470 } 1471 params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 1472 supportedJpegThumbSizes); 1473 } 1474 1475 mParameters.jpegThumbQuality = 90; 1476 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 1477 mParameters.jpegThumbQuality); 1478 mParameters.jpegQuality = 90; 1479 params.set(CameraParameters::KEY_JPEG_QUALITY, 1480 mParameters.jpegQuality); 1481 mParameters.jpegRotation = 0; 1482 params.set(CameraParameters::KEY_ROTATION, 1483 mParameters.jpegRotation); 1484 1485 mParameters.gpsEnabled = false; 1486 mParameters.gpsProcessingMethod = "unknown"; 1487 // GPS fields in CameraParameters are not set by implementation 1488 1489 mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO; 1490 params.set(CameraParameters::KEY_WHITE_BALANCE, 1491 CameraParameters::WHITE_BALANCE_AUTO); 1492 1493 camera_metadata_entry_t availableWhiteBalanceModes = 1494 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 1495 { 1496 String8 supportedWhiteBalance; 1497 bool addComma = false; 1498 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 1499 if (addComma) supportedWhiteBalance += ","; 1500 addComma = true; 1501 switch (availableWhiteBalanceModes.data.u8[i]) { 1502 case ANDROID_CONTROL_AWB_AUTO: 1503 supportedWhiteBalance += 1504 CameraParameters::WHITE_BALANCE_AUTO; 1505 break; 1506 case ANDROID_CONTROL_AWB_INCANDESCENT: 1507 supportedWhiteBalance += 1508 CameraParameters::WHITE_BALANCE_INCANDESCENT; 1509 break; 1510 case ANDROID_CONTROL_AWB_FLUORESCENT: 1511 supportedWhiteBalance += 1512 CameraParameters::WHITE_BALANCE_FLUORESCENT; 1513 break; 1514 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 1515 supportedWhiteBalance += 1516 CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 1517 break; 1518 case ANDROID_CONTROL_AWB_DAYLIGHT: 1519 supportedWhiteBalance += 1520 CameraParameters::WHITE_BALANCE_DAYLIGHT; 1521 break; 1522 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 1523 supportedWhiteBalance += 1524 CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 1525 break; 1526 case ANDROID_CONTROL_AWB_TWILIGHT: 1527 supportedWhiteBalance += 1528 CameraParameters::WHITE_BALANCE_TWILIGHT; 1529 break; 1530 case ANDROID_CONTROL_AWB_SHADE: 1531 supportedWhiteBalance += 1532 CameraParameters::WHITE_BALANCE_SHADE; 1533 break; 1534 // Skipping values not mappable to v1 API 1535 case ANDROID_CONTROL_AWB_OFF: 1536 addComma = false; 1537 break; 1538 default: 1539 ALOGW("%s: Camera %d: Unknown white balance value: %d", 1540 __FUNCTION__, mCameraId, 1541 availableWhiteBalanceModes.data.u8[i]); 1542 addComma = false; 1543 break; 1544 } 1545 } 1546 params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 1547 supportedWhiteBalance); 1548 } 1549 1550 mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF; 1551 params.set(CameraParameters::KEY_EFFECT, 1552 CameraParameters::EFFECT_NONE); 1553 1554 camera_metadata_entry_t availableEffects = 1555 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 1556 if (!availableEffects.count) return NO_INIT; 1557 { 1558 String8 supportedEffects; 1559 bool addComma = false; 1560 for (size_t i=0; i < availableEffects.count; i++) { 1561 if (addComma) supportedEffects += ","; 1562 addComma = true; 1563 switch (availableEffects.data.u8[i]) { 1564 case ANDROID_CONTROL_EFFECT_OFF: 1565 supportedEffects += 1566 CameraParameters::EFFECT_NONE; 1567 break; 1568 case ANDROID_CONTROL_EFFECT_MONO: 1569 supportedEffects += 1570 CameraParameters::EFFECT_MONO; 1571 break; 1572 case ANDROID_CONTROL_EFFECT_NEGATIVE: 1573 supportedEffects += 1574 CameraParameters::EFFECT_NEGATIVE; 1575 break; 1576 case ANDROID_CONTROL_EFFECT_SOLARIZE: 1577 supportedEffects += 1578 CameraParameters::EFFECT_SOLARIZE; 1579 break; 1580 case ANDROID_CONTROL_EFFECT_SEPIA: 1581 supportedEffects += 1582 CameraParameters::EFFECT_SEPIA; 1583 break; 1584 case ANDROID_CONTROL_EFFECT_POSTERIZE: 1585 supportedEffects += 1586 CameraParameters::EFFECT_POSTERIZE; 1587 break; 1588 case ANDROID_CONTROL_EFFECT_WHITEBOARD: 1589 supportedEffects += 1590 CameraParameters::EFFECT_WHITEBOARD; 1591 break; 1592 case ANDROID_CONTROL_EFFECT_BLACKBOARD: 1593 supportedEffects += 1594 CameraParameters::EFFECT_BLACKBOARD; 1595 break; 1596 case ANDROID_CONTROL_EFFECT_AQUA: 1597 supportedEffects += 1598 CameraParameters::EFFECT_AQUA; 1599 break; 1600 default: 1601 ALOGW("%s: Camera %d: Unknown effect value: %d", 1602 __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 1603 addComma = false; 1604 break; 1605 } 1606 } 1607 params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 1608 } 1609 1610 mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 1611 params.set(CameraParameters::KEY_ANTIBANDING, 1612 CameraParameters::ANTIBANDING_AUTO); 1613 1614 camera_metadata_entry_t availableAntibandingModes = 1615 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 1616 if (!availableAntibandingModes.count) return NO_INIT; 1617 { 1618 String8 supportedAntibanding; 1619 bool addComma = false; 1620 for (size_t i=0; i < availableAntibandingModes.count; i++) { 1621 if (addComma) supportedAntibanding += ","; 1622 addComma = true; 1623 switch (availableAntibandingModes.data.u8[i]) { 1624 case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 1625 supportedAntibanding += 1626 CameraParameters::ANTIBANDING_OFF; 1627 break; 1628 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 1629 supportedAntibanding += 1630 CameraParameters::ANTIBANDING_50HZ; 1631 break; 1632 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 1633 supportedAntibanding += 1634 CameraParameters::ANTIBANDING_60HZ; 1635 break; 1636 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 1637 supportedAntibanding += 1638 CameraParameters::ANTIBANDING_AUTO; 1639 break; 1640 default: 1641 ALOGW("%s: Camera %d: Unknown antibanding value: %d", 1642 __FUNCTION__, mCameraId, 1643 availableAntibandingModes.data.u8[i]); 1644 addComma = false; 1645 break; 1646 } 1647 } 1648 params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 1649 supportedAntibanding); 1650 } 1651 1652 mParameters.sceneMode = ANDROID_CONTROL_OFF; 1653 params.set(CameraParameters::KEY_SCENE_MODE, 1654 CameraParameters::SCENE_MODE_AUTO); 1655 1656 camera_metadata_entry_t availableSceneModes = 1657 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 1658 if (!availableSceneModes.count) return NO_INIT; 1659 { 1660 String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 1661 bool addComma = true; 1662 bool noSceneModes = false; 1663 for (size_t i=0; i < availableSceneModes.count; i++) { 1664 if (addComma) supportedSceneModes += ","; 1665 addComma = true; 1666 switch (availableSceneModes.data.u8[i]) { 1667 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 1668 noSceneModes = true; 1669 break; 1670 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 1671 // Not in old API 1672 addComma = false; 1673 break; 1674 case ANDROID_CONTROL_SCENE_MODE_ACTION: 1675 supportedSceneModes += 1676 CameraParameters::SCENE_MODE_ACTION; 1677 break; 1678 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 1679 supportedSceneModes += 1680 CameraParameters::SCENE_MODE_PORTRAIT; 1681 break; 1682 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 1683 supportedSceneModes += 1684 CameraParameters::SCENE_MODE_LANDSCAPE; 1685 break; 1686 case ANDROID_CONTROL_SCENE_MODE_NIGHT: 1687 supportedSceneModes += 1688 CameraParameters::SCENE_MODE_NIGHT; 1689 break; 1690 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 1691 supportedSceneModes += 1692 CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 1693 break; 1694 case ANDROID_CONTROL_SCENE_MODE_THEATRE: 1695 supportedSceneModes += 1696 CameraParameters::SCENE_MODE_THEATRE; 1697 break; 1698 case ANDROID_CONTROL_SCENE_MODE_BEACH: 1699 supportedSceneModes += 1700 CameraParameters::SCENE_MODE_BEACH; 1701 break; 1702 case ANDROID_CONTROL_SCENE_MODE_SNOW: 1703 supportedSceneModes += 1704 CameraParameters::SCENE_MODE_SNOW; 1705 break; 1706 case ANDROID_CONTROL_SCENE_MODE_SUNSET: 1707 supportedSceneModes += 1708 CameraParameters::SCENE_MODE_SUNSET; 1709 break; 1710 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 1711 supportedSceneModes += 1712 CameraParameters::SCENE_MODE_STEADYPHOTO; 1713 break; 1714 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 1715 supportedSceneModes += 1716 CameraParameters::SCENE_MODE_FIREWORKS; 1717 break; 1718 case ANDROID_CONTROL_SCENE_MODE_SPORTS: 1719 supportedSceneModes += 1720 CameraParameters::SCENE_MODE_SPORTS; 1721 break; 1722 case ANDROID_CONTROL_SCENE_MODE_PARTY: 1723 supportedSceneModes += 1724 CameraParameters::SCENE_MODE_PARTY; 1725 break; 1726 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 1727 supportedSceneModes += 1728 CameraParameters::SCENE_MODE_CANDLELIGHT; 1729 break; 1730 case ANDROID_CONTROL_SCENE_MODE_BARCODE: 1731 supportedSceneModes += 1732 CameraParameters::SCENE_MODE_BARCODE; 1733 break; 1734 default: 1735 ALOGW("%s: Camera %d: Unknown scene mode value: %d", 1736 __FUNCTION__, mCameraId, 1737 availableSceneModes.data.u8[i]); 1738 addComma = false; 1739 break; 1740 } 1741 } 1742 if (!noSceneModes) { 1743 params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 1744 supportedSceneModes); 1745 } 1746 } 1747 1748 camera_metadata_entry_t flashAvailable = 1749 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 1750 if (!flashAvailable.count) return NO_INIT; 1751 1752 camera_metadata_entry_t availableAeModes = 1753 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 1754 if (!availableAeModes.count) return NO_INIT; 1755 1756 if (flashAvailable.data.u8[0]) { 1757 mParameters.flashMode = Parameters::FLASH_MODE_AUTO; 1758 params.set(CameraParameters::KEY_FLASH_MODE, 1759 CameraParameters::FLASH_MODE_AUTO); 1760 1761 String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 1762 supportedFlashModes = supportedFlashModes + 1763 "," + CameraParameters::FLASH_MODE_AUTO + 1764 "," + CameraParameters::FLASH_MODE_ON + 1765 "," + CameraParameters::FLASH_MODE_TORCH; 1766 for (size_t i=0; i < availableAeModes.count; i++) { 1767 if (availableAeModes.data.u8[i] == 1768 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 1769 supportedFlashModes = supportedFlashModes + "," + 1770 CameraParameters::FLASH_MODE_RED_EYE; 1771 break; 1772 } 1773 } 1774 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 1775 supportedFlashModes); 1776 } else { 1777 mParameters.flashMode = Parameters::FLASH_MODE_OFF; 1778 params.set(CameraParameters::KEY_FLASH_MODE, 1779 CameraParameters::FLASH_MODE_OFF); 1780 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 1781 CameraParameters::FLASH_MODE_OFF); 1782 } 1783 1784 camera_metadata_entry_t minFocusDistance = 1785 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 1786 if (!minFocusDistance.count) return NO_INIT; 1787 1788 camera_metadata_entry_t availableAfModes = 1789 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 1790 if (!availableAfModes.count) return NO_INIT; 1791 1792 if (minFocusDistance.data.f[0] == 0) { 1793 // Fixed-focus lens 1794 mParameters.focusMode = Parameters::FOCUS_MODE_FIXED; 1795 params.set(CameraParameters::KEY_FOCUS_MODE, 1796 CameraParameters::FOCUS_MODE_FIXED); 1797 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 1798 CameraParameters::FOCUS_MODE_FIXED); 1799 } else { 1800 mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 1801 params.set(CameraParameters::KEY_FOCUS_MODE, 1802 CameraParameters::FOCUS_MODE_AUTO); 1803 String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED); 1804 supportedFocusModes = supportedFocusModes + "," + 1805 CameraParameters::FOCUS_MODE_INFINITY; 1806 bool addComma = true; 1807 1808 for (size_t i=0; i < availableAfModes.count; i++) { 1809 if (addComma) supportedFocusModes += ","; 1810 addComma = true; 1811 switch (availableAfModes.data.u8[i]) { 1812 case ANDROID_CONTROL_AF_AUTO: 1813 supportedFocusModes += 1814 CameraParameters::FOCUS_MODE_AUTO; 1815 break; 1816 case ANDROID_CONTROL_AF_MACRO: 1817 supportedFocusModes += 1818 CameraParameters::FOCUS_MODE_MACRO; 1819 break; 1820 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 1821 supportedFocusModes += 1822 CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 1823 break; 1824 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 1825 supportedFocusModes += 1826 CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 1827 break; 1828 case ANDROID_CONTROL_AF_EDOF: 1829 supportedFocusModes += 1830 CameraParameters::FOCUS_MODE_EDOF; 1831 break; 1832 // Not supported in old API 1833 case ANDROID_CONTROL_AF_OFF: 1834 addComma = false; 1835 break; 1836 default: 1837 ALOGW("%s: Camera %d: Unknown AF mode value: %d", 1838 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 1839 addComma = false; 1840 break; 1841 } 1842 } 1843 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 1844 supportedFocusModes); 1845 } 1846 1847 camera_metadata_entry_t max3aRegions = 1848 staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 1849 if (!max3aRegions.count) return NO_INIT; 1850 1851 params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 1852 max3aRegions.data.i32[0]); 1853 params.set(CameraParameters::KEY_FOCUS_AREAS, 1854 "(0,0,0,0,0)"); 1855 mParameters.focusingAreas.clear(); 1856 mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0)); 1857 1858 camera_metadata_entry_t availableFocalLengths = 1859 staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 1860 if (!availableFocalLengths.count) return NO_INIT; 1861 1862 float minFocalLength = availableFocalLengths.data.f[0]; 1863 params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 1864 1865 camera_metadata_entry_t sensorSize = 1866 staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 1867 if (!sensorSize.count) return NO_INIT; 1868 1869 // The fields of view here assume infinity focus, maximum wide angle 1870 float horizFov = 180 / M_PI * 1871 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 1872 float vertFov = 180 / M_PI * 1873 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 1874 params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 1875 params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 1876 1877 mParameters.exposureCompensation = 0; 1878 params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 1879 mParameters.exposureCompensation); 1880 1881 camera_metadata_entry_t exposureCompensationRange = 1882 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 1883 if (!exposureCompensationRange.count) return NO_INIT; 1884 1885 params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 1886 exposureCompensationRange.data.i32[1]); 1887 params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 1888 exposureCompensationRange.data.i32[0]); 1889 1890 camera_metadata_entry_t exposureCompensationStep = 1891 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 1892 if (!exposureCompensationStep.count) return NO_INIT; 1893 1894 params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 1895 exposureCompensationStep.data.r[0].numerator / 1896 exposureCompensationStep.data.r[0].denominator); 1897 1898 mParameters.autoExposureLock = false; 1899 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 1900 CameraParameters::FALSE); 1901 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 1902 CameraParameters::TRUE); 1903 1904 mParameters.autoWhiteBalanceLock = false; 1905 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 1906 CameraParameters::FALSE); 1907 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 1908 CameraParameters::TRUE); 1909 1910 mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 1911 params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 1912 max3aRegions.data.i32[0]); 1913 params.set(CameraParameters::KEY_METERING_AREAS, 1914 "(0,0,0,0,0)"); 1915 1916 mParameters.zoom = 0; 1917 params.set(CameraParameters::KEY_ZOOM, mParameters.zoom); 1918 params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 1919 1920 camera_metadata_entry_t maxDigitalZoom = 1921 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1); 1922 if (!maxDigitalZoom.count) return NO_INIT; 1923 1924 { 1925 String8 zoomRatios; 1926 float zoom = 1.f; 1927 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 1928 (NUM_ZOOM_STEPS-1); 1929 bool addComma = false; 1930 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 1931 if (addComma) zoomRatios += ","; 1932 addComma = true; 1933 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 1934 zoom += zoomIncrement; 1935 } 1936 params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 1937 } 1938 1939 params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 1940 CameraParameters::TRUE); 1941 params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 1942 CameraParameters::TRUE); 1943 1944 params.set(CameraParameters::KEY_FOCUS_DISTANCES, 1945 "Infinity,Infinity,Infinity"); 1946 1947 camera_metadata_entry_t maxFacesDetected = 1948 staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 1949 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 1950 maxFacesDetected.data.i32[0]); 1951 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 1952 0); 1953 1954 params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 1955 formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP)); 1956 1957 params.set(CameraParameters::KEY_RECORDING_HINT, 1958 CameraParameters::FALSE); 1959 1960 params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 1961 CameraParameters::TRUE); 1962 1963 params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 1964 CameraParameters::FALSE); 1965 1966 camera_metadata_entry_t availableVideoStabilizationModes = 1967 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 1968 if (!availableVideoStabilizationModes.count) return NO_INIT; 1969 1970 if (availableVideoStabilizationModes.count > 1) { 1971 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 1972 CameraParameters::TRUE); 1973 } else { 1974 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 1975 CameraParameters::FALSE); 1976 } 1977 1978 mParamsFlattened = params.flatten(); 1979 1980 return OK; 1981} 1982 1983status_t Camera2Client::updatePreviewRequest() { 1984 ATRACE_CALL(); 1985 status_t res; 1986 if (mPreviewRequest == NULL) { 1987 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 1988 &mPreviewRequest); 1989 if (res != OK) { 1990 ALOGE("%s: Camera %d: Unable to create default preview request: " 1991 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1992 return res; 1993 } 1994 } 1995 // TODO: Adjust for params changes 1996 return OK; 1997} 1998 1999status_t Camera2Client::updateCaptureStream() { 2000 status_t res; 2001 // Find out buffer size for JPEG 2002 camera_metadata_entry_t maxJpegSize = 2003 staticInfo(ANDROID_JPEG_MAX_SIZE); 2004 if (maxJpegSize.count == 0) { 2005 ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!", 2006 __FUNCTION__, mCameraId); 2007 return INVALID_OPERATION; 2008 } 2009 2010 if (mCaptureConsumer == 0) { 2011 // Create CPU buffer queue endpoint 2012 mCaptureConsumer = new CpuConsumer(1); 2013 mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this)); 2014 mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer")); 2015 mCaptureWindow = new SurfaceTextureClient( 2016 mCaptureConsumer->getProducerInterface()); 2017 // Create memory for API consumption 2018 mCaptureHeap = new MemoryHeapBase(maxJpegSize.data.i32[0], 0, 2019 "Camera2Client::CaptureHeap"); 2020 if (mCaptureHeap->getSize() == 0) { 2021 ALOGE("%s: Camera %d: Unable to allocate memory for capture", 2022 __FUNCTION__, mCameraId); 2023 return NO_MEMORY; 2024 } 2025 mCaptureMemory = new MemoryBase(mCaptureHeap, 2026 0, maxJpegSize.data.i32[0]); 2027 } 2028 if (mCaptureStreamId == NO_STREAM) { 2029 // Create stream for HAL production 2030 res = mDevice->createStream(mCaptureWindow, 2031 mParameters.pictureWidth, mParameters.pictureHeight, 2032 HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0], 2033 &mCaptureStreamId); 2034 if (res != OK) { 2035 ALOGE("%s: Camera %d: Can't create output stream for capture: " 2036 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2037 return res; 2038 } 2039 2040 } else { 2041 // Check if stream parameters have to change 2042 uint32_t currentWidth, currentHeight; 2043 res = mDevice->getStreamInfo(mCaptureStreamId, 2044 ¤tWidth, ¤tHeight, 0); 2045 if (res != OK) { 2046 ALOGE("%s: Camera %d: Error querying capture output stream info: " 2047 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2048 return res; 2049 } 2050 if (currentWidth != (uint32_t)mParameters.pictureWidth || 2051 currentHeight != (uint32_t)mParameters.pictureHeight) { 2052 res = mDevice->deleteStream(mCaptureStreamId); 2053 if (res != OK) { 2054 ALOGE("%s: Camera %d: Unable to delete old output stream " 2055 "for capture: %s (%d)", __FUNCTION__, mCameraId, 2056 strerror(-res), res); 2057 return res; 2058 } 2059 mCaptureStreamId = NO_STREAM; 2060 return updateCaptureStream(); 2061 } 2062 } 2063 return OK; 2064} 2065status_t Camera2Client::updateCaptureRequest() { 2066 ATRACE_CALL(); 2067 status_t res; 2068 if (mCaptureRequest == NULL) { 2069 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE, 2070 &mCaptureRequest); 2071 if (res != OK) { 2072 ALOGE("%s: Camera %d: Unable to create default still image request:" 2073 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2074 return res; 2075 } 2076 } 2077 // TODO: Adjust for params changes 2078 return OK; 2079} 2080 2081int Camera2Client::formatStringToEnum(const char *format) { 2082 return 2083 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 2084 HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 2085 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 2086 HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 2087 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 2088 HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 2089 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 2090 HAL_PIXEL_FORMAT_YV12 : // YV12 2091 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 2092 HAL_PIXEL_FORMAT_RGB_565 : // RGB565 2093 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 2094 HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 2095 !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 2096 HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 2097 -1; 2098} 2099 2100const char* Camera2Client::formatEnumToString(int format) { 2101 const char *fmt; 2102 switch(format) { 2103 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 2104 fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 2105 break; 2106 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 2107 fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 2108 break; 2109 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 2110 fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 2111 break; 2112 case HAL_PIXEL_FORMAT_YV12: // YV12 2113 fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 2114 break; 2115 case HAL_PIXEL_FORMAT_RGB_565: // RGB565 2116 fmt = CameraParameters::PIXEL_FORMAT_RGB565; 2117 break; 2118 case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 2119 fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 2120 break; 2121 case HAL_PIXEL_FORMAT_RAW_SENSOR: 2122 ALOGW("Raw sensor preview format requested."); 2123 fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 2124 break; 2125 default: 2126 ALOGE("%s: Unknown preview format: %x", 2127 __FUNCTION__, format); 2128 fmt = NULL; 2129 break; 2130 } 2131 return fmt; 2132} 2133 2134int Camera2Client::wbModeStringToEnum(const char *wbMode) { 2135 return 2136 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 2137 ANDROID_CONTROL_AWB_AUTO : 2138 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 2139 ANDROID_CONTROL_AWB_INCANDESCENT : 2140 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 2141 ANDROID_CONTROL_AWB_FLUORESCENT : 2142 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 2143 ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 2144 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 2145 ANDROID_CONTROL_AWB_DAYLIGHT : 2146 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 2147 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 2148 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 2149 ANDROID_CONTROL_AWB_TWILIGHT : 2150 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 2151 ANDROID_CONTROL_AWB_SHADE : 2152 -1; 2153} 2154 2155int Camera2Client::effectModeStringToEnum(const char *effectMode) { 2156 return 2157 !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 2158 ANDROID_CONTROL_EFFECT_OFF : 2159 !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 2160 ANDROID_CONTROL_EFFECT_MONO : 2161 !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 2162 ANDROID_CONTROL_EFFECT_NEGATIVE : 2163 !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 2164 ANDROID_CONTROL_EFFECT_SOLARIZE : 2165 !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 2166 ANDROID_CONTROL_EFFECT_SEPIA : 2167 !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 2168 ANDROID_CONTROL_EFFECT_POSTERIZE : 2169 !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 2170 ANDROID_CONTROL_EFFECT_WHITEBOARD : 2171 !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 2172 ANDROID_CONTROL_EFFECT_BLACKBOARD : 2173 !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 2174 ANDROID_CONTROL_EFFECT_AQUA : 2175 -1; 2176} 2177 2178int Camera2Client::abModeStringToEnum(const char *abMode) { 2179 return 2180 !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 2181 ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 2182 !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 2183 ANDROID_CONTROL_AE_ANTIBANDING_OFF : 2184 !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 2185 ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 2186 !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 2187 ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 2188 -1; 2189} 2190 2191int Camera2Client::sceneModeStringToEnum(const char *sceneMode) { 2192 return 2193 !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 2194 ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 2195 !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 2196 ANDROID_CONTROL_SCENE_MODE_ACTION : 2197 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 2198 ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 2199 !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 2200 ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 2201 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 2202 ANDROID_CONTROL_SCENE_MODE_NIGHT : 2203 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 2204 ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 2205 !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 2206 ANDROID_CONTROL_SCENE_MODE_THEATRE : 2207 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 2208 ANDROID_CONTROL_SCENE_MODE_BEACH : 2209 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 2210 ANDROID_CONTROL_SCENE_MODE_SNOW : 2211 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 2212 ANDROID_CONTROL_SCENE_MODE_SUNSET : 2213 !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 2214 ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 2215 !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 2216 ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 2217 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 2218 ANDROID_CONTROL_SCENE_MODE_SPORTS : 2219 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 2220 ANDROID_CONTROL_SCENE_MODE_PARTY : 2221 !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 2222 ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 2223 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 2224 ANDROID_CONTROL_SCENE_MODE_BARCODE: 2225 -1; 2226} 2227 2228Camera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum( 2229 const char *flashMode) { 2230 return 2231 !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 2232 Parameters::FLASH_MODE_OFF : 2233 !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 2234 Parameters::FLASH_MODE_AUTO : 2235 !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 2236 Parameters::FLASH_MODE_ON : 2237 !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 2238 Parameters::FLASH_MODE_RED_EYE : 2239 !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 2240 Parameters::FLASH_MODE_TORCH : 2241 Parameters::FLASH_MODE_INVALID; 2242} 2243 2244Camera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum( 2245 const char *focusMode) { 2246 return 2247 !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 2248 Parameters::FOCUS_MODE_AUTO : 2249 !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 2250 Parameters::FOCUS_MODE_INFINITY : 2251 !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 2252 Parameters::FOCUS_MODE_MACRO : 2253 !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 2254 Parameters::FOCUS_MODE_FIXED : 2255 !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 2256 Parameters::FOCUS_MODE_EDOF : 2257 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 2258 Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 2259 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 2260 Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 2261 Parameters::FOCUS_MODE_INVALID; 2262} 2263 2264status_t Camera2Client::parseAreas(const char *areasCStr, 2265 Vector<Parameters::Area> *areas) { 2266 static const size_t NUM_FIELDS = 5; 2267 areas->clear(); 2268 if (areasCStr == NULL) { 2269 // If no key exists, use default (0,0,0,0,0) 2270 areas->push(); 2271 return OK; 2272 } 2273 String8 areasStr(areasCStr); 2274 ssize_t areaStart = areasStr.find("(", 0) + 1; 2275 while (areaStart != 0) { 2276 const char* area = areasStr.string() + areaStart; 2277 char *numEnd; 2278 int vals[NUM_FIELDS]; 2279 for (size_t i = 0; i < NUM_FIELDS; i++) { 2280 errno = 0; 2281 vals[i] = strtol(area, &numEnd, 10); 2282 if (errno || numEnd == area) return BAD_VALUE; 2283 area = numEnd + 1; 2284 } 2285 areas->push(Parameters::Area( 2286 vals[0], vals[1], vals[2], vals[3], vals[4]) ); 2287 areaStart = areasStr.find("(", areaStart) + 1; 2288 } 2289 return OK; 2290} 2291 2292status_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas, 2293 size_t maxRegions) { 2294 // Definition of valid area can be found in 2295 // include/camera/CameraParameters.h 2296 if (areas.size() == 0) return BAD_VALUE; 2297 if (areas.size() == 1) { 2298 if (areas[0].left == 0 && 2299 areas[0].top == 0 && 2300 areas[0].right == 0 && 2301 areas[0].bottom == 0 && 2302 areas[0].weight == 0) { 2303 // Single (0,0,0,0,0) entry is always valid (== driver decides) 2304 return OK; 2305 } 2306 } 2307 if (areas.size() > maxRegions) { 2308 ALOGE("%s: Too many areas requested: %d", 2309 __FUNCTION__, areas.size()); 2310 return BAD_VALUE; 2311 } 2312 2313 for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 2314 a != areas.end(); a++) { 2315 if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 2316 if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 2317 if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 2318 if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 2319 if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 2320 if (a->left >= a->right) return BAD_VALUE; 2321 if (a->top >= a->bottom) return BAD_VALUE; 2322 } 2323 return OK; 2324} 2325 2326bool Camera2Client::boolFromString(const char *boolStr) { 2327 return !boolStr ? false : 2328 !strcmp(boolStr, CameraParameters::TRUE) ? true : 2329 false; 2330} 2331 2332 2333} // namespace android 2334