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