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