CameraService.cpp revision cc776718c0be7c31fe5ab4fc1446d377be60369f
1/* 2 * Copyright (C) 2008 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 "CameraService" 18//#define LOG_NDEBUG 0 19 20#include <algorithm> 21#include <climits> 22#include <stdio.h> 23#include <cstring> 24#include <ctime> 25#include <string> 26#include <sys/types.h> 27#include <inttypes.h> 28#include <pthread.h> 29 30#include <binder/AppOpsManager.h> 31#include <binder/IPCThreadState.h> 32#include <binder/IServiceManager.h> 33#include <binder/MemoryBase.h> 34#include <binder/MemoryHeapBase.h> 35#include <binder/ProcessInfoService.h> 36#include <cutils/atomic.h> 37#include <cutils/properties.h> 38#include <cutils/multiuser.h> 39#include <gui/Surface.h> 40#include <hardware/hardware.h> 41#include <media/AudioSystem.h> 42#include <media/IMediaHTTPService.h> 43#include <media/mediaplayer.h> 44#include <utils/Errors.h> 45#include <utils/Log.h> 46#include <utils/String16.h> 47#include <utils/Trace.h> 48#include <system/camera_vendor_tags.h> 49#include <system/camera_metadata.h> 50#include <system/camera.h> 51 52#include "CameraService.h" 53#include "api1/CameraClient.h" 54#include "api1/Camera2Client.h" 55#include "api_pro/ProCamera2Client.h" 56#include "api2/CameraDeviceClient.h" 57#include "utils/CameraTraces.h" 58#include "CameraDeviceFactory.h" 59 60namespace android { 61 62// ---------------------------------------------------------------------------- 63// Logging support -- this is for debugging only 64// Use "adb shell dumpsys media.camera -v 1" to change it. 65volatile int32_t gLogLevel = 0; 66 67#define LOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 68#define LOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 69 70static void setLogLevel(int level) { 71 android_atomic_write(level, &gLogLevel); 72} 73 74// ---------------------------------------------------------------------------- 75 76extern "C" { 77static void camera_device_status_change( 78 const struct camera_module_callbacks* callbacks, 79 int camera_id, 80 int new_status) { 81 sp<CameraService> cs = const_cast<CameraService*>( 82 static_cast<const CameraService*>(callbacks)); 83 84 cs->onDeviceStatusChanged(static_cast<camera_device_status_t>(camera_id), 85 static_cast<camera_device_status_t>(new_status)); 86} 87 88static void torch_mode_status_change( 89 const struct camera_module_callbacks* callbacks, 90 const char* camera_id, 91 int new_status) { 92 if (!callbacks || !camera_id) { 93 ALOGE("%s invalid parameters. callbacks %p, camera_id %p", __FUNCTION__, 94 callbacks, camera_id); 95 } 96 sp<CameraService> cs = const_cast<CameraService*>( 97 static_cast<const CameraService*>(callbacks)); 98 99 ICameraServiceListener::TorchStatus status; 100 switch (new_status) { 101 case TORCH_MODE_STATUS_NOT_AVAILABLE: 102 status = ICameraServiceListener::TORCH_STATUS_NOT_AVAILABLE; 103 break; 104 case TORCH_MODE_STATUS_AVAILABLE_OFF: 105 status = ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF; 106 break; 107 case TORCH_MODE_STATUS_AVAILABLE_ON: 108 status = ICameraServiceListener::TORCH_STATUS_AVAILABLE_ON; 109 break; 110 default: 111 ALOGE("Unknown torch status %d", new_status); 112 return; 113 } 114 115 cs->onTorchStatusChanged( 116 String8(camera_id), 117 status); 118} 119} // extern "C" 120 121// ---------------------------------------------------------------------------- 122 123// This is ugly and only safe if we never re-create the CameraService, but 124// should be ok for now. 125static CameraService *gCameraService; 126 127CameraService::CameraService() 128 : mEventLog(DEFAULT_EVICTION_LOG_LENGTH), mSoundRef(0), mModule(0), mFlashlight(0) 129{ 130 ALOGI("CameraService started (pid=%d)", getpid()); 131 gCameraService = this; 132 133 this->camera_device_status_change = android::camera_device_status_change; 134 this->torch_mode_status_change = android::torch_mode_status_change; 135 136 mServiceLockWrapper = std::make_shared<WaitableMutexWrapper>(&mServiceLock); 137} 138 139void CameraService::onFirstRef() 140{ 141 ALOGI("CameraService process starting"); 142 143 BnCameraService::onFirstRef(); 144 145 camera_module_t *rawModule; 146 if (hw_get_module(CAMERA_HARDWARE_MODULE_ID, 147 (const hw_module_t **)&rawModule) < 0) { 148 ALOGE("Could not load camera HAL module"); 149 mNumberOfCameras = 0; 150 } 151 else { 152 mModule = new CameraModule(rawModule); 153 const hw_module_t *common = mModule->getRawModule(); 154 ALOGI("Loaded \"%s\" camera module", common->name); 155 mNumberOfCameras = mModule->getNumberOfCameras(); 156 157 mFlashlight = new CameraFlashlight(*mModule, *this); 158 status_t res = mFlashlight->findFlashUnits(); 159 if (res) { 160 // impossible because we haven't open any camera devices. 161 ALOGE("Failed to find flash units."); 162 } 163 164 for (int i = 0; i < mNumberOfCameras; i++) { 165 String8 cameraId = String8::format("%d", i); 166 167 // Defaults to use for cost and conflicting devices 168 int cost = 100; 169 char** conflicting_devices = nullptr; 170 size_t conflicting_devices_length = 0; 171 172 // If using post-2.4 module version, query the cost + conflicting devices from the HAL 173 if (common->module_api_version >= CAMERA_MODULE_API_VERSION_2_4) { 174 struct camera_info info; 175 status_t rc = mModule->getCameraInfo(i, &info); 176 if (rc == NO_ERROR) { 177 cost = info.resource_cost; 178 conflicting_devices = info.conflicting_devices; 179 conflicting_devices_length = info.conflicting_devices_length; 180 } else { 181 ALOGE("%s: Received error loading camera info for device %d, cost and" 182 " conflicting devices fields set to defaults for this device.", 183 __FUNCTION__, i); 184 } 185 } 186 187 std::set<String8> conflicting; 188 for (size_t i = 0; i < conflicting_devices_length; i++) { 189 conflicting.emplace(String8(conflicting_devices[i])); 190 } 191 192 // Initialize state for each camera device 193 { 194 Mutex::Autolock lock(mCameraStatesLock); 195 mCameraStates.emplace(cameraId, std::make_shared<CameraState>(cameraId, cost, 196 conflicting)); 197 } 198 199 if (mFlashlight->hasFlashUnit(cameraId)) { 200 mTorchStatusMap.add(cameraId, 201 ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF); 202 } 203 } 204 205 if (common->module_api_version >= CAMERA_MODULE_API_VERSION_2_1) { 206 mModule->setCallbacks(this); 207 } 208 209 VendorTagDescriptor::clearGlobalVendorTagDescriptor(); 210 211 if (common->module_api_version >= CAMERA_MODULE_API_VERSION_2_2) { 212 setUpVendorTags(); 213 } 214 215 CameraDeviceFactory::registerService(this); 216 } 217} 218 219CameraService::~CameraService() { 220 if (mModule) { 221 delete mModule; 222 mModule = nullptr; 223 } 224 VendorTagDescriptor::clearGlobalVendorTagDescriptor(); 225 gCameraService = nullptr; 226} 227 228void CameraService::onDeviceStatusChanged(camera_device_status_t cameraId, 229 camera_device_status_t newStatus) { 230 ALOGI("%s: Status changed for cameraId=%d, newStatus=%d", __FUNCTION__, 231 cameraId, newStatus); 232 233 String8 id = String8::format("%d", cameraId); 234 std::shared_ptr<CameraState> state = getCameraState(id); 235 236 if (state == nullptr) { 237 ALOGE("%s: Bad camera ID %d", __FUNCTION__, cameraId); 238 return; 239 } 240 241 ICameraServiceListener::Status oldStatus = state->getStatus(); 242 243 if (oldStatus == static_cast<ICameraServiceListener::Status>(newStatus)) { 244 ALOGE("%s: State transition to the same status %#x not allowed", __FUNCTION__, newStatus); 245 return; 246 } 247 248 if (newStatus == CAMERA_DEVICE_STATUS_NOT_PRESENT) { 249 sp<BasicClient> clientToDisconnect; 250 { 251 // Don't do this in updateStatus to avoid deadlock over mServiceLock 252 Mutex::Autolock lock(mServiceLock); 253 254 // Set the device status to NOT_PRESENT, clients will no longer be able to connect 255 // to this device until the status changes 256 updateStatus(ICameraServiceListener::STATUS_NOT_PRESENT, id); 257 258 // Remove cached shim parameters 259 state->setShimParams(CameraParameters()); 260 261 // Remove the client from the list of active clients 262 clientToDisconnect = removeClientLocked(id); 263 264 // Notify the client of disconnection 265 clientToDisconnect->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED, 266 CaptureResultExtras{}); 267 } 268 269 ALOGI("%s: Client for camera ID %s evicted due to device status change from HAL", 270 __FUNCTION__, id.string()); 271 272 // Disconnect client 273 if (clientToDisconnect.get() != nullptr) { 274 // Ensure not in binder RPC so client disconnect PID checks work correctly 275 LOG_ALWAYS_FATAL_IF(getCallingPid() != getpid(), 276 "onDeviceStatusChanged must be called from the camera service process!"); 277 clientToDisconnect->disconnect(); 278 } 279 280 } else { 281 updateStatus(static_cast<ICameraServiceListener::Status>(newStatus), id); 282 } 283 284} 285 286void CameraService::onTorchStatusChanged(const String8& cameraId, 287 ICameraServiceListener::TorchStatus newStatus) { 288 Mutex::Autolock al(mTorchStatusMutex); 289 onTorchStatusChangedLocked(cameraId, newStatus); 290} 291 292void CameraService::onTorchStatusChangedLocked(const String8& cameraId, 293 ICameraServiceListener::TorchStatus newStatus) { 294 ALOGI("%s: Torch status changed for cameraId=%s, newStatus=%d", 295 __FUNCTION__, cameraId.string(), newStatus); 296 297 ICameraServiceListener::TorchStatus status; 298 status_t res = getTorchStatusLocked(cameraId, &status); 299 if (res) { 300 ALOGE("%s: cannot get torch status of camera %s", cameraId.string()); 301 return; 302 } 303 if (status == newStatus) { 304 ALOGE("%s: Torch state transition to the same status 0x%x not allowed", 305 __FUNCTION__, (uint32_t)newStatus); 306 return; 307 } 308 309 res = setTorchStatusLocked(cameraId, newStatus); 310 if (res) { 311 ALOGE("%s: Failed to set the torch status", __FUNCTION__, 312 (uint32_t)newStatus); 313 return; 314 } 315 316 { 317 Mutex::Autolock lock(mStatusListenerLock); 318 for (auto& i : mListenerList) { 319 i->onTorchStatusChanged(newStatus, String16{cameraId}); 320 } 321 } 322} 323 324 325int32_t CameraService::getNumberOfCameras() { 326 return mNumberOfCameras; 327} 328 329status_t CameraService::getCameraInfo(int cameraId, 330 struct CameraInfo* cameraInfo) { 331 if (!mModule) { 332 return -ENODEV; 333 } 334 335 if (cameraId < 0 || cameraId >= mNumberOfCameras) { 336 return BAD_VALUE; 337 } 338 339 struct camera_info info; 340 status_t rc = filterGetInfoErrorCode( 341 mModule->getCameraInfo(cameraId, &info)); 342 cameraInfo->facing = info.facing; 343 cameraInfo->orientation = info.orientation; 344 return rc; 345} 346 347int CameraService::cameraIdToInt(const String8& cameraId) { 348 errno = 0; 349 size_t pos = 0; 350 int ret = stoi(std::string{cameraId.string()}, &pos); 351 if (errno != 0 || pos != cameraId.size()) { 352 return -1; 353 } 354 return ret; 355} 356 357status_t CameraService::generateShimMetadata(int cameraId, /*out*/CameraMetadata* cameraInfo) { 358 status_t ret = OK; 359 struct CameraInfo info; 360 if ((ret = getCameraInfo(cameraId, &info)) != OK) { 361 return ret; 362 } 363 364 CameraMetadata shimInfo; 365 int32_t orientation = static_cast<int32_t>(info.orientation); 366 if ((ret = shimInfo.update(ANDROID_SENSOR_ORIENTATION, &orientation, 1)) != OK) { 367 return ret; 368 } 369 370 uint8_t facing = (info.facing == CAMERA_FACING_FRONT) ? 371 ANDROID_LENS_FACING_FRONT : ANDROID_LENS_FACING_BACK; 372 if ((ret = shimInfo.update(ANDROID_LENS_FACING, &facing, 1)) != OK) { 373 return ret; 374 } 375 376 CameraParameters shimParams; 377 if ((ret = getLegacyParametersLazy(cameraId, /*out*/&shimParams)) != OK) { 378 // Error logged by callee 379 return ret; 380 } 381 382 Vector<Size> sizes; 383 Vector<Size> jpegSizes; 384 Vector<int32_t> formats; 385 const char* supportedPreviewFormats; 386 { 387 shimParams.getSupportedPreviewSizes(/*out*/sizes); 388 shimParams.getSupportedPreviewFormats(/*out*/formats); 389 shimParams.getSupportedPictureSizes(/*out*/jpegSizes); 390 } 391 392 // Always include IMPLEMENTATION_DEFINED 393 formats.add(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED); 394 395 const size_t INTS_PER_CONFIG = 4; 396 397 // Build available stream configurations metadata 398 size_t streamConfigSize = (sizes.size() * formats.size() + jpegSizes.size()) * INTS_PER_CONFIG; 399 400 Vector<int32_t> streamConfigs; 401 streamConfigs.setCapacity(streamConfigSize); 402 403 for (size_t i = 0; i < formats.size(); ++i) { 404 for (size_t j = 0; j < sizes.size(); ++j) { 405 streamConfigs.add(formats[i]); 406 streamConfigs.add(sizes[j].width); 407 streamConfigs.add(sizes[j].height); 408 streamConfigs.add(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT); 409 } 410 } 411 412 for (size_t i = 0; i < jpegSizes.size(); ++i) { 413 streamConfigs.add(HAL_PIXEL_FORMAT_BLOB); 414 streamConfigs.add(jpegSizes[i].width); 415 streamConfigs.add(jpegSizes[i].height); 416 streamConfigs.add(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT); 417 } 418 419 if ((ret = shimInfo.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, 420 streamConfigs.array(), streamConfigSize)) != OK) { 421 return ret; 422 } 423 424 int64_t fakeMinFrames[0]; 425 // TODO: Fixme, don't fake min frame durations. 426 if ((ret = shimInfo.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, 427 fakeMinFrames, 0)) != OK) { 428 return ret; 429 } 430 431 int64_t fakeStalls[0]; 432 // TODO: Fixme, don't fake stall durations. 433 if ((ret = shimInfo.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, 434 fakeStalls, 0)) != OK) { 435 return ret; 436 } 437 438 *cameraInfo = shimInfo; 439 return OK; 440} 441 442status_t CameraService::getCameraCharacteristics(int cameraId, 443 CameraMetadata* cameraInfo) { 444 if (!cameraInfo) { 445 ALOGE("%s: cameraInfo is NULL", __FUNCTION__); 446 return BAD_VALUE; 447 } 448 449 if (!mModule) { 450 ALOGE("%s: camera hardware module doesn't exist", __FUNCTION__); 451 return -ENODEV; 452 } 453 454 if (cameraId < 0 || cameraId >= mNumberOfCameras) { 455 ALOGE("%s: Invalid camera id: %d", __FUNCTION__, cameraId); 456 return BAD_VALUE; 457 } 458 459 int facing; 460 status_t ret = OK; 461 if (mModule->getRawModule()->module_api_version < CAMERA_MODULE_API_VERSION_2_0 || 462 getDeviceVersion(cameraId, &facing) <= CAMERA_DEVICE_API_VERSION_2_1 ) { 463 /** 464 * Backwards compatibility mode for old HALs: 465 * - Convert CameraInfo into static CameraMetadata properties. 466 * - Retrieve cached CameraParameters for this camera. If none exist, 467 * attempt to open CameraClient and retrieve the CameraParameters. 468 * - Convert cached CameraParameters into static CameraMetadata 469 * properties. 470 */ 471 ALOGI("%s: Switching to HAL1 shim implementation...", __FUNCTION__); 472 473 if ((ret = generateShimMetadata(cameraId, cameraInfo)) != OK) { 474 return ret; 475 } 476 477 } else { 478 /** 479 * Normal HAL 2.1+ codepath. 480 */ 481 struct camera_info info; 482 ret = filterGetInfoErrorCode(mModule->getCameraInfo(cameraId, &info)); 483 *cameraInfo = info.static_camera_characteristics; 484 } 485 486 return ret; 487} 488 489int CameraService::getCallingPid() { 490 return IPCThreadState::self()->getCallingPid(); 491} 492 493int CameraService::getCallingUid() { 494 return IPCThreadState::self()->getCallingUid(); 495} 496 497String8 CameraService::getFormattedCurrentTime() { 498 time_t now = time(nullptr); 499 char formattedTime[64]; 500 strftime(formattedTime, sizeof(formattedTime), "%m-%d %H:%M:%S", localtime(&now)); 501 return String8(formattedTime); 502} 503 504int CameraService::getCameraPriorityFromProcState(int procState) { 505 // Find the priority for the camera usage based on the process state. Higher priority clients 506 // win for evictions. 507 // Note: Unlike the ordering for ActivityManager, persistent system processes will always lose 508 // the camera to the top/foreground applications. 509 switch(procState) { 510 case PROCESS_STATE_TOP: // User visible 511 return 100; 512 case PROCESS_STATE_IMPORTANT_FOREGROUND: // Foreground 513 return 90; 514 case PROCESS_STATE_PERSISTENT: // Persistent system services 515 case PROCESS_STATE_PERSISTENT_UI: 516 return 80; 517 case PROCESS_STATE_IMPORTANT_BACKGROUND: // "Important" background processes 518 return 70; 519 case PROCESS_STATE_BACKUP: // Everything else 520 case PROCESS_STATE_HEAVY_WEIGHT: 521 case PROCESS_STATE_SERVICE: 522 case PROCESS_STATE_RECEIVER: 523 case PROCESS_STATE_HOME: 524 case PROCESS_STATE_LAST_ACTIVITY: 525 case PROCESS_STATE_CACHED_ACTIVITY: 526 case PROCESS_STATE_CACHED_ACTIVITY_CLIENT: 527 case PROCESS_STATE_CACHED_EMPTY: 528 return 1; 529 case PROCESS_STATE_NONEXISTENT: 530 return -1; 531 default: 532 ALOGE("%s: Received unknown process state from ActivityManagerService!", __FUNCTION__); 533 return -1; 534 } 535} 536 537status_t CameraService::getCameraVendorTagDescriptor(/*out*/sp<VendorTagDescriptor>& desc) { 538 if (!mModule) { 539 ALOGE("%s: camera hardware module doesn't exist", __FUNCTION__); 540 return -ENODEV; 541 } 542 543 desc = VendorTagDescriptor::getGlobalVendorTagDescriptor(); 544 return OK; 545} 546 547int CameraService::getDeviceVersion(int cameraId, int* facing) { 548 struct camera_info info; 549 if (mModule->getCameraInfo(cameraId, &info) != OK) { 550 return -1; 551 } 552 553 int deviceVersion; 554 if (mModule->getRawModule()->module_api_version >= CAMERA_MODULE_API_VERSION_2_0) { 555 deviceVersion = info.device_version; 556 } else { 557 deviceVersion = CAMERA_DEVICE_API_VERSION_1_0; 558 } 559 560 if (facing) { 561 *facing = info.facing; 562 } 563 564 return deviceVersion; 565} 566 567status_t CameraService::filterGetInfoErrorCode(status_t err) { 568 switch(err) { 569 case NO_ERROR: 570 case -EINVAL: 571 return err; 572 default: 573 break; 574 } 575 return -ENODEV; 576} 577 578bool CameraService::setUpVendorTags() { 579 vendor_tag_ops_t vOps = vendor_tag_ops_t(); 580 581 // Check if vendor operations have been implemented 582 if (!mModule->isVendorTagDefined()) { 583 ALOGI("%s: No vendor tags defined for this device.", __FUNCTION__); 584 return false; 585 } 586 587 ATRACE_BEGIN("camera3->get_metadata_vendor_tag_ops"); 588 mModule->getVendorTagOps(&vOps); 589 ATRACE_END(); 590 591 // Ensure all vendor operations are present 592 if (vOps.get_tag_count == NULL || vOps.get_all_tags == NULL || 593 vOps.get_section_name == NULL || vOps.get_tag_name == NULL || 594 vOps.get_tag_type == NULL) { 595 ALOGE("%s: Vendor tag operations not fully defined. Ignoring definitions." 596 , __FUNCTION__); 597 return false; 598 } 599 600 // Read all vendor tag definitions into a descriptor 601 sp<VendorTagDescriptor> desc; 602 status_t res; 603 if ((res = VendorTagDescriptor::createDescriptorFromOps(&vOps, /*out*/desc)) 604 != OK) { 605 ALOGE("%s: Could not generate descriptor from vendor tag operations," 606 "received error %s (%d). Camera clients will not be able to use" 607 "vendor tags", __FUNCTION__, strerror(res), res); 608 return false; 609 } 610 611 // Set the global descriptor to use with camera metadata 612 VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc); 613 return true; 614} 615 616status_t CameraService::makeClient(const sp<CameraService>& cameraService, 617 const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId, 618 int facing, int clientPid, uid_t clientUid, int servicePid, bool legacyMode, 619 int halVersion, int deviceVersion, apiLevel effectiveApiLevel, 620 /*out*/sp<BasicClient>* client) { 621 622 // TODO: Update CameraClients + HAL interface to use strings for Camera IDs 623 int id = cameraIdToInt(cameraId); 624 if (id == -1) { 625 ALOGE("%s: Invalid camera ID %s, cannot convert to integer.", __FUNCTION__, 626 cameraId.string()); 627 return BAD_VALUE; 628 } 629 630 if (halVersion < 0 || halVersion == deviceVersion) { 631 // Default path: HAL version is unspecified by caller, create CameraClient 632 // based on device version reported by the HAL. 633 switch(deviceVersion) { 634 case CAMERA_DEVICE_API_VERSION_1_0: 635 if (effectiveApiLevel == API_1) { // Camera1 API route 636 sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get()); 637 *client = new CameraClient(cameraService, tmp, packageName, id, facing, 638 clientPid, clientUid, getpid(), legacyMode); 639 } else { // Camera2 API route 640 ALOGW("Camera using old HAL version: %d", deviceVersion); 641 return -EOPNOTSUPP; 642 } 643 break; 644 case CAMERA_DEVICE_API_VERSION_2_0: 645 case CAMERA_DEVICE_API_VERSION_2_1: 646 case CAMERA_DEVICE_API_VERSION_3_0: 647 case CAMERA_DEVICE_API_VERSION_3_1: 648 case CAMERA_DEVICE_API_VERSION_3_2: 649 case CAMERA_DEVICE_API_VERSION_3_3: 650 if (effectiveApiLevel == API_1) { // Camera1 API route 651 sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get()); 652 *client = new Camera2Client(cameraService, tmp, packageName, id, facing, 653 clientPid, clientUid, servicePid, legacyMode); 654 } else { // Camera2 API route 655 sp<ICameraDeviceCallbacks> tmp = 656 static_cast<ICameraDeviceCallbacks*>(cameraCb.get()); 657 *client = new CameraDeviceClient(cameraService, tmp, packageName, id, 658 facing, clientPid, clientUid, servicePid); 659 } 660 break; 661 default: 662 // Should not be reachable 663 ALOGE("Unknown camera device HAL version: %d", deviceVersion); 664 return INVALID_OPERATION; 665 } 666 } else { 667 // A particular HAL version is requested by caller. Create CameraClient 668 // based on the requested HAL version. 669 if (deviceVersion > CAMERA_DEVICE_API_VERSION_1_0 && 670 halVersion == CAMERA_DEVICE_API_VERSION_1_0) { 671 // Only support higher HAL version device opened as HAL1.0 device. 672 sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get()); 673 *client = new CameraClient(cameraService, tmp, packageName, id, facing, 674 clientPid, clientUid, servicePid, legacyMode); 675 } else { 676 // Other combinations (e.g. HAL3.x open as HAL2.x) are not supported yet. 677 ALOGE("Invalid camera HAL version %x: HAL %x device can only be" 678 " opened as HAL %x device", halVersion, deviceVersion, 679 CAMERA_DEVICE_API_VERSION_1_0); 680 return INVALID_OPERATION; 681 } 682 } 683 return NO_ERROR; 684} 685 686status_t CameraService::initializeShimMetadata(int cameraId) { 687 int uid = getCallingUid(); 688 689 String16 internalPackageName("media"); 690 String8 id = String8::format("%d", cameraId); 691 status_t ret = NO_ERROR; 692 sp<Client> tmp = nullptr; 693 if ((ret = connectHelper<ICameraClient,Client>(sp<ICameraClient>{nullptr}, id, 694 static_cast<int>(CAMERA_HAL_API_VERSION_UNSPECIFIED), internalPackageName, uid, API_1, 695 false, true, tmp)) != NO_ERROR) { 696 ALOGE("%s: Error %d (%s) initializing shim metadata.", __FUNCTION__, ret, strerror(ret)); 697 return ret; 698 } 699 return NO_ERROR; 700} 701 702status_t CameraService::getLegacyParametersLazy(int cameraId, 703 /*out*/ 704 CameraParameters* parameters) { 705 706 ALOGV("%s: for cameraId: %d", __FUNCTION__, cameraId); 707 708 status_t ret = 0; 709 710 if (parameters == NULL) { 711 ALOGE("%s: parameters must not be null", __FUNCTION__); 712 return BAD_VALUE; 713 } 714 715 String8 id = String8::format("%d", cameraId); 716 717 // Check if we already have parameters 718 { 719 // Scope for service lock 720 Mutex::Autolock lock(mServiceLock); 721 auto cameraState = getCameraState(id); 722 if (cameraState == nullptr) { 723 ALOGE("%s: Invalid camera ID: %s", __FUNCTION__, id.string()); 724 return BAD_VALUE; 725 } 726 CameraParameters p = cameraState->getShimParams(); 727 if (!p.isEmpty()) { 728 *parameters = p; 729 return NO_ERROR; 730 } 731 } 732 733 int64_t token = IPCThreadState::self()->clearCallingIdentity(); 734 ret = initializeShimMetadata(cameraId); 735 IPCThreadState::self()->restoreCallingIdentity(token); 736 if (ret != NO_ERROR) { 737 // Error already logged by callee 738 return ret; 739 } 740 741 // Check for parameters again 742 { 743 // Scope for service lock 744 Mutex::Autolock lock(mServiceLock); 745 auto cameraState = getCameraState(id); 746 if (cameraState == nullptr) { 747 ALOGE("%s: Invalid camera ID: %s", __FUNCTION__, id.string()); 748 return BAD_VALUE; 749 } 750 CameraParameters p = cameraState->getShimParams(); 751 if (!p.isEmpty()) { 752 *parameters = p; 753 return NO_ERROR; 754 } 755 } 756 757 ALOGE("%s: Parameters were not initialized, or were empty. Device may not be present.", 758 __FUNCTION__); 759 return INVALID_OPERATION; 760} 761 762status_t CameraService::validateConnect(const String8& cameraId, /*inout*/int& clientUid) const { 763 764 int callingPid = getCallingPid(); 765 766 if (clientUid == USE_CALLING_UID) { 767 clientUid = getCallingUid(); 768 } else { 769 // We only trust our own process to forward client UIDs 770 if (callingPid != getpid()) { 771 ALOGE("CameraService::connect X (PID %d) rejected (don't trust clientUid)", 772 callingPid); 773 return PERMISSION_DENIED; 774 } 775 } 776 777 if (!mModule) { 778 ALOGE("CameraService::connect X (PID %d) rejected (camera HAL module not loaded)", 779 callingPid); 780 return -ENODEV; 781 } 782 783 if (getCameraState(cameraId) == nullptr) { 784 ALOGE("CameraService::connect X (PID %d) rejected (invalid camera ID %s)", callingPid, 785 cameraId.string()); 786 return -ENODEV; 787 } 788 789 // Check device policy for this camera 790 char value[PROPERTY_VALUE_MAX]; 791 char key[PROPERTY_KEY_MAX]; 792 int clientUserId = multiuser_get_user_id(clientUid); 793 snprintf(key, PROPERTY_KEY_MAX, "sys.secpolicy.camera.off_%d", clientUserId); 794 property_get(key, value, "0"); 795 if (strcmp(value, "1") == 0) { 796 // Camera is disabled by DevicePolicyManager. 797 ALOGE("CameraService::connect X (PID %d) rejected (camera %s is disabled by device " 798 "policy)", callingPid, cameraId.string()); 799 return -EACCES; 800 } 801 802 return checkIfDeviceIsUsable(cameraId); 803} 804 805status_t CameraService::checkIfDeviceIsUsable(const String8& cameraId) const { 806 auto cameraState = getCameraState(cameraId); 807 int callingPid = getCallingPid(); 808 if (cameraState == nullptr) { 809 ALOGE("CameraService::connect X (PID %d) rejected (invalid camera ID %s)", callingPid, 810 cameraId.string()); 811 return -ENODEV; 812 } 813 814 ICameraServiceListener::Status currentStatus = cameraState->getStatus(); 815 if (currentStatus == ICameraServiceListener::STATUS_NOT_PRESENT) { 816 ALOGE("CameraService::connect X (PID %d) rejected (camera %s is not connected)", 817 callingPid, cameraId.string()); 818 return -ENODEV; 819 } else if (currentStatus == ICameraServiceListener::STATUS_ENUMERATING) { 820 ALOGE("CameraService::connect X (PID %d) rejected, (camera %s is initializing)", 821 callingPid, cameraId.string()); 822 return -EBUSY; 823 } 824 825 return NO_ERROR; 826} 827 828void CameraService::finishConnectLocked(const sp<BasicClient>& client, 829 const CameraService::DescriptorPtr& desc) { 830 831 // Make a descriptor for the incoming client 832 auto clientDescriptor = CameraService::CameraClientManager::makeClientDescriptor(client, desc); 833 auto evicted = mActiveClientManager.addAndEvict(clientDescriptor); 834 835 logConnected(desc->getKey(), static_cast<int>(desc->getOwnerId()), 836 String8(client->getPackageName())); 837 838 if (evicted.size() > 0) { 839 // This should never happen - clients should already have been removed in disconnect 840 for (auto& i : evicted) { 841 ALOGE("%s: Invalid state: Client for camera %s was not removed in disconnect", 842 __FUNCTION__, i->getKey().string()); 843 } 844 845 LOG_ALWAYS_FATAL("%s: Invalid state for CameraService, clients not evicted properly", 846 __FUNCTION__); 847 } 848} 849 850status_t CameraService::handleEvictionsLocked(const String8& cameraId, int clientPid, 851 apiLevel effectiveApiLevel, const sp<IBinder>& remoteCallback, const String8& packageName, 852 /*out*/ 853 sp<BasicClient>* client, 854 std::shared_ptr<resource_policy::ClientDescriptor<String8, sp<BasicClient>>>* partial) { 855 856 status_t ret = NO_ERROR; 857 std::vector<sp<BasicClient>> evictedClients; 858 DescriptorPtr clientDescriptor; 859 { 860 if (effectiveApiLevel == API_1) { 861 // If we are using API1, any existing client for this camera ID with the same remote 862 // should be returned rather than evicted to allow MediaRecorder to work properly. 863 864 auto current = mActiveClientManager.get(cameraId); 865 if (current != nullptr) { 866 auto clientSp = current->getValue(); 867 if (clientSp.get() != nullptr) { // should never be needed 868 if (clientSp->getRemote() == remoteCallback) { 869 ALOGI("CameraService::connect X (PID %d) (second call from same" 870 "app binder, returning the same client)", clientPid); 871 *client = clientSp; 872 return NO_ERROR; 873 } 874 } 875 } 876 } 877 878 // Return error if the device was unplugged or removed by the HAL for some reason 879 if ((ret = checkIfDeviceIsUsable(cameraId)) != NO_ERROR) { 880 return ret; 881 } 882 883 // Get current active client PIDs 884 std::vector<int> ownerPids(mActiveClientManager.getAllOwners()); 885 ownerPids.push_back(clientPid); 886 887 std::vector<int> priorities(ownerPids.size(), PROCESS_STATE_NONEXISTENT); 888 889 // Get priorites of all active PIDs 890 ProcessInfoService::getProcessStatesFromPids(ownerPids.size(), &ownerPids[0], 891 /*out*/&priorities[0]); 892 893 // Update all active clients' priorities 894 std::map<int,int> pidToPriorityMap; 895 for (size_t i = 0; i < ownerPids.size() - 1; i++) { 896 pidToPriorityMap.emplace(ownerPids[i], getCameraPriorityFromProcState(priorities[i])); 897 } 898 mActiveClientManager.updatePriorities(pidToPriorityMap); 899 900 // Get state for the given cameraId 901 auto state = getCameraState(cameraId); 902 if (state == nullptr) { 903 ALOGE("CameraService::connect X (PID %d) rejected (no camera device with ID %s)", 904 clientPid, cameraId.string()); 905 return BAD_VALUE; 906 } 907 908 // Make descriptor for incoming client 909 clientDescriptor = CameraClientManager::makeClientDescriptor(cameraId, 910 sp<BasicClient>{nullptr}, static_cast<int32_t>(state->getCost()), 911 state->getConflicting(), 912 getCameraPriorityFromProcState(priorities[priorities.size() - 1]), clientPid); 913 914 // Find clients that would be evicted 915 auto evicted = mActiveClientManager.wouldEvict(clientDescriptor); 916 917 // If the incoming client was 'evicted,' higher priority clients have the camera in the 918 // background, so we cannot do evictions 919 if (std::find(evicted.begin(), evicted.end(), clientDescriptor) != evicted.end()) { 920 ALOGE("CameraService::connect X (PID %d) rejected (existing client(s) with higher" 921 " priority).", clientPid); 922 923 sp<BasicClient> clientSp = clientDescriptor->getValue(); 924 String8 curTime = getFormattedCurrentTime(); 925 auto incompatibleClients = 926 mActiveClientManager.getIncompatibleClients(clientDescriptor); 927 928 String8 msg = String8::format("%s : DENIED connect device %s client for package %s " 929 "(PID %d, priority %d)", curTime.string(), 930 cameraId.string(), packageName.string(), clientPid, 931 getCameraPriorityFromProcState(priorities[priorities.size() - 1])); 932 933 for (auto& i : incompatibleClients) { 934 msg.appendFormat("\n - Blocked by existing device %s client for package %s" 935 "(PID %" PRId32 ", priority %" PRId32 ")", i->getKey().string(), 936 String8{i->getValue()->getPackageName()}.string(), i->getOwnerId(), 937 i->getPriority()); 938 } 939 940 // Log the client's attempt 941 mEventLog.add(msg); 942 943 return -EBUSY; 944 } 945 946 for (auto& i : evicted) { 947 sp<BasicClient> clientSp = i->getValue(); 948 if (clientSp.get() == nullptr) { 949 ALOGE("%s: Invalid state: Null client in active client list.", __FUNCTION__); 950 951 // TODO: Remove this 952 LOG_ALWAYS_FATAL("%s: Invalid state for CameraService, null client in active list", 953 __FUNCTION__); 954 mActiveClientManager.remove(i); 955 continue; 956 } 957 958 ALOGE("CameraService::connect evicting conflicting client for camera ID %s", 959 i->getKey().string()); 960 evictedClients.push_back(clientSp); 961 962 String8 curTime = getFormattedCurrentTime(); 963 964 // Log the clients evicted 965 mEventLog.add(String8::format("%s : EVICT device %s client for package %s (PID %" 966 PRId32 ", priority %" PRId32 ")\n - Evicted by device %s client for " 967 "package %s (PID %d, priority %" PRId32 ")", curTime.string(), 968 i->getKey().string(), String8{clientSp->getPackageName()}.string(), 969 i->getOwnerId(), i->getPriority(), cameraId.string(), 970 packageName.string(), clientPid, 971 getCameraPriorityFromProcState(priorities[priorities.size() - 1]))); 972 973 // Notify the client of disconnection 974 clientSp->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED, 975 CaptureResultExtras()); 976 } 977 } 978 979 // Do not hold mServiceLock while disconnecting clients, but retain the condition blocking 980 // other clients from connecting in mServiceLockWrapper if held 981 mServiceLock.unlock(); 982 983 // Clear caller identity temporarily so client disconnect PID checks work correctly 984 int64_t token = IPCThreadState::self()->clearCallingIdentity(); 985 986 // Destroy evicted clients 987 for (auto& i : evictedClients) { 988 // Disconnect is blocking, and should only have returned when HAL has cleaned up 989 i->disconnect(); // Clients will remove themselves from the active client list here 990 } 991 evictedClients.clear(); 992 993 IPCThreadState::self()->restoreCallingIdentity(token); 994 995 // Once clients have been disconnected, relock 996 mServiceLock.lock(); 997 998 // Check again if the device was unplugged or something while we weren't holding mServiceLock 999 if ((ret = checkIfDeviceIsUsable(cameraId)) != NO_ERROR) { 1000 return ret; 1001 } 1002 1003 *partial = clientDescriptor; 1004 return NO_ERROR; 1005} 1006 1007status_t CameraService::connect( 1008 const sp<ICameraClient>& cameraClient, 1009 int cameraId, 1010 const String16& clientPackageName, 1011 int clientUid, 1012 /*out*/ 1013 sp<ICamera>& device) { 1014 1015 status_t ret = NO_ERROR; 1016 String8 id = String8::format("%d", cameraId); 1017 sp<Client> client = nullptr; 1018 ret = connectHelper<ICameraClient,Client>(cameraClient, id, CAMERA_HAL_API_VERSION_UNSPECIFIED, 1019 clientPackageName, clientUid, API_1, false, false, /*out*/client); 1020 1021 if(ret != NO_ERROR) { 1022 return ret; 1023 } 1024 1025 device = client; 1026 return NO_ERROR; 1027} 1028 1029status_t CameraService::connectLegacy( 1030 const sp<ICameraClient>& cameraClient, 1031 int cameraId, int halVersion, 1032 const String16& clientPackageName, 1033 int clientUid, 1034 /*out*/ 1035 sp<ICamera>& device) { 1036 1037 int apiVersion = mModule->getRawModule()->module_api_version; 1038 if (halVersion != CAMERA_HAL_API_VERSION_UNSPECIFIED && 1039 apiVersion < CAMERA_MODULE_API_VERSION_2_3) { 1040 /* 1041 * Either the HAL version is unspecified in which case this just creates 1042 * a camera client selected by the latest device version, or 1043 * it's a particular version in which case the HAL must supported 1044 * the open_legacy call 1045 */ 1046 ALOGE("%s: camera HAL module version %x doesn't support connecting to legacy HAL devices!", 1047 __FUNCTION__, apiVersion); 1048 return INVALID_OPERATION; 1049 } 1050 1051 status_t ret = NO_ERROR; 1052 String8 id = String8::format("%d", cameraId); 1053 sp<Client> client = nullptr; 1054 ret = connectHelper<ICameraClient,Client>(cameraClient, id, halVersion, clientPackageName, 1055 clientUid, API_1, true, false, /*out*/client); 1056 1057 if(ret != NO_ERROR) { 1058 return ret; 1059 } 1060 1061 device = client; 1062 return NO_ERROR; 1063} 1064 1065status_t CameraService::connectPro(const sp<IProCameraCallbacks>& cameraCb, 1066 int cameraId, 1067 const String16& clientPackageName, 1068 int clientUid, 1069 /*out*/ 1070 sp<IProCameraUser>& device) { 1071 ALOGE("%s: Unimplemented, please use connectDevice", __FUNCTION__); 1072 return INVALID_OPERATION; 1073} 1074 1075status_t CameraService::connectDevice( 1076 const sp<ICameraDeviceCallbacks>& cameraCb, 1077 int cameraId, 1078 const String16& clientPackageName, 1079 int clientUid, 1080 /*out*/ 1081 sp<ICameraDeviceUser>& device) { 1082 1083 status_t ret = NO_ERROR; 1084 String8 id = String8::format("%d", cameraId); 1085 sp<CameraDeviceClient> client = nullptr; 1086 ret = connectHelper<ICameraDeviceCallbacks,CameraDeviceClient>(cameraCb, id, 1087 CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName, clientUid, API_2, false, false, 1088 /*out*/client); 1089 1090 if(ret != NO_ERROR) { 1091 return ret; 1092 } 1093 1094 device = client; 1095 return NO_ERROR; 1096} 1097 1098status_t CameraService::setTorchMode(const String16& cameraId, bool enabled, 1099 const sp<IBinder>& clientBinder) { 1100 if (enabled && clientBinder == NULL) { 1101 ALOGE("%s: torch client binder is NULL", __FUNCTION__); 1102 return -EINVAL; 1103 } 1104 1105 String8 id = String8(cameraId.string()); 1106 1107 // verify id is valid. 1108 auto state = getCameraState(id); 1109 if (state == nullptr) { 1110 ALOGE("%s: camera id is invalid %s", id.string()); 1111 return -EINVAL; 1112 } 1113 1114 ICameraServiceListener::Status cameraStatus = state->getStatus(); 1115 if (cameraStatus != ICameraServiceListener::STATUS_PRESENT && 1116 cameraStatus != ICameraServiceListener::STATUS_NOT_AVAILABLE) { 1117 ALOGE("%s: camera id is invalid %s", id.string()); 1118 return -EINVAL; 1119 } 1120 1121 { 1122 Mutex::Autolock al(mTorchStatusMutex); 1123 ICameraServiceListener::TorchStatus status; 1124 status_t res = getTorchStatusLocked(id, &status); 1125 if (res) { 1126 ALOGE("%s: getting current torch status failed for camera %s", 1127 __FUNCTION__, id.string()); 1128 return -EINVAL; 1129 } 1130 1131 if (status == ICameraServiceListener::TORCH_STATUS_NOT_AVAILABLE) { 1132 if (cameraStatus == ICameraServiceListener::STATUS_NOT_AVAILABLE) { 1133 ALOGE("%s: torch mode of camera %s is not available because " 1134 "camera is in use", __FUNCTION__, id.string()); 1135 return -EBUSY; 1136 } else { 1137 ALOGE("%s: torch mode of camera %s is not available due to " 1138 "insufficient resources", __FUNCTION__, id.string()); 1139 return -EUSERS; 1140 } 1141 } 1142 } 1143 1144 status_t res = mFlashlight->setTorchMode(id, enabled); 1145 if (res) { 1146 ALOGE("%s: setting torch mode of camera %s to %d failed. %s (%d)", 1147 __FUNCTION__, id.string(), enabled, strerror(-res), res); 1148 return res; 1149 } 1150 1151 { 1152 // update the link to client's death 1153 Mutex::Autolock al(mTorchClientMapMutex); 1154 ssize_t index = mTorchClientMap.indexOfKey(id); 1155 if (enabled) { 1156 if (index == NAME_NOT_FOUND) { 1157 mTorchClientMap.add(id, clientBinder); 1158 } else { 1159 const sp<IBinder> oldBinder = mTorchClientMap.valueAt(index); 1160 oldBinder->unlinkToDeath(this); 1161 1162 mTorchClientMap.replaceValueAt(index, clientBinder); 1163 } 1164 clientBinder->linkToDeath(this); 1165 } else if (index != NAME_NOT_FOUND) { 1166 sp<IBinder> oldBinder = mTorchClientMap.valueAt(index); 1167 oldBinder->unlinkToDeath(this); 1168 } 1169 } 1170 1171 return OK; 1172} 1173 1174status_t CameraService::addListener( 1175 const sp<ICameraServiceListener>& listener) { 1176 ALOGV("%s: Add listener %p", __FUNCTION__, listener.get()); 1177 1178 if (listener == 0) { 1179 ALOGE("%s: Listener must not be null", __FUNCTION__); 1180 return BAD_VALUE; 1181 } 1182 1183 Mutex::Autolock lock(mServiceLock); 1184 1185 { 1186 Mutex::Autolock lock(mStatusListenerLock); 1187 for (auto& it : mListenerList) { 1188 if (IInterface::asBinder(it) == IInterface::asBinder(listener)) { 1189 ALOGW("%s: Tried to add listener %p which was already subscribed", 1190 __FUNCTION__, listener.get()); 1191 return ALREADY_EXISTS; 1192 } 1193 } 1194 1195 mListenerList.push_back(listener); 1196 } 1197 1198 1199 /* Immediately signal current status to this listener only */ 1200 { 1201 Mutex::Autolock lock(mCameraStatesLock); 1202 for (auto& i : mCameraStates) { 1203 // TODO: Update binder to use String16 for camera IDs and remove; 1204 int id = cameraIdToInt(i.first); 1205 if (id == -1) continue; 1206 1207 listener->onStatusChanged(i.second->getStatus(), id); 1208 } 1209 } 1210 1211 /* Immediately signal current torch status to this listener only */ 1212 { 1213 Mutex::Autolock al(mTorchStatusMutex); 1214 for (size_t i = 0; i < mTorchStatusMap.size(); i++ ) { 1215 String16 id = String16(mTorchStatusMap.keyAt(i).string()); 1216 listener->onTorchStatusChanged(mTorchStatusMap.valueAt(i), id); 1217 } 1218 } 1219 1220 return OK; 1221} 1222 1223status_t CameraService::removeListener(const sp<ICameraServiceListener>& listener) { 1224 ALOGV("%s: Remove listener %p", __FUNCTION__, listener.get()); 1225 1226 if (listener == 0) { 1227 ALOGE("%s: Listener must not be null", __FUNCTION__); 1228 return BAD_VALUE; 1229 } 1230 1231 Mutex::Autolock lock(mServiceLock); 1232 1233 { 1234 Mutex::Autolock lock(mStatusListenerLock); 1235 for (auto it = mListenerList.begin(); it != mListenerList.end(); it++) { 1236 if (IInterface::asBinder(*it) == IInterface::asBinder(listener)) { 1237 mListenerList.erase(it); 1238 return OK; 1239 } 1240 } 1241 } 1242 1243 ALOGW("%s: Tried to remove a listener %p which was not subscribed", 1244 __FUNCTION__, listener.get()); 1245 1246 return BAD_VALUE; 1247} 1248 1249status_t CameraService::getLegacyParameters(int cameraId, /*out*/String16* parameters) { 1250 ALOGV("%s: for camera ID = %d", __FUNCTION__, cameraId); 1251 1252 if (parameters == NULL) { 1253 ALOGE("%s: parameters must not be null", __FUNCTION__); 1254 return BAD_VALUE; 1255 } 1256 1257 status_t ret = 0; 1258 1259 CameraParameters shimParams; 1260 if ((ret = getLegacyParametersLazy(cameraId, /*out*/&shimParams)) != OK) { 1261 // Error logged by caller 1262 return ret; 1263 } 1264 1265 String8 shimParamsString8 = shimParams.flatten(); 1266 String16 shimParamsString16 = String16(shimParamsString8); 1267 1268 *parameters = shimParamsString16; 1269 1270 return OK; 1271} 1272 1273status_t CameraService::supportsCameraApi(int cameraId, int apiVersion) { 1274 ALOGV("%s: for camera ID = %d", __FUNCTION__, cameraId); 1275 1276 switch (apiVersion) { 1277 case API_VERSION_1: 1278 case API_VERSION_2: 1279 break; 1280 default: 1281 ALOGE("%s: Bad API version %d", __FUNCTION__, apiVersion); 1282 return BAD_VALUE; 1283 } 1284 1285 int facing = -1; 1286 int deviceVersion = getDeviceVersion(cameraId, &facing); 1287 1288 switch(deviceVersion) { 1289 case CAMERA_DEVICE_API_VERSION_1_0: 1290 case CAMERA_DEVICE_API_VERSION_2_0: 1291 case CAMERA_DEVICE_API_VERSION_2_1: 1292 case CAMERA_DEVICE_API_VERSION_3_0: 1293 case CAMERA_DEVICE_API_VERSION_3_1: 1294 if (apiVersion == API_VERSION_2) { 1295 ALOGV("%s: Camera id %d uses HAL prior to HAL3.2, doesn't support api2 without shim", 1296 __FUNCTION__, cameraId); 1297 return -EOPNOTSUPP; 1298 } else { // if (apiVersion == API_VERSION_1) { 1299 ALOGV("%s: Camera id %d uses older HAL before 3.2, but api1 is always supported", 1300 __FUNCTION__, cameraId); 1301 return OK; 1302 } 1303 case CAMERA_DEVICE_API_VERSION_3_2: 1304 case CAMERA_DEVICE_API_VERSION_3_3: 1305 ALOGV("%s: Camera id %d uses HAL3.2 or newer, supports api1/api2 directly", 1306 __FUNCTION__, cameraId); 1307 return OK; 1308 case -1: 1309 ALOGE("%s: Invalid camera id %d", __FUNCTION__, cameraId); 1310 return BAD_VALUE; 1311 default: 1312 ALOGE("%s: Unknown camera device HAL version: %d", __FUNCTION__, deviceVersion); 1313 return INVALID_OPERATION; 1314 } 1315 1316 return OK; 1317} 1318 1319void CameraService::removeByClient(const BasicClient* client) { 1320 Mutex::Autolock lock(mServiceLock); 1321 for (auto& i : mActiveClientManager.getAll()) { 1322 auto clientSp = i->getValue(); 1323 if (clientSp.get() == client) { 1324 mActiveClientManager.remove(i); 1325 } 1326 } 1327} 1328 1329bool CameraService::evictClientIdByRemote(const wp<IBinder>& remote) { 1330 const int callingPid = getCallingPid(); 1331 const int servicePid = getpid(); 1332 bool ret = false; 1333 { 1334 // Acquire mServiceLock and prevent other clients from connecting 1335 std::unique_ptr<AutoConditionLock> lock = 1336 AutoConditionLock::waitAndAcquire(mServiceLockWrapper); 1337 1338 1339 std::vector<sp<BasicClient>> evicted; 1340 for (auto& i : mActiveClientManager.getAll()) { 1341 auto clientSp = i->getValue(); 1342 if (clientSp.get() == nullptr) { 1343 ALOGE("%s: Dead client still in mActiveClientManager.", __FUNCTION__); 1344 mActiveClientManager.remove(i); 1345 continue; 1346 } 1347 if (remote == clientSp->getRemote() && (callingPid == servicePid || 1348 callingPid == clientSp->getClientPid())) { 1349 mActiveClientManager.remove(i); 1350 evicted.push_back(clientSp); 1351 1352 // Notify the client of disconnection 1353 clientSp->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED, 1354 CaptureResultExtras()); 1355 } 1356 } 1357 1358 // Do not hold mServiceLock while disconnecting clients, but retain the condition blocking 1359 // other clients from connecting in mServiceLockWrapper if held 1360 mServiceLock.unlock(); 1361 1362 for (auto& i : evicted) { 1363 if (i.get() != nullptr) { 1364 i->disconnect(); 1365 ret = true; 1366 } 1367 } 1368 1369 // Reacquire mServiceLock 1370 mServiceLock.lock(); 1371 1372 } // lock is destroyed, allow further connect calls 1373 1374 return ret; 1375} 1376 1377 1378std::shared_ptr<CameraService::CameraState> CameraService::getCameraState( 1379 const String8& cameraId) const { 1380 std::shared_ptr<CameraState> state; 1381 { 1382 Mutex::Autolock lock(mCameraStatesLock); 1383 auto iter = mCameraStates.find(cameraId); 1384 if (iter != mCameraStates.end()) { 1385 state = iter->second; 1386 } 1387 } 1388 return state; 1389} 1390 1391sp<CameraService::BasicClient> CameraService::removeClientLocked(const String8& cameraId) { 1392 // Remove from active clients list 1393 auto clientDescriptorPtr = mActiveClientManager.remove(cameraId); 1394 if (clientDescriptorPtr == nullptr) { 1395 ALOGW("%s: Could not evict client, no client for camera ID %s", __FUNCTION__, 1396 cameraId.string()); 1397 return sp<BasicClient>{nullptr}; 1398 } 1399 1400 return clientDescriptorPtr->getValue(); 1401} 1402 1403 1404void CameraService::logDisconnected(const String8& cameraId, int clientPid, 1405 const String8& clientPackage) { 1406 1407 String8 curTime = getFormattedCurrentTime(); 1408 // Log the clients evicted 1409 mEventLog.add(String8::format("%s : DISCONNECT device %s client for package %s (PID %d)", 1410 curTime.string(), cameraId.string(), clientPackage.string(), clientPid)); 1411} 1412 1413void CameraService::logConnected(const String8& cameraId, int clientPid, 1414 const String8& clientPackage) { 1415 1416 String8 curTime = getFormattedCurrentTime(); 1417 // Log the clients evicted 1418 mEventLog.add(String8::format("%s : CONNECT device %s client for package %s (PID %d)", 1419 curTime.string(), cameraId.string(), clientPackage.string(), clientPid)); 1420} 1421 1422status_t CameraService::onTransact( 1423 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 1424 // Permission checks 1425 switch (code) { 1426 case BnCameraService::CONNECT: 1427 case BnCameraService::CONNECT_PRO: 1428 case BnCameraService::CONNECT_DEVICE: 1429 case BnCameraService::CONNECT_LEGACY: 1430 const int pid = getCallingPid(); 1431 const int self_pid = getpid(); 1432 if (pid != self_pid) { 1433 // we're called from a different process, do the real check 1434 if (!checkCallingPermission( 1435 String16("android.permission.CAMERA"))) { 1436 const int uid = getCallingUid(); 1437 ALOGE("Permission Denial: " 1438 "can't use the camera pid=%d, uid=%d", pid, uid); 1439 return PERMISSION_DENIED; 1440 } 1441 } 1442 break; 1443 } 1444 1445 return BnCameraService::onTransact(code, data, reply, flags); 1446} 1447 1448// We share the media players for shutter and recording sound for all clients. 1449// A reference count is kept to determine when we will actually release the 1450// media players. 1451 1452MediaPlayer* CameraService::newMediaPlayer(const char *file) { 1453 MediaPlayer* mp = new MediaPlayer(); 1454 if (mp->setDataSource(NULL /* httpService */, file, NULL) == NO_ERROR) { 1455 mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE); 1456 mp->prepare(); 1457 } else { 1458 ALOGE("Failed to load CameraService sounds: %s", file); 1459 return NULL; 1460 } 1461 return mp; 1462} 1463 1464void CameraService::loadSound() { 1465 Mutex::Autolock lock(mSoundLock); 1466 LOG1("CameraService::loadSound ref=%d", mSoundRef); 1467 if (mSoundRef++) return; 1468 1469 mSoundPlayer[SOUND_SHUTTER] = newMediaPlayer("/system/media/audio/ui/camera_click.ogg"); 1470 mSoundPlayer[SOUND_RECORDING] = newMediaPlayer("/system/media/audio/ui/VideoRecord.ogg"); 1471} 1472 1473void CameraService::releaseSound() { 1474 Mutex::Autolock lock(mSoundLock); 1475 LOG1("CameraService::releaseSound ref=%d", mSoundRef); 1476 if (--mSoundRef) return; 1477 1478 for (int i = 0; i < NUM_SOUNDS; i++) { 1479 if (mSoundPlayer[i] != 0) { 1480 mSoundPlayer[i]->disconnect(); 1481 mSoundPlayer[i].clear(); 1482 } 1483 } 1484} 1485 1486void CameraService::playSound(sound_kind kind) { 1487 LOG1("playSound(%d)", kind); 1488 Mutex::Autolock lock(mSoundLock); 1489 sp<MediaPlayer> player = mSoundPlayer[kind]; 1490 if (player != 0) { 1491 player->seekTo(0); 1492 player->start(); 1493 } 1494} 1495 1496// ---------------------------------------------------------------------------- 1497 1498CameraService::Client::Client(const sp<CameraService>& cameraService, 1499 const sp<ICameraClient>& cameraClient, 1500 const String16& clientPackageName, 1501 int cameraId, int cameraFacing, 1502 int clientPid, uid_t clientUid, 1503 int servicePid) : 1504 CameraService::BasicClient(cameraService, 1505 IInterface::asBinder(cameraClient), 1506 clientPackageName, 1507 cameraId, cameraFacing, 1508 clientPid, clientUid, 1509 servicePid) 1510{ 1511 int callingPid = getCallingPid(); 1512 LOG1("Client::Client E (pid %d, id %d)", callingPid, cameraId); 1513 1514 mRemoteCallback = cameraClient; 1515 1516 cameraService->loadSound(); 1517 1518 LOG1("Client::Client X (pid %d, id %d)", callingPid, cameraId); 1519} 1520 1521// tear down the client 1522CameraService::Client::~Client() { 1523 ALOGV("~Client"); 1524 mDestructionStarted = true; 1525 1526 mCameraService->releaseSound(); 1527 // unconditionally disconnect. function is idempotent 1528 Client::disconnect(); 1529} 1530 1531CameraService::BasicClient::BasicClient(const sp<CameraService>& cameraService, 1532 const sp<IBinder>& remoteCallback, 1533 const String16& clientPackageName, 1534 int cameraId, int cameraFacing, 1535 int clientPid, uid_t clientUid, 1536 int servicePid): 1537 mClientPackageName(clientPackageName), mDisconnected(false) 1538{ 1539 mCameraService = cameraService; 1540 mRemoteBinder = remoteCallback; 1541 mCameraId = cameraId; 1542 mCameraFacing = cameraFacing; 1543 mClientPid = clientPid; 1544 mClientUid = clientUid; 1545 mServicePid = servicePid; 1546 mOpsActive = false; 1547 mDestructionStarted = false; 1548} 1549 1550CameraService::BasicClient::~BasicClient() { 1551 ALOGV("~BasicClient"); 1552 mDestructionStarted = true; 1553} 1554 1555void CameraService::BasicClient::disconnect() { 1556 if (mDisconnected) return; 1557 mDisconnected = true;; 1558 1559 mCameraService->removeByClient(this); 1560 mCameraService->logDisconnected(String8::format("%d", mCameraId), mClientPid, 1561 String8(mClientPackageName)); 1562 1563 sp<IBinder> remote = getRemote(); 1564 if (remote != nullptr) { 1565 remote->unlinkToDeath(mCameraService); 1566 } 1567 1568 finishCameraOps(); 1569 ALOGI("%s: Disconnected client for camera %d for PID %d", __FUNCTION__, mCameraId, mClientPid); 1570 1571 // client shouldn't be able to call into us anymore 1572 mClientPid = 0; 1573} 1574 1575String16 CameraService::BasicClient::getPackageName() const { 1576 return mClientPackageName; 1577} 1578 1579 1580int CameraService::BasicClient::getClientPid() const { 1581 return mClientPid; 1582} 1583 1584status_t CameraService::BasicClient::startCameraOps() { 1585 int32_t res; 1586 // Notify app ops that the camera is not available 1587 mOpsCallback = new OpsCallback(this); 1588 1589 { 1590 ALOGV("%s: Start camera ops, package name = %s, client UID = %d", 1591 __FUNCTION__, String8(mClientPackageName).string(), mClientUid); 1592 } 1593 1594 mAppOpsManager.startWatchingMode(AppOpsManager::OP_CAMERA, 1595 mClientPackageName, mOpsCallback); 1596 res = mAppOpsManager.startOp(AppOpsManager::OP_CAMERA, 1597 mClientUid, mClientPackageName); 1598 1599 if (res != AppOpsManager::MODE_ALLOWED) { 1600 ALOGI("Camera %d: Access for \"%s\" has been revoked", 1601 mCameraId, String8(mClientPackageName).string()); 1602 return PERMISSION_DENIED; 1603 } 1604 1605 mOpsActive = true; 1606 1607 // Transition device availability listeners from PRESENT -> NOT_AVAILABLE 1608 mCameraService->updateStatus(ICameraServiceListener::STATUS_NOT_AVAILABLE, 1609 String8::format("%d", mCameraId)); 1610 1611 return OK; 1612} 1613 1614status_t CameraService::BasicClient::finishCameraOps() { 1615 // Check if startCameraOps succeeded, and if so, finish the camera op 1616 if (mOpsActive) { 1617 // Notify app ops that the camera is available again 1618 mAppOpsManager.finishOp(AppOpsManager::OP_CAMERA, mClientUid, 1619 mClientPackageName); 1620 mOpsActive = false; 1621 1622 auto rejected = {ICameraServiceListener::STATUS_NOT_PRESENT, 1623 ICameraServiceListener::STATUS_ENUMERATING}; 1624 1625 // Transition to PRESENT if the camera is not in either of the rejected states 1626 mCameraService->updateStatus(ICameraServiceListener::STATUS_PRESENT, 1627 String8::format("%d", mCameraId), rejected); 1628 1629 // Notify flashlight that a camera device is closed. 1630 mCameraService->mFlashlight->deviceClosed( 1631 String8::format("%d", mCameraId)); 1632 } 1633 // Always stop watching, even if no camera op is active 1634 if (mOpsCallback != NULL) { 1635 mAppOpsManager.stopWatchingMode(mOpsCallback); 1636 } 1637 mOpsCallback.clear(); 1638 1639 return OK; 1640} 1641 1642void CameraService::BasicClient::opChanged(int32_t op, const String16& packageName) { 1643 String8 name(packageName); 1644 String8 myName(mClientPackageName); 1645 1646 if (op != AppOpsManager::OP_CAMERA) { 1647 ALOGW("Unexpected app ops notification received: %d", op); 1648 return; 1649 } 1650 1651 int32_t res; 1652 res = mAppOpsManager.checkOp(AppOpsManager::OP_CAMERA, 1653 mClientUid, mClientPackageName); 1654 ALOGV("checkOp returns: %d, %s ", res, 1655 res == AppOpsManager::MODE_ALLOWED ? "ALLOWED" : 1656 res == AppOpsManager::MODE_IGNORED ? "IGNORED" : 1657 res == AppOpsManager::MODE_ERRORED ? "ERRORED" : 1658 "UNKNOWN"); 1659 1660 if (res != AppOpsManager::MODE_ALLOWED) { 1661 ALOGI("Camera %d: Access for \"%s\" revoked", mCameraId, 1662 myName.string()); 1663 // Reset the client PID to allow server-initiated disconnect, 1664 // and to prevent further calls by client. 1665 mClientPid = getCallingPid(); 1666 CaptureResultExtras resultExtras; // a dummy result (invalid) 1667 notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE, resultExtras); 1668 disconnect(); 1669 } 1670} 1671 1672// ---------------------------------------------------------------------------- 1673 1674// Provide client strong pointer for callbacks. 1675sp<CameraService::Client> CameraService::Client::getClientFromCookie(void* user) { 1676 String8 cameraId = String8::format("%d", (int)(intptr_t) user); 1677 auto clientDescriptor = gCameraService->mActiveClientManager.get(cameraId); 1678 if (clientDescriptor != nullptr) { 1679 return sp<Client>{ 1680 static_cast<Client*>(clientDescriptor->getValue().get())}; 1681 } 1682 return sp<Client>{nullptr}; 1683} 1684 1685void CameraService::Client::notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode, 1686 const CaptureResultExtras& resultExtras) { 1687 mRemoteCallback->notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_RELEASED, 0); 1688} 1689 1690// NOTE: function is idempotent 1691void CameraService::Client::disconnect() { 1692 ALOGV("Client::disconnect"); 1693 BasicClient::disconnect(); 1694} 1695 1696CameraService::Client::OpsCallback::OpsCallback(wp<BasicClient> client): 1697 mClient(client) { 1698} 1699 1700void CameraService::Client::OpsCallback::opChanged(int32_t op, 1701 const String16& packageName) { 1702 sp<BasicClient> client = mClient.promote(); 1703 if (client != NULL) { 1704 client->opChanged(op, packageName); 1705 } 1706} 1707 1708// ---------------------------------------------------------------------------- 1709// IProCamera 1710// ---------------------------------------------------------------------------- 1711 1712CameraService::ProClient::ProClient(const sp<CameraService>& cameraService, 1713 const sp<IProCameraCallbacks>& remoteCallback, 1714 const String16& clientPackageName, 1715 int cameraId, 1716 int cameraFacing, 1717 int clientPid, 1718 uid_t clientUid, 1719 int servicePid) 1720 : CameraService::BasicClient(cameraService, IInterface::asBinder(remoteCallback), 1721 clientPackageName, cameraId, cameraFacing, 1722 clientPid, clientUid, servicePid) 1723{ 1724 mRemoteCallback = remoteCallback; 1725} 1726 1727CameraService::ProClient::~ProClient() { 1728} 1729 1730void CameraService::ProClient::notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode, 1731 const CaptureResultExtras& resultExtras) { 1732 mRemoteCallback->notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_RELEASED, 0); 1733} 1734 1735// ---------------------------------------------------------------------------- 1736// CameraState 1737// ---------------------------------------------------------------------------- 1738 1739CameraService::CameraState::CameraState(const String8& id, int cost, 1740 const std::set<String8>& conflicting) : mId(id), 1741 mStatus(ICameraServiceListener::STATUS_PRESENT), mCost(cost), mConflicting(conflicting) {} 1742 1743CameraService::CameraState::~CameraState() {} 1744 1745ICameraServiceListener::Status CameraService::CameraState::getStatus() const { 1746 Mutex::Autolock lock(mStatusLock); 1747 return mStatus; 1748} 1749 1750CameraParameters CameraService::CameraState::getShimParams() const { 1751 return mShimParams; 1752} 1753 1754void CameraService::CameraState::setShimParams(const CameraParameters& params) { 1755 mShimParams = params; 1756} 1757 1758int CameraService::CameraState::getCost() const { 1759 return mCost; 1760} 1761 1762std::set<String8> CameraService::CameraState::getConflicting() const { 1763 return mConflicting; 1764} 1765 1766String8 CameraService::CameraState::getId() const { 1767 return mId; 1768} 1769 1770// ---------------------------------------------------------------------------- 1771// CameraClientManager 1772// ---------------------------------------------------------------------------- 1773 1774CameraService::CameraClientManager::~CameraClientManager() {} 1775 1776sp<CameraService::BasicClient> CameraService::CameraClientManager::getCameraClient( 1777 const String8& id) const { 1778 auto descriptor = get(id); 1779 if (descriptor == nullptr) { 1780 return sp<BasicClient>{nullptr}; 1781 } 1782 return descriptor->getValue(); 1783} 1784 1785String8 CameraService::CameraClientManager::toString() const { 1786 auto all = getAll(); 1787 String8 ret("["); 1788 bool hasAny = false; 1789 for (auto& i : all) { 1790 hasAny = true; 1791 String8 key = i->getKey(); 1792 int32_t cost = i->getCost(); 1793 int32_t pid = i->getOwnerId(); 1794 int32_t priority = i->getPriority(); 1795 auto conflicting = i->getConflicting(); 1796 auto clientSp = i->getValue(); 1797 String8 packageName; 1798 if (clientSp.get() != nullptr) { 1799 packageName = String8{clientSp->getPackageName()}; 1800 } 1801 ret.appendFormat("\n(Camera ID: %s, Cost: %" PRId32 ", PID: %" PRId32 ", Priority: %" 1802 PRId32 ", ", key.string(), cost, pid, priority); 1803 1804 if (packageName.size() != 0) { 1805 ret.appendFormat("Client Package Name: %s", packageName.string()); 1806 } 1807 1808 ret.append(", Conflicting Client Devices: {"); 1809 for (auto& j : conflicting) { 1810 ret.appendFormat("%s, ", j.string()); 1811 } 1812 ret.append("})"); 1813 } 1814 if (hasAny) ret.append("\n"); 1815 ret.append("]\n"); 1816 return ret; 1817} 1818 1819CameraService::DescriptorPtr CameraService::CameraClientManager::makeClientDescriptor( 1820 const String8& key, const sp<BasicClient>& value, int32_t cost, 1821 const std::set<String8>& conflictingKeys, int32_t priority, int32_t ownerId) { 1822 1823 return std::make_shared<resource_policy::ClientDescriptor<String8, sp<BasicClient>>>( 1824 key, value, cost, conflictingKeys, priority, ownerId); 1825} 1826 1827CameraService::DescriptorPtr CameraService::CameraClientManager::makeClientDescriptor( 1828 const sp<BasicClient>& value, const CameraService::DescriptorPtr& partial) { 1829 return makeClientDescriptor(partial->getKey(), value, partial->getCost(), 1830 partial->getConflicting(), partial->getPriority(), partial->getOwnerId()); 1831} 1832 1833// ---------------------------------------------------------------------------- 1834 1835static const int kDumpLockRetries = 50; 1836static const int kDumpLockSleep = 60000; 1837 1838static bool tryLock(Mutex& mutex) 1839{ 1840 bool locked = false; 1841 for (int i = 0; i < kDumpLockRetries; ++i) { 1842 if (mutex.tryLock() == NO_ERROR) { 1843 locked = true; 1844 break; 1845 } 1846 usleep(kDumpLockSleep); 1847 } 1848 return locked; 1849} 1850 1851status_t CameraService::dump(int fd, const Vector<String16>& args) { 1852 String8 result; 1853 if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 1854 result.appendFormat("Permission Denial: " 1855 "can't dump CameraService from pid=%d, uid=%d\n", 1856 getCallingPid(), 1857 getCallingUid()); 1858 write(fd, result.string(), result.size()); 1859 } else { 1860 bool locked = tryLock(mServiceLock); 1861 // failed to lock - CameraService is probably deadlocked 1862 if (!locked) { 1863 result.append("CameraService may be deadlocked\n"); 1864 write(fd, result.string(), result.size()); 1865 } 1866 1867 bool hasClient = false; 1868 if (!mModule) { 1869 result = String8::format("No camera module available!\n"); 1870 write(fd, result.string(), result.size()); 1871 if (locked) mServiceLock.unlock(); 1872 return NO_ERROR; 1873 } 1874 1875 const hw_module_t* common = mModule->getRawModule(); 1876 result = String8::format("Camera module HAL API version: %#x\n", common->hal_api_version); 1877 result.appendFormat("Camera module API version: %#x\n", common->module_api_version); 1878 result.appendFormat("Camera module name: %s\n", common->name); 1879 result.appendFormat("Camera module author: %s\n", common->author); 1880 result.appendFormat("Number of camera devices: %d\n", mNumberOfCameras); 1881 String8 activeClientString = mActiveClientManager.toString(); 1882 result.appendFormat("Active Camera Clients:\n%s", activeClientString.string()); 1883 1884 1885 sp<VendorTagDescriptor> desc = VendorTagDescriptor::getGlobalVendorTagDescriptor(); 1886 if (desc == NULL) { 1887 result.appendFormat("Vendor tags left unimplemented.\n"); 1888 } else { 1889 result.appendFormat("Vendor tag definitions:\n"); 1890 } 1891 1892 write(fd, result.string(), result.size()); 1893 1894 if (desc != NULL) { 1895 desc->dump(fd, /*verbosity*/2, /*indentation*/4); 1896 } 1897 1898 result = String8("Prior client events (most recent at top):\n"); 1899 1900 for (const auto& msg : mEventLog) { 1901 result.appendFormat("%s\n", msg.string()); 1902 } 1903 1904 if (mEventLog.size() == DEFAULT_EVICTION_LOG_LENGTH) { 1905 result.append("...\n"); 1906 } 1907 1908 write(fd, result.string(), result.size()); 1909 1910 bool stateLocked = tryLock(mCameraStatesLock); 1911 if (!stateLocked) { 1912 result = String8::format("CameraStates in use, may be deadlocked\n"); 1913 write(fd, result.string(), result.size()); 1914 } 1915 1916 for (auto& state : mCameraStates) { 1917 String8 cameraId = state.first; 1918 result = String8::format("Camera %s information:\n", cameraId.string()); 1919 camera_info info; 1920 1921 // TODO: Change getCameraInfo + HAL to use String cameraIds 1922 status_t rc = mModule->getCameraInfo(cameraIdToInt(cameraId), &info); 1923 if (rc != OK) { 1924 result.appendFormat(" Error reading static information!\n"); 1925 write(fd, result.string(), result.size()); 1926 } else { 1927 result.appendFormat(" Facing: %s\n", 1928 info.facing == CAMERA_FACING_BACK ? "BACK" : "FRONT"); 1929 result.appendFormat(" Orientation: %d\n", info.orientation); 1930 int deviceVersion; 1931 if (common->module_api_version < CAMERA_MODULE_API_VERSION_2_0) { 1932 deviceVersion = CAMERA_DEVICE_API_VERSION_1_0; 1933 } else { 1934 deviceVersion = info.device_version; 1935 } 1936 1937 auto conflicting = state.second->getConflicting(); 1938 result.appendFormat(" Resource Cost: %d\n", state.second->getCost()); 1939 result.appendFormat(" Conflicting Devices:"); 1940 for (auto& id : conflicting) { 1941 result.appendFormat(" %s", cameraId.string()); 1942 } 1943 if (conflicting.size() == 0) { 1944 result.appendFormat(" NONE"); 1945 } 1946 result.appendFormat("\n"); 1947 1948 result.appendFormat(" Device version: %#x\n", deviceVersion); 1949 if (deviceVersion >= CAMERA_DEVICE_API_VERSION_2_0) { 1950 result.appendFormat(" Device static metadata:\n"); 1951 write(fd, result.string(), result.size()); 1952 dump_indented_camera_metadata(info.static_camera_characteristics, 1953 fd, /*verbosity*/2, /*indentation*/4); 1954 } else { 1955 write(fd, result.string(), result.size()); 1956 } 1957 1958 CameraParameters p = state.second->getShimParams(); 1959 if (!p.isEmpty()) { 1960 result = String8::format(" Camera1 API shim is using parameters:\n "); 1961 write(fd, result.string(), result.size()); 1962 p.dump(fd, args); 1963 } 1964 } 1965 1966 auto clientDescriptor = mActiveClientManager.get(cameraId); 1967 if (clientDescriptor == nullptr) { 1968 result = String8::format(" Device %s is closed, no client instance\n", 1969 cameraId.string()); 1970 write(fd, result.string(), result.size()); 1971 continue; 1972 } 1973 hasClient = true; 1974 result = String8::format(" Device %s is open. Client instance dump:\n\n", 1975 cameraId.string()); 1976 result.appendFormat("Client priority level: %d\n", clientDescriptor->getPriority()); 1977 result.appendFormat("Client PID: %d\n", clientDescriptor->getOwnerId()); 1978 1979 auto client = clientDescriptor->getValue(); 1980 result.appendFormat("Client package: %s\n", 1981 String8(client->getPackageName()).string()); 1982 write(fd, result.string(), result.size()); 1983 1984 client->dump(fd, args); 1985 } 1986 1987 if (stateLocked) mCameraStatesLock.unlock(); 1988 1989 if (!hasClient) { 1990 result = String8::format("\nNo active camera clients yet.\n"); 1991 write(fd, result.string(), result.size()); 1992 } 1993 1994 if (locked) mServiceLock.unlock(); 1995 1996 // Dump camera traces if there were any 1997 write(fd, "\n", 1); 1998 camera3::CameraTraces::dump(fd, args); 1999 2000 // change logging level 2001 int n = args.size(); 2002 for (int i = 0; i + 1 < n; i++) { 2003 String16 verboseOption("-v"); 2004 if (args[i] == verboseOption) { 2005 String8 levelStr(args[i+1]); 2006 int level = atoi(levelStr.string()); 2007 result = String8::format("\nSetting log level to %d.\n", level); 2008 setLogLevel(level); 2009 write(fd, result.string(), result.size()); 2010 } 2011 } 2012 } 2013 return NO_ERROR; 2014} 2015 2016void CameraService::handleTorchClientBinderDied(const wp<IBinder> &who) { 2017 Mutex::Autolock al(mTorchClientMapMutex); 2018 for (size_t i = 0; i < mTorchClientMap.size(); i++) { 2019 if (mTorchClientMap[i] == who) { 2020 // turn off the torch mode that was turned on by dead client 2021 String8 cameraId = mTorchClientMap.keyAt(i); 2022 status_t res = mFlashlight->setTorchMode(cameraId, false); 2023 if (res) { 2024 ALOGE("%s: torch client died but couldn't turn off torch: " 2025 "%s (%d)", __FUNCTION__, strerror(-res), res); 2026 return; 2027 } 2028 mTorchClientMap.removeItemsAt(i); 2029 break; 2030 } 2031 } 2032} 2033 2034/*virtual*/void CameraService::binderDied(const wp<IBinder> &who) { 2035 2036 /** 2037 * While tempting to promote the wp<IBinder> into a sp, 2038 * it's actually not supported by the binder driver 2039 */ 2040 2041 // check torch client 2042 handleTorchClientBinderDied(who); 2043 2044 // check camera device client 2045 if(!evictClientIdByRemote(who)) { 2046 ALOGV("%s: Java client's binder death already cleaned up (normal case)", __FUNCTION__); 2047 return; 2048 } 2049 2050 ALOGE("%s: Java client's binder died, removing it from the list of active clients", 2051 __FUNCTION__); 2052} 2053 2054void CameraService::updateStatus(ICameraServiceListener::Status status, const String8& cameraId) { 2055 updateStatus(status, cameraId, {}); 2056} 2057 2058void CameraService::updateStatus(ICameraServiceListener::Status status, const String8& cameraId, 2059 std::initializer_list<ICameraServiceListener::Status> rejectSourceStates) { 2060 // Do not lock mServiceLock here or can get into a deadlock from 2061 // connect() -> disconnect -> updateStatus 2062 2063 auto state = getCameraState(cameraId); 2064 2065 if (state == nullptr) { 2066 ALOGW("%s: Could not update the status for %s, no such device exists", __FUNCTION__, 2067 cameraId.string()); 2068 return; 2069 } 2070 2071 // Update the status for this camera state, then send the onStatusChangedCallbacks to each 2072 // of the listeners with both the mStatusStatus and mStatusListenerLock held 2073 state->updateStatus(status, cameraId, rejectSourceStates, [this] 2074 (const String8& cameraId, ICameraServiceListener::Status status) { 2075 2076 // Update torch status 2077 if (status == ICameraServiceListener::STATUS_NOT_PRESENT || 2078 status == ICameraServiceListener::STATUS_NOT_AVAILABLE) { 2079 // Update torch status to not available when the camera device becomes not present 2080 // or not available. 2081 onTorchStatusChanged(cameraId, ICameraServiceListener::TORCH_STATUS_NOT_AVAILABLE); 2082 } else if (status == ICameraServiceListener::STATUS_PRESENT) { 2083 // Update torch status to available when the camera device becomes present or 2084 // available 2085 onTorchStatusChanged(cameraId, ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF); 2086 } 2087 2088 Mutex::Autolock lock(mStatusListenerLock); 2089 2090 for (auto& listener : mListenerList) { 2091 // TODO: Refactor status listeners to use strings for Camera IDs and remove this. 2092 int id = cameraIdToInt(cameraId); 2093 if (id != -1) listener->onStatusChanged(status, id); 2094 } 2095 }); 2096} 2097 2098status_t CameraService::getTorchStatusLocked( 2099 const String8& cameraId, 2100 ICameraServiceListener::TorchStatus *status) const { 2101 if (!status) { 2102 return BAD_VALUE; 2103 } 2104 ssize_t index = mTorchStatusMap.indexOfKey(cameraId); 2105 if (index == NAME_NOT_FOUND) { 2106 // invalid camera ID or the camera doesn't have a flash unit 2107 return NAME_NOT_FOUND; 2108 } 2109 2110 *status = mTorchStatusMap.valueAt(index); 2111 return OK; 2112} 2113 2114status_t CameraService::setTorchStatusLocked(const String8& cameraId, 2115 ICameraServiceListener::TorchStatus status) { 2116 ssize_t index = mTorchStatusMap.indexOfKey(cameraId); 2117 if (index == NAME_NOT_FOUND) { 2118 return BAD_VALUE; 2119 } 2120 ICameraServiceListener::TorchStatus& item = 2121 mTorchStatusMap.editValueAt(index); 2122 item = status; 2123 2124 return OK; 2125} 2126 2127}; // namespace android 2128