CameraService.cpp revision 54b4246bb2025a5dcfdf1611c199998448d28424
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 // Use the value +PROCESS_STATE_NONEXISTENT, to avoid taking 888 // address of PROCESS_STATE_NONEXISTENT as a reference argument 889 // for the vector constructor. PROCESS_STATE_NONEXISTENT does 890 // not have an out-of-class definition. 891 std::vector<int> priorities(ownerPids.size(), +PROCESS_STATE_NONEXISTENT); 892 893 // Get priorites of all active PIDs 894 ProcessInfoService::getProcessStatesFromPids(ownerPids.size(), &ownerPids[0], 895 /*out*/&priorities[0]); 896 897 // Update all active clients' priorities 898 std::map<int,int> pidToPriorityMap; 899 for (size_t i = 0; i < ownerPids.size() - 1; i++) { 900 pidToPriorityMap.emplace(ownerPids[i], getCameraPriorityFromProcState(priorities[i])); 901 } 902 mActiveClientManager.updatePriorities(pidToPriorityMap); 903 904 // Get state for the given cameraId 905 auto state = getCameraState(cameraId); 906 if (state == nullptr) { 907 ALOGE("CameraService::connect X (PID %d) rejected (no camera device with ID %s)", 908 clientPid, cameraId.string()); 909 return BAD_VALUE; 910 } 911 912 // Make descriptor for incoming client 913 clientDescriptor = CameraClientManager::makeClientDescriptor(cameraId, 914 sp<BasicClient>{nullptr}, static_cast<int32_t>(state->getCost()), 915 state->getConflicting(), 916 getCameraPriorityFromProcState(priorities[priorities.size() - 1]), clientPid); 917 918 // Find clients that would be evicted 919 auto evicted = mActiveClientManager.wouldEvict(clientDescriptor); 920 921 // If the incoming client was 'evicted,' higher priority clients have the camera in the 922 // background, so we cannot do evictions 923 if (std::find(evicted.begin(), evicted.end(), clientDescriptor) != evicted.end()) { 924 ALOGE("CameraService::connect X (PID %d) rejected (existing client(s) with higher" 925 " priority).", clientPid); 926 927 sp<BasicClient> clientSp = clientDescriptor->getValue(); 928 String8 curTime = getFormattedCurrentTime(); 929 auto incompatibleClients = 930 mActiveClientManager.getIncompatibleClients(clientDescriptor); 931 932 String8 msg = String8::format("%s : DENIED connect device %s client for package %s " 933 "(PID %d, priority %d)", curTime.string(), 934 cameraId.string(), packageName.string(), clientPid, 935 getCameraPriorityFromProcState(priorities[priorities.size() - 1])); 936 937 for (auto& i : incompatibleClients) { 938 msg.appendFormat("\n - Blocked by existing device %s client for package %s" 939 "(PID %" PRId32 ", priority %" PRId32 ")", i->getKey().string(), 940 String8{i->getValue()->getPackageName()}.string(), i->getOwnerId(), 941 i->getPriority()); 942 } 943 944 // Log the client's attempt 945 mEventLog.add(msg); 946 947 return -EBUSY; 948 } 949 950 for (auto& i : evicted) { 951 sp<BasicClient> clientSp = i->getValue(); 952 if (clientSp.get() == nullptr) { 953 ALOGE("%s: Invalid state: Null client in active client list.", __FUNCTION__); 954 955 // TODO: Remove this 956 LOG_ALWAYS_FATAL("%s: Invalid state for CameraService, null client in active list", 957 __FUNCTION__); 958 mActiveClientManager.remove(i); 959 continue; 960 } 961 962 ALOGE("CameraService::connect evicting conflicting client for camera ID %s", 963 i->getKey().string()); 964 evictedClients.push_back(clientSp); 965 966 String8 curTime = getFormattedCurrentTime(); 967 968 // Log the clients evicted 969 mEventLog.add(String8::format("%s : EVICT device %s client for package %s (PID %" 970 PRId32 ", priority %" PRId32 ")\n - Evicted by device %s client for " 971 "package %s (PID %d, priority %" PRId32 ")", curTime.string(), 972 i->getKey().string(), String8{clientSp->getPackageName()}.string(), 973 i->getOwnerId(), i->getPriority(), cameraId.string(), 974 packageName.string(), clientPid, 975 getCameraPriorityFromProcState(priorities[priorities.size() - 1]))); 976 977 // Notify the client of disconnection 978 clientSp->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED, 979 CaptureResultExtras()); 980 } 981 } 982 983 // Do not hold mServiceLock while disconnecting clients, but retain the condition blocking 984 // other clients from connecting in mServiceLockWrapper if held 985 mServiceLock.unlock(); 986 987 // Clear caller identity temporarily so client disconnect PID checks work correctly 988 int64_t token = IPCThreadState::self()->clearCallingIdentity(); 989 990 // Destroy evicted clients 991 for (auto& i : evictedClients) { 992 // Disconnect is blocking, and should only have returned when HAL has cleaned up 993 i->disconnect(); // Clients will remove themselves from the active client list here 994 } 995 evictedClients.clear(); 996 997 IPCThreadState::self()->restoreCallingIdentity(token); 998 999 // Once clients have been disconnected, relock 1000 mServiceLock.lock(); 1001 1002 // Check again if the device was unplugged or something while we weren't holding mServiceLock 1003 if ((ret = checkIfDeviceIsUsable(cameraId)) != NO_ERROR) { 1004 return ret; 1005 } 1006 1007 *partial = clientDescriptor; 1008 return NO_ERROR; 1009} 1010 1011status_t CameraService::connect( 1012 const sp<ICameraClient>& cameraClient, 1013 int cameraId, 1014 const String16& clientPackageName, 1015 int clientUid, 1016 /*out*/ 1017 sp<ICamera>& device) { 1018 1019 status_t ret = NO_ERROR; 1020 String8 id = String8::format("%d", cameraId); 1021 sp<Client> client = nullptr; 1022 ret = connectHelper<ICameraClient,Client>(cameraClient, id, CAMERA_HAL_API_VERSION_UNSPECIFIED, 1023 clientPackageName, clientUid, API_1, false, false, /*out*/client); 1024 1025 if(ret != NO_ERROR) { 1026 return ret; 1027 } 1028 1029 device = client; 1030 return NO_ERROR; 1031} 1032 1033status_t CameraService::connectLegacy( 1034 const sp<ICameraClient>& cameraClient, 1035 int cameraId, int halVersion, 1036 const String16& clientPackageName, 1037 int clientUid, 1038 /*out*/ 1039 sp<ICamera>& device) { 1040 1041 int apiVersion = mModule->getRawModule()->module_api_version; 1042 if (halVersion != CAMERA_HAL_API_VERSION_UNSPECIFIED && 1043 apiVersion < CAMERA_MODULE_API_VERSION_2_3) { 1044 /* 1045 * Either the HAL version is unspecified in which case this just creates 1046 * a camera client selected by the latest device version, or 1047 * it's a particular version in which case the HAL must supported 1048 * the open_legacy call 1049 */ 1050 ALOGE("%s: camera HAL module version %x doesn't support connecting to legacy HAL devices!", 1051 __FUNCTION__, apiVersion); 1052 return INVALID_OPERATION; 1053 } 1054 1055 status_t ret = NO_ERROR; 1056 String8 id = String8::format("%d", cameraId); 1057 sp<Client> client = nullptr; 1058 ret = connectHelper<ICameraClient,Client>(cameraClient, id, halVersion, clientPackageName, 1059 clientUid, API_1, true, false, /*out*/client); 1060 1061 if(ret != NO_ERROR) { 1062 return ret; 1063 } 1064 1065 device = client; 1066 return NO_ERROR; 1067} 1068 1069status_t CameraService::connectPro(const sp<IProCameraCallbacks>& cameraCb, 1070 int cameraId, 1071 const String16& clientPackageName, 1072 int clientUid, 1073 /*out*/ 1074 sp<IProCameraUser>& device) { 1075 ALOGE("%s: Unimplemented, please use connectDevice", __FUNCTION__); 1076 return INVALID_OPERATION; 1077} 1078 1079status_t CameraService::connectDevice( 1080 const sp<ICameraDeviceCallbacks>& cameraCb, 1081 int cameraId, 1082 const String16& clientPackageName, 1083 int clientUid, 1084 /*out*/ 1085 sp<ICameraDeviceUser>& device) { 1086 1087 status_t ret = NO_ERROR; 1088 String8 id = String8::format("%d", cameraId); 1089 sp<CameraDeviceClient> client = nullptr; 1090 ret = connectHelper<ICameraDeviceCallbacks,CameraDeviceClient>(cameraCb, id, 1091 CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageName, clientUid, API_2, false, false, 1092 /*out*/client); 1093 1094 if(ret != NO_ERROR) { 1095 return ret; 1096 } 1097 1098 device = client; 1099 return NO_ERROR; 1100} 1101 1102status_t CameraService::setTorchMode(const String16& cameraId, bool enabled, 1103 const sp<IBinder>& clientBinder) { 1104 if (enabled && clientBinder == NULL) { 1105 ALOGE("%s: torch client binder is NULL", __FUNCTION__); 1106 return -EINVAL; 1107 } 1108 1109 String8 id = String8(cameraId.string()); 1110 1111 // verify id is valid. 1112 auto state = getCameraState(id); 1113 if (state == nullptr) { 1114 ALOGE("%s: camera id is invalid %s", id.string()); 1115 return -EINVAL; 1116 } 1117 1118 ICameraServiceListener::Status cameraStatus = state->getStatus(); 1119 if (cameraStatus != ICameraServiceListener::STATUS_PRESENT && 1120 cameraStatus != ICameraServiceListener::STATUS_NOT_AVAILABLE) { 1121 ALOGE("%s: camera id is invalid %s", id.string()); 1122 return -EINVAL; 1123 } 1124 1125 { 1126 Mutex::Autolock al(mTorchStatusMutex); 1127 ICameraServiceListener::TorchStatus status; 1128 status_t res = getTorchStatusLocked(id, &status); 1129 if (res) { 1130 ALOGE("%s: getting current torch status failed for camera %s", 1131 __FUNCTION__, id.string()); 1132 return -EINVAL; 1133 } 1134 1135 if (status == ICameraServiceListener::TORCH_STATUS_NOT_AVAILABLE) { 1136 if (cameraStatus == ICameraServiceListener::STATUS_NOT_AVAILABLE) { 1137 ALOGE("%s: torch mode of camera %s is not available because " 1138 "camera is in use", __FUNCTION__, id.string()); 1139 return -EBUSY; 1140 } else { 1141 ALOGE("%s: torch mode of camera %s is not available due to " 1142 "insufficient resources", __FUNCTION__, id.string()); 1143 return -EUSERS; 1144 } 1145 } 1146 } 1147 1148 status_t res = mFlashlight->setTorchMode(id, enabled); 1149 if (res) { 1150 ALOGE("%s: setting torch mode of camera %s to %d failed. %s (%d)", 1151 __FUNCTION__, id.string(), enabled, strerror(-res), res); 1152 return res; 1153 } 1154 1155 { 1156 // update the link to client's death 1157 Mutex::Autolock al(mTorchClientMapMutex); 1158 ssize_t index = mTorchClientMap.indexOfKey(id); 1159 if (enabled) { 1160 if (index == NAME_NOT_FOUND) { 1161 mTorchClientMap.add(id, clientBinder); 1162 } else { 1163 const sp<IBinder> oldBinder = mTorchClientMap.valueAt(index); 1164 oldBinder->unlinkToDeath(this); 1165 1166 mTorchClientMap.replaceValueAt(index, clientBinder); 1167 } 1168 clientBinder->linkToDeath(this); 1169 } else if (index != NAME_NOT_FOUND) { 1170 sp<IBinder> oldBinder = mTorchClientMap.valueAt(index); 1171 oldBinder->unlinkToDeath(this); 1172 } 1173 } 1174 1175 return OK; 1176} 1177 1178status_t CameraService::addListener( 1179 const sp<ICameraServiceListener>& listener) { 1180 ALOGV("%s: Add listener %p", __FUNCTION__, listener.get()); 1181 1182 if (listener == 0) { 1183 ALOGE("%s: Listener must not be null", __FUNCTION__); 1184 return BAD_VALUE; 1185 } 1186 1187 Mutex::Autolock lock(mServiceLock); 1188 1189 { 1190 Mutex::Autolock lock(mStatusListenerLock); 1191 for (auto& it : mListenerList) { 1192 if (IInterface::asBinder(it) == IInterface::asBinder(listener)) { 1193 ALOGW("%s: Tried to add listener %p which was already subscribed", 1194 __FUNCTION__, listener.get()); 1195 return ALREADY_EXISTS; 1196 } 1197 } 1198 1199 mListenerList.push_back(listener); 1200 } 1201 1202 1203 /* Immediately signal current status to this listener only */ 1204 { 1205 Mutex::Autolock lock(mCameraStatesLock); 1206 for (auto& i : mCameraStates) { 1207 // TODO: Update binder to use String16 for camera IDs and remove; 1208 int id = cameraIdToInt(i.first); 1209 if (id == -1) continue; 1210 1211 listener->onStatusChanged(i.second->getStatus(), id); 1212 } 1213 } 1214 1215 /* Immediately signal current torch status to this listener only */ 1216 { 1217 Mutex::Autolock al(mTorchStatusMutex); 1218 for (size_t i = 0; i < mTorchStatusMap.size(); i++ ) { 1219 String16 id = String16(mTorchStatusMap.keyAt(i).string()); 1220 listener->onTorchStatusChanged(mTorchStatusMap.valueAt(i), id); 1221 } 1222 } 1223 1224 return OK; 1225} 1226 1227status_t CameraService::removeListener(const sp<ICameraServiceListener>& listener) { 1228 ALOGV("%s: Remove listener %p", __FUNCTION__, listener.get()); 1229 1230 if (listener == 0) { 1231 ALOGE("%s: Listener must not be null", __FUNCTION__); 1232 return BAD_VALUE; 1233 } 1234 1235 Mutex::Autolock lock(mServiceLock); 1236 1237 { 1238 Mutex::Autolock lock(mStatusListenerLock); 1239 for (auto it = mListenerList.begin(); it != mListenerList.end(); it++) { 1240 if (IInterface::asBinder(*it) == IInterface::asBinder(listener)) { 1241 mListenerList.erase(it); 1242 return OK; 1243 } 1244 } 1245 } 1246 1247 ALOGW("%s: Tried to remove a listener %p which was not subscribed", 1248 __FUNCTION__, listener.get()); 1249 1250 return BAD_VALUE; 1251} 1252 1253status_t CameraService::getLegacyParameters(int cameraId, /*out*/String16* parameters) { 1254 ALOGV("%s: for camera ID = %d", __FUNCTION__, cameraId); 1255 1256 if (parameters == NULL) { 1257 ALOGE("%s: parameters must not be null", __FUNCTION__); 1258 return BAD_VALUE; 1259 } 1260 1261 status_t ret = 0; 1262 1263 CameraParameters shimParams; 1264 if ((ret = getLegacyParametersLazy(cameraId, /*out*/&shimParams)) != OK) { 1265 // Error logged by caller 1266 return ret; 1267 } 1268 1269 String8 shimParamsString8 = shimParams.flatten(); 1270 String16 shimParamsString16 = String16(shimParamsString8); 1271 1272 *parameters = shimParamsString16; 1273 1274 return OK; 1275} 1276 1277status_t CameraService::supportsCameraApi(int cameraId, int apiVersion) { 1278 ALOGV("%s: for camera ID = %d", __FUNCTION__, cameraId); 1279 1280 switch (apiVersion) { 1281 case API_VERSION_1: 1282 case API_VERSION_2: 1283 break; 1284 default: 1285 ALOGE("%s: Bad API version %d", __FUNCTION__, apiVersion); 1286 return BAD_VALUE; 1287 } 1288 1289 int facing = -1; 1290 int deviceVersion = getDeviceVersion(cameraId, &facing); 1291 1292 switch(deviceVersion) { 1293 case CAMERA_DEVICE_API_VERSION_1_0: 1294 case CAMERA_DEVICE_API_VERSION_2_0: 1295 case CAMERA_DEVICE_API_VERSION_2_1: 1296 case CAMERA_DEVICE_API_VERSION_3_0: 1297 case CAMERA_DEVICE_API_VERSION_3_1: 1298 if (apiVersion == API_VERSION_2) { 1299 ALOGV("%s: Camera id %d uses HAL prior to HAL3.2, doesn't support api2 without shim", 1300 __FUNCTION__, cameraId); 1301 return -EOPNOTSUPP; 1302 } else { // if (apiVersion == API_VERSION_1) { 1303 ALOGV("%s: Camera id %d uses older HAL before 3.2, but api1 is always supported", 1304 __FUNCTION__, cameraId); 1305 return OK; 1306 } 1307 case CAMERA_DEVICE_API_VERSION_3_2: 1308 case CAMERA_DEVICE_API_VERSION_3_3: 1309 ALOGV("%s: Camera id %d uses HAL3.2 or newer, supports api1/api2 directly", 1310 __FUNCTION__, cameraId); 1311 return OK; 1312 case -1: 1313 ALOGE("%s: Invalid camera id %d", __FUNCTION__, cameraId); 1314 return BAD_VALUE; 1315 default: 1316 ALOGE("%s: Unknown camera device HAL version: %d", __FUNCTION__, deviceVersion); 1317 return INVALID_OPERATION; 1318 } 1319 1320 return OK; 1321} 1322 1323void CameraService::removeByClient(const BasicClient* client) { 1324 Mutex::Autolock lock(mServiceLock); 1325 for (auto& i : mActiveClientManager.getAll()) { 1326 auto clientSp = i->getValue(); 1327 if (clientSp.get() == client) { 1328 mActiveClientManager.remove(i); 1329 } 1330 } 1331} 1332 1333bool CameraService::evictClientIdByRemote(const wp<IBinder>& remote) { 1334 const int callingPid = getCallingPid(); 1335 const int servicePid = getpid(); 1336 bool ret = false; 1337 { 1338 // Acquire mServiceLock and prevent other clients from connecting 1339 std::unique_ptr<AutoConditionLock> lock = 1340 AutoConditionLock::waitAndAcquire(mServiceLockWrapper); 1341 1342 1343 std::vector<sp<BasicClient>> evicted; 1344 for (auto& i : mActiveClientManager.getAll()) { 1345 auto clientSp = i->getValue(); 1346 if (clientSp.get() == nullptr) { 1347 ALOGE("%s: Dead client still in mActiveClientManager.", __FUNCTION__); 1348 mActiveClientManager.remove(i); 1349 continue; 1350 } 1351 if (remote == clientSp->getRemote() && (callingPid == servicePid || 1352 callingPid == clientSp->getClientPid())) { 1353 mActiveClientManager.remove(i); 1354 evicted.push_back(clientSp); 1355 1356 // Notify the client of disconnection 1357 clientSp->notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED, 1358 CaptureResultExtras()); 1359 } 1360 } 1361 1362 // Do not hold mServiceLock while disconnecting clients, but retain the condition blocking 1363 // other clients from connecting in mServiceLockWrapper if held 1364 mServiceLock.unlock(); 1365 1366 for (auto& i : evicted) { 1367 if (i.get() != nullptr) { 1368 i->disconnect(); 1369 ret = true; 1370 } 1371 } 1372 1373 // Reacquire mServiceLock 1374 mServiceLock.lock(); 1375 1376 } // lock is destroyed, allow further connect calls 1377 1378 return ret; 1379} 1380 1381 1382std::shared_ptr<CameraService::CameraState> CameraService::getCameraState( 1383 const String8& cameraId) const { 1384 std::shared_ptr<CameraState> state; 1385 { 1386 Mutex::Autolock lock(mCameraStatesLock); 1387 auto iter = mCameraStates.find(cameraId); 1388 if (iter != mCameraStates.end()) { 1389 state = iter->second; 1390 } 1391 } 1392 return state; 1393} 1394 1395sp<CameraService::BasicClient> CameraService::removeClientLocked(const String8& cameraId) { 1396 // Remove from active clients list 1397 auto clientDescriptorPtr = mActiveClientManager.remove(cameraId); 1398 if (clientDescriptorPtr == nullptr) { 1399 ALOGW("%s: Could not evict client, no client for camera ID %s", __FUNCTION__, 1400 cameraId.string()); 1401 return sp<BasicClient>{nullptr}; 1402 } 1403 1404 return clientDescriptorPtr->getValue(); 1405} 1406 1407 1408void CameraService::logDisconnected(const String8& cameraId, int clientPid, 1409 const String8& clientPackage) { 1410 1411 String8 curTime = getFormattedCurrentTime(); 1412 // Log the clients evicted 1413 mEventLog.add(String8::format("%s : DISCONNECT device %s client for package %s (PID %d)", 1414 curTime.string(), cameraId.string(), clientPackage.string(), clientPid)); 1415} 1416 1417void CameraService::logConnected(const String8& cameraId, int clientPid, 1418 const String8& clientPackage) { 1419 1420 String8 curTime = getFormattedCurrentTime(); 1421 // Log the clients evicted 1422 mEventLog.add(String8::format("%s : CONNECT device %s client for package %s (PID %d)", 1423 curTime.string(), cameraId.string(), clientPackage.string(), clientPid)); 1424} 1425 1426status_t CameraService::onTransact( 1427 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 1428 // Permission checks 1429 switch (code) { 1430 case BnCameraService::CONNECT: 1431 case BnCameraService::CONNECT_PRO: 1432 case BnCameraService::CONNECT_DEVICE: 1433 case BnCameraService::CONNECT_LEGACY: 1434 const int pid = getCallingPid(); 1435 const int self_pid = getpid(); 1436 if (pid != self_pid) { 1437 // we're called from a different process, do the real check 1438 if (!checkCallingPermission( 1439 String16("android.permission.CAMERA"))) { 1440 const int uid = getCallingUid(); 1441 ALOGE("Permission Denial: " 1442 "can't use the camera pid=%d, uid=%d", pid, uid); 1443 return PERMISSION_DENIED; 1444 } 1445 } 1446 break; 1447 } 1448 1449 return BnCameraService::onTransact(code, data, reply, flags); 1450} 1451 1452// We share the media players for shutter and recording sound for all clients. 1453// A reference count is kept to determine when we will actually release the 1454// media players. 1455 1456MediaPlayer* CameraService::newMediaPlayer(const char *file) { 1457 MediaPlayer* mp = new MediaPlayer(); 1458 if (mp->setDataSource(NULL /* httpService */, file, NULL) == NO_ERROR) { 1459 mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE); 1460 mp->prepare(); 1461 } else { 1462 ALOGE("Failed to load CameraService sounds: %s", file); 1463 return NULL; 1464 } 1465 return mp; 1466} 1467 1468void CameraService::loadSound() { 1469 Mutex::Autolock lock(mSoundLock); 1470 LOG1("CameraService::loadSound ref=%d", mSoundRef); 1471 if (mSoundRef++) return; 1472 1473 mSoundPlayer[SOUND_SHUTTER] = newMediaPlayer("/system/media/audio/ui/camera_click.ogg"); 1474 mSoundPlayer[SOUND_RECORDING] = newMediaPlayer("/system/media/audio/ui/VideoRecord.ogg"); 1475} 1476 1477void CameraService::releaseSound() { 1478 Mutex::Autolock lock(mSoundLock); 1479 LOG1("CameraService::releaseSound ref=%d", mSoundRef); 1480 if (--mSoundRef) return; 1481 1482 for (int i = 0; i < NUM_SOUNDS; i++) { 1483 if (mSoundPlayer[i] != 0) { 1484 mSoundPlayer[i]->disconnect(); 1485 mSoundPlayer[i].clear(); 1486 } 1487 } 1488} 1489 1490void CameraService::playSound(sound_kind kind) { 1491 LOG1("playSound(%d)", kind); 1492 Mutex::Autolock lock(mSoundLock); 1493 sp<MediaPlayer> player = mSoundPlayer[kind]; 1494 if (player != 0) { 1495 player->seekTo(0); 1496 player->start(); 1497 } 1498} 1499 1500// ---------------------------------------------------------------------------- 1501 1502CameraService::Client::Client(const sp<CameraService>& cameraService, 1503 const sp<ICameraClient>& cameraClient, 1504 const String16& clientPackageName, 1505 int cameraId, int cameraFacing, 1506 int clientPid, uid_t clientUid, 1507 int servicePid) : 1508 CameraService::BasicClient(cameraService, 1509 IInterface::asBinder(cameraClient), 1510 clientPackageName, 1511 cameraId, cameraFacing, 1512 clientPid, clientUid, 1513 servicePid) 1514{ 1515 int callingPid = getCallingPid(); 1516 LOG1("Client::Client E (pid %d, id %d)", callingPid, cameraId); 1517 1518 mRemoteCallback = cameraClient; 1519 1520 cameraService->loadSound(); 1521 1522 LOG1("Client::Client X (pid %d, id %d)", callingPid, cameraId); 1523} 1524 1525// tear down the client 1526CameraService::Client::~Client() { 1527 ALOGV("~Client"); 1528 mDestructionStarted = true; 1529 1530 mCameraService->releaseSound(); 1531 // unconditionally disconnect. function is idempotent 1532 Client::disconnect(); 1533} 1534 1535CameraService::BasicClient::BasicClient(const sp<CameraService>& cameraService, 1536 const sp<IBinder>& remoteCallback, 1537 const String16& clientPackageName, 1538 int cameraId, int cameraFacing, 1539 int clientPid, uid_t clientUid, 1540 int servicePid): 1541 mClientPackageName(clientPackageName), mDisconnected(false) 1542{ 1543 mCameraService = cameraService; 1544 mRemoteBinder = remoteCallback; 1545 mCameraId = cameraId; 1546 mCameraFacing = cameraFacing; 1547 mClientPid = clientPid; 1548 mClientUid = clientUid; 1549 mServicePid = servicePid; 1550 mOpsActive = false; 1551 mDestructionStarted = false; 1552} 1553 1554CameraService::BasicClient::~BasicClient() { 1555 ALOGV("~BasicClient"); 1556 mDestructionStarted = true; 1557} 1558 1559void CameraService::BasicClient::disconnect() { 1560 if (mDisconnected) return; 1561 mDisconnected = true;; 1562 1563 mCameraService->removeByClient(this); 1564 mCameraService->logDisconnected(String8::format("%d", mCameraId), mClientPid, 1565 String8(mClientPackageName)); 1566 1567 sp<IBinder> remote = getRemote(); 1568 if (remote != nullptr) { 1569 remote->unlinkToDeath(mCameraService); 1570 } 1571 1572 finishCameraOps(); 1573 ALOGI("%s: Disconnected client for camera %d for PID %d", __FUNCTION__, mCameraId, mClientPid); 1574 1575 // client shouldn't be able to call into us anymore 1576 mClientPid = 0; 1577} 1578 1579String16 CameraService::BasicClient::getPackageName() const { 1580 return mClientPackageName; 1581} 1582 1583 1584int CameraService::BasicClient::getClientPid() const { 1585 return mClientPid; 1586} 1587 1588status_t CameraService::BasicClient::startCameraOps() { 1589 int32_t res; 1590 // Notify app ops that the camera is not available 1591 mOpsCallback = new OpsCallback(this); 1592 1593 { 1594 ALOGV("%s: Start camera ops, package name = %s, client UID = %d", 1595 __FUNCTION__, String8(mClientPackageName).string(), mClientUid); 1596 } 1597 1598 mAppOpsManager.startWatchingMode(AppOpsManager::OP_CAMERA, 1599 mClientPackageName, mOpsCallback); 1600 res = mAppOpsManager.startOp(AppOpsManager::OP_CAMERA, 1601 mClientUid, mClientPackageName); 1602 1603 if (res != AppOpsManager::MODE_ALLOWED) { 1604 ALOGI("Camera %d: Access for \"%s\" has been revoked", 1605 mCameraId, String8(mClientPackageName).string()); 1606 return PERMISSION_DENIED; 1607 } 1608 1609 mOpsActive = true; 1610 1611 // Transition device availability listeners from PRESENT -> NOT_AVAILABLE 1612 mCameraService->updateStatus(ICameraServiceListener::STATUS_NOT_AVAILABLE, 1613 String8::format("%d", mCameraId)); 1614 1615 return OK; 1616} 1617 1618status_t CameraService::BasicClient::finishCameraOps() { 1619 // Check if startCameraOps succeeded, and if so, finish the camera op 1620 if (mOpsActive) { 1621 // Notify app ops that the camera is available again 1622 mAppOpsManager.finishOp(AppOpsManager::OP_CAMERA, mClientUid, 1623 mClientPackageName); 1624 mOpsActive = false; 1625 1626 auto rejected = {ICameraServiceListener::STATUS_NOT_PRESENT, 1627 ICameraServiceListener::STATUS_ENUMERATING}; 1628 1629 // Transition to PRESENT if the camera is not in either of the rejected states 1630 mCameraService->updateStatus(ICameraServiceListener::STATUS_PRESENT, 1631 String8::format("%d", mCameraId), rejected); 1632 1633 // Notify flashlight that a camera device is closed. 1634 mCameraService->mFlashlight->deviceClosed( 1635 String8::format("%d", mCameraId)); 1636 } 1637 // Always stop watching, even if no camera op is active 1638 if (mOpsCallback != NULL) { 1639 mAppOpsManager.stopWatchingMode(mOpsCallback); 1640 } 1641 mOpsCallback.clear(); 1642 1643 return OK; 1644} 1645 1646void CameraService::BasicClient::opChanged(int32_t op, const String16& packageName) { 1647 String8 name(packageName); 1648 String8 myName(mClientPackageName); 1649 1650 if (op != AppOpsManager::OP_CAMERA) { 1651 ALOGW("Unexpected app ops notification received: %d", op); 1652 return; 1653 } 1654 1655 int32_t res; 1656 res = mAppOpsManager.checkOp(AppOpsManager::OP_CAMERA, 1657 mClientUid, mClientPackageName); 1658 ALOGV("checkOp returns: %d, %s ", res, 1659 res == AppOpsManager::MODE_ALLOWED ? "ALLOWED" : 1660 res == AppOpsManager::MODE_IGNORED ? "IGNORED" : 1661 res == AppOpsManager::MODE_ERRORED ? "ERRORED" : 1662 "UNKNOWN"); 1663 1664 if (res != AppOpsManager::MODE_ALLOWED) { 1665 ALOGI("Camera %d: Access for \"%s\" revoked", mCameraId, 1666 myName.string()); 1667 // Reset the client PID to allow server-initiated disconnect, 1668 // and to prevent further calls by client. 1669 mClientPid = getCallingPid(); 1670 CaptureResultExtras resultExtras; // a dummy result (invalid) 1671 notifyError(ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE, resultExtras); 1672 disconnect(); 1673 } 1674} 1675 1676// ---------------------------------------------------------------------------- 1677 1678// Provide client strong pointer for callbacks. 1679sp<CameraService::Client> CameraService::Client::getClientFromCookie(void* user) { 1680 String8 cameraId = String8::format("%d", (int)(intptr_t) user); 1681 auto clientDescriptor = gCameraService->mActiveClientManager.get(cameraId); 1682 if (clientDescriptor != nullptr) { 1683 return sp<Client>{ 1684 static_cast<Client*>(clientDescriptor->getValue().get())}; 1685 } 1686 return sp<Client>{nullptr}; 1687} 1688 1689void CameraService::Client::notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode, 1690 const CaptureResultExtras& resultExtras) { 1691 mRemoteCallback->notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_RELEASED, 0); 1692} 1693 1694// NOTE: function is idempotent 1695void CameraService::Client::disconnect() { 1696 ALOGV("Client::disconnect"); 1697 BasicClient::disconnect(); 1698} 1699 1700CameraService::Client::OpsCallback::OpsCallback(wp<BasicClient> client): 1701 mClient(client) { 1702} 1703 1704void CameraService::Client::OpsCallback::opChanged(int32_t op, 1705 const String16& packageName) { 1706 sp<BasicClient> client = mClient.promote(); 1707 if (client != NULL) { 1708 client->opChanged(op, packageName); 1709 } 1710} 1711 1712// ---------------------------------------------------------------------------- 1713// IProCamera 1714// ---------------------------------------------------------------------------- 1715 1716CameraService::ProClient::ProClient(const sp<CameraService>& cameraService, 1717 const sp<IProCameraCallbacks>& remoteCallback, 1718 const String16& clientPackageName, 1719 int cameraId, 1720 int cameraFacing, 1721 int clientPid, 1722 uid_t clientUid, 1723 int servicePid) 1724 : CameraService::BasicClient(cameraService, IInterface::asBinder(remoteCallback), 1725 clientPackageName, cameraId, cameraFacing, 1726 clientPid, clientUid, servicePid) 1727{ 1728 mRemoteCallback = remoteCallback; 1729} 1730 1731CameraService::ProClient::~ProClient() { 1732} 1733 1734void CameraService::ProClient::notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode, 1735 const CaptureResultExtras& resultExtras) { 1736 mRemoteCallback->notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_RELEASED, 0); 1737} 1738 1739// ---------------------------------------------------------------------------- 1740// CameraState 1741// ---------------------------------------------------------------------------- 1742 1743CameraService::CameraState::CameraState(const String8& id, int cost, 1744 const std::set<String8>& conflicting) : mId(id), 1745 mStatus(ICameraServiceListener::STATUS_PRESENT), mCost(cost), mConflicting(conflicting) {} 1746 1747CameraService::CameraState::~CameraState() {} 1748 1749ICameraServiceListener::Status CameraService::CameraState::getStatus() const { 1750 Mutex::Autolock lock(mStatusLock); 1751 return mStatus; 1752} 1753 1754CameraParameters CameraService::CameraState::getShimParams() const { 1755 return mShimParams; 1756} 1757 1758void CameraService::CameraState::setShimParams(const CameraParameters& params) { 1759 mShimParams = params; 1760} 1761 1762int CameraService::CameraState::getCost() const { 1763 return mCost; 1764} 1765 1766std::set<String8> CameraService::CameraState::getConflicting() const { 1767 return mConflicting; 1768} 1769 1770String8 CameraService::CameraState::getId() const { 1771 return mId; 1772} 1773 1774// ---------------------------------------------------------------------------- 1775// CameraClientManager 1776// ---------------------------------------------------------------------------- 1777 1778CameraService::CameraClientManager::~CameraClientManager() {} 1779 1780sp<CameraService::BasicClient> CameraService::CameraClientManager::getCameraClient( 1781 const String8& id) const { 1782 auto descriptor = get(id); 1783 if (descriptor == nullptr) { 1784 return sp<BasicClient>{nullptr}; 1785 } 1786 return descriptor->getValue(); 1787} 1788 1789String8 CameraService::CameraClientManager::toString() const { 1790 auto all = getAll(); 1791 String8 ret("["); 1792 bool hasAny = false; 1793 for (auto& i : all) { 1794 hasAny = true; 1795 String8 key = i->getKey(); 1796 int32_t cost = i->getCost(); 1797 int32_t pid = i->getOwnerId(); 1798 int32_t priority = i->getPriority(); 1799 auto conflicting = i->getConflicting(); 1800 auto clientSp = i->getValue(); 1801 String8 packageName; 1802 if (clientSp.get() != nullptr) { 1803 packageName = String8{clientSp->getPackageName()}; 1804 } 1805 ret.appendFormat("\n(Camera ID: %s, Cost: %" PRId32 ", PID: %" PRId32 ", Priority: %" 1806 PRId32 ", ", key.string(), cost, pid, priority); 1807 1808 if (packageName.size() != 0) { 1809 ret.appendFormat("Client Package Name: %s", packageName.string()); 1810 } 1811 1812 ret.append(", Conflicting Client Devices: {"); 1813 for (auto& j : conflicting) { 1814 ret.appendFormat("%s, ", j.string()); 1815 } 1816 ret.append("})"); 1817 } 1818 if (hasAny) ret.append("\n"); 1819 ret.append("]\n"); 1820 return ret; 1821} 1822 1823CameraService::DescriptorPtr CameraService::CameraClientManager::makeClientDescriptor( 1824 const String8& key, const sp<BasicClient>& value, int32_t cost, 1825 const std::set<String8>& conflictingKeys, int32_t priority, int32_t ownerId) { 1826 1827 return std::make_shared<resource_policy::ClientDescriptor<String8, sp<BasicClient>>>( 1828 key, value, cost, conflictingKeys, priority, ownerId); 1829} 1830 1831CameraService::DescriptorPtr CameraService::CameraClientManager::makeClientDescriptor( 1832 const sp<BasicClient>& value, const CameraService::DescriptorPtr& partial) { 1833 return makeClientDescriptor(partial->getKey(), value, partial->getCost(), 1834 partial->getConflicting(), partial->getPriority(), partial->getOwnerId()); 1835} 1836 1837// ---------------------------------------------------------------------------- 1838 1839static const int kDumpLockRetries = 50; 1840static const int kDumpLockSleep = 60000; 1841 1842static bool tryLock(Mutex& mutex) 1843{ 1844 bool locked = false; 1845 for (int i = 0; i < kDumpLockRetries; ++i) { 1846 if (mutex.tryLock() == NO_ERROR) { 1847 locked = true; 1848 break; 1849 } 1850 usleep(kDumpLockSleep); 1851 } 1852 return locked; 1853} 1854 1855status_t CameraService::dump(int fd, const Vector<String16>& args) { 1856 String8 result; 1857 if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 1858 result.appendFormat("Permission Denial: " 1859 "can't dump CameraService from pid=%d, uid=%d\n", 1860 getCallingPid(), 1861 getCallingUid()); 1862 write(fd, result.string(), result.size()); 1863 } else { 1864 bool locked = tryLock(mServiceLock); 1865 // failed to lock - CameraService is probably deadlocked 1866 if (!locked) { 1867 result.append("CameraService may be deadlocked\n"); 1868 write(fd, result.string(), result.size()); 1869 } 1870 1871 bool hasClient = false; 1872 if (!mModule) { 1873 result = String8::format("No camera module available!\n"); 1874 write(fd, result.string(), result.size()); 1875 if (locked) mServiceLock.unlock(); 1876 return NO_ERROR; 1877 } 1878 1879 const hw_module_t* common = mModule->getRawModule(); 1880 result = String8::format("Camera module HAL API version: %#x\n", common->hal_api_version); 1881 result.appendFormat("Camera module API version: %#x\n", common->module_api_version); 1882 result.appendFormat("Camera module name: %s\n", common->name); 1883 result.appendFormat("Camera module author: %s\n", common->author); 1884 result.appendFormat("Number of camera devices: %d\n", mNumberOfCameras); 1885 String8 activeClientString = mActiveClientManager.toString(); 1886 result.appendFormat("Active Camera Clients:\n%s", activeClientString.string()); 1887 1888 1889 sp<VendorTagDescriptor> desc = VendorTagDescriptor::getGlobalVendorTagDescriptor(); 1890 if (desc == NULL) { 1891 result.appendFormat("Vendor tags left unimplemented.\n"); 1892 } else { 1893 result.appendFormat("Vendor tag definitions:\n"); 1894 } 1895 1896 write(fd, result.string(), result.size()); 1897 1898 if (desc != NULL) { 1899 desc->dump(fd, /*verbosity*/2, /*indentation*/4); 1900 } 1901 1902 result = String8("Prior client events (most recent at top):\n"); 1903 1904 for (const auto& msg : mEventLog) { 1905 result.appendFormat("%s\n", msg.string()); 1906 } 1907 1908 if (mEventLog.size() == DEFAULT_EVICTION_LOG_LENGTH) { 1909 result.append("...\n"); 1910 } 1911 1912 write(fd, result.string(), result.size()); 1913 1914 bool stateLocked = tryLock(mCameraStatesLock); 1915 if (!stateLocked) { 1916 result = String8::format("CameraStates in use, may be deadlocked\n"); 1917 write(fd, result.string(), result.size()); 1918 } 1919 1920 for (auto& state : mCameraStates) { 1921 String8 cameraId = state.first; 1922 result = String8::format("Camera %s information:\n", cameraId.string()); 1923 camera_info info; 1924 1925 // TODO: Change getCameraInfo + HAL to use String cameraIds 1926 status_t rc = mModule->getCameraInfo(cameraIdToInt(cameraId), &info); 1927 if (rc != OK) { 1928 result.appendFormat(" Error reading static information!\n"); 1929 write(fd, result.string(), result.size()); 1930 } else { 1931 result.appendFormat(" Facing: %s\n", 1932 info.facing == CAMERA_FACING_BACK ? "BACK" : "FRONT"); 1933 result.appendFormat(" Orientation: %d\n", info.orientation); 1934 int deviceVersion; 1935 if (common->module_api_version < CAMERA_MODULE_API_VERSION_2_0) { 1936 deviceVersion = CAMERA_DEVICE_API_VERSION_1_0; 1937 } else { 1938 deviceVersion = info.device_version; 1939 } 1940 1941 auto conflicting = state.second->getConflicting(); 1942 result.appendFormat(" Resource Cost: %d\n", state.second->getCost()); 1943 result.appendFormat(" Conflicting Devices:"); 1944 for (auto& id : conflicting) { 1945 result.appendFormat(" %s", cameraId.string()); 1946 } 1947 if (conflicting.size() == 0) { 1948 result.appendFormat(" NONE"); 1949 } 1950 result.appendFormat("\n"); 1951 1952 result.appendFormat(" Device version: %#x\n", deviceVersion); 1953 if (deviceVersion >= CAMERA_DEVICE_API_VERSION_2_0) { 1954 result.appendFormat(" Device static metadata:\n"); 1955 write(fd, result.string(), result.size()); 1956 dump_indented_camera_metadata(info.static_camera_characteristics, 1957 fd, /*verbosity*/2, /*indentation*/4); 1958 } else { 1959 write(fd, result.string(), result.size()); 1960 } 1961 1962 CameraParameters p = state.second->getShimParams(); 1963 if (!p.isEmpty()) { 1964 result = String8::format(" Camera1 API shim is using parameters:\n "); 1965 write(fd, result.string(), result.size()); 1966 p.dump(fd, args); 1967 } 1968 } 1969 1970 auto clientDescriptor = mActiveClientManager.get(cameraId); 1971 if (clientDescriptor == nullptr) { 1972 result = String8::format(" Device %s is closed, no client instance\n", 1973 cameraId.string()); 1974 write(fd, result.string(), result.size()); 1975 continue; 1976 } 1977 hasClient = true; 1978 result = String8::format(" Device %s is open. Client instance dump:\n\n", 1979 cameraId.string()); 1980 result.appendFormat("Client priority level: %d\n", clientDescriptor->getPriority()); 1981 result.appendFormat("Client PID: %d\n", clientDescriptor->getOwnerId()); 1982 1983 auto client = clientDescriptor->getValue(); 1984 result.appendFormat("Client package: %s\n", 1985 String8(client->getPackageName()).string()); 1986 write(fd, result.string(), result.size()); 1987 1988 client->dump(fd, args); 1989 } 1990 1991 if (stateLocked) mCameraStatesLock.unlock(); 1992 1993 if (!hasClient) { 1994 result = String8::format("\nNo active camera clients yet.\n"); 1995 write(fd, result.string(), result.size()); 1996 } 1997 1998 if (locked) mServiceLock.unlock(); 1999 2000 // Dump camera traces if there were any 2001 write(fd, "\n", 1); 2002 camera3::CameraTraces::dump(fd, args); 2003 2004 // change logging level 2005 int n = args.size(); 2006 for (int i = 0; i + 1 < n; i++) { 2007 String16 verboseOption("-v"); 2008 if (args[i] == verboseOption) { 2009 String8 levelStr(args[i+1]); 2010 int level = atoi(levelStr.string()); 2011 result = String8::format("\nSetting log level to %d.\n", level); 2012 setLogLevel(level); 2013 write(fd, result.string(), result.size()); 2014 } 2015 } 2016 } 2017 return NO_ERROR; 2018} 2019 2020void CameraService::handleTorchClientBinderDied(const wp<IBinder> &who) { 2021 Mutex::Autolock al(mTorchClientMapMutex); 2022 for (size_t i = 0; i < mTorchClientMap.size(); i++) { 2023 if (mTorchClientMap[i] == who) { 2024 // turn off the torch mode that was turned on by dead client 2025 String8 cameraId = mTorchClientMap.keyAt(i); 2026 status_t res = mFlashlight->setTorchMode(cameraId, false); 2027 if (res) { 2028 ALOGE("%s: torch client died but couldn't turn off torch: " 2029 "%s (%d)", __FUNCTION__, strerror(-res), res); 2030 return; 2031 } 2032 mTorchClientMap.removeItemsAt(i); 2033 break; 2034 } 2035 } 2036} 2037 2038/*virtual*/void CameraService::binderDied(const wp<IBinder> &who) { 2039 2040 /** 2041 * While tempting to promote the wp<IBinder> into a sp, 2042 * it's actually not supported by the binder driver 2043 */ 2044 2045 // check torch client 2046 handleTorchClientBinderDied(who); 2047 2048 // check camera device client 2049 if(!evictClientIdByRemote(who)) { 2050 ALOGV("%s: Java client's binder death already cleaned up (normal case)", __FUNCTION__); 2051 return; 2052 } 2053 2054 ALOGE("%s: Java client's binder died, removing it from the list of active clients", 2055 __FUNCTION__); 2056} 2057 2058void CameraService::updateStatus(ICameraServiceListener::Status status, const String8& cameraId) { 2059 updateStatus(status, cameraId, {}); 2060} 2061 2062void CameraService::updateStatus(ICameraServiceListener::Status status, const String8& cameraId, 2063 std::initializer_list<ICameraServiceListener::Status> rejectSourceStates) { 2064 // Do not lock mServiceLock here or can get into a deadlock from 2065 // connect() -> disconnect -> updateStatus 2066 2067 auto state = getCameraState(cameraId); 2068 2069 if (state == nullptr) { 2070 ALOGW("%s: Could not update the status for %s, no such device exists", __FUNCTION__, 2071 cameraId.string()); 2072 return; 2073 } 2074 2075 // Update the status for this camera state, then send the onStatusChangedCallbacks to each 2076 // of the listeners with both the mStatusStatus and mStatusListenerLock held 2077 state->updateStatus(status, cameraId, rejectSourceStates, [this] 2078 (const String8& cameraId, ICameraServiceListener::Status status) { 2079 2080 // Update torch status 2081 if (status == ICameraServiceListener::STATUS_NOT_PRESENT || 2082 status == ICameraServiceListener::STATUS_NOT_AVAILABLE) { 2083 // Update torch status to not available when the camera device becomes not present 2084 // or not available. 2085 onTorchStatusChanged(cameraId, ICameraServiceListener::TORCH_STATUS_NOT_AVAILABLE); 2086 } else if (status == ICameraServiceListener::STATUS_PRESENT) { 2087 // Update torch status to available when the camera device becomes present or 2088 // available 2089 onTorchStatusChanged(cameraId, ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF); 2090 } 2091 2092 Mutex::Autolock lock(mStatusListenerLock); 2093 2094 for (auto& listener : mListenerList) { 2095 // TODO: Refactor status listeners to use strings for Camera IDs and remove this. 2096 int id = cameraIdToInt(cameraId); 2097 if (id != -1) listener->onStatusChanged(status, id); 2098 } 2099 }); 2100} 2101 2102status_t CameraService::getTorchStatusLocked( 2103 const String8& cameraId, 2104 ICameraServiceListener::TorchStatus *status) const { 2105 if (!status) { 2106 return BAD_VALUE; 2107 } 2108 ssize_t index = mTorchStatusMap.indexOfKey(cameraId); 2109 if (index == NAME_NOT_FOUND) { 2110 // invalid camera ID or the camera doesn't have a flash unit 2111 return NAME_NOT_FOUND; 2112 } 2113 2114 *status = mTorchStatusMap.valueAt(index); 2115 return OK; 2116} 2117 2118status_t CameraService::setTorchStatusLocked(const String8& cameraId, 2119 ICameraServiceListener::TorchStatus status) { 2120 ssize_t index = mTorchStatusMap.indexOfKey(cameraId); 2121 if (index == NAME_NOT_FOUND) { 2122 return BAD_VALUE; 2123 } 2124 ICameraServiceListener::TorchStatus& item = 2125 mTorchStatusMap.editValueAt(index); 2126 item = status; 2127 2128 return OK; 2129} 2130 2131}; // namespace android 2132