Camera2Client.cpp revision c03792041b9dd6f7f54abd6c82bd6c755a336cd8
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 "Camera2" 18#define ATRACE_TAG ATRACE_TAG_CAMERA 19//#define LOG_NDEBUG 0 20 21#include <utils/Log.h> 22#include <utils/Trace.h> 23 24#include <cutils/properties.h> 25#include <gui/SurfaceTextureClient.h> 26#include <gui/Surface.h> 27#include "camera2/Parameters.h" 28#include "Camera2Client.h" 29 30#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 31#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 32 33namespace android { 34using namespace camera2; 35 36static int getCallingPid() { 37 return IPCThreadState::self()->getCallingPid(); 38} 39 40static int getCallingUid() { 41 return IPCThreadState::self()->getCallingUid(); 42} 43 44// Interface used by CameraService 45 46Camera2Client::Camera2Client(const sp<CameraService>& cameraService, 47 const sp<ICameraClient>& cameraClient, 48 int cameraId, 49 int cameraFacing, 50 int clientPid, 51 int servicePid): 52 Client(cameraService, cameraClient, 53 cameraId, cameraFacing, clientPid, servicePid), 54 mSharedCameraClient(cameraClient), 55 mParameters(cameraId, cameraFacing) 56{ 57 ATRACE_CALL(); 58 ALOGI("Camera %d: Opened", cameraId); 59 60 mDevice = new Camera2Device(cameraId); 61 62 SharedParameters::Lock l(mParameters); 63 l.mParameters.state = Parameters::DISCONNECTED; 64} 65 66status_t Camera2Client::checkPid(const char* checkLocation) const { 67 int callingPid = getCallingPid(); 68 if (callingPid == mClientPid) return NO_ERROR; 69 70 ALOGE("%s: attempt to use a locked camera from a different process" 71 " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid); 72 return PERMISSION_DENIED; 73} 74 75status_t Camera2Client::initialize(camera_module_t *module) 76{ 77 ATRACE_CALL(); 78 ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId); 79 status_t res; 80 81 res = mDevice->initialize(module); 82 if (res != OK) { 83 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 84 __FUNCTION__, mCameraId, strerror(-res), res); 85 return NO_INIT; 86 } 87 88 res = mDevice->setNotifyCallback(this); 89 90 SharedParameters::Lock l(mParameters); 91 92 res = l.mParameters.initialize(&(mDevice->info())); 93 if (res != OK) { 94 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 95 __FUNCTION__, mCameraId, strerror(-res), res); 96 return NO_INIT; 97 } 98 99 String8 threadName; 100 101 mStreamingProcessor = new StreamingProcessor(this); 102 103 mFrameProcessor = new FrameProcessor(this); 104 threadName = String8::format("C2-%d-FrameProc", 105 mCameraId); 106 mFrameProcessor->run(threadName.string()); 107 108 mCaptureSequencer = new CaptureSequencer(this); 109 threadName = String8::format("C2-%d-CaptureSeq", 110 mCameraId); 111 mCaptureSequencer->run(threadName.string()); 112 113 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer); 114 threadName = String8::format("C2-%d-JpegProc", 115 mCameraId); 116 mJpegProcessor->run(threadName.string()); 117 118 mZslProcessor = new ZslProcessor(this, mCaptureSequencer); 119 threadName = String8::format("C2-%d-ZslProc", 120 mCameraId); 121 mZslProcessor->run(threadName.string()); 122 123 mCallbackProcessor = new CallbackProcessor(this); 124 threadName = String8::format("C2-%d-CallbkProc", 125 mCameraId); 126 mCallbackProcessor->run(threadName.string()); 127 128 if (gLogLevel >= 1) { 129 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 130 mCameraId); 131 ALOGD("%s", l.mParameters.paramsFlattened.string()); 132 } 133 134 return OK; 135} 136 137Camera2Client::~Camera2Client() { 138 ATRACE_CALL(); 139 140 mDestructionStarted = true; 141 142 disconnect(); 143 144 ALOGI("Camera %d: Closed", mCameraId); 145} 146 147status_t Camera2Client::dump(int fd, const Vector<String16>& args) { 148 String8 result; 149 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 150 mCameraId, 151 getCameraClient()->asBinder().get(), 152 mClientPid); 153 result.append(" State: "); 154#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 155 156 const Parameters& p = mParameters.unsafeAccess(); 157 158 result.append(Parameters::getStateName(p.state)); 159 160 result.append("\n Current parameters:\n"); 161 result.appendFormat(" Preview size: %d x %d\n", 162 p.previewWidth, p.previewHeight); 163 result.appendFormat(" Preview FPS range: %d - %d\n", 164 p.previewFpsRange[0], p.previewFpsRange[1]); 165 result.appendFormat(" Preview HAL pixel format: 0x%x\n", 166 p.previewFormat); 167 result.appendFormat(" Preview transform: %x\n", 168 p.previewTransform); 169 result.appendFormat(" Picture size: %d x %d\n", 170 p.pictureWidth, p.pictureHeight); 171 result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 172 p.jpegThumbSize[0], p.jpegThumbSize[1]); 173 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 174 p.jpegQuality, p.jpegThumbQuality); 175 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 176 result.appendFormat(" GPS tags %s\n", 177 p.gpsEnabled ? "enabled" : "disabled"); 178 if (p.gpsEnabled) { 179 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 180 p.gpsCoordinates[0], p.gpsCoordinates[1], 181 p.gpsCoordinates[2]); 182 result.appendFormat(" GPS timestamp: %lld\n", 183 p.gpsTimestamp); 184 result.appendFormat(" GPS processing method: %s\n", 185 p.gpsProcessingMethod.string()); 186 } 187 188 result.append(" White balance mode: "); 189 switch (p.wbMode) { 190 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 191 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 192 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 193 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 194 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 195 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 196 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 197 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 198 default: result.append("UNKNOWN\n"); 199 } 200 201 result.append(" Effect mode: "); 202 switch (p.effectMode) { 203 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 204 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 205 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 206 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 207 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 208 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 209 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 210 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 211 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 212 default: result.append("UNKNOWN\n"); 213 } 214 215 result.append(" Antibanding mode: "); 216 switch (p.antibandingMode) { 217 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 218 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 219 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 220 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 221 default: result.append("UNKNOWN\n"); 222 } 223 224 result.append(" Scene mode: "); 225 switch (p.sceneMode) { 226 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 227 result.append("AUTO\n"); break; 228 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 229 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 230 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 231 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 232 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 233 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 234 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 235 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 236 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 237 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 238 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 239 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 240 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 241 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 242 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 243 default: result.append("UNKNOWN\n"); 244 } 245 246 result.append(" Flash mode: "); 247 switch (p.flashMode) { 248 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 249 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 250 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 251 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 252 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 253 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 254 default: result.append("UNKNOWN\n"); 255 } 256 257 result.append(" Focus mode: "); 258 switch (p.focusMode) { 259 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 260 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 261 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 262 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 263 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 264 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 265 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 266 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 267 default: result.append("UNKNOWN\n"); 268 } 269 270 result.append(" Focusing areas:\n"); 271 for (size_t i = 0; i < p.focusingAreas.size(); i++) { 272 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 273 p.focusingAreas[i].left, 274 p.focusingAreas[i].top, 275 p.focusingAreas[i].right, 276 p.focusingAreas[i].bottom, 277 p.focusingAreas[i].weight); 278 } 279 280 result.appendFormat(" Exposure compensation index: %d\n", 281 p.exposureCompensation); 282 283 result.appendFormat(" AE lock %s, AWB lock %s\n", 284 p.autoExposureLock ? "enabled" : "disabled", 285 p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 286 287 result.appendFormat(" Metering areas:\n"); 288 for (size_t i = 0; i < p.meteringAreas.size(); i++) { 289 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 290 p.meteringAreas[i].left, 291 p.meteringAreas[i].top, 292 p.meteringAreas[i].right, 293 p.meteringAreas[i].bottom, 294 p.meteringAreas[i].weight); 295 } 296 297 result.appendFormat(" Zoom index: %d\n", p.zoom); 298 result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 299 p.videoHeight); 300 301 result.appendFormat(" Recording hint is %s\n", 302 p.recordingHint ? "set" : "not set"); 303 304 result.appendFormat(" Video stabilization is %s\n", 305 p.videoStabilization ? "enabled" : "disabled"); 306 307 result.append(" Current streams:\n"); 308 result.appendFormat(" Preview stream ID: %d\n", 309 getPreviewStreamId()); 310 result.appendFormat(" Capture stream ID: %d\n", 311 getCaptureStreamId()); 312 result.appendFormat(" Recording stream ID: %d\n", 313 getRecordingStreamId()); 314 315 result.append(" Quirks for this camera:\n"); 316 bool haveQuirk = false; 317 if (p.quirks.triggerAfWithAuto) { 318 result.appendFormat(" triggerAfWithAuto\n"); 319 haveQuirk = true; 320 } 321 if (p.quirks.useZslFormat) { 322 result.appendFormat(" useZslFormat\n"); 323 haveQuirk = true; 324 } 325 if (p.quirks.meteringCropRegion) { 326 result.appendFormat(" meteringCropRegion\n"); 327 haveQuirk = true; 328 } 329 if (!haveQuirk) { 330 result.appendFormat(" none\n"); 331 } 332 333 write(fd, result.string(), result.size()); 334 335 mStreamingProcessor->dump(fd, args); 336 337 mCaptureSequencer->dump(fd, args); 338 339 mFrameProcessor->dump(fd, args); 340 341 mZslProcessor->dump(fd, args); 342 343 result = " Device dump:\n"; 344 write(fd, result.string(), result.size()); 345 346 status_t res = mDevice->dump(fd, args); 347 if (res != OK) { 348 result = String8::format(" Error dumping device: %s (%d)", 349 strerror(-res), res); 350 write(fd, result.string(), result.size()); 351 } 352 353#undef CASE_APPEND_ENUM 354 return NO_ERROR; 355} 356 357// ICamera interface 358 359void Camera2Client::disconnect() { 360 ATRACE_CALL(); 361 Mutex::Autolock icl(mICameraLock); 362 status_t res; 363 364 // Allow both client and the media server to disconnect at all times 365 int callingPid = getCallingPid(); 366 if (callingPid != mClientPid && callingPid != mServicePid) return; 367 368 if (mDevice == 0) return; 369 370 ALOGV("Camera %d: Shutting down", mCameraId); 371 372 stopPreviewL(); 373 374 { 375 SharedParameters::Lock l(mParameters); 376 if (l.mParameters.state == Parameters::DISCONNECTED) return; 377 l.mParameters.state = Parameters::DISCONNECTED; 378 } 379 380 mStreamingProcessor->deletePreviewStream(); 381 mStreamingProcessor->deleteRecordingStream(); 382 mJpegProcessor->deleteStream(); 383 mCallbackProcessor->deleteStream(); 384 mZslProcessor->deleteStream(); 385 386 mFrameProcessor->requestExit(); 387 mCaptureSequencer->requestExit(); 388 mJpegProcessor->requestExit(); 389 mZslProcessor->requestExit(); 390 mCallbackProcessor->requestExit(); 391 392 ALOGV("Camera %d: Waiting for threads", mCameraId); 393 394 mFrameProcessor->join(); 395 mCaptureSequencer->join(); 396 mJpegProcessor->join(); 397 mZslProcessor->join(); 398 mCallbackProcessor->join(); 399 400 ALOGV("Camera %d: Disconnecting device", mCameraId); 401 402 mDevice->disconnect(); 403 404 mDevice.clear(); 405 406 CameraService::Client::disconnect(); 407} 408 409status_t Camera2Client::connect(const sp<ICameraClient>& client) { 410 ATRACE_CALL(); 411 ALOGV("%s: E", __FUNCTION__); 412 Mutex::Autolock icl(mICameraLock); 413 414 if (mClientPid != 0 && getCallingPid() != mClientPid) { 415 ALOGE("%s: Camera %d: Connection attempt from pid %d; " 416 "current locked to pid %d", __FUNCTION__, 417 mCameraId, getCallingPid(), mClientPid); 418 return BAD_VALUE; 419 } 420 421 mClientPid = getCallingPid(); 422 423 mCameraClient = client; 424 mSharedCameraClient = client; 425 426 return OK; 427} 428 429status_t Camera2Client::lock() { 430 ATRACE_CALL(); 431 ALOGV("%s: E", __FUNCTION__); 432 Mutex::Autolock icl(mICameraLock); 433 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 434 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 435 436 if (mClientPid == 0) { 437 mClientPid = getCallingPid(); 438 return OK; 439 } 440 441 if (mClientPid != getCallingPid()) { 442 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 443 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 444 return EBUSY; 445 } 446 447 return OK; 448} 449 450status_t Camera2Client::unlock() { 451 ATRACE_CALL(); 452 ALOGV("%s: E", __FUNCTION__); 453 Mutex::Autolock icl(mICameraLock); 454 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 455 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 456 457 // TODO: Check for uninterruptable conditions 458 459 if (mClientPid == getCallingPid()) { 460 mClientPid = 0; 461 mCameraClient.clear(); 462 mSharedCameraClient.clear(); 463 return OK; 464 } 465 466 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 467 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 468 return EBUSY; 469} 470 471status_t Camera2Client::setPreviewDisplay( 472 const sp<Surface>& surface) { 473 ATRACE_CALL(); 474 ALOGV("%s: E", __FUNCTION__); 475 Mutex::Autolock icl(mICameraLock); 476 status_t res; 477 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 478 479 sp<IBinder> binder; 480 sp<ANativeWindow> window; 481 if (surface != 0) { 482 binder = surface->asBinder(); 483 window = surface; 484 } 485 486 return setPreviewWindowL(binder,window); 487} 488 489status_t Camera2Client::setPreviewTexture( 490 const sp<ISurfaceTexture>& surfaceTexture) { 491 ATRACE_CALL(); 492 ALOGV("%s: E", __FUNCTION__); 493 Mutex::Autolock icl(mICameraLock); 494 status_t res; 495 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 496 497 sp<IBinder> binder; 498 sp<ANativeWindow> window; 499 if (surfaceTexture != 0) { 500 binder = surfaceTexture->asBinder(); 501 window = new SurfaceTextureClient(surfaceTexture); 502 } 503 return setPreviewWindowL(binder, window); 504} 505 506status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder, 507 sp<ANativeWindow> window) { 508 ATRACE_CALL(); 509 status_t res; 510 511 if (binder == mPreviewSurface) { 512 ALOGV("%s: Camera %d: New window is same as old window", 513 __FUNCTION__, mCameraId); 514 return NO_ERROR; 515 } 516 517 SharedParameters::Lock l(mParameters); 518 switch (l.mParameters.state) { 519 case Parameters::DISCONNECTED: 520 case Parameters::RECORD: 521 case Parameters::STILL_CAPTURE: 522 case Parameters::VIDEO_SNAPSHOT: 523 ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 524 __FUNCTION__, mCameraId, 525 Parameters::getStateName(l.mParameters.state)); 526 return INVALID_OPERATION; 527 case Parameters::STOPPED: 528 case Parameters::WAITING_FOR_PREVIEW_WINDOW: 529 // OK 530 break; 531 case Parameters::PREVIEW: 532 // Already running preview - need to stop and create a new stream 533 // TODO: Optimize this so that we don't wait for old stream to drain 534 // before spinning up new stream 535 mStreamingProcessor->stopStream(); 536 l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 537 break; 538 } 539 540 mPreviewSurface = binder; 541 res = mStreamingProcessor->setPreviewWindow(window); 542 if (res != OK) { 543 ALOGE("%s: Unable to set new preview window: %s (%d)", 544 __FUNCTION__, strerror(-res), res); 545 return res; 546 } 547 548 if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) { 549 return startPreviewL(l.mParameters, false); 550 } 551 552 return OK; 553} 554 555void Camera2Client::setPreviewCallbackFlag(int flag) { 556 ATRACE_CALL(); 557 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag); 558 Mutex::Autolock icl(mICameraLock); 559 status_t res; 560 if ( checkPid(__FUNCTION__) != OK) return; 561 562 SharedParameters::Lock l(mParameters); 563 setPreviewCallbackFlagL(l.mParameters, flag); 564} 565 566void Camera2Client::setPreviewCallbackFlagL(Parameters ¶ms, int flag) { 567 status_t res = OK; 568 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { 569 ALOGV("%s: setting oneshot", __FUNCTION__); 570 params.previewCallbackOneShot = true; 571 } 572 if (params.previewCallbackFlags != (uint32_t)flag) { 573 params.previewCallbackFlags = flag; 574 switch(params.state) { 575 case Parameters::PREVIEW: 576 res = startPreviewL(params, true); 577 break; 578 case Parameters::RECORD: 579 case Parameters::VIDEO_SNAPSHOT: 580 res = startRecordingL(params, true); 581 break; 582 default: 583 break; 584 } 585 if (res != OK) { 586 ALOGE("%s: Camera %d: Unable to refresh request in state %s", 587 __FUNCTION__, mCameraId, 588 Parameters::getStateName(params.state)); 589 } 590 } 591 592} 593 594status_t Camera2Client::startPreview() { 595 ATRACE_CALL(); 596 ALOGV("%s: E", __FUNCTION__); 597 Mutex::Autolock icl(mICameraLock); 598 status_t res; 599 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 600 SharedParameters::Lock l(mParameters); 601 return startPreviewL(l.mParameters, false); 602} 603 604status_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) { 605 ATRACE_CALL(); 606 status_t res; 607 608 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 609 610 if (params.state == Parameters::PREVIEW && !restart) { 611 // Succeed attempt to re-enter preview state 612 ALOGI("%s: Not starting preview; already in preview state.", 613 __FUNCTION__); 614 return OK; 615 } 616 if (params.state > Parameters::PREVIEW && !restart) { 617 ALOGE("%s: Can't start preview in state %s", 618 __FUNCTION__, 619 Parameters::getStateName(params.state)); 620 return INVALID_OPERATION; 621 } 622 623 if (!mStreamingProcessor->haveValidPreviewWindow()) { 624 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 625 return OK; 626 } 627 params.state = Parameters::STOPPED; 628 629 res = mStreamingProcessor->updatePreviewStream(params); 630 if (res != OK) { 631 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 632 __FUNCTION__, mCameraId, strerror(-res), res); 633 return res; 634 } 635 636 Vector<uint8_t> outputStreams; 637 bool callbacksEnabled = params.previewCallbackFlags & 638 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 639 if (callbacksEnabled) { 640 res = mCallbackProcessor->updateStream(params); 641 if (res != OK) { 642 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 643 __FUNCTION__, mCameraId, strerror(-res), res); 644 return res; 645 } 646 outputStreams.push(getCallbackStreamId()); 647 } 648 if (params.zslMode && !params.recordingHint) { 649 res = mZslProcessor->updateStream(params); 650 if (res != OK) { 651 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)", 652 __FUNCTION__, mCameraId, strerror(-res), res); 653 return res; 654 } 655 outputStreams.push(getZslStreamId()); 656 } 657 658 outputStreams.push(getPreviewStreamId()); 659 660 if (!params.recordingHint) { 661 if (!restart) { 662 res = mStreamingProcessor->updatePreviewRequest(params); 663 if (res != OK) { 664 ALOGE("%s: Camera %d: Can't set up preview request: " 665 "%s (%d)", __FUNCTION__, mCameraId, 666 strerror(-res), res); 667 return res; 668 } 669 } 670 res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW, 671 outputStreams); 672 } else { 673 // With recording hint set, we're going to be operating under the 674 // assumption that the user will record video. To optimize recording 675 // startup time, create the necessary output streams for recording and 676 // video snapshot now if they don't already exist. 677 res = mJpegProcessor->updateStream(params); 678 if (res != OK) { 679 ALOGE("%s: Camera %d: Can't pre-configure still image " 680 "stream: %s (%d)", 681 __FUNCTION__, mCameraId, strerror(-res), res); 682 return res; 683 } 684 685 if (!restart) { 686 res = mStreamingProcessor->updateRecordingRequest(params); 687 if (res != OK) { 688 ALOGE("%s: Camera %d: Can't set up preview request with " 689 "record hint: %s (%d)", __FUNCTION__, mCameraId, 690 strerror(-res), res); 691 return res; 692 } 693 } 694 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 695 outputStreams); 696 } 697 if (res != OK) { 698 ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)", 699 __FUNCTION__, mCameraId, strerror(-res), res); 700 return res; 701 } 702 703 params.state = Parameters::PREVIEW; 704 return OK; 705} 706 707void Camera2Client::stopPreview() { 708 ATRACE_CALL(); 709 ALOGV("%s: E", __FUNCTION__); 710 Mutex::Autolock icl(mICameraLock); 711 status_t res; 712 if ( (res = checkPid(__FUNCTION__) ) != OK) return; 713 stopPreviewL(); 714} 715 716void Camera2Client::stopPreviewL() { 717 ATRACE_CALL(); 718 status_t res; 719 const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds 720 Parameters::State state; 721 { 722 SharedParameters::Lock l(mParameters); 723 state = l.mParameters.state; 724 } 725 726 switch (state) { 727 case Parameters::DISCONNECTED: 728 ALOGE("%s: Camera %d: Call before initialized", 729 __FUNCTION__, mCameraId); 730 break; 731 case Parameters::STOPPED: 732 case Parameters::VIDEO_SNAPSHOT: 733 case Parameters::STILL_CAPTURE: 734 mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout); 735 // no break 736 case Parameters::RECORD: 737 case Parameters::PREVIEW: 738 mStreamingProcessor->stopStream(); 739 res = mDevice->waitUntilDrained(); 740 if (res != OK) { 741 ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)", 742 __FUNCTION__, mCameraId, strerror(-res), res); 743 } 744 // no break 745 case Parameters::WAITING_FOR_PREVIEW_WINDOW: { 746 SharedParameters::Lock l(mParameters); 747 l.mParameters.state = Parameters::STOPPED; 748 commandStopFaceDetectionL(l.mParameters); 749 break; 750 } 751 default: 752 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 753 state); 754 } 755} 756 757bool Camera2Client::previewEnabled() { 758 ATRACE_CALL(); 759 Mutex::Autolock icl(mICameraLock); 760 status_t res; 761 if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 762 763 SharedParameters::Lock l(mParameters); 764 return l.mParameters.state == Parameters::PREVIEW; 765} 766 767status_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 768 ATRACE_CALL(); 769 Mutex::Autolock icl(mICameraLock); 770 status_t res; 771 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 772 773 SharedParameters::Lock l(mParameters); 774 switch (l.mParameters.state) { 775 case Parameters::RECORD: 776 case Parameters::VIDEO_SNAPSHOT: 777 ALOGE("%s: Camera %d: Can't be called in state %s", 778 __FUNCTION__, mCameraId, 779 Parameters::getStateName(l.mParameters.state)); 780 return INVALID_OPERATION; 781 default: 782 // OK 783 break; 784 } 785 786 l.mParameters.storeMetadataInBuffers = enabled; 787 788 return OK; 789} 790 791status_t Camera2Client::startRecording() { 792 ATRACE_CALL(); 793 ALOGV("%s: E", __FUNCTION__); 794 Mutex::Autolock icl(mICameraLock); 795 status_t res; 796 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 797 SharedParameters::Lock l(mParameters); 798 799 return startRecordingL(l.mParameters, false); 800} 801 802status_t Camera2Client::startRecordingL(Parameters ¶ms, bool restart) { 803 status_t res; 804 805 ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart); 806 807 switch (params.state) { 808 case Parameters::STOPPED: 809 res = startPreviewL(params, false); 810 if (res != OK) return res; 811 break; 812 case Parameters::PREVIEW: 813 // Ready to go 814 break; 815 case Parameters::RECORD: 816 case Parameters::VIDEO_SNAPSHOT: 817 // OK to call this when recording is already on, just skip unless 818 // we're looking to restart 819 if (!restart) return OK; 820 break; 821 default: 822 ALOGE("%s: Camera %d: Can't start recording in state %s", 823 __FUNCTION__, mCameraId, 824 Parameters::getStateName(params.state)); 825 return INVALID_OPERATION; 826 }; 827 828 if (!params.storeMetadataInBuffers) { 829 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 830 "non-metadata recording mode requested!", __FUNCTION__, 831 mCameraId); 832 return INVALID_OPERATION; 833 } 834 835 if (!restart) { 836 mCameraService->playSound(CameraService::SOUND_RECORDING); 837 mStreamingProcessor->updateRecordingRequest(params); 838 if (res != OK) { 839 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 840 __FUNCTION__, mCameraId, strerror(-res), res); 841 return res; 842 } 843 } 844 845 res = mStreamingProcessor->updateRecordingStream(params); 846 if (res != OK) { 847 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 848 __FUNCTION__, mCameraId, strerror(-res), res); 849 return res; 850 } 851 852 Vector<uint8_t> outputStreams; 853 bool callbacksEnabled = params.previewCallbackFlags & 854 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 855 if (callbacksEnabled) { 856 res = mCallbackProcessor->updateStream(params); 857 if (res != OK) { 858 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 859 __FUNCTION__, mCameraId, strerror(-res), res); 860 return res; 861 } 862 outputStreams.push(getCallbackStreamId()); 863 } 864 outputStreams.push(getPreviewStreamId()); 865 outputStreams.push(getRecordingStreamId()); 866 867 res = mStreamingProcessor->startStream(StreamingProcessor::RECORD, 868 outputStreams); 869 if (res != OK) { 870 ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)", 871 __FUNCTION__, mCameraId, strerror(-res), res); 872 return res; 873 } 874 875 if (params.state < Parameters::RECORD) { 876 params.state = Parameters::RECORD; 877 } 878 879 return OK; 880} 881 882void Camera2Client::stopRecording() { 883 ATRACE_CALL(); 884 ALOGV("%s: E", __FUNCTION__); 885 Mutex::Autolock icl(mICameraLock); 886 SharedParameters::Lock l(mParameters); 887 888 status_t res; 889 if ( (res = checkPid(__FUNCTION__) ) != OK) return; 890 891 switch (l.mParameters.state) { 892 case Parameters::RECORD: 893 // OK to stop 894 break; 895 case Parameters::STOPPED: 896 case Parameters::PREVIEW: 897 case Parameters::STILL_CAPTURE: 898 case Parameters::VIDEO_SNAPSHOT: 899 default: 900 ALOGE("%s: Camera %d: Can't stop recording in state %s", 901 __FUNCTION__, mCameraId, 902 Parameters::getStateName(l.mParameters.state)); 903 return; 904 }; 905 906 mCameraService->playSound(CameraService::SOUND_RECORDING); 907 908 res = startPreviewL(l.mParameters, true); 909 if (res != OK) { 910 ALOGE("%s: Camera %d: Unable to return to preview", 911 __FUNCTION__, mCameraId); 912 } 913} 914 915bool Camera2Client::recordingEnabled() { 916 ATRACE_CALL(); 917 Mutex::Autolock icl(mICameraLock); 918 919 if ( checkPid(__FUNCTION__) != OK) return false; 920 921 return recordingEnabledL(); 922} 923 924bool Camera2Client::recordingEnabledL() { 925 ATRACE_CALL(); 926 SharedParameters::Lock l(mParameters); 927 928 return (l.mParameters.state == Parameters::RECORD 929 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT); 930} 931 932void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 933 ATRACE_CALL(); 934 Mutex::Autolock icl(mICameraLock); 935 if ( checkPid(__FUNCTION__) != OK) return; 936 937 mStreamingProcessor->releaseRecordingFrame(mem); 938} 939 940status_t Camera2Client::autoFocus() { 941 ATRACE_CALL(); 942 Mutex::Autolock icl(mICameraLock); 943 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 944 status_t res; 945 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 946 947 int triggerId; 948 { 949 SharedParameters::Lock l(mParameters); 950 if (l.mParameters.state < Parameters::PREVIEW) { 951 return INVALID_OPERATION; 952 } 953 954 /** 955 * If the camera does not support auto-focus, it is a no-op and 956 * onAutoFocus(boolean, Camera) callback will be called immediately 957 * with a fake value of success set to true. 958 */ 959 if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED) { 960 SharedCameraClient::Lock l(mSharedCameraClient); 961 if (l.mCameraClient != 0) { 962 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, 963 /*success*/1, 0); 964 } 965 966 return OK; 967 } 968 969 if (l.mParameters.quirks.triggerAfWithAuto && 970 l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED && 971 l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO) { 972 ALOGV("%s: Quirk: Switching from focusMode %d to AUTO", 973 __FUNCTION__, l.mParameters.focusMode); 974 l.mParameters.shadowFocusMode = l.mParameters.focusMode; 975 l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO; 976 updateRequests(l.mParameters); 977 } 978 979 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter; 980 triggerId = l.mParameters.currentAfTriggerId; 981 } 982 syncWithDevice(); 983 984 mDevice->triggerAutofocus(triggerId); 985 986 return OK; 987} 988 989status_t Camera2Client::cancelAutoFocus() { 990 ATRACE_CALL(); 991 Mutex::Autolock icl(mICameraLock); 992 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 993 status_t res; 994 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 995 996 int triggerId; 997 { 998 SharedParameters::Lock l(mParameters); 999 triggerId = ++l.mParameters.afTriggerCounter; 1000 1001 // When using triggerAfWithAuto quirk, may need to reset focus mode to 1002 // the real state at this point. 1003 if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) { 1004 ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__, 1005 l.mParameters.shadowFocusMode); 1006 l.mParameters.focusMode = l.mParameters.shadowFocusMode; 1007 l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID; 1008 updateRequests(l.mParameters); 1009 } 1010 } 1011 syncWithDevice(); 1012 1013 mDevice->triggerCancelAutofocus(triggerId); 1014 1015 return OK; 1016} 1017 1018status_t Camera2Client::takePicture(int msgType) { 1019 ATRACE_CALL(); 1020 Mutex::Autolock icl(mICameraLock); 1021 status_t res; 1022 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1023 1024 SharedParameters::Lock l(mParameters); 1025 switch (l.mParameters.state) { 1026 case Parameters::DISCONNECTED: 1027 case Parameters::STOPPED: 1028 case Parameters::WAITING_FOR_PREVIEW_WINDOW: 1029 ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 1030 __FUNCTION__, mCameraId); 1031 return INVALID_OPERATION; 1032 case Parameters::PREVIEW: 1033 // Good to go for takePicture 1034 res = commandStopFaceDetectionL(l.mParameters); 1035 if (res != OK) { 1036 ALOGE("%s: Camera %d: Unable to stop face detection for still capture", 1037 __FUNCTION__, mCameraId); 1038 return res; 1039 } 1040 l.mParameters.state = Parameters::STILL_CAPTURE; 1041 break; 1042 case Parameters::RECORD: 1043 // Good to go for video snapshot 1044 l.mParameters.state = Parameters::VIDEO_SNAPSHOT; 1045 break; 1046 case Parameters::STILL_CAPTURE: 1047 case Parameters::VIDEO_SNAPSHOT: 1048 ALOGE("%s: Camera %d: Already taking a picture", 1049 __FUNCTION__, mCameraId); 1050 return INVALID_OPERATION; 1051 } 1052 1053 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId); 1054 1055 res = mJpegProcessor->updateStream(l.mParameters); 1056 if (res != OK) { 1057 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 1058 __FUNCTION__, mCameraId, strerror(-res), res); 1059 return res; 1060 } 1061 1062 // Need HAL to have correct settings before (possibly) triggering precapture 1063 syncWithDevice(); 1064 1065 res = mCaptureSequencer->startCapture(); 1066 if (res != OK) { 1067 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)", 1068 __FUNCTION__, mCameraId, strerror(-res), res); 1069 } 1070 1071 return res; 1072} 1073 1074status_t Camera2Client::setParameters(const String8& params) { 1075 ATRACE_CALL(); 1076 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 1077 Mutex::Autolock icl(mICameraLock); 1078 status_t res; 1079 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1080 1081 SharedParameters::Lock l(mParameters); 1082 1083 res = l.mParameters.set(params); 1084 if (res != OK) return res; 1085 1086 res = updateRequests(l.mParameters); 1087 1088 return res; 1089} 1090 1091String8 Camera2Client::getParameters() const { 1092 ATRACE_CALL(); 1093 ALOGV("%s: Camera %d", __FUNCTION__, mCameraId); 1094 Mutex::Autolock icl(mICameraLock); 1095 if ( checkPid(__FUNCTION__) != OK) return String8(); 1096 1097 SharedParameters::ReadLock l(mParameters); 1098 1099 return l.mParameters.get(); 1100} 1101 1102status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1103 ATRACE_CALL(); 1104 Mutex::Autolock icl(mICameraLock); 1105 status_t res; 1106 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1107 1108 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1109 cmd, arg1, arg2); 1110 1111 switch (cmd) { 1112 case CAMERA_CMD_START_SMOOTH_ZOOM: 1113 return commandStartSmoothZoomL(); 1114 case CAMERA_CMD_STOP_SMOOTH_ZOOM: 1115 return commandStopSmoothZoomL(); 1116 case CAMERA_CMD_SET_DISPLAY_ORIENTATION: 1117 return commandSetDisplayOrientationL(arg1); 1118 case CAMERA_CMD_ENABLE_SHUTTER_SOUND: 1119 return commandEnableShutterSoundL(arg1 == 1); 1120 case CAMERA_CMD_PLAY_RECORDING_SOUND: 1121 return commandPlayRecordingSoundL(); 1122 case CAMERA_CMD_START_FACE_DETECTION: 1123 return commandStartFaceDetectionL(arg1); 1124 case CAMERA_CMD_STOP_FACE_DETECTION: { 1125 SharedParameters::Lock l(mParameters); 1126 return commandStopFaceDetectionL(l.mParameters); 1127 } 1128 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 1129 return commandEnableFocusMoveMsgL(arg1 == 1); 1130 case CAMERA_CMD_PING: 1131 return commandPingL(); 1132 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT: 1133 return commandSetVideoBufferCountL(arg1); 1134 default: 1135 ALOGE("%s: Unknown command %d (arguments %d, %d)", 1136 __FUNCTION__, cmd, arg1, arg2); 1137 return BAD_VALUE; 1138 } 1139} 1140 1141status_t Camera2Client::commandStartSmoothZoomL() { 1142 ALOGE("%s: Unimplemented!", __FUNCTION__); 1143 return OK; 1144} 1145 1146status_t Camera2Client::commandStopSmoothZoomL() { 1147 ALOGE("%s: Unimplemented!", __FUNCTION__); 1148 return OK; 1149} 1150 1151status_t Camera2Client::commandSetDisplayOrientationL(int degrees) { 1152 int transform = Parameters::degToTransform(degrees, 1153 mCameraFacing == CAMERA_FACING_FRONT); 1154 if (transform == -1) { 1155 ALOGE("%s: Camera %d: Error setting %d as display orientation value", 1156 __FUNCTION__, mCameraId, degrees); 1157 return BAD_VALUE; 1158 } 1159 SharedParameters::Lock l(mParameters); 1160 if (transform != l.mParameters.previewTransform && 1161 getPreviewStreamId() != NO_STREAM) { 1162 mDevice->setStreamTransform(getPreviewStreamId(), transform); 1163 } 1164 l.mParameters.previewTransform = transform; 1165 return OK; 1166} 1167 1168status_t Camera2Client::commandEnableShutterSoundL(bool enable) { 1169 SharedParameters::Lock l(mParameters); 1170 if (enable) { 1171 l.mParameters.playShutterSound = true; 1172 return OK; 1173 } 1174 1175 // Disabling shutter sound may not be allowed. In that case only 1176 // allow the mediaserver process to disable the sound. 1177 char value[PROPERTY_VALUE_MAX]; 1178 property_get("ro.camera.sound.forced", value, "0"); 1179 if (strncmp(value, "0", 2) != 0) { 1180 // Disabling shutter sound is not allowed. Deny if the current 1181 // process is not mediaserver. 1182 if (getCallingPid() != getpid()) { 1183 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", 1184 getCallingPid()); 1185 return PERMISSION_DENIED; 1186 } 1187 } 1188 1189 l.mParameters.playShutterSound = false; 1190 return OK; 1191} 1192 1193status_t Camera2Client::commandPlayRecordingSoundL() { 1194 mCameraService->playSound(CameraService::SOUND_RECORDING); 1195 return OK; 1196} 1197 1198status_t Camera2Client::commandStartFaceDetectionL(int type) { 1199 ALOGV("%s: Camera %d: Starting face detection", 1200 __FUNCTION__, mCameraId); 1201 status_t res; 1202 SharedParameters::Lock l(mParameters); 1203 switch (l.mParameters.state) { 1204 case Parameters::DISCONNECTED: 1205 case Parameters::STOPPED: 1206 case Parameters::WAITING_FOR_PREVIEW_WINDOW: 1207 case Parameters::STILL_CAPTURE: 1208 ALOGE("%s: Camera %d: Cannot start face detection without preview active", 1209 __FUNCTION__, mCameraId); 1210 return INVALID_OPERATION; 1211 case Parameters::PREVIEW: 1212 case Parameters::RECORD: 1213 case Parameters::VIDEO_SNAPSHOT: 1214 // Good to go for starting face detect 1215 break; 1216 } 1217 // Ignoring type 1218 if (l.mParameters.fastInfo.bestFaceDetectMode == 1219 ANDROID_STATS_FACE_DETECTION_OFF) { 1220 ALOGE("%s: Camera %d: Face detection not supported", 1221 __FUNCTION__, mCameraId); 1222 return INVALID_OPERATION; 1223 } 1224 if (l.mParameters.enableFaceDetect) return OK; 1225 1226 l.mParameters.enableFaceDetect = true; 1227 1228 res = updateRequests(l.mParameters); 1229 1230 return res; 1231} 1232 1233status_t Camera2Client::commandStopFaceDetectionL(Parameters ¶ms) { 1234 status_t res = OK; 1235 ALOGV("%s: Camera %d: Stopping face detection", 1236 __FUNCTION__, mCameraId); 1237 1238 if (!params.enableFaceDetect) return OK; 1239 1240 params.enableFaceDetect = false; 1241 1242 if (params.state == Parameters::PREVIEW 1243 || params.state == Parameters::RECORD 1244 || params.state == Parameters::VIDEO_SNAPSHOT) { 1245 res = updateRequests(params); 1246 } 1247 1248 return res; 1249} 1250 1251status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) { 1252 SharedParameters::Lock l(mParameters); 1253 l.mParameters.enableFocusMoveMessages = enable; 1254 1255 return OK; 1256} 1257 1258status_t Camera2Client::commandPingL() { 1259 // Always ping back if access is proper and device is alive 1260 SharedParameters::Lock l(mParameters); 1261 if (l.mParameters.state != Parameters::DISCONNECTED) { 1262 return OK; 1263 } else { 1264 return NO_INIT; 1265 } 1266} 1267 1268status_t Camera2Client::commandSetVideoBufferCountL(size_t count) { 1269 if (recordingEnabledL()) { 1270 ALOGE("%s: Camera %d: Error setting video buffer count after " 1271 "recording was started", __FUNCTION__, mCameraId); 1272 return INVALID_OPERATION; 1273 } 1274 1275 return mStreamingProcessor->setRecordingBufferCount(count); 1276} 1277 1278/** Device-related methods */ 1279 1280void Camera2Client::notifyError(int errorCode, int arg1, int arg2) { 1281 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2); 1282} 1283 1284void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) { 1285 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__, 1286 frameNumber, timestamp); 1287} 1288 1289void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { 1290 ALOGV("%s: Autofocus state now %d, last trigger %d", 1291 __FUNCTION__, newState, triggerId); 1292 bool sendCompletedMessage = false; 1293 bool sendMovingMessage = false; 1294 1295 bool success = false; 1296 bool afInMotion = false; 1297 { 1298 SharedParameters::Lock l(mParameters); 1299 switch (l.mParameters.focusMode) { 1300 case Parameters::FOCUS_MODE_AUTO: 1301 case Parameters::FOCUS_MODE_MACRO: 1302 // Don't send notifications upstream if they're not for the current AF 1303 // trigger. For example, if cancel was called in between, or if we 1304 // already sent a notification about this AF call. 1305 if (triggerId != l.mParameters.currentAfTriggerId) break; 1306 switch (newState) { 1307 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1308 success = true; 1309 // no break 1310 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1311 sendCompletedMessage = true; 1312 l.mParameters.currentAfTriggerId = -1; 1313 break; 1314 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1315 // Just starting focusing, ignore 1316 break; 1317 case ANDROID_CONTROL_AF_STATE_INACTIVE: 1318 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1319 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1320 default: 1321 // Unexpected in AUTO/MACRO mode 1322 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d", 1323 __FUNCTION__, newState); 1324 break; 1325 } 1326 break; 1327 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1328 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1329 switch (newState) { 1330 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1331 success = true; 1332 // no break 1333 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1334 // Don't send notifications upstream if they're not for 1335 // the current AF trigger. For example, if cancel was 1336 // called in between, or if we already sent a 1337 // notification about this AF call. 1338 // Send both a 'AF done' callback and a 'AF move' callback 1339 if (triggerId != l.mParameters.currentAfTriggerId) break; 1340 sendCompletedMessage = true; 1341 afInMotion = false; 1342 if (l.mParameters.enableFocusMoveMessages && 1343 l.mParameters.afInMotion) { 1344 sendMovingMessage = true; 1345 } 1346 l.mParameters.currentAfTriggerId = -1; 1347 break; 1348 case ANDROID_CONTROL_AF_STATE_INACTIVE: 1349 // Cancel was called, or we switched state; care if 1350 // currently moving 1351 afInMotion = false; 1352 if (l.mParameters.enableFocusMoveMessages && 1353 l.mParameters.afInMotion) { 1354 sendMovingMessage = true; 1355 } 1356 break; 1357 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1358 // Start passive scan, inform upstream 1359 afInMotion = true; 1360 // no break 1361 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1362 // Stop passive scan, inform upstream 1363 if (l.mParameters.enableFocusMoveMessages) { 1364 sendMovingMessage = true; 1365 } 1366 break; 1367 } 1368 l.mParameters.afInMotion = afInMotion; 1369 break; 1370 case Parameters::FOCUS_MODE_EDOF: 1371 case Parameters::FOCUS_MODE_INFINITY: 1372 case Parameters::FOCUS_MODE_FIXED: 1373 default: 1374 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) { 1375 ALOGE("%s: Unexpected AF state change %d " 1376 "(ID %d) in focus mode %d", 1377 __FUNCTION__, newState, triggerId, 1378 l.mParameters.focusMode); 1379 } 1380 } 1381 } 1382 if (sendMovingMessage) { 1383 SharedCameraClient::Lock l(mSharedCameraClient); 1384 if (l.mCameraClient != 0) { 1385 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 1386 afInMotion ? 1 : 0, 0); 1387 } 1388 } 1389 if (sendCompletedMessage) { 1390 SharedCameraClient::Lock l(mSharedCameraClient); 1391 if (l.mCameraClient != 0) { 1392 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, 1393 success ? 1 : 0, 0); 1394 } 1395 } 1396} 1397 1398void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { 1399 ALOGV("%s: Autoexposure state now %d, last trigger %d", 1400 __FUNCTION__, newState, triggerId); 1401 mCaptureSequencer->notifyAutoExposure(newState, triggerId); 1402} 1403 1404void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) { 1405 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d", 1406 __FUNCTION__, newState, triggerId); 1407} 1408 1409int Camera2Client::getCameraId() const { 1410 return mCameraId; 1411} 1412 1413const sp<Camera2Device>& Camera2Client::getCameraDevice() { 1414 return mDevice; 1415} 1416 1417const sp<CameraService>& Camera2Client::getCameraService() { 1418 return mCameraService; 1419} 1420 1421camera2::SharedParameters& Camera2Client::getParameters() { 1422 return mParameters; 1423} 1424 1425int Camera2Client::getPreviewStreamId() const { 1426 return mStreamingProcessor->getPreviewStreamId(); 1427} 1428 1429int Camera2Client::getCaptureStreamId() const { 1430 return mJpegProcessor->getStreamId(); 1431} 1432 1433int Camera2Client::getCallbackStreamId() const { 1434 return mCallbackProcessor->getStreamId(); 1435} 1436 1437int Camera2Client::getRecordingStreamId() const { 1438 return mStreamingProcessor->getRecordingStreamId(); 1439} 1440 1441int Camera2Client::getZslStreamId() const { 1442 return mZslProcessor->getStreamId(); 1443} 1444 1445status_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId, 1446 wp<camera2::FrameProcessor::FilteredListener> listener) { 1447 return mFrameProcessor->registerListener(minId, maxId, listener); 1448} 1449 1450status_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId, 1451 wp<camera2::FrameProcessor::FilteredListener> listener) { 1452 return mFrameProcessor->removeListener(minId, maxId, listener); 1453} 1454 1455status_t Camera2Client::stopStream() { 1456 return mStreamingProcessor->stopStream(); 1457} 1458 1459Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client): 1460 mCameraClient(client.mCameraClient), 1461 mSharedClient(client) { 1462 mSharedClient.mCameraClientLock.lock(); 1463} 1464 1465Camera2Client::SharedCameraClient::Lock::~Lock() { 1466 mSharedClient.mCameraClientLock.unlock(); 1467} 1468 1469Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client): 1470 mCameraClient(client) { 1471} 1472 1473Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=( 1474 const sp<ICameraClient>&client) { 1475 Mutex::Autolock l(mCameraClientLock); 1476 mCameraClient = client; 1477 return *this; 1478} 1479 1480void Camera2Client::SharedCameraClient::clear() { 1481 Mutex::Autolock l(mCameraClientLock); 1482 mCameraClient.clear(); 1483} 1484 1485const int32_t Camera2Client::kPreviewRequestIdStart; 1486const int32_t Camera2Client::kPreviewRequestIdEnd; 1487const int32_t Camera2Client::kRecordingRequestIdStart; 1488const int32_t Camera2Client::kRecordingRequestIdEnd; 1489const int32_t Camera2Client::kCaptureRequestIdStart; 1490const int32_t Camera2Client::kCaptureRequestIdEnd; 1491 1492/** Utility methods */ 1493 1494status_t Camera2Client::updateRequests(Parameters ¶ms) { 1495 status_t res; 1496 1497 ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state); 1498 1499 res = mStreamingProcessor->incrementStreamingIds(); 1500 if (res != OK) { 1501 ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)", 1502 __FUNCTION__, mCameraId, strerror(-res), res); 1503 return res; 1504 } 1505 1506 res = mStreamingProcessor->updatePreviewRequest(params); 1507 if (res != OK) { 1508 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 1509 __FUNCTION__, mCameraId, strerror(-res), res); 1510 return res; 1511 } 1512 res = mStreamingProcessor->updateRecordingRequest(params); 1513 if (res != OK) { 1514 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 1515 __FUNCTION__, mCameraId, strerror(-res), res); 1516 return res; 1517 } 1518 1519 if (params.state == Parameters::PREVIEW) { 1520 res = startPreviewL(params, true); 1521 if (res != OK) { 1522 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 1523 __FUNCTION__, mCameraId, strerror(-res), res); 1524 return res; 1525 } 1526 } else if (params.state == Parameters::RECORD || 1527 params.state == Parameters::VIDEO_SNAPSHOT) { 1528 res = startRecordingL(params, true); 1529 if (res != OK) { 1530 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 1531 __FUNCTION__, mCameraId, strerror(-res), res); 1532 return res; 1533 } 1534 } 1535 return res; 1536} 1537 1538 1539size_t Camera2Client::calculateBufferSize(int width, int height, 1540 int format, int stride) { 1541 switch (format) { 1542 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 1543 return width * height * 2; 1544 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 1545 return width * height * 3 / 2; 1546 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 1547 return width * height * 2; 1548 case HAL_PIXEL_FORMAT_YV12: { // YV12 1549 size_t ySize = stride * height; 1550 size_t uvStride = (stride / 2 + 0xF) & ~0xF; 1551 size_t uvSize = uvStride * height / 2; 1552 return ySize + uvSize * 2; 1553 } 1554 case HAL_PIXEL_FORMAT_RGB_565: 1555 return width * height * 2; 1556 case HAL_PIXEL_FORMAT_RGBA_8888: 1557 return width * height * 4; 1558 case HAL_PIXEL_FORMAT_RAW_SENSOR: 1559 return width * height * 2; 1560 default: 1561 ALOGE("%s: Unknown preview format: %x", 1562 __FUNCTION__, format); 1563 return 0; 1564 } 1565} 1566 1567status_t Camera2Client::syncWithDevice() { 1568 ATRACE_CALL(); 1569 const nsecs_t kMaxSyncTimeout = 100000000; // 100 ms 1570 status_t res; 1571 1572 int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); 1573 if (activeRequestId == 0) return OK; 1574 1575 res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout); 1576 if (res == TIMED_OUT) { 1577 ALOGE("%s: Camera %d: Timed out waiting sync with HAL", 1578 __FUNCTION__, mCameraId); 1579 } else if (res != OK) { 1580 ALOGE("%s: Camera %d: Error while waiting to sync with HAL", 1581 __FUNCTION__, mCameraId); 1582 } 1583 return res; 1584} 1585 1586} // namespace android 1587