Camera2Client.cpp revision 803cbf6190f16f7b2c43cbc51d0df21ec888abdd
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#include <media/hardware/MetadataBufferType.h> 28 29#include <math.h> 30 31#include "Camera2Client.h" 32 33namespace android { 34 35#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 36#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 37 38static int getCallingPid() { 39 return IPCThreadState::self()->getCallingPid(); 40} 41 42static int getCallingUid() { 43 return IPCThreadState::self()->getCallingUid(); 44} 45 46// Interface used by CameraService 47 48Camera2Client::Camera2Client(const sp<CameraService>& cameraService, 49 const sp<ICameraClient>& cameraClient, 50 int cameraId, 51 int cameraFacing, 52 int clientPid): 53 Client(cameraService, cameraClient, 54 cameraId, cameraFacing, clientPid), 55 mState(NOT_INITIALIZED), 56 mPreviewStreamId(NO_STREAM), 57 mPreviewRequest(NULL), 58 mCaptureStreamId(NO_STREAM), 59 mCaptureRequest(NULL), 60 mRecordingStreamId(NO_STREAM), 61 mRecordingRequest(NULL) 62{ 63 ATRACE_CALL(); 64 65 mDevice = new Camera2Device(cameraId); 66} 67 68status_t Camera2Client::initialize(camera_module_t *module) 69{ 70 ATRACE_CALL(); 71 ALOGV("%s: E", __FUNCTION__); 72 status_t res; 73 74 res = mDevice->initialize(module); 75 if (res != OK) { 76 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 77 __FUNCTION__, mCameraId, strerror(-res), res); 78 return NO_INIT; 79 } 80 81 res = buildDefaultParameters(); 82 if (res != OK) { 83 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 84 __FUNCTION__, mCameraId, strerror(-res), res); 85 return NO_INIT; 86 } 87 88 if (gLogLevel >= 1) { 89 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 90 mCameraId); 91 ALOGD("%s", mParamsFlattened.string()); 92 } 93 94 mState = STOPPED; 95 96 return OK; 97} 98 99Camera2Client::~Camera2Client() { 100 ATRACE_CALL(); 101 ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId); 102 103 mDestructionStarted = true; 104 105 disconnect(); 106 107} 108 109status_t Camera2Client::dump(int fd, const Vector<String16>& args) { 110 String8 result; 111 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 112 mCameraId, 113 getCameraClient()->asBinder().get(), 114 mClientPid); 115 result.append(" State: "); 116#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 117 118 result.append(getStateName(mState)); 119 120 result.append("\n Current parameters:\n"); 121 result.appendFormat(" Preview size: %d x %d\n", 122 mParameters.previewWidth, mParameters.previewHeight); 123 result.appendFormat(" Preview FPS range: %d - %d\n", 124 mParameters.previewFpsRange[0], mParameters.previewFpsRange[1]); 125 result.appendFormat(" Preview HAL pixel format: 0x%x\n", 126 mParameters.previewFormat); 127 result.appendFormat(" Preview transform: %x\n", 128 mParameters.previewTransform); 129 result.appendFormat(" Picture size: %d x %d\n", 130 mParameters.pictureWidth, mParameters.pictureHeight); 131 result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 132 mParameters.jpegThumbSize[0], mParameters.jpegThumbSize[1]); 133 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 134 mParameters.jpegQuality, mParameters.jpegThumbQuality); 135 result.appendFormat(" Jpeg rotation: %d\n", mParameters.jpegRotation); 136 result.appendFormat(" GPS tags %s\n", 137 mParameters.gpsEnabled ? "enabled" : "disabled"); 138 if (mParameters.gpsEnabled) { 139 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 140 mParameters.gpsCoordinates[0], mParameters.gpsCoordinates[1], 141 mParameters.gpsCoordinates[2]); 142 result.appendFormat(" GPS timestamp: %lld\n", 143 mParameters.gpsTimestamp); 144 result.appendFormat(" GPS processing method: %s\n", 145 mParameters.gpsProcessingMethod.string()); 146 } 147 148 result.append(" White balance mode: "); 149 switch (mParameters.wbMode) { 150 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 151 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 152 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 153 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 154 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 155 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 156 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 157 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 158 default: result.append("UNKNOWN\n"); 159 } 160 161 result.append(" Effect mode: "); 162 switch (mParameters.effectMode) { 163 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 164 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 165 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 166 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 167 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 168 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 169 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 170 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 171 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 172 default: result.append("UNKNOWN\n"); 173 } 174 175 result.append(" Antibanding mode: "); 176 switch (mParameters.antibandingMode) { 177 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 178 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 179 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 180 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 181 default: result.append("UNKNOWN\n"); 182 } 183 184 result.append(" Scene mode: "); 185 switch (mParameters.sceneMode) { 186 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 187 result.append("AUTO\n"); break; 188 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 189 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 190 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 191 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 192 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 193 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 194 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 195 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 196 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 197 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 198 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 199 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 200 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 201 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 202 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 203 default: result.append("UNKNOWN\n"); 204 } 205 206 result.append(" Flash mode: "); 207 switch (mParameters.flashMode) { 208 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 209 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 210 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 211 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 212 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 213 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 214 default: result.append("UNKNOWN\n"); 215 } 216 217 result.append(" Focus mode: "); 218 switch (mParameters.focusMode) { 219 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 220 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 221 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 222 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 223 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 224 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 225 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 226 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 227 default: result.append("UNKNOWN\n"); 228 } 229 230 result.append(" Focusing areas:\n"); 231 for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) { 232 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 233 mParameters.focusingAreas[i].left, 234 mParameters.focusingAreas[i].top, 235 mParameters.focusingAreas[i].right, 236 mParameters.focusingAreas[i].bottom, 237 mParameters.focusingAreas[i].weight); 238 } 239 240 result.appendFormat(" Exposure compensation index: %d\n", 241 mParameters.exposureCompensation); 242 243 result.appendFormat(" AE lock %s, AWB lock %s\n", 244 mParameters.autoExposureLock ? "enabled" : "disabled", 245 mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" ); 246 247 result.appendFormat(" Metering areas:\n"); 248 for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) { 249 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 250 mParameters.meteringAreas[i].left, 251 mParameters.meteringAreas[i].top, 252 mParameters.meteringAreas[i].right, 253 mParameters.meteringAreas[i].bottom, 254 mParameters.meteringAreas[i].weight); 255 } 256 257 result.appendFormat(" Zoom index: %d\n", mParameters.zoom); 258 result.appendFormat(" Video size: %d x %d\n", mParameters.videoWidth, 259 mParameters.videoHeight); 260 261 result.appendFormat(" Recording hint is %s\n", 262 mParameters.recordingHint ? "set" : "not set"); 263 264 result.appendFormat(" Video stabilization is %s\n", 265 mParameters.videoStabilization ? "enabled" : "disabled"); 266 267 result.append(" Current streams:\n"); 268 result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId); 269 result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId); 270 271 result.append(" Current requests:\n"); 272 if (mPreviewRequest != NULL) { 273 result.append(" Preview request:\n"); 274 write(fd, result.string(), result.size()); 275 dump_camera_metadata(mPreviewRequest, fd, 2); 276 } else { 277 result.append(" Preview request: undefined\n"); 278 write(fd, result.string(), result.size()); 279 } 280 281 if (mCaptureRequest != NULL) { 282 result = " Capture request:\n"; 283 write(fd, result.string(), result.size()); 284 dump_camera_metadata(mCaptureRequest, fd, 2); 285 } else { 286 result = " Capture request: undefined\n"; 287 write(fd, result.string(), result.size()); 288 } 289 290 result = " Device dump:\n"; 291 write(fd, result.string(), result.size()); 292 293 status_t res = mDevice->dump(fd, args); 294 if (res != OK) { 295 result = String8::format(" Error dumping device: %s (%d)", 296 strerror(-res), res); 297 write(fd, result.string(), result.size()); 298 } 299 300#undef CASE_APPEND_ENUM 301 return NO_ERROR; 302} 303 304const char* Camera2Client::getStateName(State state) { 305#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 306 switch(state) { 307 CASE_ENUM_TO_CHAR(NOT_INITIALIZED) 308 CASE_ENUM_TO_CHAR(STOPPED) 309 CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 310 CASE_ENUM_TO_CHAR(PREVIEW) 311 CASE_ENUM_TO_CHAR(RECORD) 312 CASE_ENUM_TO_CHAR(STILL_CAPTURE) 313 CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 314 default: 315 return "Unknown state!"; 316 break; 317 } 318#undef CASE_ENUM_TO_CHAR 319} 320 321// ICamera interface 322 323void Camera2Client::disconnect() { 324 ATRACE_CALL(); 325 ALOGV("%s: E", __FUNCTION__); 326 Mutex::Autolock icl(mICameraLock); 327 328 if (mDevice == 0) return; 329 330 stopPreviewLocked(); 331 332 mDevice->waitUntilDrained(); 333 334 if (mPreviewStreamId != NO_STREAM) { 335 mDevice->deleteStream(mPreviewStreamId); 336 mPreviewStreamId = NO_STREAM; 337 } 338 339 if (mCaptureStreamId != NO_STREAM) { 340 mDevice->deleteStream(mCaptureStreamId); 341 mCaptureStreamId = NO_STREAM; 342 } 343 344 if (mRecordingStreamId != NO_STREAM) { 345 mDevice->deleteStream(mRecordingStreamId); 346 mRecordingStreamId = NO_STREAM; 347 } 348 349 CameraService::Client::disconnect(); 350} 351 352status_t Camera2Client::connect(const sp<ICameraClient>& client) { 353 ATRACE_CALL(); 354 ALOGV("%s: E", __FUNCTION__); 355 Mutex::Autolock icl(mICameraLock); 356 357 if (mClientPid != 0 && getCallingPid() != mClientPid) { 358 ALOGE("%s: Camera %d: Connection attempt from pid %d; " 359 "current locked to pid %d", __FUNCTION__, 360 mCameraId, getCallingPid(), mClientPid); 361 return BAD_VALUE; 362 } 363 364 mClientPid = getCallingPid(); 365 mCameraClient = client; 366 367 return OK; 368} 369 370status_t Camera2Client::lock() { 371 ATRACE_CALL(); 372 ALOGV("%s: E", __FUNCTION__); 373 Mutex::Autolock icl(mICameraLock); 374 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 375 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 376 377 if (mClientPid == 0) { 378 mClientPid = getCallingPid(); 379 return OK; 380 } 381 382 if (mClientPid != getCallingPid()) { 383 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 384 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 385 return EBUSY; 386 } 387 388 return OK; 389} 390 391status_t Camera2Client::unlock() { 392 ATRACE_CALL(); 393 ALOGV("%s: E", __FUNCTION__); 394 Mutex::Autolock icl(mICameraLock); 395 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 396 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 397 398 // TODO: Check for uninterruptable conditions 399 400 if (mClientPid == getCallingPid()) { 401 mClientPid = 0; 402 mCameraClient.clear(); 403 return OK; 404 } 405 406 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 407 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 408 return EBUSY; 409} 410 411status_t Camera2Client::setPreviewDisplay( 412 const sp<Surface>& surface) { 413 ATRACE_CALL(); 414 ALOGV("%s: E", __FUNCTION__); 415 Mutex::Autolock icl(mICameraLock); 416 417 sp<IBinder> binder; 418 sp<ANativeWindow> window; 419 if (surface != 0) { 420 binder = surface->asBinder(); 421 window = surface; 422 } 423 424 return setPreviewWindowLocked(binder,window); 425} 426 427status_t Camera2Client::setPreviewTexture( 428 const sp<ISurfaceTexture>& surfaceTexture) { 429 ATRACE_CALL(); 430 ALOGV("%s: E", __FUNCTION__); 431 Mutex::Autolock icl(mICameraLock); 432 433 sp<IBinder> binder; 434 sp<ANativeWindow> window; 435 if (surfaceTexture != 0) { 436 binder = surfaceTexture->asBinder(); 437 window = new SurfaceTextureClient(surfaceTexture); 438 } 439 return setPreviewWindowLocked(binder, window); 440} 441 442status_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder, 443 sp<ANativeWindow> window) { 444 ATRACE_CALL(); 445 status_t res; 446 447 if (binder == mPreviewSurface) { 448 ALOGV("%s: Camera %d: New window is same as old window", 449 __FUNCTION__, mCameraId); 450 return NO_ERROR; 451 } 452 453 switch (mState) { 454 case NOT_INITIALIZED: 455 case RECORD: 456 case STILL_CAPTURE: 457 case VIDEO_SNAPSHOT: 458 ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 459 __FUNCTION__, mCameraId, getStateName(mState)); 460 return INVALID_OPERATION; 461 case STOPPED: 462 case WAITING_FOR_PREVIEW_WINDOW: 463 // OK 464 break; 465 case PREVIEW: 466 // Already running preview - need to stop and create a new stream 467 // TODO: Optimize this so that we don't wait for old stream to drain 468 // before spinning up new stream 469 mDevice->setStreamingRequest(NULL); 470 mState = WAITING_FOR_PREVIEW_WINDOW; 471 break; 472 } 473 474 if (mPreviewStreamId != NO_STREAM) { 475 res = mDevice->waitUntilDrained(); 476 if (res != OK) { 477 ALOGE("%s: Error waiting for preview to drain: %s (%d)", 478 __FUNCTION__, strerror(-res), res); 479 return res; 480 } 481 res = mDevice->deleteStream(mPreviewStreamId); 482 if (res != OK) { 483 ALOGE("%s: Unable to delete old preview stream: %s (%d)", 484 __FUNCTION__, strerror(-res), res); 485 return res; 486 } 487 mPreviewStreamId = NO_STREAM; 488 } 489 490 mPreviewSurface = binder; 491 mPreviewWindow = window; 492 493 if (mState == WAITING_FOR_PREVIEW_WINDOW) { 494 return startPreviewLocked(); 495 } 496 497 return OK; 498} 499 500void Camera2Client::setPreviewCallbackFlag(int flag) { 501 ATRACE_CALL(); 502 Mutex::Autolock icl(mICameraLock); 503} 504 505status_t Camera2Client::startPreview() { 506 ATRACE_CALL(); 507 ALOGV("%s: E", __FUNCTION__); 508 Mutex::Autolock icl(mICameraLock); 509 return startPreviewLocked(); 510} 511 512status_t Camera2Client::startPreviewLocked() { 513 ATRACE_CALL(); 514 status_t res; 515 if (mState >= PREVIEW) { 516 ALOGE("%s: Can't start preview in state %s", 517 __FUNCTION__, getStateName(mState)); 518 return INVALID_OPERATION; 519 } 520 521 if (mPreviewWindow == 0) { 522 mState = WAITING_FOR_PREVIEW_WINDOW; 523 return OK; 524 } 525 mState = STOPPED; 526 527 Mutex::Autolock pl(mParamsLock); 528 529 res = updatePreviewStream(); 530 if (res != OK) { 531 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 532 __FUNCTION__, mCameraId, strerror(-res), res); 533 return res; 534 } 535 536 if (mPreviewRequest == NULL) { 537 res = updatePreviewRequest(); 538 if (res != OK) { 539 ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)", 540 __FUNCTION__, mCameraId, strerror(-res), res); 541 return res; 542 } 543 } 544 545 res = updateEntry(mPreviewRequest, 546 ANDROID_REQUEST_OUTPUT_STREAMS, 547 &mPreviewStreamId, 1); 548 if (res != OK) { 549 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 550 __FUNCTION__, mCameraId, strerror(-res), res); 551 return res; 552 } 553 res = sort_camera_metadata(mPreviewRequest); 554 if (res != OK) { 555 ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)", 556 __FUNCTION__, mCameraId, strerror(-res), res); 557 return res; 558 } 559 560 res = mDevice->setStreamingRequest(mPreviewRequest); 561 if (res != OK) { 562 ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 563 "%s (%d)", 564 __FUNCTION__, mCameraId, strerror(-res), res); 565 return res; 566 } 567 mState = PREVIEW; 568 569 return OK; 570} 571 572void Camera2Client::stopPreview() { 573 ATRACE_CALL(); 574 ALOGV("%s: E", __FUNCTION__); 575 Mutex::Autolock icl(mICameraLock); 576 stopPreviewLocked(); 577} 578 579void Camera2Client::stopPreviewLocked() { 580 ATRACE_CALL(); 581 switch (mState) { 582 case NOT_INITIALIZED: 583 ALOGE("%s: Camera %d: Call before initialized", 584 __FUNCTION__, mCameraId); 585 break; 586 case STOPPED: 587 break; 588 case STILL_CAPTURE: 589 ALOGE("%s: Camera %d: Cannot stop preview during still capture.", 590 __FUNCTION__, mCameraId); 591 break; 592 case RECORD: 593 // TODO: Handle record stop here 594 case PREVIEW: 595 mDevice->setStreamingRequest(NULL); 596 mDevice->waitUntilDrained(); 597 case WAITING_FOR_PREVIEW_WINDOW: 598 mState = STOPPED; 599 break; 600 default: 601 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 602 mState); 603 } 604} 605 606bool Camera2Client::previewEnabled() { 607 ATRACE_CALL(); 608 Mutex::Autolock icl(mICameraLock); 609 return mState == PREVIEW; 610} 611 612status_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 613 ATRACE_CALL(); 614 Mutex::Autolock icl(mICameraLock); 615 switch (mState) { 616 case RECORD: 617 case VIDEO_SNAPSHOT: 618 ALOGE("%s: Camera %d: Can't be called in state %s", 619 __FUNCTION__, mCameraId, getStateName(mState)); 620 return INVALID_OPERATION; 621 default: 622 // OK 623 break; 624 } 625 Mutex::Autolock pl(mParamsLock); 626 627 mParameters.storeMetadataInBuffers = enabled; 628 629 return OK; 630} 631 632status_t Camera2Client::startRecording() { 633 ATRACE_CALL(); 634 ALOGV("%s: E", __FUNCTION__); 635 Mutex::Autolock icl(mICameraLock); 636 status_t res; 637 switch (mState) { 638 case STOPPED: 639 res = startPreviewLocked(); 640 if (res != OK) return res; 641 break; 642 case PREVIEW: 643 // Ready to go 644 break; 645 case RECORD: 646 case VIDEO_SNAPSHOT: 647 // OK to call this when recording is already on 648 return OK; 649 break; 650 default: 651 ALOGE("%s: Camera %d: Can't start recording in state %s", 652 __FUNCTION__, mCameraId, getStateName(mState)); 653 return INVALID_OPERATION; 654 }; 655 656 Mutex::Autolock pl(mParamsLock); 657 658 if (!mParameters.storeMetadataInBuffers) { 659 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 660 "non-metadata recording mode requested!", __FUNCTION__, 661 mCameraId); 662 return INVALID_OPERATION; 663 } 664 665 res = updateRecordingStream(); 666 if (res != OK) { 667 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 668 __FUNCTION__, mCameraId, strerror(-res), res); 669 return res; 670 } 671 672 if (mRecordingRequest == NULL) { 673 res = updateRecordingRequest(); 674 if (res != OK) { 675 ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)", 676 __FUNCTION__, mCameraId, strerror(-res), res); 677 return res; 678 } 679 } 680 681 uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId }; 682 res = updateEntry(mRecordingRequest, 683 ANDROID_REQUEST_OUTPUT_STREAMS, 684 outputStreams, 2); 685 if (res != OK) { 686 ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)", 687 __FUNCTION__, mCameraId, strerror(-res), res); 688 return res; 689 } 690 res = sort_camera_metadata(mRecordingRequest); 691 if (res != OK) { 692 ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)", 693 __FUNCTION__, mCameraId, strerror(-res), res); 694 return res; 695 } 696 697 res = mDevice->setStreamingRequest(mRecordingRequest); 698 if (res != OK) { 699 ALOGE("%s: Camera %d: Unable to set recording request to start " 700 "recording: %s (%d)", __FUNCTION__, mCameraId, 701 strerror(-res), res); 702 return res; 703 } 704 mState = RECORD; 705 706 return OK; 707} 708 709void Camera2Client::stopRecording() { 710 ATRACE_CALL(); 711 ALOGV("%s: E", __FUNCTION__); 712 Mutex::Autolock icl(mICameraLock); 713 status_t res; 714 switch (mState) { 715 case RECORD: 716 // OK to stop 717 break; 718 case STOPPED: 719 case PREVIEW: 720 case STILL_CAPTURE: 721 case VIDEO_SNAPSHOT: 722 default: 723 ALOGE("%s: Camera %d: Can't stop recording in state %s", 724 __FUNCTION__, mCameraId, getStateName(mState)); 725 return; 726 }; 727 728 // Back to preview. Since record can only be reached through preview, 729 // all preview stream setup should be up to date. 730 res = mDevice->setStreamingRequest(mPreviewRequest); 731 if (res != OK) { 732 ALOGE("%s: Camera %d: Unable to switch back to preview request: " 733 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 734 return; 735 } 736 737 // TODO: Should recording heap be freed? Can't do it yet since requests 738 // could still be in flight. 739 740 mState = PREVIEW; 741} 742 743bool Camera2Client::recordingEnabled() { 744 ATRACE_CALL(); 745 Mutex::Autolock icl(mICameraLock); 746 return (mState == RECORD || mState == VIDEO_SNAPSHOT); 747} 748 749void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 750 ATRACE_CALL(); 751 Mutex::Autolock icl(mICameraLock); 752 // Make sure this is for the current heap 753 ssize_t offset; 754 size_t size; 755 status_t res; 756 sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 757 if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) { 758 ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release " 759 "(got %x, expected %x)", __FUNCTION__, mCameraId, 760 heap->getHeapID(), mRecordingHeap->mHeap->getHeapID()); 761 return; 762 } 763 uint8_t *data = (uint8_t*)heap->getBase() + offset; 764 uint32_t type = *(uint32_t*)data; 765 if (type != kMetadataBufferTypeGrallocSource) { 766 ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)", 767 __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource); 768 return; 769 } 770 buffer_handle_t imgBuffer = *(buffer_handle_t*)(data + 4); 771 ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId, 772 imgBuffer); 773 res = mRecordingConsumer->freeBuffer(imgBuffer); 774 if (res != OK) { 775 ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):" 776 "%s (%d)", 777 __FUNCTION__, mCameraId, imgBuffer, strerror(-res), res); 778 return; 779 } 780 781 mRecordingHeapFree++; 782} 783 784status_t Camera2Client::autoFocus() { 785 ATRACE_CALL(); 786 Mutex::Autolock icl(mICameraLock); 787 return OK; 788} 789 790status_t Camera2Client::cancelAutoFocus() { 791 ATRACE_CALL(); 792 Mutex::Autolock icl(mICameraLock); 793 return OK; 794} 795 796status_t Camera2Client::takePicture(int msgType) { 797 ATRACE_CALL(); 798 Mutex::Autolock icl(mICameraLock); 799 status_t res; 800 801 switch (mState) { 802 case NOT_INITIALIZED: 803 case STOPPED: 804 case WAITING_FOR_PREVIEW_WINDOW: 805 ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 806 __FUNCTION__, mCameraId); 807 return INVALID_OPERATION; 808 case PREVIEW: 809 case RECORD: 810 // Good to go for takePicture 811 break; 812 case STILL_CAPTURE: 813 case VIDEO_SNAPSHOT: 814 ALOGE("%s: Camera %d: Already taking a picture", 815 __FUNCTION__, mCameraId); 816 return INVALID_OPERATION; 817 } 818 819 Mutex::Autolock pl(mParamsLock); 820 821 res = updateCaptureStream(); 822 if (res != OK) { 823 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 824 __FUNCTION__, mCameraId, strerror(-res), res); 825 return res; 826 } 827 828 if (mCaptureRequest == NULL) { 829 res = updateCaptureRequest(); 830 if (res != OK) { 831 ALOGE("%s: Camera %d: Can't create still image capture request: " 832 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 833 return res; 834 } 835 } 836 837 camera_metadata_entry_t outputStreams; 838 if (mState == PREVIEW) { 839 uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId }; 840 res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 841 &streamIds, 2); 842 } else if (mState == RECORD) { 843 uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId, 844 mCaptureStreamId }; 845 res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS, 846 &streamIds, 3); 847 } 848 849 if (res != OK) { 850 ALOGE("%s: Camera %d: Unable to set up still image capture request: " 851 "%s (%d)", 852 __FUNCTION__, mCameraId, strerror(-res), res); 853 return res; 854 } 855 res = sort_camera_metadata(mCaptureRequest); 856 if (res != OK) { 857 ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)", 858 __FUNCTION__, mCameraId, strerror(-res), res); 859 return res; 860 } 861 862 camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest); 863 if (captureCopy == NULL) { 864 ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 865 __FUNCTION__, mCameraId); 866 return NO_MEMORY; 867 } 868 869 if (mState == PREVIEW) { 870 res = mDevice->setStreamingRequest(NULL); 871 if (res != OK) { 872 ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 873 "%s (%d)", 874 __FUNCTION__, mCameraId, strerror(-res), res); 875 return res; 876 } 877 } 878 // TODO: Capture should be atomic with setStreamingRequest here 879 res = mDevice->capture(captureCopy); 880 if (res != OK) { 881 ALOGE("%s: Camera %d: Unable to submit still image capture request: " 882 "%s (%d)", 883 __FUNCTION__, mCameraId, strerror(-res), res); 884 return res; 885 } 886 887 switch (mState) { 888 case PREVIEW: 889 mState = STILL_CAPTURE; 890 break; 891 case RECORD: 892 mState = VIDEO_SNAPSHOT; 893 break; 894 default: 895 ALOGE("%s: Camera %d: Unknown state for still capture!", 896 __FUNCTION__, mCameraId); 897 return INVALID_OPERATION; 898 } 899 900 return OK; 901} 902 903status_t Camera2Client::setParameters(const String8& params) { 904 ATRACE_CALL(); 905 ALOGV("%s: E", __FUNCTION__); 906 Mutex::Autolock icl(mICameraLock); 907 Mutex::Autolock pl(mParamsLock); 908 status_t res; 909 910 CameraParameters newParams(params); 911 912 // TODO: Currently ignoring any changes to supposedly read-only 913 // parameters such as supported preview sizes, etc. Should probably 914 // produce an error if they're changed. 915 916 /** Extract and verify new parameters */ 917 918 size_t i; 919 920 // PREVIEW_SIZE 921 int previewWidth, previewHeight; 922 newParams.getPreviewSize(&previewWidth, &previewHeight); 923 924 if (previewWidth != mParameters.previewWidth || 925 previewHeight != mParameters.previewHeight) { 926 if (mState >= PREVIEW) { 927 ALOGE("%s: Preview size cannot be updated when preview " 928 "is active! (Currently %d x %d, requested %d x %d", 929 __FUNCTION__, 930 mParameters.previewWidth, mParameters.previewHeight, 931 previewWidth, previewHeight); 932 return BAD_VALUE; 933 } 934 camera_metadata_entry_t availablePreviewSizes = 935 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 936 for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 937 if (availablePreviewSizes.data.i32[i] == previewWidth && 938 availablePreviewSizes.data.i32[i+1] == previewHeight) break; 939 } 940 if (i == availablePreviewSizes.count) { 941 ALOGE("%s: Requested preview size %d x %d is not supported", 942 __FUNCTION__, previewWidth, previewHeight); 943 return BAD_VALUE; 944 } 945 } 946 947 // PREVIEW_FPS_RANGE 948 int previewFpsRange[2]; 949 int previewFps = 0; 950 bool fpsRangeChanged = false; 951 newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]); 952 if (previewFpsRange[0] != mParameters.previewFpsRange[0] || 953 previewFpsRange[1] != mParameters.previewFpsRange[1]) { 954 fpsRangeChanged = true; 955 camera_metadata_entry_t availablePreviewFpsRanges = 956 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 957 for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 958 if ((availablePreviewFpsRanges.data.i32[i] == 959 previewFpsRange[0]) && 960 (availablePreviewFpsRanges.data.i32[i+1] == 961 previewFpsRange[1]) ) { 962 break; 963 } 964 } 965 if (i == availablePreviewFpsRanges.count) { 966 ALOGE("%s: Requested preview FPS range %d - %d is not supported", 967 __FUNCTION__, previewFpsRange[0], previewFpsRange[1]); 968 return BAD_VALUE; 969 } 970 previewFps = previewFpsRange[0]; 971 } 972 973 // PREVIEW_FORMAT 974 int previewFormat = formatStringToEnum(newParams.getPreviewFormat()); 975 if (previewFormat != mParameters.previewFormat) { 976 if (mState >= PREVIEW) { 977 ALOGE("%s: Preview format cannot be updated when preview " 978 "is active!", __FUNCTION__); 979 return BAD_VALUE; 980 } 981 camera_metadata_entry_t availableFormats = 982 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 983 for (i = 0; i < availableFormats.count; i++) { 984 if (availableFormats.data.i32[i] == previewFormat) break; 985 } 986 if (i == availableFormats.count) { 987 ALOGE("%s: Requested preview format %s (0x%x) is not supported", 988 __FUNCTION__, newParams.getPreviewFormat(), previewFormat); 989 return BAD_VALUE; 990 } 991 } 992 993 // PREVIEW_FRAME_RATE 994 // Deprecated, only use if the preview fps range is unchanged this time. 995 // The single-value FPS is the same as the minimum of the range. 996 if (!fpsRangeChanged) { 997 previewFps = newParams.getPreviewFrameRate(); 998 if (previewFps != mParameters.previewFps) { 999 camera_metadata_entry_t availableFrameRates = 1000 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 1001 for (i = 0; i < availableFrameRates.count; i+=2) { 1002 if (availableFrameRates.data.i32[i] == previewFps) break; 1003 } 1004 if (i == availableFrameRates.count) { 1005 ALOGE("%s: Requested preview frame rate %d is not supported", 1006 __FUNCTION__, previewFps); 1007 return BAD_VALUE; 1008 } 1009 previewFpsRange[0] = availableFrameRates.data.i32[i]; 1010 previewFpsRange[1] = availableFrameRates.data.i32[i+1]; 1011 } 1012 } 1013 1014 // PICTURE_SIZE 1015 int pictureWidth, pictureHeight; 1016 newParams.getPictureSize(&pictureWidth, &pictureHeight); 1017 if (pictureWidth == mParameters.pictureWidth || 1018 pictureHeight == mParameters.pictureHeight) { 1019 camera_metadata_entry_t availablePictureSizes = 1020 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 1021 for (i = 0; i < availablePictureSizes.count; i+=2) { 1022 if (availablePictureSizes.data.i32[i] == pictureWidth && 1023 availablePictureSizes.data.i32[i+1] == pictureHeight) break; 1024 } 1025 if (i == availablePictureSizes.count) { 1026 ALOGE("%s: Requested picture size %d x %d is not supported", 1027 __FUNCTION__, pictureWidth, pictureHeight); 1028 return BAD_VALUE; 1029 } 1030 } 1031 1032 // JPEG_THUMBNAIL_WIDTH/HEIGHT 1033 int jpegThumbSize[2]; 1034 jpegThumbSize[0] = 1035 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 1036 jpegThumbSize[1] = 1037 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 1038 if (jpegThumbSize[0] != mParameters.jpegThumbSize[0] || 1039 jpegThumbSize[1] != mParameters.jpegThumbSize[1]) { 1040 camera_metadata_entry_t availableJpegThumbSizes = 1041 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 1042 for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 1043 if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] && 1044 availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) { 1045 break; 1046 } 1047 } 1048 if (i == availableJpegThumbSizes.count) { 1049 ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 1050 __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]); 1051 return BAD_VALUE; 1052 } 1053 } 1054 1055 // JPEG_THUMBNAIL_QUALITY 1056 int jpegThumbQuality = 1057 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 1058 if (jpegThumbQuality < 0 || jpegThumbQuality > 100) { 1059 ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 1060 __FUNCTION__, jpegThumbQuality); 1061 return BAD_VALUE; 1062 } 1063 1064 // JPEG_QUALITY 1065 int jpegQuality = 1066 newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 1067 if (jpegQuality < 0 || jpegQuality > 100) { 1068 ALOGE("%s: Requested JPEG quality %d is not supported", 1069 __FUNCTION__, jpegQuality); 1070 return BAD_VALUE; 1071 } 1072 1073 // ROTATION 1074 int jpegRotation = 1075 newParams.getInt(CameraParameters::KEY_ROTATION); 1076 if (jpegRotation != 0 && 1077 jpegRotation != 90 && 1078 jpegRotation != 180 && 1079 jpegRotation != 270) { 1080 ALOGE("%s: Requested picture rotation angle %d is not supported", 1081 __FUNCTION__, jpegRotation); 1082 return BAD_VALUE; 1083 } 1084 1085 // GPS 1086 bool gpsEnabled = false; 1087 double gpsCoordinates[3] = {0,0,0}; 1088 int64_t gpsTimestamp = 0; 1089 String8 gpsProcessingMethod; 1090 const char *gpsLatStr = 1091 newParams.get(CameraParameters::KEY_GPS_LATITUDE); 1092 if (gpsLatStr != NULL) { 1093 const char *gpsLongStr = 1094 newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 1095 const char *gpsAltitudeStr = 1096 newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 1097 const char *gpsTimeStr = 1098 newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 1099 const char *gpsProcMethodStr = 1100 newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 1101 if (gpsLongStr == NULL || 1102 gpsAltitudeStr == NULL || 1103 gpsTimeStr == NULL || 1104 gpsProcMethodStr == NULL) { 1105 ALOGE("%s: Incomplete set of GPS parameters provided", 1106 __FUNCTION__); 1107 return BAD_VALUE; 1108 } 1109 char *endPtr; 1110 errno = 0; 1111 gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 1112 if (errno || endPtr == gpsLatStr) { 1113 ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 1114 return BAD_VALUE; 1115 } 1116 errno = 0; 1117 gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 1118 if (errno || endPtr == gpsLongStr) { 1119 ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 1120 return BAD_VALUE; 1121 } 1122 errno = 0; 1123 gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 1124 if (errno || endPtr == gpsAltitudeStr) { 1125 ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 1126 gpsAltitudeStr); 1127 return BAD_VALUE; 1128 } 1129 errno = 0; 1130 gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 1131 if (errno || endPtr == gpsTimeStr) { 1132 ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 1133 return BAD_VALUE; 1134 } 1135 gpsProcessingMethod = gpsProcMethodStr; 1136 1137 gpsEnabled = true; 1138 } 1139 1140 // WHITE_BALANCE 1141 int wbMode = wbModeStringToEnum( 1142 newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 1143 if (wbMode != mParameters.wbMode) { 1144 camera_metadata_entry_t availableWbModes = 1145 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 1146 for (i = 0; i < availableWbModes.count; i++) { 1147 if (wbMode == availableWbModes.data.u8[i]) break; 1148 } 1149 if (i == availableWbModes.count) { 1150 ALOGE("%s: Requested white balance mode %s is not supported", 1151 __FUNCTION__, 1152 newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 1153 return BAD_VALUE; 1154 } 1155 } 1156 1157 // EFFECT 1158 int effectMode = effectModeStringToEnum( 1159 newParams.get(CameraParameters::KEY_EFFECT) ); 1160 if (effectMode != mParameters.effectMode) { 1161 camera_metadata_entry_t availableEffectModes = 1162 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 1163 for (i = 0; i < availableEffectModes.count; i++) { 1164 if (effectMode == availableEffectModes.data.u8[i]) break; 1165 } 1166 if (i == availableEffectModes.count) { 1167 ALOGE("%s: Requested effect mode \"%s\" is not supported", 1168 __FUNCTION__, 1169 newParams.get(CameraParameters::KEY_EFFECT) ); 1170 return BAD_VALUE; 1171 } 1172 } 1173 1174 // ANTIBANDING 1175 int antibandingMode = abModeStringToEnum( 1176 newParams.get(CameraParameters::KEY_ANTIBANDING) ); 1177 if (antibandingMode != mParameters.antibandingMode) { 1178 camera_metadata_entry_t availableAbModes = 1179 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 1180 for (i = 0; i < availableAbModes.count; i++) { 1181 if (antibandingMode == availableAbModes.data.u8[i]) break; 1182 } 1183 if (i == availableAbModes.count) { 1184 ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 1185 __FUNCTION__, 1186 newParams.get(CameraParameters::KEY_ANTIBANDING)); 1187 return BAD_VALUE; 1188 } 1189 } 1190 1191 // SCENE_MODE 1192 int sceneMode = sceneModeStringToEnum( 1193 newParams.get(CameraParameters::KEY_SCENE_MODE) ); 1194 if (sceneMode != mParameters.sceneMode) { 1195 camera_metadata_entry_t availableSceneModes = 1196 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 1197 for (i = 0; i < availableSceneModes.count; i++) { 1198 if (sceneMode == availableSceneModes.data.u8[i]) break; 1199 } 1200 if (i == availableSceneModes.count) { 1201 ALOGE("%s: Requested scene mode \"%s\" is not supported", 1202 __FUNCTION__, 1203 newParams.get(CameraParameters::KEY_SCENE_MODE)); 1204 return BAD_VALUE; 1205 } 1206 } 1207 1208 // FLASH_MODE 1209 Parameters::flashMode_t flashMode = flashModeStringToEnum( 1210 newParams.get(CameraParameters::KEY_FLASH_MODE) ); 1211 if (flashMode != mParameters.flashMode) { 1212 camera_metadata_entry_t flashAvailable = 1213 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 1214 if (!flashAvailable.data.u8[0] && 1215 flashMode != Parameters::FLASH_MODE_OFF) { 1216 ALOGE("%s: Requested flash mode \"%s\" is not supported: " 1217 "No flash on device", __FUNCTION__, 1218 newParams.get(CameraParameters::KEY_FLASH_MODE)); 1219 return BAD_VALUE; 1220 } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) { 1221 camera_metadata_entry_t availableAeModes = 1222 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 1223 for (i = 0; i < availableAeModes.count; i++) { 1224 if (flashMode == availableAeModes.data.u8[i]) break; 1225 } 1226 if (i == availableAeModes.count) { 1227 ALOGE("%s: Requested flash mode \"%s\" is not supported", 1228 __FUNCTION__, 1229 newParams.get(CameraParameters::KEY_FLASH_MODE)); 1230 return BAD_VALUE; 1231 } 1232 } else if (flashMode == -1) { 1233 ALOGE("%s: Requested flash mode \"%s\" is unknown", 1234 __FUNCTION__, 1235 newParams.get(CameraParameters::KEY_FLASH_MODE)); 1236 return BAD_VALUE; 1237 } 1238 } 1239 1240 // FOCUS_MODE 1241 Parameters::focusMode_t focusMode = focusModeStringToEnum( 1242 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1243 if (focusMode != mParameters.focusMode) { 1244 if (focusMode != Parameters::FOCUS_MODE_FIXED) { 1245 camera_metadata_entry_t minFocusDistance = 1246 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 1247 if (minFocusDistance.data.f[0] == 0) { 1248 ALOGE("%s: Requested focus mode \"%s\" is not available: " 1249 "fixed focus lens", 1250 __FUNCTION__, 1251 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1252 return BAD_VALUE; 1253 } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) { 1254 camera_metadata_entry_t availableFocusModes = 1255 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 1256 for (i = 0; i < availableFocusModes.count; i++) { 1257 if (focusMode == availableFocusModes.data.u8[i]) break; 1258 } 1259 if (i == availableFocusModes.count) { 1260 ALOGE("%s: Requested focus mode \"%s\" is not supported", 1261 __FUNCTION__, 1262 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 1263 return BAD_VALUE; 1264 } 1265 } 1266 } 1267 } 1268 1269 // FOCUS_AREAS 1270 Vector<Parameters::Area> focusingAreas; 1271 res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 1272 &focusingAreas); 1273 size_t max3aRegions = 1274 (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 1275 if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 1276 if (res != OK) { 1277 ALOGE("%s: Requested focus areas are malformed: %s", 1278 __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 1279 return BAD_VALUE; 1280 } 1281 1282 // EXPOSURE_COMPENSATION 1283 int exposureCompensation = 1284 newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 1285 camera_metadata_entry_t exposureCompensationRange = 1286 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 1287 if (exposureCompensation < exposureCompensationRange.data.i32[0] || 1288 exposureCompensation > exposureCompensationRange.data.i32[1]) { 1289 ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 1290 __FUNCTION__, exposureCompensation); 1291 return BAD_VALUE; 1292 } 1293 1294 // AUTO_EXPOSURE_LOCK (always supported) 1295 bool autoExposureLock = boolFromString( 1296 newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 1297 1298 // AUTO_WHITEBALANCE_LOCK (always supported) 1299 bool autoWhiteBalanceLock = boolFromString( 1300 newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 1301 1302 // METERING_AREAS 1303 Vector<Parameters::Area> meteringAreas; 1304 res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 1305 &meteringAreas); 1306 if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 1307 if (res != OK) { 1308 ALOGE("%s: Requested metering areas are malformed: %s", 1309 __FUNCTION__, 1310 newParams.get(CameraParameters::KEY_METERING_AREAS)); 1311 return BAD_VALUE; 1312 } 1313 1314 // ZOOM 1315 int zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 1316 if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) { 1317 ALOGE("%s: Requested zoom level %d is not supported", 1318 __FUNCTION__, zoom); 1319 return BAD_VALUE; 1320 } 1321 1322 // VIDEO_SIZE 1323 int videoWidth, videoHeight; 1324 newParams.getVideoSize(&videoWidth, &videoHeight); 1325 if (videoWidth != mParameters.videoWidth || 1326 videoHeight != mParameters.videoHeight) { 1327 if (mState == RECORD) { 1328 ALOGE("%s: Video size cannot be updated when recording is active!", 1329 __FUNCTION__); 1330 return BAD_VALUE; 1331 } 1332 camera_metadata_entry_t availableVideoSizes = 1333 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 1334 for (i = 0; i < availableVideoSizes.count; i += 2 ) { 1335 if (availableVideoSizes.data.i32[i] == videoWidth && 1336 availableVideoSizes.data.i32[i+1] == videoHeight) break; 1337 } 1338 if (i == availableVideoSizes.count) { 1339 ALOGE("%s: Requested video size %d x %d is not supported", 1340 __FUNCTION__, videoWidth, videoHeight); 1341 return BAD_VALUE; 1342 } 1343 } 1344 1345 // RECORDING_HINT (always supported) 1346 bool recordingHint = boolFromString( 1347 newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 1348 1349 // VIDEO_STABILIZATION 1350 bool videoStabilization = boolFromString( 1351 newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 1352 camera_metadata_entry_t availableVideoStabilizationModes = 1353 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 1354 if (videoStabilization && availableVideoStabilizationModes.count == 1) { 1355 ALOGE("%s: Video stabilization not supported", __FUNCTION__); 1356 } 1357 1358 /** Update internal parameters */ 1359 1360 mParameters.previewWidth = previewWidth; 1361 mParameters.previewHeight = previewHeight; 1362 mParameters.previewFpsRange[0] = previewFpsRange[0]; 1363 mParameters.previewFpsRange[1] = previewFpsRange[1]; 1364 mParameters.previewFps = previewFps; 1365 mParameters.previewFormat = previewFormat; 1366 1367 mParameters.pictureWidth = pictureWidth; 1368 mParameters.pictureHeight = pictureHeight; 1369 1370 mParameters.jpegThumbSize[0] = jpegThumbSize[0]; 1371 mParameters.jpegThumbSize[1] = jpegThumbSize[1]; 1372 mParameters.jpegQuality = jpegQuality; 1373 mParameters.jpegThumbQuality = jpegThumbQuality; 1374 1375 mParameters.gpsEnabled = gpsEnabled; 1376 mParameters.gpsCoordinates[0] = gpsCoordinates[0]; 1377 mParameters.gpsCoordinates[1] = gpsCoordinates[1]; 1378 mParameters.gpsCoordinates[2] = gpsCoordinates[2]; 1379 mParameters.gpsTimestamp = gpsTimestamp; 1380 mParameters.gpsProcessingMethod = gpsProcessingMethod; 1381 1382 mParameters.wbMode = wbMode; 1383 mParameters.effectMode = effectMode; 1384 mParameters.antibandingMode = antibandingMode; 1385 mParameters.sceneMode = sceneMode; 1386 1387 mParameters.flashMode = flashMode; 1388 mParameters.focusMode = focusMode; 1389 1390 mParameters.focusingAreas = focusingAreas; 1391 mParameters.exposureCompensation = exposureCompensation; 1392 mParameters.autoExposureLock = autoExposureLock; 1393 mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock; 1394 mParameters.meteringAreas = meteringAreas; 1395 mParameters.zoom = zoom; 1396 1397 mParameters.videoWidth = videoWidth; 1398 mParameters.videoHeight = videoHeight; 1399 1400 mParameters.recordingHint = recordingHint; 1401 mParameters.videoStabilization = videoStabilization; 1402 1403 res = updatePreviewRequest(); 1404 if (res != OK) { 1405 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 1406 __FUNCTION__, mCameraId, strerror(-res), res); 1407 return res; 1408 } 1409 res = updateCaptureRequest(); 1410 if (res != OK) { 1411 ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)", 1412 __FUNCTION__, mCameraId, strerror(-res), res); 1413 return res; 1414 } 1415 1416 res = updateRecordingRequest(); 1417 if (res != OK) { 1418 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 1419 __FUNCTION__, mCameraId, strerror(-res), res); 1420 return res; 1421 } 1422 1423 if (mState == PREVIEW) { 1424 res = mDevice->setStreamingRequest(mPreviewRequest); 1425 if (res != OK) { 1426 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 1427 __FUNCTION__, mCameraId, strerror(-res), res); 1428 return res; 1429 } 1430 } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) { 1431 res = mDevice->setStreamingRequest(mRecordingRequest); 1432 if (res != OK) { 1433 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 1434 __FUNCTION__, mCameraId, strerror(-res), res); 1435 return res; 1436 } 1437 } 1438 1439 mParamsFlattened = params; 1440 1441 return OK; 1442} 1443 1444String8 Camera2Client::getParameters() const { 1445 ATRACE_CALL(); 1446 Mutex::Autolock icl(mICameraLock); 1447 1448 Mutex::Autolock pl(mParamsLock); 1449 1450 // TODO: Deal with focus distances 1451 return mParamsFlattened; 1452} 1453 1454status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1455 ATRACE_CALL(); 1456 Mutex::Autolock icl(mICameraLock); 1457 1458 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1459 cmd, arg1, arg2); 1460 1461 if (cmd == CAMERA_CMD_SET_DISPLAY_ORIENTATION) { 1462 int transform = degToTransform(arg1, 1463 mCameraFacing == CAMERA_FACING_FRONT); 1464 if (transform == -1) { 1465 ALOGE("%s: Camera %d: Error setting %d as display orientation value", 1466 __FUNCTION__, mCameraId, arg1); 1467 return BAD_VALUE; 1468 } 1469 if (transform != mParameters.previewTransform && 1470 mPreviewStreamId != NO_STREAM) { 1471 mDevice->setStreamTransform(mPreviewStreamId, transform); 1472 } 1473 mParameters.previewTransform = transform; 1474 return OK; 1475 } 1476 1477 ALOGE("%s: Camera %d: Unimplemented command %d (%d, %d)", __FUNCTION__, 1478 mCameraId, cmd, arg1, arg2); 1479 1480 return OK; 1481} 1482 1483/** Device-related methods */ 1484 1485void Camera2Client::onCaptureAvailable() { 1486 ATRACE_CALL(); 1487 status_t res; 1488 sp<ICameraClient> currentClient; 1489 ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId); 1490 1491 CpuConsumer::LockedBuffer imgBuffer; 1492 { 1493 Mutex::Autolock icl(mICameraLock); 1494 1495 // TODO: Signal errors here upstream 1496 if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) { 1497 ALOGE("%s: Camera %d: Still image produced unexpectedly!", 1498 __FUNCTION__, mCameraId); 1499 return; 1500 } 1501 1502 res = mCaptureConsumer->lockNextBuffer(&imgBuffer); 1503 if (res != OK) { 1504 ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)", 1505 __FUNCTION__, mCameraId, strerror(-res), res); 1506 return; 1507 } 1508 1509 if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) { 1510 ALOGE("%s: Camera %d: Unexpected format for still image: " 1511 "%x, expected %x", __FUNCTION__, mCameraId, 1512 imgBuffer.format, 1513 HAL_PIXEL_FORMAT_BLOB); 1514 mCaptureConsumer->unlockBuffer(imgBuffer); 1515 return; 1516 } 1517 1518 // TODO: Optimize this to avoid memcopy 1519 void* captureMemory = mCaptureHeap->mHeap->getBase(); 1520 size_t size = mCaptureHeap->mHeap->getSize(); 1521 memcpy(captureMemory, imgBuffer.data, size); 1522 1523 mCaptureConsumer->unlockBuffer(imgBuffer); 1524 1525 currentClient = mCameraClient; 1526 switch (mState) { 1527 case STILL_CAPTURE: 1528 mState = STOPPED; 1529 break; 1530 case VIDEO_SNAPSHOT: 1531 mState = RECORD; 1532 break; 1533 default: 1534 ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__, 1535 mCameraId, mState); 1536 break; 1537 } 1538 } 1539 // Call outside mICameraLock to allow re-entrancy from notification 1540 if (currentClient != 0) { 1541 currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 1542 mCaptureHeap->mBuffers[0], NULL); 1543 } 1544} 1545 1546void Camera2Client::onRecordingFrameAvailable() { 1547 ATRACE_CALL(); 1548 status_t res; 1549 sp<ICameraClient> currentClient; 1550 size_t heapIdx = 0; 1551 nsecs_t timestamp; 1552 { 1553 Mutex::Autolock icl(mICameraLock); 1554 // TODO: Signal errors here upstream 1555 bool discardData = false; 1556 if (mState != RECORD && mState != VIDEO_SNAPSHOT) { 1557 ALOGV("%s: Camera %d: Discarding recording image buffers received after " 1558 "recording done", 1559 __FUNCTION__, mCameraId); 1560 discardData = true; 1561 } 1562 1563 buffer_handle_t imgBuffer; 1564 res = mRecordingConsumer->getNextBuffer(&imgBuffer, ×tamp); 1565 if (res != OK) { 1566 ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)", 1567 __FUNCTION__, mCameraId, strerror(-res), res); 1568 return; 1569 } 1570 1571 if (discardData) { 1572 mRecordingConsumer->freeBuffer(imgBuffer); 1573 return; 1574 } 1575 1576 if (mRecordingHeap == 0) { 1577 const size_t bufferSize = 4 + sizeof(buffer_handle_t); 1578 ALOGV("%s: Camera %d: Creating recording heap with %d buffers of " 1579 "size %d bytes", __FUNCTION__, mCameraId, 1580 kRecordingHeapCount, bufferSize); 1581 if (mRecordingHeap != 0) { 1582 ALOGV("%s: Camera %d: Previous heap has size %d " 1583 "(new will be %d) bytes", __FUNCTION__, mCameraId, 1584 mRecordingHeap->mHeap->getSize(), 1585 bufferSize * kRecordingHeapCount); 1586 } 1587 // Need to allocate memory for heap 1588 mRecordingHeap.clear(); 1589 1590 mRecordingHeap = new Camera2Heap(bufferSize, kRecordingHeapCount, 1591 "Camera2Client::RecordingHeap"); 1592 if (mRecordingHeap->mHeap->getSize() == 0) { 1593 ALOGE("%s: Camera %d: Unable to allocate memory for recording", 1594 __FUNCTION__, mCameraId); 1595 mRecordingConsumer->freeBuffer(imgBuffer); 1596 return; 1597 } 1598 mRecordingHeapHead = 0; 1599 mRecordingHeapFree = kRecordingHeapCount; 1600 } 1601 1602 if ( mRecordingHeapFree == 0) { 1603 ALOGE("%s: Camera %d: No free recording buffers, dropping frame", 1604 __FUNCTION__, mCameraId); 1605 mRecordingConsumer->freeBuffer(imgBuffer); 1606 return; 1607 } 1608 heapIdx = mRecordingHeapHead; 1609 mRecordingHeapHead = (mRecordingHeapHead + 1) % kRecordingHeapCount; 1610 mRecordingHeapFree--; 1611 1612 ALOGV("%s: Camera %d: Timestamp %lld", 1613 __FUNCTION__, mCameraId, timestamp); 1614 1615 ssize_t offset; 1616 size_t size; 1617 sp<IMemoryHeap> heap = 1618 mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset, 1619 &size); 1620 1621 uint8_t *data = (uint8_t*)heap->getBase() + offset; 1622 uint32_t type = kMetadataBufferTypeGrallocSource; 1623 memcpy(data, &type, 4); 1624 memcpy(data + 4, &imgBuffer, sizeof(buffer_handle_t)); 1625 ALOGV("%s: Camera %d: Sending out buffer_handle_t %p", 1626 __FUNCTION__, mCameraId, imgBuffer); 1627 currentClient = mCameraClient; 1628 } 1629 // Call outside mICameraLock to allow re-entrancy from notification 1630 if (currentClient != 0) { 1631 currentClient->dataCallbackTimestamp(timestamp, 1632 CAMERA_MSG_VIDEO_FRAME, 1633 mRecordingHeap->mBuffers[heapIdx]); 1634 } 1635} 1636 1637camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag, 1638 size_t minCount, size_t maxCount) { 1639 status_t res; 1640 camera_metadata_entry_t entry; 1641 res = find_camera_metadata_entry(mDevice->info(), 1642 tag, 1643 &entry); 1644 if (CC_UNLIKELY( res != OK )) { 1645 const char* tagSection = get_camera_metadata_section_name(tag); 1646 if (tagSection == NULL) tagSection = "<unknown>"; 1647 const char* tagName = get_camera_metadata_tag_name(tag); 1648 if (tagName == NULL) tagName = "<unknown>"; 1649 1650 ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)", 1651 tagSection, tagName, tag, strerror(-res), res); 1652 entry.count = 0; 1653 entry.data.u8 = NULL; 1654 } else if (CC_UNLIKELY( 1655 (minCount != 0 && entry.count < minCount) || 1656 (maxCount != 0 && entry.count > maxCount) ) ) { 1657 const char* tagSection = get_camera_metadata_section_name(tag); 1658 if (tagSection == NULL) tagSection = "<unknown>"; 1659 const char* tagName = get_camera_metadata_tag_name(tag); 1660 if (tagName == NULL) tagName = "<unknown>"; 1661 ALOGE("Malformed static metadata entry '%s.%s' (%x):" 1662 "Expected between %d and %d values, but got %d values", 1663 tagSection, tagName, tag, minCount, maxCount, entry.count); 1664 entry.count = 0; 1665 entry.data.u8 = NULL; 1666 } 1667 1668 return entry; 1669} 1670 1671/** Utility methods */ 1672 1673 1674status_t Camera2Client::buildDefaultParameters() { 1675 ATRACE_CALL(); 1676 Mutex::Autolock pl(mParamsLock); 1677 1678 status_t res; 1679 CameraParameters params; 1680 1681 camera_metadata_entry_t availableProcessedSizes = 1682 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 1683 if (!availableProcessedSizes.count) return NO_INIT; 1684 1685 // TODO: Pick more intelligently 1686 mParameters.previewWidth = availableProcessedSizes.data.i32[0]; 1687 mParameters.previewHeight = availableProcessedSizes.data.i32[1]; 1688 mParameters.videoWidth = mParameters.previewWidth; 1689 mParameters.videoHeight = mParameters.previewHeight; 1690 1691 params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight); 1692 params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight); 1693 params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 1694 String8::format("%dx%d", 1695 mParameters.previewWidth, mParameters.previewHeight)); 1696 { 1697 String8 supportedPreviewSizes; 1698 for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 1699 if (i != 0) supportedPreviewSizes += ","; 1700 supportedPreviewSizes += String8::format("%dx%d", 1701 availableProcessedSizes.data.i32[i], 1702 availableProcessedSizes.data.i32[i+1]); 1703 } 1704 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 1705 supportedPreviewSizes); 1706 params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 1707 supportedPreviewSizes); 1708 } 1709 1710 camera_metadata_entry_t availableFpsRanges = 1711 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 1712 if (!availableFpsRanges.count) return NO_INIT; 1713 1714 mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0]; 1715 mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1]; 1716 1717 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 1718 String8::format("%d,%d", 1719 mParameters.previewFpsRange[0], 1720 mParameters.previewFpsRange[1])); 1721 1722 { 1723 String8 supportedPreviewFpsRange; 1724 for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1725 if (i != 0) supportedPreviewFpsRange += ","; 1726 supportedPreviewFpsRange += String8::format("(%d,%d)", 1727 availableFpsRanges.data.i32[i], 1728 availableFpsRanges.data.i32[i+1]); 1729 } 1730 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 1731 supportedPreviewFpsRange); 1732 } 1733 1734 mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1735 params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1736 formatEnumToString(mParameters.previewFormat)); // NV21 1737 1738 mParameters.previewTransform = degToTransform(0, 1739 mCameraFacing == CAMERA_FACING_FRONT); 1740 1741 camera_metadata_entry_t availableFormats = 1742 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 1743 1744 { 1745 String8 supportedPreviewFormats; 1746 bool addComma = false; 1747 for (size_t i=0; i < availableFormats.count; i++) { 1748 if (addComma) supportedPreviewFormats += ","; 1749 addComma = true; 1750 switch (availableFormats.data.i32[i]) { 1751 case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1752 supportedPreviewFormats += 1753 CameraParameters::PIXEL_FORMAT_YUV422SP; 1754 break; 1755 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1756 supportedPreviewFormats += 1757 CameraParameters::PIXEL_FORMAT_YUV420SP; 1758 break; 1759 case HAL_PIXEL_FORMAT_YCbCr_422_I: 1760 supportedPreviewFormats += 1761 CameraParameters::PIXEL_FORMAT_YUV422I; 1762 break; 1763 case HAL_PIXEL_FORMAT_YV12: 1764 supportedPreviewFormats += 1765 CameraParameters::PIXEL_FORMAT_YUV420P; 1766 break; 1767 case HAL_PIXEL_FORMAT_RGB_565: 1768 supportedPreviewFormats += 1769 CameraParameters::PIXEL_FORMAT_RGB565; 1770 break; 1771 case HAL_PIXEL_FORMAT_RGBA_8888: 1772 supportedPreviewFormats += 1773 CameraParameters::PIXEL_FORMAT_RGBA8888; 1774 break; 1775 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1776 case HAL_PIXEL_FORMAT_RAW_SENSOR: 1777 case HAL_PIXEL_FORMAT_BLOB: 1778 addComma = false; 1779 break; 1780 1781 default: 1782 ALOGW("%s: Camera %d: Unknown preview format: %x", 1783 __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 1784 addComma = false; 1785 break; 1786 } 1787 } 1788 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1789 supportedPreviewFormats); 1790 } 1791 1792 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1793 // still have to do something sane for them 1794 1795 params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 1796 mParameters.previewFpsRange[0]); 1797 1798 { 1799 String8 supportedPreviewFrameRates; 1800 for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1801 if (i != 0) supportedPreviewFrameRates += ","; 1802 supportedPreviewFrameRates += String8::format("%d", 1803 availableFpsRanges.data.i32[i]); 1804 } 1805 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 1806 supportedPreviewFrameRates); 1807 } 1808 1809 camera_metadata_entry_t availableJpegSizes = 1810 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 1811 if (!availableJpegSizes.count) return NO_INIT; 1812 1813 // TODO: Pick maximum 1814 mParameters.pictureWidth = availableJpegSizes.data.i32[0]; 1815 mParameters.pictureHeight = availableJpegSizes.data.i32[1]; 1816 1817 params.setPictureSize(mParameters.pictureWidth, 1818 mParameters.pictureHeight); 1819 1820 { 1821 String8 supportedPictureSizes; 1822 for (size_t i=0; i < availableJpegSizes.count; i += 2) { 1823 if (i != 0) supportedPictureSizes += ","; 1824 supportedPictureSizes += String8::format("%dx%d", 1825 availableJpegSizes.data.i32[i], 1826 availableJpegSizes.data.i32[i+1]); 1827 } 1828 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 1829 supportedPictureSizes); 1830 } 1831 1832 params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 1833 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 1834 CameraParameters::PIXEL_FORMAT_JPEG); 1835 1836 camera_metadata_entry_t availableJpegThumbnailSizes = 1837 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2); 1838 if (!availableJpegThumbnailSizes.count) return NO_INIT; 1839 1840 // TODO: Pick default thumbnail size sensibly 1841 mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 1842 mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 1843 1844 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 1845 mParameters.jpegThumbSize[0]); 1846 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 1847 mParameters.jpegThumbSize[1]); 1848 1849 { 1850 String8 supportedJpegThumbSizes; 1851 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 1852 if (i != 0) supportedJpegThumbSizes += ","; 1853 supportedJpegThumbSizes += String8::format("%dx%d", 1854 availableJpegThumbnailSizes.data.i32[i], 1855 availableJpegThumbnailSizes.data.i32[i+1]); 1856 } 1857 params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 1858 supportedJpegThumbSizes); 1859 } 1860 1861 mParameters.jpegThumbQuality = 90; 1862 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 1863 mParameters.jpegThumbQuality); 1864 mParameters.jpegQuality = 90; 1865 params.set(CameraParameters::KEY_JPEG_QUALITY, 1866 mParameters.jpegQuality); 1867 mParameters.jpegRotation = 0; 1868 params.set(CameraParameters::KEY_ROTATION, 1869 mParameters.jpegRotation); 1870 1871 mParameters.gpsEnabled = false; 1872 mParameters.gpsProcessingMethod = "unknown"; 1873 // GPS fields in CameraParameters are not set by implementation 1874 1875 mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO; 1876 params.set(CameraParameters::KEY_WHITE_BALANCE, 1877 CameraParameters::WHITE_BALANCE_AUTO); 1878 1879 camera_metadata_entry_t availableWhiteBalanceModes = 1880 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 1881 { 1882 String8 supportedWhiteBalance; 1883 bool addComma = false; 1884 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 1885 if (addComma) supportedWhiteBalance += ","; 1886 addComma = true; 1887 switch (availableWhiteBalanceModes.data.u8[i]) { 1888 case ANDROID_CONTROL_AWB_AUTO: 1889 supportedWhiteBalance += 1890 CameraParameters::WHITE_BALANCE_AUTO; 1891 break; 1892 case ANDROID_CONTROL_AWB_INCANDESCENT: 1893 supportedWhiteBalance += 1894 CameraParameters::WHITE_BALANCE_INCANDESCENT; 1895 break; 1896 case ANDROID_CONTROL_AWB_FLUORESCENT: 1897 supportedWhiteBalance += 1898 CameraParameters::WHITE_BALANCE_FLUORESCENT; 1899 break; 1900 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 1901 supportedWhiteBalance += 1902 CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 1903 break; 1904 case ANDROID_CONTROL_AWB_DAYLIGHT: 1905 supportedWhiteBalance += 1906 CameraParameters::WHITE_BALANCE_DAYLIGHT; 1907 break; 1908 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 1909 supportedWhiteBalance += 1910 CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 1911 break; 1912 case ANDROID_CONTROL_AWB_TWILIGHT: 1913 supportedWhiteBalance += 1914 CameraParameters::WHITE_BALANCE_TWILIGHT; 1915 break; 1916 case ANDROID_CONTROL_AWB_SHADE: 1917 supportedWhiteBalance += 1918 CameraParameters::WHITE_BALANCE_SHADE; 1919 break; 1920 // Skipping values not mappable to v1 API 1921 case ANDROID_CONTROL_AWB_OFF: 1922 addComma = false; 1923 break; 1924 default: 1925 ALOGW("%s: Camera %d: Unknown white balance value: %d", 1926 __FUNCTION__, mCameraId, 1927 availableWhiteBalanceModes.data.u8[i]); 1928 addComma = false; 1929 break; 1930 } 1931 } 1932 params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 1933 supportedWhiteBalance); 1934 } 1935 1936 mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF; 1937 params.set(CameraParameters::KEY_EFFECT, 1938 CameraParameters::EFFECT_NONE); 1939 1940 camera_metadata_entry_t availableEffects = 1941 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 1942 if (!availableEffects.count) return NO_INIT; 1943 { 1944 String8 supportedEffects; 1945 bool addComma = false; 1946 for (size_t i=0; i < availableEffects.count; i++) { 1947 if (addComma) supportedEffects += ","; 1948 addComma = true; 1949 switch (availableEffects.data.u8[i]) { 1950 case ANDROID_CONTROL_EFFECT_OFF: 1951 supportedEffects += 1952 CameraParameters::EFFECT_NONE; 1953 break; 1954 case ANDROID_CONTROL_EFFECT_MONO: 1955 supportedEffects += 1956 CameraParameters::EFFECT_MONO; 1957 break; 1958 case ANDROID_CONTROL_EFFECT_NEGATIVE: 1959 supportedEffects += 1960 CameraParameters::EFFECT_NEGATIVE; 1961 break; 1962 case ANDROID_CONTROL_EFFECT_SOLARIZE: 1963 supportedEffects += 1964 CameraParameters::EFFECT_SOLARIZE; 1965 break; 1966 case ANDROID_CONTROL_EFFECT_SEPIA: 1967 supportedEffects += 1968 CameraParameters::EFFECT_SEPIA; 1969 break; 1970 case ANDROID_CONTROL_EFFECT_POSTERIZE: 1971 supportedEffects += 1972 CameraParameters::EFFECT_POSTERIZE; 1973 break; 1974 case ANDROID_CONTROL_EFFECT_WHITEBOARD: 1975 supportedEffects += 1976 CameraParameters::EFFECT_WHITEBOARD; 1977 break; 1978 case ANDROID_CONTROL_EFFECT_BLACKBOARD: 1979 supportedEffects += 1980 CameraParameters::EFFECT_BLACKBOARD; 1981 break; 1982 case ANDROID_CONTROL_EFFECT_AQUA: 1983 supportedEffects += 1984 CameraParameters::EFFECT_AQUA; 1985 break; 1986 default: 1987 ALOGW("%s: Camera %d: Unknown effect value: %d", 1988 __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 1989 addComma = false; 1990 break; 1991 } 1992 } 1993 params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 1994 } 1995 1996 mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 1997 params.set(CameraParameters::KEY_ANTIBANDING, 1998 CameraParameters::ANTIBANDING_AUTO); 1999 2000 camera_metadata_entry_t availableAntibandingModes = 2001 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 2002 if (!availableAntibandingModes.count) return NO_INIT; 2003 { 2004 String8 supportedAntibanding; 2005 bool addComma = false; 2006 for (size_t i=0; i < availableAntibandingModes.count; i++) { 2007 if (addComma) supportedAntibanding += ","; 2008 addComma = true; 2009 switch (availableAntibandingModes.data.u8[i]) { 2010 case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 2011 supportedAntibanding += 2012 CameraParameters::ANTIBANDING_OFF; 2013 break; 2014 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 2015 supportedAntibanding += 2016 CameraParameters::ANTIBANDING_50HZ; 2017 break; 2018 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 2019 supportedAntibanding += 2020 CameraParameters::ANTIBANDING_60HZ; 2021 break; 2022 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 2023 supportedAntibanding += 2024 CameraParameters::ANTIBANDING_AUTO; 2025 break; 2026 default: 2027 ALOGW("%s: Camera %d: Unknown antibanding value: %d", 2028 __FUNCTION__, mCameraId, 2029 availableAntibandingModes.data.u8[i]); 2030 addComma = false; 2031 break; 2032 } 2033 } 2034 params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 2035 supportedAntibanding); 2036 } 2037 2038 mParameters.sceneMode = ANDROID_CONTROL_OFF; 2039 params.set(CameraParameters::KEY_SCENE_MODE, 2040 CameraParameters::SCENE_MODE_AUTO); 2041 2042 camera_metadata_entry_t availableSceneModes = 2043 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 2044 if (!availableSceneModes.count) return NO_INIT; 2045 { 2046 String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 2047 bool addComma = true; 2048 bool noSceneModes = false; 2049 for (size_t i=0; i < availableSceneModes.count; i++) { 2050 if (addComma) supportedSceneModes += ","; 2051 addComma = true; 2052 switch (availableSceneModes.data.u8[i]) { 2053 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 2054 noSceneModes = true; 2055 break; 2056 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 2057 // Not in old API 2058 addComma = false; 2059 break; 2060 case ANDROID_CONTROL_SCENE_MODE_ACTION: 2061 supportedSceneModes += 2062 CameraParameters::SCENE_MODE_ACTION; 2063 break; 2064 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 2065 supportedSceneModes += 2066 CameraParameters::SCENE_MODE_PORTRAIT; 2067 break; 2068 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 2069 supportedSceneModes += 2070 CameraParameters::SCENE_MODE_LANDSCAPE; 2071 break; 2072 case ANDROID_CONTROL_SCENE_MODE_NIGHT: 2073 supportedSceneModes += 2074 CameraParameters::SCENE_MODE_NIGHT; 2075 break; 2076 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 2077 supportedSceneModes += 2078 CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 2079 break; 2080 case ANDROID_CONTROL_SCENE_MODE_THEATRE: 2081 supportedSceneModes += 2082 CameraParameters::SCENE_MODE_THEATRE; 2083 break; 2084 case ANDROID_CONTROL_SCENE_MODE_BEACH: 2085 supportedSceneModes += 2086 CameraParameters::SCENE_MODE_BEACH; 2087 break; 2088 case ANDROID_CONTROL_SCENE_MODE_SNOW: 2089 supportedSceneModes += 2090 CameraParameters::SCENE_MODE_SNOW; 2091 break; 2092 case ANDROID_CONTROL_SCENE_MODE_SUNSET: 2093 supportedSceneModes += 2094 CameraParameters::SCENE_MODE_SUNSET; 2095 break; 2096 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 2097 supportedSceneModes += 2098 CameraParameters::SCENE_MODE_STEADYPHOTO; 2099 break; 2100 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 2101 supportedSceneModes += 2102 CameraParameters::SCENE_MODE_FIREWORKS; 2103 break; 2104 case ANDROID_CONTROL_SCENE_MODE_SPORTS: 2105 supportedSceneModes += 2106 CameraParameters::SCENE_MODE_SPORTS; 2107 break; 2108 case ANDROID_CONTROL_SCENE_MODE_PARTY: 2109 supportedSceneModes += 2110 CameraParameters::SCENE_MODE_PARTY; 2111 break; 2112 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 2113 supportedSceneModes += 2114 CameraParameters::SCENE_MODE_CANDLELIGHT; 2115 break; 2116 case ANDROID_CONTROL_SCENE_MODE_BARCODE: 2117 supportedSceneModes += 2118 CameraParameters::SCENE_MODE_BARCODE; 2119 break; 2120 default: 2121 ALOGW("%s: Camera %d: Unknown scene mode value: %d", 2122 __FUNCTION__, mCameraId, 2123 availableSceneModes.data.u8[i]); 2124 addComma = false; 2125 break; 2126 } 2127 } 2128 if (!noSceneModes) { 2129 params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 2130 supportedSceneModes); 2131 } 2132 } 2133 2134 camera_metadata_entry_t flashAvailable = 2135 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 2136 if (!flashAvailable.count) return NO_INIT; 2137 2138 camera_metadata_entry_t availableAeModes = 2139 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 2140 if (!availableAeModes.count) return NO_INIT; 2141 2142 if (flashAvailable.data.u8[0]) { 2143 mParameters.flashMode = Parameters::FLASH_MODE_AUTO; 2144 params.set(CameraParameters::KEY_FLASH_MODE, 2145 CameraParameters::FLASH_MODE_AUTO); 2146 2147 String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 2148 supportedFlashModes = supportedFlashModes + 2149 "," + CameraParameters::FLASH_MODE_AUTO + 2150 "," + CameraParameters::FLASH_MODE_ON + 2151 "," + CameraParameters::FLASH_MODE_TORCH; 2152 for (size_t i=0; i < availableAeModes.count; i++) { 2153 if (availableAeModes.data.u8[i] == 2154 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 2155 supportedFlashModes = supportedFlashModes + "," + 2156 CameraParameters::FLASH_MODE_RED_EYE; 2157 break; 2158 } 2159 } 2160 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 2161 supportedFlashModes); 2162 } else { 2163 mParameters.flashMode = Parameters::FLASH_MODE_OFF; 2164 params.set(CameraParameters::KEY_FLASH_MODE, 2165 CameraParameters::FLASH_MODE_OFF); 2166 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 2167 CameraParameters::FLASH_MODE_OFF); 2168 } 2169 2170 camera_metadata_entry_t minFocusDistance = 2171 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 2172 if (!minFocusDistance.count) return NO_INIT; 2173 2174 camera_metadata_entry_t availableAfModes = 2175 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 2176 if (!availableAfModes.count) return NO_INIT; 2177 2178 if (minFocusDistance.data.f[0] == 0) { 2179 // Fixed-focus lens 2180 mParameters.focusMode = Parameters::FOCUS_MODE_FIXED; 2181 params.set(CameraParameters::KEY_FOCUS_MODE, 2182 CameraParameters::FOCUS_MODE_FIXED); 2183 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 2184 CameraParameters::FOCUS_MODE_FIXED); 2185 } else { 2186 mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 2187 params.set(CameraParameters::KEY_FOCUS_MODE, 2188 CameraParameters::FOCUS_MODE_AUTO); 2189 String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED); 2190 supportedFocusModes = supportedFocusModes + "," + 2191 CameraParameters::FOCUS_MODE_INFINITY; 2192 bool addComma = true; 2193 2194 for (size_t i=0; i < availableAfModes.count; i++) { 2195 if (addComma) supportedFocusModes += ","; 2196 addComma = true; 2197 switch (availableAfModes.data.u8[i]) { 2198 case ANDROID_CONTROL_AF_AUTO: 2199 supportedFocusModes += 2200 CameraParameters::FOCUS_MODE_AUTO; 2201 break; 2202 case ANDROID_CONTROL_AF_MACRO: 2203 supportedFocusModes += 2204 CameraParameters::FOCUS_MODE_MACRO; 2205 break; 2206 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 2207 supportedFocusModes += 2208 CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 2209 break; 2210 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 2211 supportedFocusModes += 2212 CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 2213 break; 2214 case ANDROID_CONTROL_AF_EDOF: 2215 supportedFocusModes += 2216 CameraParameters::FOCUS_MODE_EDOF; 2217 break; 2218 // Not supported in old API 2219 case ANDROID_CONTROL_AF_OFF: 2220 addComma = false; 2221 break; 2222 default: 2223 ALOGW("%s: Camera %d: Unknown AF mode value: %d", 2224 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 2225 addComma = false; 2226 break; 2227 } 2228 } 2229 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 2230 supportedFocusModes); 2231 } 2232 2233 camera_metadata_entry_t max3aRegions = 2234 staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 2235 if (!max3aRegions.count) return NO_INIT; 2236 2237 params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 2238 max3aRegions.data.i32[0]); 2239 params.set(CameraParameters::KEY_FOCUS_AREAS, 2240 "(0,0,0,0,0)"); 2241 mParameters.focusingAreas.clear(); 2242 mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0)); 2243 2244 camera_metadata_entry_t availableFocalLengths = 2245 staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 2246 if (!availableFocalLengths.count) return NO_INIT; 2247 2248 float minFocalLength = availableFocalLengths.data.f[0]; 2249 params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 2250 2251 camera_metadata_entry_t sensorSize = 2252 staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 2253 if (!sensorSize.count) return NO_INIT; 2254 2255 // The fields of view here assume infinity focus, maximum wide angle 2256 float horizFov = 180 / M_PI * 2257 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 2258 float vertFov = 180 / M_PI * 2259 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 2260 params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 2261 params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 2262 2263 mParameters.exposureCompensation = 0; 2264 params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 2265 mParameters.exposureCompensation); 2266 2267 camera_metadata_entry_t exposureCompensationRange = 2268 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 2269 if (!exposureCompensationRange.count) return NO_INIT; 2270 2271 params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 2272 exposureCompensationRange.data.i32[1]); 2273 params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 2274 exposureCompensationRange.data.i32[0]); 2275 2276 camera_metadata_entry_t exposureCompensationStep = 2277 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 2278 if (!exposureCompensationStep.count) return NO_INIT; 2279 2280 params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 2281 exposureCompensationStep.data.r[0].numerator / 2282 exposureCompensationStep.data.r[0].denominator); 2283 2284 mParameters.autoExposureLock = false; 2285 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 2286 CameraParameters::FALSE); 2287 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 2288 CameraParameters::TRUE); 2289 2290 mParameters.autoWhiteBalanceLock = false; 2291 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 2292 CameraParameters::FALSE); 2293 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 2294 CameraParameters::TRUE); 2295 2296 mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 2297 params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 2298 max3aRegions.data.i32[0]); 2299 params.set(CameraParameters::KEY_METERING_AREAS, 2300 "(0,0,0,0,0)"); 2301 2302 mParameters.zoom = 0; 2303 params.set(CameraParameters::KEY_ZOOM, mParameters.zoom); 2304 params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 2305 2306 camera_metadata_entry_t maxDigitalZoom = 2307 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1); 2308 if (!maxDigitalZoom.count) return NO_INIT; 2309 2310 { 2311 String8 zoomRatios; 2312 float zoom = 1.f; 2313 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 2314 (NUM_ZOOM_STEPS-1); 2315 bool addComma = false; 2316 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 2317 if (addComma) zoomRatios += ","; 2318 addComma = true; 2319 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 2320 zoom += zoomIncrement; 2321 } 2322 params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 2323 } 2324 2325 params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 2326 CameraParameters::TRUE); 2327 params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 2328 CameraParameters::TRUE); 2329 2330 params.set(CameraParameters::KEY_FOCUS_DISTANCES, 2331 "Infinity,Infinity,Infinity"); 2332 2333 camera_metadata_entry_t maxFacesDetected = 2334 staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 2335 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 2336 maxFacesDetected.data.i32[0]); 2337 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 2338 0); 2339 2340 params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 2341 CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 2342 2343 params.set(CameraParameters::KEY_RECORDING_HINT, 2344 CameraParameters::FALSE); 2345 2346 params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 2347 CameraParameters::TRUE); 2348 2349 params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 2350 CameraParameters::FALSE); 2351 2352 camera_metadata_entry_t availableVideoStabilizationModes = 2353 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 2354 if (!availableVideoStabilizationModes.count) return NO_INIT; 2355 2356 if (availableVideoStabilizationModes.count > 1) { 2357 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 2358 CameraParameters::TRUE); 2359 } else { 2360 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 2361 CameraParameters::FALSE); 2362 } 2363 2364 // Always use metadata mode for recording 2365 mParameters.storeMetadataInBuffers = true; 2366 2367 mParamsFlattened = params.flatten(); 2368 2369 return OK; 2370} 2371 2372status_t Camera2Client::updatePreviewStream() { 2373 ATRACE_CALL(); 2374 status_t res; 2375 if (mPreviewStreamId != NO_STREAM) { 2376 // Check if stream parameters have to change 2377 uint32_t currentWidth, currentHeight; 2378 res = mDevice->getStreamInfo(mPreviewStreamId, 2379 ¤tWidth, ¤tHeight, 0); 2380 if (res != OK) { 2381 ALOGE("%s: Camera %d: Error querying preview stream info: " 2382 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2383 return res; 2384 } 2385 if (currentWidth != (uint32_t)mParameters.previewWidth || 2386 currentHeight != (uint32_t)mParameters.previewHeight) { 2387 ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d", 2388 __FUNCTION__, mCameraId, currentWidth, currentHeight, 2389 mParameters.previewWidth, mParameters.previewHeight); 2390 res = mDevice->waitUntilDrained(); 2391 if (res != OK) { 2392 ALOGE("%s: Camera %d: Error waiting for preview to drain: " 2393 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2394 return res; 2395 } 2396 res = mDevice->deleteStream(mPreviewStreamId); 2397 if (res != OK) { 2398 ALOGE("%s: Camera %d: Unable to delete old output stream " 2399 "for preview: %s (%d)", __FUNCTION__, mCameraId, 2400 strerror(-res), res); 2401 return res; 2402 } 2403 mPreviewStreamId = NO_STREAM; 2404 } 2405 } 2406 2407 if (mPreviewStreamId == NO_STREAM) { 2408 res = mDevice->createStream(mPreviewWindow, 2409 mParameters.previewWidth, mParameters.previewHeight, 2410 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, 2411 &mPreviewStreamId); 2412 if (res != OK) { 2413 ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", 2414 __FUNCTION__, mCameraId, strerror(-res), res); 2415 return res; 2416 } 2417 } 2418 2419 res = mDevice->setStreamTransform(mPreviewStreamId, 2420 mParameters.previewTransform); 2421 if (res != OK) { 2422 ALOGE("%s: Camera %d: Unable to set preview stream transform: " 2423 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2424 return res; 2425 } 2426 2427 return OK; 2428} 2429 2430status_t Camera2Client::updatePreviewRequest() { 2431 ATRACE_CALL(); 2432 status_t res; 2433 if (mPreviewRequest == NULL) { 2434 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 2435 &mPreviewRequest); 2436 if (res != OK) { 2437 ALOGE("%s: Camera %d: Unable to create default preview request: " 2438 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2439 return res; 2440 } 2441 } 2442 2443 res = updateRequestCommon(mPreviewRequest); 2444 if (res != OK) { 2445 ALOGE("%s: Camera %d: Unable to update common entries of preview " 2446 "request: %s (%d)", __FUNCTION__, mCameraId, 2447 strerror(-res), res); 2448 return res; 2449 } 2450 2451 return OK; 2452} 2453 2454status_t Camera2Client::updateCaptureStream() { 2455 ATRACE_CALL(); 2456 status_t res; 2457 // Find out buffer size for JPEG 2458 camera_metadata_entry_t maxJpegSize = 2459 staticInfo(ANDROID_JPEG_MAX_SIZE); 2460 if (maxJpegSize.count == 0) { 2461 ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!", 2462 __FUNCTION__, mCameraId); 2463 return INVALID_OPERATION; 2464 } 2465 2466 if (mCaptureConsumer == 0) { 2467 // Create CPU buffer queue endpoint 2468 mCaptureConsumer = new CpuConsumer(1); 2469 mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this)); 2470 mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer")); 2471 mCaptureWindow = new SurfaceTextureClient( 2472 mCaptureConsumer->getProducerInterface()); 2473 // Create memory for API consumption 2474 mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1, 2475 "Camera2Client::CaptureHeap"); 2476 if (mCaptureHeap->mHeap->getSize() == 0) { 2477 ALOGE("%s: Camera %d: Unable to allocate memory for capture", 2478 __FUNCTION__, mCameraId); 2479 return NO_MEMORY; 2480 } 2481 } 2482 2483 if (mCaptureStreamId != NO_STREAM) { 2484 // Check if stream parameters have to change 2485 uint32_t currentWidth, currentHeight; 2486 res = mDevice->getStreamInfo(mCaptureStreamId, 2487 ¤tWidth, ¤tHeight, 0); 2488 if (res != OK) { 2489 ALOGE("%s: Camera %d: Error querying capture output stream info: " 2490 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2491 return res; 2492 } 2493 if (currentWidth != (uint32_t)mParameters.pictureWidth || 2494 currentHeight != (uint32_t)mParameters.pictureHeight) { 2495 res = mDevice->deleteStream(mCaptureStreamId); 2496 if (res != OK) { 2497 ALOGE("%s: Camera %d: Unable to delete old output stream " 2498 "for capture: %s (%d)", __FUNCTION__, mCameraId, 2499 strerror(-res), res); 2500 return res; 2501 } 2502 mCaptureStreamId = NO_STREAM; 2503 } 2504 } 2505 2506 if (mCaptureStreamId == NO_STREAM) { 2507 // Create stream for HAL production 2508 res = mDevice->createStream(mCaptureWindow, 2509 mParameters.pictureWidth, mParameters.pictureHeight, 2510 HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0], 2511 &mCaptureStreamId); 2512 if (res != OK) { 2513 ALOGE("%s: Camera %d: Can't create output stream for capture: " 2514 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2515 return res; 2516 } 2517 2518 } 2519 return OK; 2520} 2521 2522status_t Camera2Client::updateCaptureRequest() { 2523 ATRACE_CALL(); 2524 status_t res; 2525 if (mCaptureRequest == NULL) { 2526 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE, 2527 &mCaptureRequest); 2528 if (res != OK) { 2529 ALOGE("%s: Camera %d: Unable to create default still image request:" 2530 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2531 return res; 2532 } 2533 } 2534 2535 res = updateRequestCommon(mCaptureRequest); 2536 if (res != OK) { 2537 ALOGE("%s: Camera %d: Unable to update common entries of capture " 2538 "request: %s (%d)", __FUNCTION__, mCameraId, 2539 strerror(-res), res); 2540 return res; 2541 } 2542 2543 res = updateEntry(mCaptureRequest, 2544 ANDROID_JPEG_THUMBNAIL_SIZE, 2545 mParameters.jpegThumbSize, 2); 2546 if (res != OK) return res; 2547 res = updateEntry(mCaptureRequest, 2548 ANDROID_JPEG_THUMBNAIL_QUALITY, 2549 &mParameters.jpegThumbQuality, 1); 2550 if (res != OK) return res; 2551 res = updateEntry(mCaptureRequest, 2552 ANDROID_JPEG_QUALITY, 2553 &mParameters.jpegQuality, 1); 2554 if (res != OK) return res; 2555 res = updateEntry(mCaptureRequest, 2556 ANDROID_JPEG_ORIENTATION, 2557 &mParameters.jpegRotation, 1); 2558 if (res != OK) return res; 2559 2560 if (mParameters.gpsEnabled) { 2561 res = updateEntry(mCaptureRequest, 2562 ANDROID_JPEG_GPS_COORDINATES, 2563 mParameters.gpsCoordinates, 3); 2564 if (res != OK) return res; 2565 res = updateEntry(mCaptureRequest, 2566 ANDROID_JPEG_GPS_TIMESTAMP, 2567 &mParameters.gpsTimestamp, 1); 2568 if (res != OK) return res; 2569 res = updateEntry(mCaptureRequest, 2570 ANDROID_JPEG_GPS_PROCESSING_METHOD, 2571 mParameters.gpsProcessingMethod.string(), 2572 mParameters.gpsProcessingMethod.size()); 2573 if (res != OK) return res; 2574 } else { 2575 res = deleteEntry(mCaptureRequest, 2576 ANDROID_JPEG_GPS_COORDINATES); 2577 if (res != OK) return res; 2578 res = deleteEntry(mCaptureRequest, 2579 ANDROID_JPEG_GPS_TIMESTAMP); 2580 if (res != OK) return res; 2581 res = deleteEntry(mCaptureRequest, 2582 ANDROID_JPEG_GPS_PROCESSING_METHOD); 2583 if (res != OK) return res; 2584 } 2585 2586 return OK; 2587} 2588 2589status_t Camera2Client::updateRecordingRequest() { 2590 ATRACE_CALL(); 2591 status_t res; 2592 if (mRecordingRequest == NULL) { 2593 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD, 2594 &mRecordingRequest); 2595 if (res != OK) { 2596 ALOGE("%s: Camera %d: Unable to create default recording request:" 2597 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2598 return res; 2599 } 2600 } 2601 2602 res = updateRequestCommon(mRecordingRequest); 2603 if (res != OK) { 2604 ALOGE("%s: Camera %d: Unable to update common entries of recording " 2605 "request: %s (%d)", __FUNCTION__, mCameraId, 2606 strerror(-res), res); 2607 return res; 2608 } 2609 2610 return OK; 2611} 2612 2613status_t Camera2Client::updateRecordingStream() { 2614 status_t res; 2615 2616 if (mRecordingConsumer == 0) { 2617 // Create CPU buffer queue endpoint 2618 mRecordingConsumer = new MediaConsumer(kRecordingHeapCount); 2619 mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this)); 2620 mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer")); 2621 mRecordingWindow = new SurfaceTextureClient( 2622 mRecordingConsumer->getProducerInterface()); 2623 // Allocate memory later, since we don't know buffer size until receipt 2624 } 2625 2626 if (mRecordingStreamId != NO_STREAM) { 2627 // Check if stream parameters have to change 2628 uint32_t currentWidth, currentHeight; 2629 res = mDevice->getStreamInfo(mRecordingStreamId, 2630 ¤tWidth, ¤tHeight, 0); 2631 if (res != OK) { 2632 ALOGE("%s: Camera %d: Error querying recording output stream info: " 2633 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2634 return res; 2635 } 2636 if (currentWidth != (uint32_t)mParameters.videoWidth || 2637 currentHeight != (uint32_t)mParameters.videoHeight) { 2638 // TODO: Should wait to be sure previous recording has finished 2639 res = mDevice->deleteStream(mRecordingStreamId); 2640 if (res != OK) { 2641 ALOGE("%s: Camera %d: Unable to delete old output stream " 2642 "for recording: %s (%d)", __FUNCTION__, mCameraId, 2643 strerror(-res), res); 2644 return res; 2645 } 2646 mRecordingStreamId = NO_STREAM; 2647 } 2648 } 2649 2650 if (mRecordingStreamId == NO_STREAM) { 2651 res = mDevice->createStream(mRecordingWindow, 2652 mParameters.videoWidth, mParameters.videoHeight, 2653 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId); 2654 if (res != OK) { 2655 ALOGE("%s: Camera %d: Can't create output stream for recording: " 2656 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 2657 return res; 2658 } 2659 } 2660 2661 return OK; 2662} 2663 2664status_t Camera2Client::updateRequestCommon(camera_metadata_t *request) { 2665 ATRACE_CALL(); 2666 status_t res; 2667 res = updateEntry(request, 2668 ANDROID_CONTROL_AE_TARGET_FPS_RANGE, mParameters.previewFpsRange, 2); 2669 if (res != OK) return res; 2670 2671 uint8_t wbMode = mParameters.autoWhiteBalanceLock ? 2672 ANDROID_CONTROL_AWB_LOCKED : mParameters.wbMode; 2673 res = updateEntry(request, 2674 ANDROID_CONTROL_AWB_MODE, &wbMode, 1); 2675 if (res != OK) return res; 2676 res = updateEntry(request, 2677 ANDROID_CONTROL_EFFECT_MODE, &mParameters.effectMode, 1); 2678 if (res != OK) return res; 2679 res = updateEntry(request, 2680 ANDROID_CONTROL_AE_ANTIBANDING_MODE, 2681 &mParameters.antibandingMode, 1); 2682 if (res != OK) return res; 2683 2684 uint8_t controlMode = 2685 (mParameters.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ? 2686 ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE; 2687 res = updateEntry(request, 2688 ANDROID_CONTROL_MODE, &controlMode, 1); 2689 if (res != OK) return res; 2690 if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) { 2691 res = updateEntry(request, 2692 ANDROID_CONTROL_SCENE_MODE, 2693 &mParameters.sceneMode, 1); 2694 if (res != OK) return res; 2695 } 2696 2697 uint8_t flashMode = ANDROID_FLASH_OFF; 2698 uint8_t aeMode; 2699 switch (mParameters.flashMode) { 2700 case Parameters::FLASH_MODE_OFF: 2701 aeMode = ANDROID_CONTROL_AE_ON; break; 2702 case Parameters::FLASH_MODE_AUTO: 2703 aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break; 2704 case Parameters::FLASH_MODE_ON: 2705 aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break; 2706 case Parameters::FLASH_MODE_TORCH: 2707 aeMode = ANDROID_CONTROL_AE_ON; 2708 flashMode = ANDROID_FLASH_TORCH; 2709 break; 2710 case Parameters::FLASH_MODE_RED_EYE: 2711 aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break; 2712 default: 2713 ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 2714 mCameraId, mParameters.flashMode); 2715 return BAD_VALUE; 2716 } 2717 if (mParameters.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED; 2718 2719 res = updateEntry(request, 2720 ANDROID_FLASH_MODE, &flashMode, 1); 2721 if (res != OK) return res; 2722 res = updateEntry(request, 2723 ANDROID_CONTROL_AE_MODE, &aeMode, 1); 2724 if (res != OK) return res; 2725 2726 float focusDistance = 0; // infinity focus in diopters 2727 uint8_t focusMode; 2728 switch (mParameters.focusMode) { 2729 case Parameters::FOCUS_MODE_AUTO: 2730 case Parameters::FOCUS_MODE_MACRO: 2731 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 2732 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 2733 case Parameters::FOCUS_MODE_EDOF: 2734 focusMode = mParameters.focusMode; 2735 break; 2736 case Parameters::FOCUS_MODE_INFINITY: 2737 case Parameters::FOCUS_MODE_FIXED: 2738 focusMode = ANDROID_CONTROL_AF_OFF; 2739 break; 2740 default: 2741 ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 2742 mCameraId, mParameters.focusMode); 2743 return BAD_VALUE; 2744 } 2745 res = updateEntry(request, 2746 ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 2747 if (res != OK) return res; 2748 res = updateEntry(request, 2749 ANDROID_CONTROL_AF_MODE, &focusMode, 1); 2750 if (res != OK) return res; 2751 2752 size_t focusingAreasSize = mParameters.focusingAreas.size() * 5; 2753 int32_t *focusingAreas = new int32_t[focusingAreasSize]; 2754 for (size_t i = 0; i < focusingAreasSize; i += 5) { 2755 focusingAreas[i + 0] = mParameters.focusingAreas[i].left; 2756 focusingAreas[i + 1] = mParameters.focusingAreas[i].top; 2757 focusingAreas[i + 2] = mParameters.focusingAreas[i].right; 2758 focusingAreas[i + 3] = mParameters.focusingAreas[i].bottom; 2759 focusingAreas[i + 4] = mParameters.focusingAreas[i].weight; 2760 } 2761 res = updateEntry(request, 2762 ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize); 2763 if (res != OK) return res; 2764 delete[] focusingAreas; 2765 2766 res = updateEntry(request, 2767 ANDROID_CONTROL_AE_EXP_COMPENSATION, 2768 &mParameters.exposureCompensation, 1); 2769 if (res != OK) return res; 2770 2771 size_t meteringAreasSize = mParameters.meteringAreas.size() * 5; 2772 int32_t *meteringAreas = new int32_t[meteringAreasSize]; 2773 for (size_t i = 0; i < meteringAreasSize; i += 5) { 2774 meteringAreas[i + 0] = mParameters.meteringAreas[i].left; 2775 meteringAreas[i + 1] = mParameters.meteringAreas[i].top; 2776 meteringAreas[i + 2] = mParameters.meteringAreas[i].right; 2777 meteringAreas[i + 3] = mParameters.meteringAreas[i].bottom; 2778 meteringAreas[i + 4] = mParameters.meteringAreas[i].weight; 2779 } 2780 res = updateEntry(request, 2781 ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize); 2782 if (res != OK) return res; 2783 2784 res = updateEntry(request, 2785 ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize); 2786 if (res != OK) return res; 2787 delete[] meteringAreas; 2788 2789 // Need to convert zoom index into a crop rectangle. The rectangle is 2790 // chosen to maximize its area on the sensor 2791 2792 camera_metadata_entry_t maxDigitalZoom = 2793 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM); 2794 float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2795 (NUM_ZOOM_STEPS-1); 2796 float zoomRatio = 1 + zoomIncrement * mParameters.zoom; 2797 2798 camera_metadata_entry_t activePixelArraySize = 2799 staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2); 2800 int32_t arrayWidth = activePixelArraySize.data.i32[0]; 2801 int32_t arrayHeight = activePixelArraySize.data.i32[1]; 2802 float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2803 if (mParameters.previewWidth >= mParameters.previewHeight) { 2804 zoomWidth = arrayWidth / zoomRatio; 2805 zoomHeight = zoomWidth * 2806 mParameters.previewHeight / mParameters.previewWidth; 2807 } else { 2808 zoomHeight = arrayHeight / zoomRatio; 2809 zoomWidth = zoomHeight * 2810 mParameters.previewWidth / mParameters.previewHeight; 2811 } 2812 zoomLeft = (arrayWidth - zoomWidth) / 2; 2813 zoomTop = (arrayHeight - zoomHeight) / 2; 2814 2815 int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth }; 2816 res = updateEntry(request, 2817 ANDROID_SCALER_CROP_REGION, cropRegion, 3); 2818 if (res != OK) return res; 2819 2820 // TODO: Decide how to map recordingHint, or whether just to ignore it 2821 2822 uint8_t vstabMode = mParameters.videoStabilization ? 2823 ANDROID_CONTROL_VIDEO_STABILIZATION_ON : 2824 ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 2825 res = updateEntry(request, 2826 ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 2827 &vstabMode, 1); 2828 if (res != OK) return res; 2829 2830 return OK; 2831} 2832 2833status_t Camera2Client::updateEntry(camera_metadata_t *buffer, 2834 uint32_t tag, const void *data, size_t data_count) { 2835 camera_metadata_entry_t entry; 2836 status_t res; 2837 res = find_camera_metadata_entry(buffer, tag, &entry); 2838 if (res == NAME_NOT_FOUND) { 2839 res = add_camera_metadata_entry(buffer, 2840 tag, data, data_count); 2841 } else if (res == OK) { 2842 res = update_camera_metadata_entry(buffer, 2843 entry.index, data, data_count, NULL); 2844 } 2845 2846 if (res != OK) { 2847 ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", 2848 __FUNCTION__, get_camera_metadata_section_name(tag), 2849 get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2850 } 2851 return res; 2852} 2853 2854status_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) { 2855 camera_metadata_entry_t entry; 2856 status_t res; 2857 res = find_camera_metadata_entry(buffer, tag, &entry); 2858 if (res == NAME_NOT_FOUND) { 2859 return OK; 2860 } else if (res != OK) { 2861 ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", 2862 __FUNCTION__, 2863 get_camera_metadata_section_name(tag), 2864 get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2865 return res; 2866 } 2867 res = delete_camera_metadata_entry(buffer, entry.index); 2868 if (res != OK) { 2869 ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", 2870 __FUNCTION__, 2871 get_camera_metadata_section_name(tag), 2872 get_camera_metadata_tag_name(tag), tag, strerror(-res), res); 2873 } 2874 return res; 2875} 2876int Camera2Client::formatStringToEnum(const char *format) { 2877 return 2878 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 2879 HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 2880 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 2881 HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 2882 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 2883 HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 2884 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 2885 HAL_PIXEL_FORMAT_YV12 : // YV12 2886 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 2887 HAL_PIXEL_FORMAT_RGB_565 : // RGB565 2888 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 2889 HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 2890 !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 2891 HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 2892 -1; 2893} 2894 2895const char* Camera2Client::formatEnumToString(int format) { 2896 const char *fmt; 2897 switch(format) { 2898 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 2899 fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 2900 break; 2901 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 2902 fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 2903 break; 2904 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 2905 fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 2906 break; 2907 case HAL_PIXEL_FORMAT_YV12: // YV12 2908 fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 2909 break; 2910 case HAL_PIXEL_FORMAT_RGB_565: // RGB565 2911 fmt = CameraParameters::PIXEL_FORMAT_RGB565; 2912 break; 2913 case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 2914 fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 2915 break; 2916 case HAL_PIXEL_FORMAT_RAW_SENSOR: 2917 ALOGW("Raw sensor preview format requested."); 2918 fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 2919 break; 2920 default: 2921 ALOGE("%s: Unknown preview format: %x", 2922 __FUNCTION__, format); 2923 fmt = NULL; 2924 break; 2925 } 2926 return fmt; 2927} 2928 2929int Camera2Client::wbModeStringToEnum(const char *wbMode) { 2930 return 2931 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 2932 ANDROID_CONTROL_AWB_AUTO : 2933 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 2934 ANDROID_CONTROL_AWB_INCANDESCENT : 2935 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 2936 ANDROID_CONTROL_AWB_FLUORESCENT : 2937 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 2938 ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 2939 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 2940 ANDROID_CONTROL_AWB_DAYLIGHT : 2941 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 2942 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 2943 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 2944 ANDROID_CONTROL_AWB_TWILIGHT : 2945 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 2946 ANDROID_CONTROL_AWB_SHADE : 2947 -1; 2948} 2949 2950int Camera2Client::effectModeStringToEnum(const char *effectMode) { 2951 return 2952 !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 2953 ANDROID_CONTROL_EFFECT_OFF : 2954 !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 2955 ANDROID_CONTROL_EFFECT_MONO : 2956 !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 2957 ANDROID_CONTROL_EFFECT_NEGATIVE : 2958 !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 2959 ANDROID_CONTROL_EFFECT_SOLARIZE : 2960 !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 2961 ANDROID_CONTROL_EFFECT_SEPIA : 2962 !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 2963 ANDROID_CONTROL_EFFECT_POSTERIZE : 2964 !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 2965 ANDROID_CONTROL_EFFECT_WHITEBOARD : 2966 !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 2967 ANDROID_CONTROL_EFFECT_BLACKBOARD : 2968 !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 2969 ANDROID_CONTROL_EFFECT_AQUA : 2970 -1; 2971} 2972 2973int Camera2Client::abModeStringToEnum(const char *abMode) { 2974 return 2975 !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 2976 ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 2977 !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 2978 ANDROID_CONTROL_AE_ANTIBANDING_OFF : 2979 !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 2980 ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 2981 !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 2982 ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 2983 -1; 2984} 2985 2986int Camera2Client::sceneModeStringToEnum(const char *sceneMode) { 2987 return 2988 !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 2989 ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 2990 !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 2991 ANDROID_CONTROL_SCENE_MODE_ACTION : 2992 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 2993 ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 2994 !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 2995 ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 2996 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 2997 ANDROID_CONTROL_SCENE_MODE_NIGHT : 2998 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 2999 ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 3000 !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 3001 ANDROID_CONTROL_SCENE_MODE_THEATRE : 3002 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 3003 ANDROID_CONTROL_SCENE_MODE_BEACH : 3004 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 3005 ANDROID_CONTROL_SCENE_MODE_SNOW : 3006 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 3007 ANDROID_CONTROL_SCENE_MODE_SUNSET : 3008 !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 3009 ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 3010 !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 3011 ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 3012 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 3013 ANDROID_CONTROL_SCENE_MODE_SPORTS : 3014 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 3015 ANDROID_CONTROL_SCENE_MODE_PARTY : 3016 !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 3017 ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 3018 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 3019 ANDROID_CONTROL_SCENE_MODE_BARCODE: 3020 -1; 3021} 3022 3023Camera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum( 3024 const char *flashMode) { 3025 return 3026 !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 3027 Parameters::FLASH_MODE_OFF : 3028 !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 3029 Parameters::FLASH_MODE_AUTO : 3030 !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 3031 Parameters::FLASH_MODE_ON : 3032 !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 3033 Parameters::FLASH_MODE_RED_EYE : 3034 !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 3035 Parameters::FLASH_MODE_TORCH : 3036 Parameters::FLASH_MODE_INVALID; 3037} 3038 3039Camera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum( 3040 const char *focusMode) { 3041 return 3042 !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 3043 Parameters::FOCUS_MODE_AUTO : 3044 !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 3045 Parameters::FOCUS_MODE_INFINITY : 3046 !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 3047 Parameters::FOCUS_MODE_MACRO : 3048 !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 3049 Parameters::FOCUS_MODE_FIXED : 3050 !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 3051 Parameters::FOCUS_MODE_EDOF : 3052 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 3053 Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 3054 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 3055 Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 3056 Parameters::FOCUS_MODE_INVALID; 3057} 3058 3059status_t Camera2Client::parseAreas(const char *areasCStr, 3060 Vector<Parameters::Area> *areas) { 3061 static const size_t NUM_FIELDS = 5; 3062 areas->clear(); 3063 if (areasCStr == NULL) { 3064 // If no key exists, use default (0,0,0,0,0) 3065 areas->push(); 3066 return OK; 3067 } 3068 String8 areasStr(areasCStr); 3069 ssize_t areaStart = areasStr.find("(", 0) + 1; 3070 while (areaStart != 0) { 3071 const char* area = areasStr.string() + areaStart; 3072 char *numEnd; 3073 int vals[NUM_FIELDS]; 3074 for (size_t i = 0; i < NUM_FIELDS; i++) { 3075 errno = 0; 3076 vals[i] = strtol(area, &numEnd, 10); 3077 if (errno || numEnd == area) return BAD_VALUE; 3078 area = numEnd + 1; 3079 } 3080 areas->push(Parameters::Area( 3081 vals[0], vals[1], vals[2], vals[3], vals[4]) ); 3082 areaStart = areasStr.find("(", areaStart) + 1; 3083 } 3084 return OK; 3085} 3086 3087status_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas, 3088 size_t maxRegions) { 3089 // Definition of valid area can be found in 3090 // include/camera/CameraParameters.h 3091 if (areas.size() == 0) return BAD_VALUE; 3092 if (areas.size() == 1) { 3093 if (areas[0].left == 0 && 3094 areas[0].top == 0 && 3095 areas[0].right == 0 && 3096 areas[0].bottom == 0 && 3097 areas[0].weight == 0) { 3098 // Single (0,0,0,0,0) entry is always valid (== driver decides) 3099 return OK; 3100 } 3101 } 3102 if (areas.size() > maxRegions) { 3103 ALOGE("%s: Too many areas requested: %d", 3104 __FUNCTION__, areas.size()); 3105 return BAD_VALUE; 3106 } 3107 3108 for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 3109 a != areas.end(); a++) { 3110 if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 3111 if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 3112 if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 3113 if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 3114 if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 3115 if (a->left >= a->right) return BAD_VALUE; 3116 if (a->top >= a->bottom) return BAD_VALUE; 3117 } 3118 return OK; 3119} 3120 3121bool Camera2Client::boolFromString(const char *boolStr) { 3122 return !boolStr ? false : 3123 !strcmp(boolStr, CameraParameters::TRUE) ? true : 3124 false; 3125} 3126 3127int Camera2Client::degToTransform(int degrees, bool mirror) { 3128 if (!mirror) { 3129 if (degrees == 0) return 0; 3130 else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 3131 else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 3132 else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 3133 } else { // Do mirror (horizontal flip) 3134 if (degrees == 0) { // FLIP_H and ROT_0 3135 return HAL_TRANSFORM_FLIP_H; 3136 } else if (degrees == 90) { // FLIP_H and ROT_90 3137 return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 3138 } else if (degrees == 180) { // FLIP_H and ROT_180 3139 return HAL_TRANSFORM_FLIP_V; 3140 } else if (degrees == 270) { // FLIP_H and ROT_270 3141 return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 3142 } 3143 } 3144 ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 3145 return -1; 3146} 3147 3148} // namespace android 3149