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