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