Camera2Client.cpp revision 6861a4e9f929c2cb4a3131244e01e676c5b28f55
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 if (mState == WAITING_FOR_PREVIEW_WINDOW) { 369 return startPreview(); 370 } 371 372 return OK; 373} 374 375void Camera2Client::setPreviewCallbackFlag(int flag) { 376 ATRACE_CALL(); 377 Mutex::Autolock icl(mICameraLock); 378} 379 380status_t Camera2Client::startPreview() { 381 ATRACE_CALL(); 382 Mutex::Autolock icl(mICameraLock); 383 384 status_t res; 385 if (mState == PREVIEW) return INVALID_OPERATION; 386 387 if (mPreviewStreamId == NO_PREVIEW_STREAM) { 388 mState = WAITING_FOR_PREVIEW_WINDOW; 389 return OK; 390 } 391 392 if (mPreviewRequest == NULL) { 393 updatePreviewRequest(); 394 } 395 396 uint8_t outputStream = mPreviewStreamId; 397 398 camera_metadata_entry_t outputStreams; 399 res = find_camera_metadata_entry(mPreviewRequest, 400 ANDROID_REQUEST_OUTPUT_STREAMS, 401 &outputStreams); 402 if (res == NAME_NOT_FOUND) { 403 res = add_camera_metadata_entry(mPreviewRequest, 404 ANDROID_REQUEST_OUTPUT_STREAMS, 405 &outputStream, 1); 406 } else if (res == OK) { 407 res = update_camera_metadata_entry(mPreviewRequest, 408 outputStreams.index, &outputStream, 1, NULL); 409 } 410 411 if (res != OK) { 412 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 413 __FUNCTION__, mCameraId, strerror(-res), res); 414 mState = STOPPED; 415 return res; 416 } 417 418 res = mDevice->setStreamingRequest(mPreviewRequest); 419 if (res != OK) { 420 ALOGE("%s: Camera %d: Unable to set preview request to start preview: %s (%d)", 421 __FUNCTION__, mCameraId, strerror(-res), res); 422 mState = STOPPED; 423 return res; 424 } 425 mState = PREVIEW; 426 427 return OK; 428} 429 430void Camera2Client::stopPreview() { 431 ATRACE_CALL(); 432 Mutex::Autolock icl(mICameraLock); 433 stopPreviewLocked(); 434} 435 436void Camera2Client::stopPreviewLocked() { 437 ATRACE_CALL(); 438 if (mState != PREVIEW) return; 439 440 mDevice->setStreamingRequest(NULL); 441 mState = STOPPED; 442} 443 444bool Camera2Client::previewEnabled() { 445 ATRACE_CALL(); 446 Mutex::Autolock icl(mICameraLock); 447 return mState == PREVIEW; 448} 449 450status_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 451 ATRACE_CALL(); 452 Mutex::Autolock icl(mICameraLock); 453 return BAD_VALUE; 454} 455 456status_t Camera2Client::startRecording() { 457 ATRACE_CALL(); 458 Mutex::Autolock icl(mICameraLock); 459 return BAD_VALUE; 460} 461 462void Camera2Client::stopRecording() { 463 ATRACE_CALL(); 464 Mutex::Autolock icl(mICameraLock); 465} 466 467bool Camera2Client::recordingEnabled() { 468 ATRACE_CALL(); 469 Mutex::Autolock icl(mICameraLock); 470 return BAD_VALUE; 471} 472 473void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 474 ATRACE_CALL(); 475 Mutex::Autolock icl(mICameraLock); 476} 477 478status_t Camera2Client::autoFocus() { 479 ATRACE_CALL(); 480 Mutex::Autolock icl(mICameraLock); 481 return OK; 482} 483 484status_t Camera2Client::cancelAutoFocus() { 485 ATRACE_CALL(); 486 Mutex::Autolock icl(mICameraLock); 487 return OK; 488} 489 490status_t Camera2Client::takePicture(int msgType) { 491 ATRACE_CALL(); 492 Mutex::Autolock icl(mICameraLock); 493 return BAD_VALUE; 494} 495 496status_t Camera2Client::setParameters(const String8& params) { 497 ATRACE_CALL(); 498 Mutex::Autolock icl(mICameraLock); 499 Mutex::Autolock pl(mParamsLock); 500 status_t res; 501 502 CameraParameters newParams(params); 503 504 // TODO: Currently ignoring any changes to supposedly read-only 505 // parameters such as supported preview sizes, etc. Should probably 506 // produce an error if they're changed. 507 508 /** Extract and verify new parameters */ 509 510 size_t i; 511 512 // PREVIEW_SIZE 513 int previewWidth, previewHeight; 514 newParams.getPreviewSize(&previewWidth, &previewHeight); 515 516 if (previewWidth != mParameters.previewWidth || 517 previewHeight != mParameters.previewHeight) { 518 if (mState >= PREVIEW) { 519 ALOGE("%s: Preview size cannot be updated when preview " 520 "is active!", __FUNCTION__); 521 return BAD_VALUE; 522 } 523 camera_metadata_entry_t availablePreviewSizes = 524 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 525 for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 526 if (availablePreviewSizes.data.i32[i] == previewWidth && 527 availablePreviewSizes.data.i32[i+1] == previewHeight) break; 528 } 529 if (i == availablePreviewSizes.count) { 530 ALOGE("%s: Requested preview size %d x %d is not supported", 531 __FUNCTION__, previewWidth, previewHeight); 532 return BAD_VALUE; 533 } 534 } 535 536 // PREVIEW_FPS_RANGE 537 int previewFpsRangeMin, previewFpsRangeMax, previewFps = 0; 538 bool fpsRangeChanged = false; 539 newParams.getPreviewFpsRange(&previewFpsRangeMin, &previewFpsRangeMax); 540 if (previewFpsRangeMin != mParameters.previewFpsRangeMin || 541 previewFpsRangeMax != mParameters.previewFpsRangeMax) { 542 fpsRangeChanged = true; 543 camera_metadata_entry_t availablePreviewFpsRanges = 544 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 545 for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 546 if ((availablePreviewFpsRanges.data.i32[i] == 547 previewFpsRangeMin) && 548 (availablePreviewFpsRanges.data.i32[i+1] == 549 previewFpsRangeMax) ) { 550 break; 551 } 552 } 553 if (i == availablePreviewFpsRanges.count) { 554 ALOGE("%s: Requested preview FPS range %d - %d is not supported", 555 __FUNCTION__, previewFpsRangeMin, previewFpsRangeMax); 556 return BAD_VALUE; 557 } 558 previewFps = previewFpsRangeMin; 559 } 560 561 // PREVIEW_FORMAT 562 int previewFormat = formatStringToEnum(newParams.getPreviewFormat()); 563 if (previewFormat != mParameters.previewFormat) { 564 if (mState >= PREVIEW) { 565 ALOGE("%s: Preview format cannot be updated when preview " 566 "is active!", __FUNCTION__); 567 return BAD_VALUE; 568 } 569 camera_metadata_entry_t availableFormats = 570 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 571 for (i = 0; i < availableFormats.count; i++) { 572 if (availableFormats.data.i32[i] == previewFormat) break; 573 } 574 if (i == availableFormats.count) { 575 ALOGE("%s: Requested preview format %s (0x%x) is not supported", 576 __FUNCTION__, newParams.getPreviewFormat(), previewFormat); 577 return BAD_VALUE; 578 } 579 } 580 581 // PREVIEW_FRAME_RATE 582 // Deprecated, only use if the preview fps range is unchanged this time. 583 // The single-value FPS is the same as the minimum of the range. 584 if (!fpsRangeChanged) { 585 previewFps = newParams.getPreviewFrameRate(); 586 if (previewFps != mParameters.previewFps) { 587 camera_metadata_entry_t availableFrameRates = 588 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 589 for (i = 0; i < availableFrameRates.count; i+=2) { 590 if (availableFrameRates.data.i32[i] == previewFps) break; 591 } 592 if (i == availableFrameRates.count) { 593 ALOGE("%s: Requested preview frame rate %d is not supported", 594 __FUNCTION__, previewFps); 595 return BAD_VALUE; 596 } 597 previewFpsRangeMin = availableFrameRates.data.i32[i]; 598 previewFpsRangeMax = availableFrameRates.data.i32[i+1]; 599 } 600 } 601 602 // PICTURE_SIZE 603 int pictureWidth, pictureHeight; 604 newParams.getPictureSize(&pictureWidth, &pictureHeight); 605 if (pictureWidth == mParameters.pictureWidth || 606 pictureHeight == mParameters.pictureHeight) { 607 camera_metadata_entry_t availablePictureSizes = 608 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 609 for (i = 0; i < availablePictureSizes.count; i+=2) { 610 if (availablePictureSizes.data.i32[i] == pictureWidth && 611 availablePictureSizes.data.i32[i+1] == pictureHeight) break; 612 } 613 if (i == availablePictureSizes.count) { 614 ALOGE("%s: Requested picture size %d x %d is not supported", 615 __FUNCTION__, pictureWidth, pictureHeight); 616 return BAD_VALUE; 617 } 618 } 619 620 // JPEG_THUMBNAIL_WIDTH/HEIGHT 621 int jpegThumbWidth, jpegThumbHeight; 622 jpegThumbWidth = 623 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 624 jpegThumbHeight = 625 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 626 if (jpegThumbWidth != mParameters.jpegThumbWidth || 627 jpegThumbHeight != mParameters.jpegThumbHeight) { 628 camera_metadata_entry_t availableJpegThumbSizes = 629 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 630 for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 631 if (availableJpegThumbSizes.data.i32[i] == jpegThumbWidth && 632 availableJpegThumbSizes.data.i32[i+1] == jpegThumbHeight) { 633 break; 634 } 635 } 636 if (i == availableJpegThumbSizes.count) { 637 ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 638 __FUNCTION__, jpegThumbWidth, jpegThumbHeight); 639 return BAD_VALUE; 640 } 641 } 642 643 // JPEG_THUMBNAIL_QUALITY 644 int jpegThumbQuality = 645 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 646 if (jpegThumbQuality < 0 || jpegThumbQuality > 100) { 647 ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 648 __FUNCTION__, jpegThumbQuality); 649 return BAD_VALUE; 650 } 651 652 // JPEG_QUALITY 653 int jpegQuality = 654 newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 655 if (jpegQuality < 0 || jpegQuality > 100) { 656 ALOGE("%s: Requested JPEG quality %d is not supported", 657 __FUNCTION__, jpegQuality); 658 return BAD_VALUE; 659 } 660 661 // ROTATION 662 int jpegRotation = 663 newParams.getInt(CameraParameters::KEY_ROTATION); 664 if (jpegRotation != 0 && 665 jpegRotation != 90 && 666 jpegRotation != 180 && 667 jpegRotation != 270) { 668 ALOGE("%s: Requested picture rotation angle %d is not supported", 669 __FUNCTION__, jpegRotation); 670 return BAD_VALUE; 671 } 672 673 // GPS 674 bool gpsEnabled = false; 675 double gpsLatitude = 0, gpsLongitude = 0, gpsAltitude = 0; 676 int64_t gpsTimestamp = 0; 677 String8 gpsProcessingMethod; 678 const char *gpsLatStr = 679 newParams.get(CameraParameters::KEY_GPS_LATITUDE); 680 if (gpsLatStr != NULL) { 681 const char *gpsLongStr = 682 newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 683 const char *gpsAltitudeStr = 684 newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 685 const char *gpsTimeStr = 686 newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 687 const char *gpsProcMethodStr = 688 newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 689 if (gpsLongStr == NULL || 690 gpsAltitudeStr == NULL || 691 gpsTimeStr == NULL || 692 gpsProcMethodStr == NULL) { 693 ALOGE("%s: Incomplete set of GPS parameters provided", 694 __FUNCTION__); 695 return BAD_VALUE; 696 } 697 char *endPtr; 698 errno = 0; 699 gpsLatitude = strtod(gpsLatStr, &endPtr); 700 if (errno || endPtr == gpsLatStr) { 701 ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 702 return BAD_VALUE; 703 } 704 errno = 0; 705 gpsLongitude = strtod(gpsLongStr, &endPtr); 706 if (errno || endPtr == gpsLongStr) { 707 ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 708 return BAD_VALUE; 709 } 710 errno = 0; 711 gpsAltitude = strtod(gpsAltitudeStr, &endPtr); 712 if (errno || endPtr == gpsAltitudeStr) { 713 ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 714 gpsAltitudeStr); 715 return BAD_VALUE; 716 } 717 errno = 0; 718 gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 719 if (errno || endPtr == gpsTimeStr) { 720 ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 721 return BAD_VALUE; 722 } 723 gpsProcessingMethod = gpsProcMethodStr; 724 725 gpsEnabled = true; 726 } 727 728 // WHITE_BALANCE 729 int wbMode = wbModeStringToEnum( 730 newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 731 if (wbMode != mParameters.wbMode) { 732 camera_metadata_entry_t availableWbModes = 733 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 734 for (i = 0; i < availableWbModes.count; i++) { 735 if (wbMode == availableWbModes.data.u8[i]) break; 736 } 737 if (i == availableWbModes.count) { 738 ALOGE("%s: Requested white balance mode %s is not supported", 739 __FUNCTION__, 740 newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 741 return BAD_VALUE; 742 } 743 } 744 745 // EFFECT 746 int effectMode = effectModeStringToEnum( 747 newParams.get(CameraParameters::KEY_EFFECT) ); 748 if (effectMode != mParameters.effectMode) { 749 camera_metadata_entry_t availableEffectModes = 750 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 751 for (i = 0; i < availableEffectModes.count; i++) { 752 if (effectMode == availableEffectModes.data.u8[i]) break; 753 } 754 if (i == availableEffectModes.count) { 755 ALOGE("%s: Requested effect mode \"%s\" is not supported", 756 __FUNCTION__, 757 newParams.get(CameraParameters::KEY_EFFECT) ); 758 return BAD_VALUE; 759 } 760 } 761 762 // ANTIBANDING 763 int antibandingMode = abModeStringToEnum( 764 newParams.get(CameraParameters::KEY_ANTIBANDING) ); 765 if (antibandingMode != mParameters.antibandingMode) { 766 camera_metadata_entry_t availableAbModes = 767 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 768 for (i = 0; i < availableAbModes.count; i++) { 769 if (antibandingMode == availableAbModes.data.u8[i]) break; 770 } 771 if (i == availableAbModes.count) { 772 ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 773 __FUNCTION__, 774 newParams.get(CameraParameters::KEY_ANTIBANDING)); 775 return BAD_VALUE; 776 } 777 } 778 779 // SCENE_MODE 780 int sceneMode = sceneModeStringToEnum( 781 newParams.get(CameraParameters::KEY_SCENE_MODE) ); 782 if (sceneMode != mParameters.sceneMode) { 783 camera_metadata_entry_t availableSceneModes = 784 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 785 for (i = 0; i < availableSceneModes.count; i++) { 786 if (sceneMode == availableSceneModes.data.u8[i]) break; 787 } 788 if (i == availableSceneModes.count) { 789 ALOGE("%s: Requested scene mode \"%s\" is not supported", 790 __FUNCTION__, 791 newParams.get(CameraParameters::KEY_SCENE_MODE)); 792 return BAD_VALUE; 793 } 794 } 795 796 // FLASH_MODE 797 Parameters::flashMode_t flashMode = flashModeStringToEnum( 798 newParams.get(CameraParameters::KEY_FLASH_MODE) ); 799 if (flashMode != mParameters.flashMode) { 800 camera_metadata_entry_t flashAvailable = 801 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 802 if (!flashAvailable.data.u8[0] && 803 flashMode != Parameters::FLASH_MODE_OFF) { 804 ALOGE("%s: Requested flash mode \"%s\" is not supported: " 805 "No flash on device", __FUNCTION__, 806 newParams.get(CameraParameters::KEY_FLASH_MODE)); 807 return BAD_VALUE; 808 } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) { 809 camera_metadata_entry_t availableAeModes = 810 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 811 for (i = 0; i < availableAeModes.count; i++) { 812 if (flashMode == availableAeModes.data.u8[i]) break; 813 } 814 if (i == availableAeModes.count) { 815 ALOGE("%s: Requested flash mode \"%s\" is not supported", 816 __FUNCTION__, 817 newParams.get(CameraParameters::KEY_FLASH_MODE)); 818 return BAD_VALUE; 819 } 820 } else if (flashMode == -1) { 821 ALOGE("%s: Requested flash mode \"%s\" is unknown", 822 __FUNCTION__, 823 newParams.get(CameraParameters::KEY_FLASH_MODE)); 824 return BAD_VALUE; 825 } 826 } 827 828 // FOCUS_MODE 829 Parameters::focusMode_t focusMode = focusModeStringToEnum( 830 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 831 if (focusMode != mParameters.focusMode) { 832 if (focusMode != Parameters::FOCUS_MODE_FIXED) { 833 camera_metadata_entry_t minFocusDistance = 834 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 835 if (minFocusDistance.data.f[0] == 0) { 836 ALOGE("%s: Requested focus mode \"%s\" is not available: " 837 "fixed focus lens", 838 __FUNCTION__, 839 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 840 return BAD_VALUE; 841 } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) { 842 camera_metadata_entry_t availableFocusModes = 843 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 844 for (i = 0; i < availableFocusModes.count; i++) { 845 if (focusMode == availableFocusModes.data.u8[i]) break; 846 } 847 if (i == availableFocusModes.count) { 848 ALOGE("%s: Requested focus mode \"%s\" is not supported", 849 __FUNCTION__, 850 newParams.get(CameraParameters::KEY_FOCUS_MODE)); 851 return BAD_VALUE; 852 } 853 } 854 } 855 } 856 857 // FOCUS_AREAS 858 Vector<Parameters::Area> focusingAreas; 859 res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 860 &focusingAreas); 861 size_t max3aRegions = 862 (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 863 if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 864 if (res != OK) { 865 ALOGE("%s: Requested focus areas are malformed: %s", 866 __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 867 return BAD_VALUE; 868 } 869 870 // EXPOSURE_COMPENSATION 871 int exposureCompensation = 872 newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 873 camera_metadata_entry_t exposureCompensationRange = 874 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 875 if (exposureCompensation < exposureCompensationRange.data.i32[0] || 876 exposureCompensation > exposureCompensationRange.data.i32[1]) { 877 ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 878 __FUNCTION__, exposureCompensation); 879 return BAD_VALUE; 880 } 881 882 // AUTO_EXPOSURE_LOCK (always supported) 883 bool autoExposureLock = boolFromString( 884 newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 885 886 // AUTO_WHITEBALANCE_LOCK (always supported) 887 bool autoWhiteBalanceLock = boolFromString( 888 newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 889 890 // METERING_AREAS 891 Vector<Parameters::Area> meteringAreas; 892 res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 893 &meteringAreas); 894 if (res == OK) res = validateAreas(focusingAreas, max3aRegions); 895 if (res != OK) { 896 ALOGE("%s: Requested metering areas are malformed: %s", 897 __FUNCTION__, 898 newParams.get(CameraParameters::KEY_METERING_AREAS)); 899 return BAD_VALUE; 900 } 901 902 // ZOOM 903 int zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 904 if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) { 905 ALOGE("%s: Requested zoom level %d is not supported", 906 __FUNCTION__, zoom); 907 return BAD_VALUE; 908 } 909 910 // VIDEO_SIZE 911 int videoWidth, videoHeight; 912 newParams.getVideoSize(&videoWidth, &videoHeight); 913 if (videoWidth != mParameters.videoWidth || 914 videoHeight != mParameters.videoHeight) { 915 if (mState == RECORD) { 916 ALOGE("%s: Video size cannot be updated when recording is active!", 917 __FUNCTION__); 918 return BAD_VALUE; 919 } 920 camera_metadata_entry_t availableVideoSizes = 921 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 922 for (i = 0; i < availableVideoSizes.count; i += 2 ) { 923 if (availableVideoSizes.data.i32[i] == videoWidth && 924 availableVideoSizes.data.i32[i+1] == videoHeight) break; 925 } 926 if (i == availableVideoSizes.count) { 927 ALOGE("%s: Requested video size %d x %d is not supported", 928 __FUNCTION__, videoWidth, videoHeight); 929 return BAD_VALUE; 930 } 931 } 932 933 // RECORDING_HINT (always supported) 934 bool recordingHint = boolFromString( 935 newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 936 937 // VIDEO_STABILIZATION 938 bool videoStabilization = boolFromString( 939 newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 940 camera_metadata_entry_t availableVideoStabilizationModes = 941 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 942 if (videoStabilization && availableVideoStabilizationModes.count == 1) { 943 ALOGE("%s: Video stabilization not supported", __FUNCTION__); 944 } 945 946 /** Update internal parameters */ 947 mParameters.previewWidth = previewWidth; 948 mParameters.previewHeight = previewHeight; 949 mParameters.previewFpsRangeMin = previewFpsRangeMin; 950 mParameters.previewFpsRangeMax = previewFpsRangeMax; 951 mParameters.previewFps = previewFps; 952 mParameters.previewFormat = previewFormat; 953 954 mParameters.pictureWidth = pictureWidth; 955 mParameters.pictureHeight = pictureHeight; 956 957 mParameters.jpegThumbWidth = jpegThumbWidth; 958 mParameters.jpegThumbHeight = jpegThumbHeight; 959 mParameters.jpegQuality = jpegQuality; 960 mParameters.jpegThumbQuality = jpegThumbQuality; 961 962 mParameters.gpsEnabled = gpsEnabled; 963 mParameters.gpsLatitude = gpsLatitude; 964 mParameters.gpsLongitude = gpsLongitude; 965 mParameters.gpsAltitude = gpsAltitude; 966 mParameters.gpsTimestamp = gpsTimestamp; 967 mParameters.gpsProcessingMethod = gpsProcessingMethod; 968 969 mParameters.wbMode = wbMode; 970 mParameters.effectMode = effectMode; 971 mParameters.antibandingMode = antibandingMode; 972 mParameters.sceneMode = sceneMode; 973 974 mParameters.flashMode = flashMode; 975 mParameters.focusMode = focusMode; 976 977 mParameters.focusingAreas = focusingAreas; 978 mParameters.exposureCompensation = exposureCompensation; 979 mParameters.autoExposureLock = autoExposureLock; 980 mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock; 981 mParameters.meteringAreas = meteringAreas; 982 mParameters.zoom = zoom; 983 984 mParameters.videoWidth = videoWidth; 985 mParameters.videoHeight = videoHeight; 986 987 mParameters.recordingHint = recordingHint; 988 mParameters.videoStabilization = videoStabilization; 989 990 updatePreviewRequest(); 991 992 return OK; 993} 994 995String8 Camera2Client::getParameters() const { 996 ATRACE_CALL(); 997 Mutex::Autolock icl(mICameraLock); 998 999 Mutex::Autolock pl(mParamsLock); 1000 1001 // TODO: Deal with focus distances 1002 return mParamsFlattened; 1003} 1004 1005status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1006 ATRACE_CALL(); 1007 Mutex::Autolock icl(mICameraLock); 1008 return OK; 1009} 1010 1011/** Device-related methods */ 1012 1013camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag, 1014 size_t minCount, size_t maxCount) { 1015 status_t res; 1016 camera_metadata_entry_t entry; 1017 res = find_camera_metadata_entry(mDevice->info(), 1018 tag, 1019 &entry); 1020 if (CC_UNLIKELY( res != OK )) { 1021 const char* tagSection = get_camera_metadata_section_name(tag); 1022 if (tagSection == NULL) tagSection = "<unknown>"; 1023 const char* tagName = get_camera_metadata_tag_name(tag); 1024 if (tagName == NULL) tagName = "<unknown>"; 1025 1026 ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)", 1027 tagSection, tagName, tag, strerror(-res), res); 1028 entry.count = 0; 1029 entry.data.u8 = NULL; 1030 } else if (CC_UNLIKELY( 1031 (minCount != 0 && entry.count < minCount) || 1032 (maxCount != 0 && entry.count > maxCount) ) ) { 1033 const char* tagSection = get_camera_metadata_section_name(tag); 1034 if (tagSection == NULL) tagSection = "<unknown>"; 1035 const char* tagName = get_camera_metadata_tag_name(tag); 1036 if (tagName == NULL) tagName = "<unknown>"; 1037 ALOGE("Malformed static metadata entry '%s.%s' (%x):" 1038 "Expected between %d and %d values, but got %d values", 1039 tagSection, tagName, tag, minCount, maxCount, entry.count); 1040 entry.count = 0; 1041 entry.data.u8 = NULL; 1042 } 1043 1044 return entry; 1045} 1046 1047/** Utility methods */ 1048 1049 1050status_t Camera2Client::buildDefaultParameters() { 1051 ATRACE_CALL(); 1052 Mutex::Autolock pl(mParamsLock); 1053 1054 status_t res; 1055 CameraParameters params; 1056 1057 camera_metadata_entry_t availableProcessedSizes = 1058 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 1059 if (!availableProcessedSizes.count) return NO_INIT; 1060 1061 // TODO: Pick more intelligently 1062 mParameters.previewWidth = availableProcessedSizes.data.i32[0]; 1063 mParameters.previewHeight = availableProcessedSizes.data.i32[1]; 1064 mParameters.videoWidth = mParameters.previewWidth; 1065 mParameters.videoHeight = mParameters.previewHeight; 1066 1067 params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight); 1068 params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight); 1069 params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 1070 String8::format("%dx%d", 1071 mParameters.previewWidth, mParameters.previewHeight)); 1072 { 1073 String8 supportedPreviewSizes; 1074 for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 1075 if (i != 0) supportedPreviewSizes += ","; 1076 supportedPreviewSizes += String8::format("%dx%d", 1077 availableProcessedSizes.data.i32[i], 1078 availableProcessedSizes.data.i32[i+1]); 1079 } 1080 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 1081 supportedPreviewSizes); 1082 params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 1083 supportedPreviewSizes); 1084 } 1085 1086 camera_metadata_entry_t availableFpsRanges = 1087 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 1088 if (!availableFpsRanges.count) return NO_INIT; 1089 1090 mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0]; 1091 mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1]; 1092 1093 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 1094 String8::format("%d,%d", 1095 mParameters.previewFpsRangeMin, 1096 mParameters.previewFpsRangeMax)); 1097 1098 { 1099 String8 supportedPreviewFpsRange; 1100 for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1101 if (i != 0) supportedPreviewFpsRange += ","; 1102 supportedPreviewFpsRange += String8::format("(%d,%d)", 1103 availableFpsRanges.data.i32[i], 1104 availableFpsRanges.data.i32[i+1]); 1105 } 1106 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 1107 supportedPreviewFpsRange); 1108 } 1109 1110 mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1111 params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1112 formatEnumToString(mParameters.previewFormat)); // NV21 1113 1114 camera_metadata_entry_t availableFormats = 1115 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 1116 1117 { 1118 String8 supportedPreviewFormats; 1119 bool addComma = false; 1120 for (size_t i=0; i < availableFormats.count; i++) { 1121 if (addComma) supportedPreviewFormats += ","; 1122 addComma = true; 1123 switch (availableFormats.data.i32[i]) { 1124 case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1125 supportedPreviewFormats += "yuv422sp"; 1126 break; 1127 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1128 supportedPreviewFormats += "yuv420sp"; 1129 break; 1130 case HAL_PIXEL_FORMAT_YCbCr_422_I: 1131 supportedPreviewFormats += "yuv422i-yuyv"; 1132 break; 1133 case HAL_PIXEL_FORMAT_YV12: 1134 supportedPreviewFormats += "yuv420p"; 1135 break; 1136 case HAL_PIXEL_FORMAT_RGB_565: 1137 supportedPreviewFormats += "rgb565"; 1138 break; 1139 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1140 case HAL_PIXEL_FORMAT_RAW_SENSOR: 1141 addComma = false; 1142 break; 1143 default: 1144 ALOGW("%s: Camera %d: Unknown preview format: %x", 1145 __FUNCTION__, mCameraId, availableFormats.data.i32[i]); 1146 addComma = false; 1147 break; 1148 } 1149 } 1150 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1151 supportedPreviewFormats); 1152 } 1153 1154 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1155 // still have to do something sane for them 1156 1157 params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 1158 mParameters.previewFpsRangeMin); 1159 1160 { 1161 String8 supportedPreviewFrameRates; 1162 for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1163 if (i != 0) supportedPreviewFrameRates += ","; 1164 supportedPreviewFrameRates += String8::format("%d", 1165 availableFpsRanges.data.i32[i]); 1166 } 1167 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 1168 supportedPreviewFrameRates); 1169 } 1170 1171 camera_metadata_entry_t availableJpegSizes = 1172 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 1173 if (!availableJpegSizes.count) return NO_INIT; 1174 1175 // TODO: Pick maximum 1176 mParameters.pictureWidth = availableJpegSizes.data.i32[0]; 1177 mParameters.pictureHeight = availableJpegSizes.data.i32[1]; 1178 1179 params.setPictureSize(mParameters.pictureWidth, 1180 mParameters.pictureHeight); 1181 1182 { 1183 String8 supportedPictureSizes; 1184 for (size_t i=0; i < availableJpegSizes.count; i += 2) { 1185 if (i != 0) supportedPictureSizes += ","; 1186 supportedPictureSizes += String8::format("%dx%d", 1187 availableJpegSizes.data.i32[i], 1188 availableJpegSizes.data.i32[i+1]); 1189 } 1190 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 1191 supportedPictureSizes); 1192 } 1193 1194 params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 1195 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 1196 CameraParameters::PIXEL_FORMAT_JPEG); 1197 1198 camera_metadata_entry_t availableJpegThumbnailSizes = 1199 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2); 1200 if (!availableJpegThumbnailSizes.count) return NO_INIT; 1201 1202 // TODO: Pick default thumbnail size sensibly 1203 mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0]; 1204 mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1]; 1205 1206 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 1207 mParameters.jpegThumbWidth); 1208 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 1209 mParameters.jpegThumbHeight); 1210 1211 { 1212 String8 supportedJpegThumbSizes; 1213 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 1214 if (i != 0) supportedJpegThumbSizes += ","; 1215 supportedJpegThumbSizes += String8::format("%dx%d", 1216 availableJpegThumbnailSizes.data.i32[i], 1217 availableJpegThumbnailSizes.data.i32[i+1]); 1218 } 1219 params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 1220 supportedJpegThumbSizes); 1221 } 1222 1223 mParameters.jpegThumbQuality = 90; 1224 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 1225 mParameters.jpegThumbQuality); 1226 mParameters.jpegQuality = 90; 1227 params.set(CameraParameters::KEY_JPEG_QUALITY, 1228 mParameters.jpegQuality); 1229 mParameters.jpegRotation = 0; 1230 params.set(CameraParameters::KEY_ROTATION, 1231 mParameters.jpegRotation); 1232 1233 mParameters.gpsEnabled = false; 1234 mParameters.gpsProcessingMethod = "unknown"; 1235 // GPS fields in CameraParameters are not set by implementation 1236 1237 mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO; 1238 params.set(CameraParameters::KEY_WHITE_BALANCE, 1239 CameraParameters::WHITE_BALANCE_AUTO); 1240 1241 camera_metadata_entry_t availableWhiteBalanceModes = 1242 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 1243 { 1244 String8 supportedWhiteBalance; 1245 bool addComma = false; 1246 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 1247 if (addComma) supportedWhiteBalance += ","; 1248 addComma = true; 1249 switch (availableWhiteBalanceModes.data.u8[i]) { 1250 case ANDROID_CONTROL_AWB_AUTO: 1251 supportedWhiteBalance += "auto"; 1252 break; 1253 case ANDROID_CONTROL_AWB_INCANDESCENT: 1254 supportedWhiteBalance += "incandescent"; 1255 break; 1256 case ANDROID_CONTROL_AWB_FLUORESCENT: 1257 supportedWhiteBalance += "fluorescent"; 1258 break; 1259 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 1260 supportedWhiteBalance += "warm-fluorescent"; 1261 break; 1262 case ANDROID_CONTROL_AWB_DAYLIGHT: 1263 supportedWhiteBalance += "daylight"; 1264 break; 1265 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 1266 supportedWhiteBalance += "cloudy-daylight"; 1267 break; 1268 case ANDROID_CONTROL_AWB_TWILIGHT: 1269 supportedWhiteBalance += "twilight"; 1270 break; 1271 case ANDROID_CONTROL_AWB_SHADE: 1272 supportedWhiteBalance += "shade"; 1273 break; 1274 // Skipping values not mappable to v1 API 1275 case ANDROID_CONTROL_AWB_OFF: 1276 addComma = false; 1277 break; 1278 default: 1279 ALOGW("%s: Camera %d: Unknown white balance value: %d", 1280 __FUNCTION__, mCameraId, 1281 availableWhiteBalanceModes.data.u8[i]); 1282 addComma = false; 1283 break; 1284 } 1285 } 1286 params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 1287 supportedWhiteBalance); 1288 } 1289 1290 mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF; 1291 params.set(CameraParameters::KEY_EFFECT, 1292 CameraParameters::EFFECT_NONE); 1293 1294 camera_metadata_entry_t availableEffects = 1295 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 1296 if (!availableEffects.count) return NO_INIT; 1297 { 1298 String8 supportedEffects; 1299 bool addComma = false; 1300 for (size_t i=0; i < availableEffects.count; i++) { 1301 if (addComma) supportedEffects += ","; 1302 addComma = true; 1303 switch (availableEffects.data.u8[i]) { 1304 case ANDROID_CONTROL_EFFECT_OFF: 1305 supportedEffects += "none"; 1306 break; 1307 case ANDROID_CONTROL_EFFECT_MONO: 1308 supportedEffects += "mono"; 1309 case ANDROID_CONTROL_EFFECT_NEGATIVE: 1310 supportedEffects += "negative"; 1311 break; 1312 case ANDROID_CONTROL_EFFECT_SOLARIZE: 1313 supportedEffects += "solarize"; 1314 break; 1315 case ANDROID_CONTROL_EFFECT_SEPIA: 1316 supportedEffects += "sepia"; 1317 break; 1318 case ANDROID_CONTROL_EFFECT_POSTERIZE: 1319 supportedEffects += "posterize"; 1320 break; 1321 case ANDROID_CONTROL_EFFECT_WHITEBOARD: 1322 supportedEffects += "whiteboard"; 1323 break; 1324 case ANDROID_CONTROL_EFFECT_BLACKBOARD: 1325 supportedEffects += "blackboard"; 1326 break; 1327 case ANDROID_CONTROL_EFFECT_AQUA: 1328 supportedEffects += "aqua"; 1329 break; 1330 default: 1331 ALOGW("%s: Camera %d: Unknown effect value: %d", 1332 __FUNCTION__, mCameraId, availableEffects.data.u8[i]); 1333 addComma = false; 1334 break; 1335 } 1336 } 1337 params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 1338 } 1339 1340 mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 1341 params.set(CameraParameters::KEY_ANTIBANDING, 1342 CameraParameters::ANTIBANDING_AUTO); 1343 1344 camera_metadata_entry_t availableAntibandingModes = 1345 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 1346 if (!availableAntibandingModes.count) return NO_INIT; 1347 { 1348 String8 supportedAntibanding; 1349 bool addComma = false; 1350 for (size_t i=0; i < availableAntibandingModes.count; i++) { 1351 if (addComma) supportedAntibanding += ","; 1352 addComma = true; 1353 switch (availableAntibandingModes.data.u8[i]) { 1354 case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 1355 supportedAntibanding += "off"; 1356 break; 1357 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 1358 supportedAntibanding += "50hz"; 1359 break; 1360 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 1361 supportedAntibanding += "60hz"; 1362 break; 1363 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 1364 supportedAntibanding += "auto"; 1365 break; 1366 default: 1367 ALOGW("%s: Camera %d: Unknown antibanding value: %d", 1368 __FUNCTION__, mCameraId, 1369 availableAntibandingModes.data.u8[i]); 1370 addComma = false; 1371 break; 1372 } 1373 } 1374 params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 1375 supportedAntibanding); 1376 } 1377 1378 mParameters.sceneMode = ANDROID_CONTROL_OFF; 1379 params.set(CameraParameters::KEY_SCENE_MODE, 1380 CameraParameters::SCENE_MODE_AUTO); 1381 1382 camera_metadata_entry_t availableSceneModes = 1383 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 1384 if (!availableSceneModes.count) return NO_INIT; 1385 { 1386 String8 supportedSceneModes("auto"); 1387 bool addComma = true; 1388 bool noSceneModes = false; 1389 for (size_t i=0; i < availableSceneModes.count; i++) { 1390 if (addComma) supportedSceneModes += ","; 1391 addComma = true; 1392 switch (availableSceneModes.data.u8[i]) { 1393 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 1394 noSceneModes = true; 1395 break; 1396 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 1397 // Not in old API 1398 addComma = false; 1399 break; 1400 case ANDROID_CONTROL_SCENE_MODE_ACTION: 1401 supportedSceneModes += "action"; 1402 break; 1403 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 1404 supportedSceneModes += "portrait"; 1405 break; 1406 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 1407 supportedSceneModes += "landscape"; 1408 break; 1409 case ANDROID_CONTROL_SCENE_MODE_NIGHT: 1410 supportedSceneModes += "night"; 1411 break; 1412 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 1413 supportedSceneModes += "night-portrait"; 1414 break; 1415 case ANDROID_CONTROL_SCENE_MODE_THEATRE: 1416 supportedSceneModes += "theatre"; 1417 break; 1418 case ANDROID_CONTROL_SCENE_MODE_BEACH: 1419 supportedSceneModes += "beach"; 1420 break; 1421 case ANDROID_CONTROL_SCENE_MODE_SNOW: 1422 supportedSceneModes += "snow"; 1423 break; 1424 case ANDROID_CONTROL_SCENE_MODE_SUNSET: 1425 supportedSceneModes += "sunset"; 1426 break; 1427 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 1428 supportedSceneModes += "steadyphoto"; 1429 break; 1430 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 1431 supportedSceneModes += "fireworks"; 1432 break; 1433 case ANDROID_CONTROL_SCENE_MODE_SPORTS: 1434 supportedSceneModes += "sports"; 1435 break; 1436 case ANDROID_CONTROL_SCENE_MODE_PARTY: 1437 supportedSceneModes += "party"; 1438 break; 1439 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 1440 supportedSceneModes += "candlelight"; 1441 break; 1442 case ANDROID_CONTROL_SCENE_MODE_BARCODE: 1443 supportedSceneModes += "barcode"; 1444 break; 1445 default: 1446 ALOGW("%s: Camera %d: Unknown scene mode value: %d", 1447 __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]); 1448 addComma = false; 1449 break; 1450 } 1451 } 1452 if (!noSceneModes) { 1453 params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 1454 supportedSceneModes); 1455 } 1456 } 1457 1458 camera_metadata_entry_t flashAvailable = 1459 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 1460 if (!flashAvailable.count) return NO_INIT; 1461 1462 camera_metadata_entry_t availableAeModes = 1463 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 1464 if (!availableAeModes.count) return NO_INIT; 1465 1466 if (flashAvailable.data.u8[0]) { 1467 mParameters.flashMode = Parameters::FLASH_MODE_AUTO; 1468 params.set(CameraParameters::KEY_FLASH_MODE, 1469 CameraParameters::FLASH_MODE_AUTO); 1470 1471 String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 1472 supportedFlashModes = supportedFlashModes + 1473 "," + CameraParameters::FLASH_MODE_AUTO + 1474 "," + CameraParameters::FLASH_MODE_ON + 1475 "," + CameraParameters::FLASH_MODE_TORCH; 1476 for (size_t i=0; i < availableAeModes.count; i++) { 1477 if (availableAeModes.data.u8[i] == 1478 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 1479 supportedFlashModes = supportedFlashModes + "," + 1480 CameraParameters::FLASH_MODE_RED_EYE; 1481 break; 1482 } 1483 } 1484 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 1485 supportedFlashModes); 1486 } else { 1487 mParameters.flashMode = Parameters::FLASH_MODE_OFF; 1488 params.set(CameraParameters::KEY_FLASH_MODE, 1489 CameraParameters::FLASH_MODE_OFF); 1490 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 1491 CameraParameters::FLASH_MODE_OFF); 1492 } 1493 1494 camera_metadata_entry_t minFocusDistance = 1495 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 1496 if (!minFocusDistance.count) return NO_INIT; 1497 1498 camera_metadata_entry_t availableAfModes = 1499 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 1500 if (!availableAfModes.count) return NO_INIT; 1501 1502 if (minFocusDistance.data.f[0] == 0) { 1503 // Fixed-focus lens 1504 mParameters.focusMode = Parameters::FOCUS_MODE_FIXED; 1505 params.set(CameraParameters::KEY_FOCUS_MODE, 1506 CameraParameters::FOCUS_MODE_FIXED); 1507 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 1508 CameraParameters::FOCUS_MODE_FIXED); 1509 } else { 1510 mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 1511 params.set(CameraParameters::KEY_FOCUS_MODE, 1512 CameraParameters::FOCUS_MODE_AUTO); 1513 String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED); 1514 supportedFocusModes = supportedFocusModes + "," + 1515 CameraParameters::FOCUS_MODE_INFINITY; 1516 bool addComma = true; 1517 for (size_t i=0; i < availableAfModes.count; i++) { 1518 if (addComma) supportedFocusModes += ","; 1519 addComma = true; 1520 switch (availableAfModes.data.u8[i]) { 1521 case ANDROID_CONTROL_AF_AUTO: 1522 supportedFocusModes += "auto"; 1523 break; 1524 case ANDROID_CONTROL_AF_MACRO: 1525 supportedFocusModes += "macro"; 1526 break; 1527 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 1528 supportedFocusModes += "continuous-video"; 1529 break; 1530 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 1531 supportedFocusModes += "continuous-picture"; 1532 break; 1533 case ANDROID_CONTROL_AF_EDOF: 1534 supportedFocusModes += "edof"; 1535 break; 1536 // Not supported in v1 API 1537 case ANDROID_CONTROL_AF_OFF: 1538 addComma = false; 1539 break; 1540 default: 1541 ALOGW("%s: Camera %d: Unknown AF mode value: %d", 1542 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]); 1543 addComma = false; 1544 break; 1545 } 1546 } 1547 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 1548 supportedFocusModes); 1549 } 1550 1551 camera_metadata_entry_t max3aRegions = 1552 staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 1553 if (!max3aRegions.count) return NO_INIT; 1554 1555 params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, 1556 max3aRegions.data.i32[0]); 1557 params.set(CameraParameters::KEY_FOCUS_AREAS, 1558 "(0,0,0,0,0)"); 1559 mParameters.focusingAreas.clear(); 1560 mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0)); 1561 1562 camera_metadata_entry_t availableFocalLengths = 1563 staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 1564 if (!availableFocalLengths.count) return NO_INIT; 1565 1566 float minFocalLength = availableFocalLengths.data.f[0]; 1567 params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 1568 1569 camera_metadata_entry_t sensorSize = 1570 staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 1571 if (!sensorSize.count) return NO_INIT; 1572 1573 // The fields of view here assume infinity focus, maximum wide angle 1574 float horizFov = 180 / M_PI * 1575 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 1576 float vertFov = 180 / M_PI * 1577 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 1578 params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 1579 params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 1580 1581 mParameters.exposureCompensation = 0; 1582 params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 1583 mParameters.exposureCompensation); 1584 1585 camera_metadata_entry_t exposureCompensationRange = 1586 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 1587 if (!exposureCompensationRange.count) return NO_INIT; 1588 1589 params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 1590 exposureCompensationRange.data.i32[1]); 1591 params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 1592 exposureCompensationRange.data.i32[0]); 1593 1594 camera_metadata_entry_t exposureCompensationStep = 1595 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 1596 if (!exposureCompensationStep.count) return NO_INIT; 1597 1598 params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 1599 exposureCompensationStep.data.r[0].numerator / 1600 exposureCompensationStep.data.r[0].denominator); 1601 1602 mParameters.autoExposureLock = false; 1603 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 1604 CameraParameters::FALSE); 1605 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 1606 CameraParameters::TRUE); 1607 1608 mParameters.autoWhiteBalanceLock = false; 1609 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 1610 CameraParameters::FALSE); 1611 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 1612 CameraParameters::TRUE); 1613 1614 mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 1615 params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 1616 max3aRegions.data.i32[0]); 1617 params.set(CameraParameters::KEY_METERING_AREAS, 1618 "(0,0,0,0,0)"); 1619 1620 mParameters.zoom = 0; 1621 params.set(CameraParameters::KEY_ZOOM, mParameters.zoom); 1622 params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 1623 1624 camera_metadata_entry_t maxDigitalZoom = 1625 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1); 1626 if (!maxDigitalZoom.count) return NO_INIT; 1627 1628 { 1629 String8 zoomRatios; 1630 float zoom = 1.f; 1631 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 1632 (NUM_ZOOM_STEPS-1); 1633 bool addComma = false; 1634 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 1635 if (addComma) zoomRatios += ","; 1636 addComma = true; 1637 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 1638 zoom += zoomIncrement; 1639 } 1640 params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 1641 } 1642 1643 params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 1644 CameraParameters::TRUE); 1645 params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 1646 CameraParameters::TRUE); 1647 1648 params.set(CameraParameters::KEY_FOCUS_DISTANCES, 1649 "Infinity,Infinity,Infinity"); 1650 1651 camera_metadata_entry_t maxFacesDetected = 1652 staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 1653 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 1654 maxFacesDetected.data.i32[0]); 1655 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 1656 0); 1657 1658 params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 1659 formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP)); 1660 1661 params.set(CameraParameters::KEY_RECORDING_HINT, 1662 CameraParameters::FALSE); 1663 1664 params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 1665 CameraParameters::TRUE); 1666 1667 params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 1668 CameraParameters::FALSE); 1669 1670 camera_metadata_entry_t availableVideoStabilizationModes = 1671 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 1672 if (!availableVideoStabilizationModes.count) return NO_INIT; 1673 1674 if (availableVideoStabilizationModes.count > 1) { 1675 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 1676 CameraParameters::TRUE); 1677 } else { 1678 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 1679 CameraParameters::FALSE); 1680 } 1681 1682 mParamsFlattened = params.flatten(); 1683 1684 return OK; 1685} 1686 1687status_t Camera2Client::updatePreviewRequest() { 1688 ATRACE_CALL(); 1689 status_t res; 1690 if (mPreviewRequest == NULL) { 1691 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 1692 &mPreviewRequest); 1693 if (res != OK) { 1694 ALOGE("%s: Camera %d: Unable to create default preview request: " 1695 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1696 return res; 1697 } 1698 } 1699 // TODO: Adjust for params changes 1700 return OK; 1701} 1702 1703int Camera2Client::formatStringToEnum(const char *format) { 1704 return 1705 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 1706 HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 1707 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 1708 HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 1709 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 1710 HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 1711 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 1712 HAL_PIXEL_FORMAT_YV12 : // YV12 1713 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 1714 HAL_PIXEL_FORMAT_RGB_565 : // RGB565 1715 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 1716 HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 1717 !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 1718 HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 1719 -1; 1720} 1721 1722const char* Camera2Client::formatEnumToString(int format) { 1723 const char *fmt; 1724 switch(format) { 1725 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 1726 fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 1727 break; 1728 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 1729 fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 1730 break; 1731 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 1732 fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 1733 break; 1734 case HAL_PIXEL_FORMAT_YV12: // YV12 1735 fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 1736 break; 1737 case HAL_PIXEL_FORMAT_RGB_565: // RGB565 1738 fmt = CameraParameters::PIXEL_FORMAT_RGB565; 1739 break; 1740 case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 1741 fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 1742 break; 1743 case HAL_PIXEL_FORMAT_RAW_SENSOR: 1744 ALOGW("Raw sensor preview format requested."); 1745 fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 1746 break; 1747 default: 1748 ALOGE("%s: Unknown preview format: %x", 1749 __FUNCTION__, format); 1750 fmt = NULL; 1751 break; 1752 } 1753 return fmt; 1754} 1755 1756int Camera2Client::wbModeStringToEnum(const char *wbMode) { 1757 return 1758 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 1759 ANDROID_CONTROL_AWB_AUTO : 1760 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 1761 ANDROID_CONTROL_AWB_INCANDESCENT : 1762 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 1763 ANDROID_CONTROL_AWB_FLUORESCENT : 1764 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 1765 ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 1766 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 1767 ANDROID_CONTROL_AWB_DAYLIGHT : 1768 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 1769 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 1770 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 1771 ANDROID_CONTROL_AWB_TWILIGHT : 1772 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 1773 ANDROID_CONTROL_AWB_SHADE : 1774 -1; 1775} 1776 1777int Camera2Client::effectModeStringToEnum(const char *effectMode) { 1778 return 1779 !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 1780 ANDROID_CONTROL_EFFECT_OFF : 1781 !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 1782 ANDROID_CONTROL_EFFECT_MONO : 1783 !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 1784 ANDROID_CONTROL_EFFECT_NEGATIVE : 1785 !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 1786 ANDROID_CONTROL_EFFECT_SOLARIZE : 1787 !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 1788 ANDROID_CONTROL_EFFECT_SEPIA : 1789 !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 1790 ANDROID_CONTROL_EFFECT_POSTERIZE : 1791 !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 1792 ANDROID_CONTROL_EFFECT_WHITEBOARD : 1793 !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 1794 ANDROID_CONTROL_EFFECT_BLACKBOARD : 1795 !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 1796 ANDROID_CONTROL_EFFECT_AQUA : 1797 -1; 1798} 1799 1800int Camera2Client::abModeStringToEnum(const char *abMode) { 1801 return 1802 !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 1803 ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 1804 !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 1805 ANDROID_CONTROL_AE_ANTIBANDING_OFF : 1806 !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 1807 ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 1808 !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 1809 ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 1810 -1; 1811} 1812 1813int Camera2Client::sceneModeStringToEnum(const char *sceneMode) { 1814 return 1815 !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 1816 ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 1817 !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 1818 ANDROID_CONTROL_SCENE_MODE_ACTION : 1819 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 1820 ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 1821 !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 1822 ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 1823 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 1824 ANDROID_CONTROL_SCENE_MODE_NIGHT : 1825 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 1826 ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 1827 !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 1828 ANDROID_CONTROL_SCENE_MODE_THEATRE : 1829 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 1830 ANDROID_CONTROL_SCENE_MODE_BEACH : 1831 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 1832 ANDROID_CONTROL_SCENE_MODE_SNOW : 1833 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 1834 ANDROID_CONTROL_SCENE_MODE_SUNSET : 1835 !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 1836 ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 1837 !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 1838 ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 1839 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 1840 ANDROID_CONTROL_SCENE_MODE_SPORTS : 1841 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 1842 ANDROID_CONTROL_SCENE_MODE_PARTY : 1843 !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 1844 ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 1845 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 1846 ANDROID_CONTROL_SCENE_MODE_BARCODE: 1847 -1; 1848} 1849 1850Camera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum( 1851 const char *flashMode) { 1852 return 1853 !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 1854 Parameters::FLASH_MODE_OFF : 1855 !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 1856 Parameters::FLASH_MODE_AUTO : 1857 !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 1858 Parameters::FLASH_MODE_ON : 1859 !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 1860 Parameters::FLASH_MODE_RED_EYE : 1861 !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 1862 Parameters::FLASH_MODE_TORCH : 1863 Parameters::FLASH_MODE_INVALID; 1864} 1865 1866Camera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum( 1867 const char *focusMode) { 1868 return 1869 !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 1870 Parameters::FOCUS_MODE_AUTO : 1871 !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 1872 Parameters::FOCUS_MODE_INFINITY : 1873 !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 1874 Parameters::FOCUS_MODE_MACRO : 1875 !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 1876 Parameters::FOCUS_MODE_FIXED : 1877 !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 1878 Parameters::FOCUS_MODE_EDOF : 1879 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 1880 Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 1881 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 1882 Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 1883 Parameters::FOCUS_MODE_INVALID; 1884} 1885 1886status_t Camera2Client::parseAreas(const char *areasCStr, 1887 Vector<Parameters::Area> *areas) { 1888 static const size_t NUM_FIELDS = 5; 1889 areas->clear(); 1890 if (areasCStr == NULL) { 1891 // If no key exists, use default (0,0,0,0,0) 1892 areas->push(); 1893 return OK; 1894 } 1895 String8 areasStr(areasCStr); 1896 ssize_t areaStart = areasStr.find("(", 0) + 1; 1897 while (areaStart != 0) { 1898 const char* area = areasStr.string() + areaStart; 1899 char *numEnd; 1900 int vals[NUM_FIELDS]; 1901 for (size_t i = 0; i < NUM_FIELDS; i++) { 1902 errno = 0; 1903 vals[i] = strtol(area, &numEnd, 10); 1904 if (errno || numEnd == area) return BAD_VALUE; 1905 area = numEnd + 1; 1906 } 1907 areas->push(Parameters::Area( 1908 vals[0], vals[1], vals[2], vals[3], vals[4]) ); 1909 areaStart = areasStr.find("(", areaStart) + 1; 1910 } 1911 return OK; 1912} 1913 1914status_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas, 1915 size_t maxRegions) { 1916 // Definition of valid area can be found in 1917 // include/camera/CameraParameters.h 1918 if (areas.size() == 0) return BAD_VALUE; 1919 if (areas.size() == 1) { 1920 if (areas[0].left == 0 && 1921 areas[0].top == 0 && 1922 areas[0].right == 0 && 1923 areas[0].bottom == 0 && 1924 areas[0].weight == 0) { 1925 // Single (0,0,0,0,0) entry is always valid (== driver decides) 1926 return OK; 1927 } 1928 } 1929 if (areas.size() > maxRegions) { 1930 ALOGE("%s: Too many areas requested: %d", 1931 __FUNCTION__, areas.size()); 1932 return BAD_VALUE; 1933 } 1934 1935 for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 1936 a != areas.end(); a++) { 1937 if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 1938 if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 1939 if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 1940 if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 1941 if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 1942 if (a->left >= a->right) return BAD_VALUE; 1943 if (a->top >= a->bottom) return BAD_VALUE; 1944 } 1945 return OK; 1946} 1947 1948bool Camera2Client::boolFromString(const char *boolStr) { 1949 return !boolStr ? false : 1950 !strcmp(boolStr, CameraParameters::TRUE) ? true : 1951 false; 1952} 1953 1954 1955} // namespace android 1956