1 /* 2 * Copyright (C) 2013 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 "CameraDeviceClient" 18 #define ATRACE_TAG ATRACE_TAG_CAMERA 19 //#define LOG_NDEBUG 0 20 21 #include <cutils/properties.h> 22 #include <utils/Log.h> 23 #include <utils/Trace.h> 24 #include <gui/Surface.h> 25 #include <camera/camera2/CaptureRequest.h> 26 #include <camera/CameraUtils.h> 27 28 #include "common/CameraDeviceBase.h" 29 #include "api2/CameraDeviceClient.h" 30 31 // Convenience methods for constructing binder::Status objects for error returns 32 33 #define STATUS_ERROR(errorCode, errorString) \ 34 binder::Status::fromServiceSpecificError(errorCode, \ 35 String8::format("%s:%d: %s", __FUNCTION__, __LINE__, errorString)) 36 37 #define STATUS_ERROR_FMT(errorCode, errorString, ...) \ 38 binder::Status::fromServiceSpecificError(errorCode, \ 39 String8::format("%s:%d: " errorString, __FUNCTION__, __LINE__, \ 40 __VA_ARGS__)) 41 42 namespace android { 43 using namespace camera2; 44 45 CameraDeviceClientBase::CameraDeviceClientBase( 46 const sp<CameraService>& cameraService, 47 const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback, 48 const String16& clientPackageName, 49 const String8& cameraId, 50 int cameraFacing, 51 int clientPid, 52 uid_t clientUid, 53 int servicePid) : 54 BasicClient(cameraService, 55 IInterface::asBinder(remoteCallback), 56 clientPackageName, 57 cameraId, 58 cameraFacing, 59 clientPid, 60 clientUid, 61 servicePid), 62 mRemoteCallback(remoteCallback) { 63 } 64 65 // Interface used by CameraService 66 67 CameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService, 68 const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback, 69 const String16& clientPackageName, 70 const String8& cameraId, 71 int cameraFacing, 72 int clientPid, 73 uid_t clientUid, 74 int servicePid) : 75 Camera2ClientBase(cameraService, remoteCallback, clientPackageName, 76 cameraId, cameraFacing, clientPid, clientUid, servicePid), 77 mInputStream(), 78 mStreamingRequestId(REQUEST_ID_NONE), 79 mRequestIdCounter(0) { 80 81 ATRACE_CALL(); 82 ALOGI("CameraDeviceClient %s: Opened", cameraId.string()); 83 } 84 85 status_t CameraDeviceClient::initialize(sp<CameraProviderManager> manager) { 86 return initializeImpl(manager); 87 } 88 89 template<typename TProviderPtr> 90 status_t CameraDeviceClient::initializeImpl(TProviderPtr providerPtr) { 91 ATRACE_CALL(); 92 status_t res; 93 94 res = Camera2ClientBase::initialize(providerPtr); 95 if (res != OK) { 96 return res; 97 } 98 99 String8 threadName; 100 mFrameProcessor = new FrameProcessorBase(mDevice); 101 threadName = String8::format("CDU-%s-FrameProc", mCameraIdStr.string()); 102 mFrameProcessor->run(threadName.string()); 103 104 mFrameProcessor->registerListener(FRAME_PROCESSOR_LISTENER_MIN_ID, 105 FRAME_PROCESSOR_LISTENER_MAX_ID, 106 /*listener*/this, 107 /*sendPartials*/true); 108 109 return OK; 110 } 111 112 CameraDeviceClient::~CameraDeviceClient() { 113 } 114 115 binder::Status CameraDeviceClient::submitRequest( 116 const hardware::camera2::CaptureRequest& request, 117 bool streaming, 118 /*out*/ 119 hardware::camera2::utils::SubmitInfo *submitInfo) { 120 std::vector<hardware::camera2::CaptureRequest> requestList = { request }; 121 return submitRequestList(requestList, streaming, submitInfo); 122 } 123 124 binder::Status CameraDeviceClient::submitRequestList( 125 const std::vector<hardware::camera2::CaptureRequest>& requests, 126 bool streaming, 127 /*out*/ 128 hardware::camera2::utils::SubmitInfo *submitInfo) { 129 ATRACE_CALL(); 130 ALOGV("%s-start of function. Request list size %zu", __FUNCTION__, requests.size()); 131 132 binder::Status res = binder::Status::ok(); 133 status_t err; 134 if ( !(res = checkPidStatus(__FUNCTION__) ).isOk()) { 135 return res; 136 } 137 138 Mutex::Autolock icl(mBinderSerializationLock); 139 140 if (!mDevice.get()) { 141 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 142 } 143 144 if (requests.empty()) { 145 ALOGE("%s: Camera %s: Sent null request. Rejecting request.", 146 __FUNCTION__, mCameraIdStr.string()); 147 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, "Empty request list"); 148 } 149 150 List<const CameraMetadata> metadataRequestList; 151 std::list<const SurfaceMap> surfaceMapList; 152 submitInfo->mRequestId = mRequestIdCounter; 153 uint32_t loopCounter = 0; 154 155 for (auto&& request: requests) { 156 if (request.mIsReprocess) { 157 if (!mInputStream.configured) { 158 ALOGE("%s: Camera %s: no input stream is configured.", __FUNCTION__, 159 mCameraIdStr.string()); 160 return STATUS_ERROR_FMT(CameraService::ERROR_ILLEGAL_ARGUMENT, 161 "No input configured for camera %s but request is for reprocessing", 162 mCameraIdStr.string()); 163 } else if (streaming) { 164 ALOGE("%s: Camera %s: streaming reprocess requests not supported.", __FUNCTION__, 165 mCameraIdStr.string()); 166 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, 167 "Repeating reprocess requests not supported"); 168 } 169 } 170 171 CameraMetadata metadata(request.mMetadata); 172 if (metadata.isEmpty()) { 173 ALOGE("%s: Camera %s: Sent empty metadata packet. Rejecting request.", 174 __FUNCTION__, mCameraIdStr.string()); 175 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, 176 "Request settings are empty"); 177 } else if (request.mSurfaceList.isEmpty()) { 178 ALOGE("%s: Camera %s: Requests must have at least one surface target. " 179 "Rejecting request.", __FUNCTION__, mCameraIdStr.string()); 180 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, 181 "Request has no output targets"); 182 } 183 184 if (!enforceRequestPermissions(metadata)) { 185 // Callee logs 186 return STATUS_ERROR(CameraService::ERROR_PERMISSION_DENIED, 187 "Caller does not have permission to change restricted controls"); 188 } 189 190 /** 191 * Write in the output stream IDs and map from stream ID to surface ID 192 * which we calculate from the capture request's list of surface target 193 */ 194 SurfaceMap surfaceMap; 195 Vector<int32_t> outputStreamIds; 196 for (sp<Surface> surface : request.mSurfaceList) { 197 if (surface == 0) continue; 198 199 sp<IGraphicBufferProducer> gbp = surface->getIGraphicBufferProducer(); 200 int idx = mStreamMap.indexOfKey(IInterface::asBinder(gbp)); 201 202 // Trying to submit request with surface that wasn't created 203 if (idx == NAME_NOT_FOUND) { 204 ALOGE("%s: Camera %s: Tried to submit a request with a surface that" 205 " we have not called createStream on", 206 __FUNCTION__, mCameraIdStr.string()); 207 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, 208 "Request targets Surface that is not part of current capture session"); 209 } 210 211 const StreamSurfaceId& streamSurfaceId = mStreamMap.valueAt(idx); 212 if (surfaceMap.find(streamSurfaceId.streamId()) == surfaceMap.end()) { 213 surfaceMap[streamSurfaceId.streamId()] = std::vector<size_t>(); 214 outputStreamIds.push_back(streamSurfaceId.streamId()); 215 } 216 surfaceMap[streamSurfaceId.streamId()].push_back(streamSurfaceId.surfaceId()); 217 218 ALOGV("%s: Camera %s: Appending output stream %d surface %d to request", 219 __FUNCTION__, mCameraIdStr.string(), streamSurfaceId.streamId(), 220 streamSurfaceId.surfaceId()); 221 } 222 223 metadata.update(ANDROID_REQUEST_OUTPUT_STREAMS, &outputStreamIds[0], 224 outputStreamIds.size()); 225 226 if (request.mIsReprocess) { 227 metadata.update(ANDROID_REQUEST_INPUT_STREAMS, &mInputStream.id, 1); 228 } 229 230 metadata.update(ANDROID_REQUEST_ID, &(submitInfo->mRequestId), /*size*/1); 231 loopCounter++; // loopCounter starts from 1 232 ALOGV("%s: Camera %s: Creating request with ID %d (%d of %zu)", 233 __FUNCTION__, mCameraIdStr.string(), submitInfo->mRequestId, 234 loopCounter, requests.size()); 235 236 metadataRequestList.push_back(metadata); 237 surfaceMapList.push_back(surfaceMap); 238 } 239 mRequestIdCounter++; 240 241 if (streaming) { 242 err = mDevice->setStreamingRequestList(metadataRequestList, surfaceMapList, 243 &(submitInfo->mLastFrameNumber)); 244 if (err != OK) { 245 String8 msg = String8::format( 246 "Camera %s: Got error %s (%d) after trying to set streaming request", 247 mCameraIdStr.string(), strerror(-err), err); 248 ALOGE("%s: %s", __FUNCTION__, msg.string()); 249 res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, 250 msg.string()); 251 } else { 252 Mutex::Autolock idLock(mStreamingRequestIdLock); 253 mStreamingRequestId = submitInfo->mRequestId; 254 } 255 } else { 256 err = mDevice->captureList(metadataRequestList, surfaceMapList, 257 &(submitInfo->mLastFrameNumber)); 258 if (err != OK) { 259 String8 msg = String8::format( 260 "Camera %s: Got error %s (%d) after trying to submit capture request", 261 mCameraIdStr.string(), strerror(-err), err); 262 ALOGE("%s: %s", __FUNCTION__, msg.string()); 263 res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, 264 msg.string()); 265 } 266 ALOGV("%s: requestId = %d ", __FUNCTION__, submitInfo->mRequestId); 267 } 268 269 ALOGV("%s: Camera %s: End of function", __FUNCTION__, mCameraIdStr.string()); 270 return res; 271 } 272 273 binder::Status CameraDeviceClient::cancelRequest( 274 int requestId, 275 /*out*/ 276 int64_t* lastFrameNumber) { 277 ATRACE_CALL(); 278 ALOGV("%s, requestId = %d", __FUNCTION__, requestId); 279 280 status_t err; 281 binder::Status res; 282 283 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 284 285 Mutex::Autolock icl(mBinderSerializationLock); 286 287 if (!mDevice.get()) { 288 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 289 } 290 291 Mutex::Autolock idLock(mStreamingRequestIdLock); 292 if (mStreamingRequestId != requestId) { 293 String8 msg = String8::format("Camera %s: Canceling request ID %d doesn't match " 294 "current request ID %d", mCameraIdStr.string(), requestId, mStreamingRequestId); 295 ALOGE("%s: %s", __FUNCTION__, msg.string()); 296 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 297 } 298 299 err = mDevice->clearStreamingRequest(lastFrameNumber); 300 301 if (err == OK) { 302 ALOGV("%s: Camera %s: Successfully cleared streaming request", 303 __FUNCTION__, mCameraIdStr.string()); 304 mStreamingRequestId = REQUEST_ID_NONE; 305 } else { 306 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 307 "Camera %s: Error clearing streaming request: %s (%d)", 308 mCameraIdStr.string(), strerror(-err), err); 309 } 310 311 return res; 312 } 313 314 binder::Status CameraDeviceClient::beginConfigure() { 315 // TODO: Implement this. 316 ATRACE_CALL(); 317 ALOGV("%s: Not implemented yet.", __FUNCTION__); 318 return binder::Status::ok(); 319 } 320 321 binder::Status CameraDeviceClient::endConfigure(int operatingMode) { 322 ATRACE_CALL(); 323 ALOGV("%s: ending configure (%d input stream, %zu output surfaces)", 324 __FUNCTION__, mInputStream.configured ? 1 : 0, 325 mStreamMap.size()); 326 327 binder::Status res; 328 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 329 330 Mutex::Autolock icl(mBinderSerializationLock); 331 332 if (!mDevice.get()) { 333 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 334 } 335 336 if (operatingMode < 0) { 337 String8 msg = String8::format( 338 "Camera %s: Invalid operating mode %d requested", mCameraIdStr.string(), operatingMode); 339 ALOGE("%s: %s", __FUNCTION__, msg.string()); 340 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, 341 msg.string()); 342 } 343 344 // Sanitize the high speed session against necessary capability bit. 345 bool isConstrainedHighSpeed = (operatingMode == ICameraDeviceUser::CONSTRAINED_HIGH_SPEED_MODE); 346 if (isConstrainedHighSpeed) { 347 CameraMetadata staticInfo = mDevice->info(); 348 camera_metadata_entry_t entry = staticInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 349 bool isConstrainedHighSpeedSupported = false; 350 for(size_t i = 0; i < entry.count; ++i) { 351 uint8_t capability = entry.data.u8[i]; 352 if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO) { 353 isConstrainedHighSpeedSupported = true; 354 break; 355 } 356 } 357 if (!isConstrainedHighSpeedSupported) { 358 String8 msg = String8::format( 359 "Camera %s: Try to create a constrained high speed configuration on a device" 360 " that doesn't support it.", mCameraIdStr.string()); 361 ALOGE("%s: %s", __FUNCTION__, msg.string()); 362 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, 363 msg.string()); 364 } 365 } 366 367 status_t err = mDevice->configureStreams(operatingMode); 368 if (err == BAD_VALUE) { 369 String8 msg = String8::format("Camera %s: Unsupported set of inputs/outputs provided", 370 mCameraIdStr.string()); 371 ALOGE("%s: %s", __FUNCTION__, msg.string()); 372 res = STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 373 } else if (err != OK) { 374 String8 msg = String8::format("Camera %s: Error configuring streams: %s (%d)", 375 mCameraIdStr.string(), strerror(-err), err); 376 ALOGE("%s: %s", __FUNCTION__, msg.string()); 377 res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 378 } 379 380 return res; 381 } 382 383 binder::Status CameraDeviceClient::deleteStream(int streamId) { 384 ATRACE_CALL(); 385 ALOGV("%s (streamId = 0x%x)", __FUNCTION__, streamId); 386 387 binder::Status res; 388 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 389 390 Mutex::Autolock icl(mBinderSerializationLock); 391 392 if (!mDevice.get()) { 393 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 394 } 395 396 bool isInput = false; 397 std::vector<sp<IBinder>> surfaces; 398 ssize_t dIndex = NAME_NOT_FOUND; 399 400 if (mInputStream.configured && mInputStream.id == streamId) { 401 isInput = true; 402 } else { 403 // Guard against trying to delete non-created streams 404 for (size_t i = 0; i < mStreamMap.size(); ++i) { 405 if (streamId == mStreamMap.valueAt(i).streamId()) { 406 surfaces.push_back(mStreamMap.keyAt(i)); 407 } 408 } 409 410 // See if this stream is one of the deferred streams. 411 for (size_t i = 0; i < mDeferredStreams.size(); ++i) { 412 if (streamId == mDeferredStreams[i]) { 413 dIndex = i; 414 break; 415 } 416 } 417 418 if (surfaces.empty() && dIndex == NAME_NOT_FOUND) { 419 String8 msg = String8::format("Camera %s: Invalid stream ID (%d) specified, no such" 420 " stream created yet", mCameraIdStr.string(), streamId); 421 ALOGW("%s: %s", __FUNCTION__, msg.string()); 422 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 423 } 424 } 425 426 // Also returns BAD_VALUE if stream ID was not valid 427 status_t err = mDevice->deleteStream(streamId); 428 429 if (err != OK) { 430 String8 msg = String8::format("Camera %s: Unexpected error %s (%d) when deleting stream %d", 431 mCameraIdStr.string(), strerror(-err), err, streamId); 432 ALOGE("%s: %s", __FUNCTION__, msg.string()); 433 res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 434 } else { 435 if (isInput) { 436 mInputStream.configured = false; 437 } else { 438 for (auto& surface : surfaces) { 439 mStreamMap.removeItem(surface); 440 } 441 442 if (dIndex != NAME_NOT_FOUND) { 443 mDeferredStreams.removeItemsAt(dIndex); 444 } 445 } 446 } 447 448 return res; 449 } 450 451 binder::Status CameraDeviceClient::createStream( 452 const hardware::camera2::params::OutputConfiguration &outputConfiguration, 453 /*out*/ 454 int32_t* newStreamId) { 455 ATRACE_CALL(); 456 457 binder::Status res; 458 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 459 460 Mutex::Autolock icl(mBinderSerializationLock); 461 462 const std::vector<sp<IGraphicBufferProducer>>& bufferProducers = 463 outputConfiguration.getGraphicBufferProducers(); 464 size_t numBufferProducers = bufferProducers.size(); 465 bool deferredConsumer = outputConfiguration.isDeferred(); 466 bool isShared = outputConfiguration.isShared(); 467 468 if (numBufferProducers > MAX_SURFACES_PER_STREAM) { 469 ALOGE("%s: GraphicBufferProducer count %zu for stream exceeds limit of %d", 470 __FUNCTION__, bufferProducers.size(), MAX_SURFACES_PER_STREAM); 471 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, "Surface count is too high"); 472 } 473 bool deferredConsumerOnly = deferredConsumer && numBufferProducers == 0; 474 int surfaceType = outputConfiguration.getSurfaceType(); 475 bool validSurfaceType = ((surfaceType == OutputConfiguration::SURFACE_TYPE_SURFACE_VIEW) || 476 (surfaceType == OutputConfiguration::SURFACE_TYPE_SURFACE_TEXTURE)); 477 478 if (deferredConsumer && !validSurfaceType) { 479 ALOGE("%s: Target surface is invalid: bufferProducer = %p, surfaceType = %d.", 480 __FUNCTION__, bufferProducers[0].get(), surfaceType); 481 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, "Target Surface is invalid"); 482 } 483 484 if (!mDevice.get()) { 485 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 486 } 487 488 std::vector<sp<Surface>> surfaces; 489 std::vector<sp<IBinder>> binders; 490 status_t err; 491 492 // Create stream for deferred surface case. 493 if (deferredConsumerOnly) { 494 return createDeferredSurfaceStreamLocked(outputConfiguration, isShared, newStreamId); 495 } 496 497 OutputStreamInfo streamInfo; 498 bool isStreamInfoValid = false; 499 for (auto& bufferProducer : bufferProducers) { 500 // Don't create multiple streams for the same target surface 501 sp<IBinder> binder = IInterface::asBinder(bufferProducer); 502 ssize_t index = mStreamMap.indexOfKey(binder); 503 if (index != NAME_NOT_FOUND) { 504 String8 msg = String8::format("Camera %s: Surface already has a stream created for it " 505 "(ID %zd)", mCameraIdStr.string(), index); 506 ALOGW("%s: %s", __FUNCTION__, msg.string()); 507 return STATUS_ERROR(CameraService::ERROR_ALREADY_EXISTS, msg.string()); 508 } 509 510 sp<Surface> surface; 511 res = createSurfaceFromGbp(streamInfo, isStreamInfoValid, surface, bufferProducer); 512 513 if (!res.isOk()) 514 return res; 515 516 if (!isStreamInfoValid) { 517 // Streaming sharing is only supported for IMPLEMENTATION_DEFINED 518 // formats. 519 if (isShared && streamInfo.format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 520 String8 msg = String8::format("Camera %s: Stream sharing is only supported for " 521 "IMPLEMENTATION_DEFINED format", mCameraIdStr.string()); 522 ALOGW("%s: %s", __FUNCTION__, msg.string()); 523 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 524 } 525 isStreamInfoValid = true; 526 } 527 528 binders.push_back(IInterface::asBinder(bufferProducer)); 529 surfaces.push_back(surface); 530 } 531 532 int streamId = camera3::CAMERA3_STREAM_ID_INVALID; 533 err = mDevice->createStream(surfaces, deferredConsumer, streamInfo.width, 534 streamInfo.height, streamInfo.format, streamInfo.dataSpace, 535 static_cast<camera3_stream_rotation_t>(outputConfiguration.getRotation()), 536 &streamId, outputConfiguration.getSurfaceSetID(), isShared); 537 538 if (err != OK) { 539 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 540 "Camera %s: Error creating output stream (%d x %d, fmt %x, dataSpace %x): %s (%d)", 541 mCameraIdStr.string(), streamInfo.width, streamInfo.height, streamInfo.format, 542 streamInfo.dataSpace, strerror(-err), err); 543 } else { 544 int i = 0; 545 for (auto& binder : binders) { 546 ALOGV("%s: mStreamMap add binder %p streamId %d, surfaceId %d", 547 __FUNCTION__, binder.get(), streamId, i); 548 mStreamMap.add(binder, StreamSurfaceId(streamId, i++)); 549 } 550 551 mStreamInfoMap[streamId] = streamInfo; 552 553 ALOGV("%s: Camera %s: Successfully created a new stream ID %d for output surface" 554 " (%d x %d) with format 0x%x.", 555 __FUNCTION__, mCameraIdStr.string(), streamId, streamInfo.width, 556 streamInfo.height, streamInfo.format); 557 558 // Set transform flags to ensure preview to be rotated correctly. 559 res = setStreamTransformLocked(streamId); 560 561 *newStreamId = streamId; 562 } 563 564 return res; 565 } 566 567 binder::Status CameraDeviceClient::createDeferredSurfaceStreamLocked( 568 const hardware::camera2::params::OutputConfiguration &outputConfiguration, 569 bool isShared, 570 /*out*/ 571 int* newStreamId) { 572 int width, height, format, surfaceType; 573 uint64_t consumerUsage; 574 android_dataspace dataSpace; 575 status_t err; 576 binder::Status res; 577 578 if (!mDevice.get()) { 579 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 580 } 581 582 // Infer the surface info for deferred surface stream creation. 583 width = outputConfiguration.getWidth(); 584 height = outputConfiguration.getHeight(); 585 surfaceType = outputConfiguration.getSurfaceType(); 586 format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 587 dataSpace = android_dataspace_t::HAL_DATASPACE_UNKNOWN; 588 // Hardcode consumer usage flags: SurfaceView--0x900, SurfaceTexture--0x100. 589 consumerUsage = GraphicBuffer::USAGE_HW_TEXTURE; 590 if (surfaceType == OutputConfiguration::SURFACE_TYPE_SURFACE_VIEW) { 591 consumerUsage |= GraphicBuffer::USAGE_HW_COMPOSER; 592 } 593 int streamId = camera3::CAMERA3_STREAM_ID_INVALID; 594 std::vector<sp<Surface>> noSurface; 595 err = mDevice->createStream(noSurface, /*hasDeferredConsumer*/true, width, 596 height, format, dataSpace, 597 static_cast<camera3_stream_rotation_t>(outputConfiguration.getRotation()), 598 &streamId, outputConfiguration.getSurfaceSetID(), isShared, consumerUsage); 599 600 if (err != OK) { 601 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 602 "Camera %s: Error creating output stream (%d x %d, fmt %x, dataSpace %x): %s (%d)", 603 mCameraIdStr.string(), width, height, format, dataSpace, strerror(-err), err); 604 } else { 605 // Can not add streamId to mStreamMap here, as the surface is deferred. Add it to 606 // a separate list to track. Once the deferred surface is set, this id will be 607 // relocated to mStreamMap. 608 mDeferredStreams.push_back(streamId); 609 610 mStreamInfoMap.emplace(std::piecewise_construct, std::forward_as_tuple(streamId), 611 std::forward_as_tuple(width, height, format, dataSpace, consumerUsage)); 612 613 ALOGV("%s: Camera %s: Successfully created a new stream ID %d for a deferred surface" 614 " (%d x %d) stream with format 0x%x.", 615 __FUNCTION__, mCameraIdStr.string(), streamId, width, height, format); 616 617 // Set transform flags to ensure preview to be rotated correctly. 618 res = setStreamTransformLocked(streamId); 619 620 *newStreamId = streamId; 621 } 622 return res; 623 } 624 625 binder::Status CameraDeviceClient::setStreamTransformLocked(int streamId) { 626 int32_t transform = 0; 627 status_t err; 628 binder::Status res; 629 630 if (!mDevice.get()) { 631 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 632 } 633 634 err = getRotationTransformLocked(&transform); 635 if (err != OK) { 636 // Error logged by getRotationTransformLocked. 637 return STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, 638 "Unable to calculate rotation transform for new stream"); 639 } 640 641 err = mDevice->setStreamTransform(streamId, transform); 642 if (err != OK) { 643 String8 msg = String8::format("Failed to set stream transform (stream id %d)", 644 streamId); 645 ALOGE("%s: %s", __FUNCTION__, msg.string()); 646 return STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 647 } 648 649 return res; 650 } 651 652 binder::Status CameraDeviceClient::createInputStream( 653 int width, int height, int format, 654 /*out*/ 655 int32_t* newStreamId) { 656 657 ATRACE_CALL(); 658 ALOGV("%s (w = %d, h = %d, f = 0x%x)", __FUNCTION__, width, height, format); 659 660 binder::Status res; 661 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 662 663 Mutex::Autolock icl(mBinderSerializationLock); 664 665 if (!mDevice.get()) { 666 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 667 } 668 669 if (mInputStream.configured) { 670 String8 msg = String8::format("Camera %s: Already has an input stream " 671 "configured (ID %zd)", mCameraIdStr.string(), mInputStream.id); 672 ALOGE("%s: %s", __FUNCTION__, msg.string() ); 673 return STATUS_ERROR(CameraService::ERROR_ALREADY_EXISTS, msg.string()); 674 } 675 676 int streamId = -1; 677 status_t err = mDevice->createInputStream(width, height, format, &streamId); 678 if (err == OK) { 679 mInputStream.configured = true; 680 mInputStream.width = width; 681 mInputStream.height = height; 682 mInputStream.format = format; 683 mInputStream.id = streamId; 684 685 ALOGV("%s: Camera %s: Successfully created a new input stream ID %d", 686 __FUNCTION__, mCameraIdStr.string(), streamId); 687 688 *newStreamId = streamId; 689 } else { 690 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 691 "Camera %s: Error creating new input stream: %s (%d)", mCameraIdStr.string(), 692 strerror(-err), err); 693 } 694 695 return res; 696 } 697 698 binder::Status CameraDeviceClient::getInputSurface(/*out*/ view::Surface *inputSurface) { 699 700 binder::Status res; 701 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 702 703 if (inputSurface == NULL) { 704 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, "Null input surface"); 705 } 706 707 Mutex::Autolock icl(mBinderSerializationLock); 708 if (!mDevice.get()) { 709 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 710 } 711 sp<IGraphicBufferProducer> producer; 712 status_t err = mDevice->getInputBufferProducer(&producer); 713 if (err != OK) { 714 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 715 "Camera %s: Error getting input Surface: %s (%d)", 716 mCameraIdStr.string(), strerror(-err), err); 717 } else { 718 inputSurface->name = String16("CameraInput"); 719 inputSurface->graphicBufferProducer = producer; 720 } 721 return res; 722 } 723 724 bool CameraDeviceClient::isPublicFormat(int32_t format) 725 { 726 switch(format) { 727 case HAL_PIXEL_FORMAT_RGBA_8888: 728 case HAL_PIXEL_FORMAT_RGBX_8888: 729 case HAL_PIXEL_FORMAT_RGB_888: 730 case HAL_PIXEL_FORMAT_RGB_565: 731 case HAL_PIXEL_FORMAT_BGRA_8888: 732 case HAL_PIXEL_FORMAT_YV12: 733 case HAL_PIXEL_FORMAT_Y8: 734 case HAL_PIXEL_FORMAT_Y16: 735 case HAL_PIXEL_FORMAT_RAW16: 736 case HAL_PIXEL_FORMAT_RAW10: 737 case HAL_PIXEL_FORMAT_RAW12: 738 case HAL_PIXEL_FORMAT_RAW_OPAQUE: 739 case HAL_PIXEL_FORMAT_BLOB: 740 case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 741 case HAL_PIXEL_FORMAT_YCbCr_420_888: 742 case HAL_PIXEL_FORMAT_YCbCr_422_888: 743 case HAL_PIXEL_FORMAT_YCbCr_444_888: 744 case HAL_PIXEL_FORMAT_FLEX_RGB_888: 745 case HAL_PIXEL_FORMAT_FLEX_RGBA_8888: 746 case HAL_PIXEL_FORMAT_YCbCr_422_SP: 747 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 748 case HAL_PIXEL_FORMAT_YCbCr_422_I: 749 return true; 750 default: 751 return false; 752 } 753 } 754 755 binder::Status CameraDeviceClient::createSurfaceFromGbp( 756 OutputStreamInfo& streamInfo, bool isStreamInfoValid, 757 sp<Surface>& surface, const sp<IGraphicBufferProducer>& gbp) { 758 759 // bufferProducer must be non-null 760 if (gbp == nullptr) { 761 String8 msg = String8::format("Camera %s: Surface is NULL", mCameraIdStr.string()); 762 ALOGW("%s: %s", __FUNCTION__, msg.string()); 763 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 764 } 765 // HACK b/10949105 766 // Query consumer usage bits to set async operation mode for 767 // GLConsumer using controlledByApp parameter. 768 bool useAsync = false; 769 uint64_t consumerUsage = 0; 770 status_t err; 771 if ((err = gbp->getConsumerUsage(&consumerUsage)) != OK) { 772 String8 msg = String8::format("Camera %s: Failed to query Surface consumer usage: %s (%d)", 773 mCameraIdStr.string(), strerror(-err), err); 774 ALOGE("%s: %s", __FUNCTION__, msg.string()); 775 return STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 776 } 777 if (consumerUsage & GraphicBuffer::USAGE_HW_TEXTURE) { 778 ALOGW("%s: Camera %s with consumer usage flag: %" PRIu64 ": Forcing asynchronous mode for stream", 779 __FUNCTION__, mCameraIdStr.string(), consumerUsage); 780 useAsync = true; 781 } 782 783 uint64_t disallowedFlags = GraphicBuffer::USAGE_HW_VIDEO_ENCODER | 784 GRALLOC_USAGE_RENDERSCRIPT; 785 uint64_t allowedFlags = GraphicBuffer::USAGE_SW_READ_MASK | 786 GraphicBuffer::USAGE_HW_TEXTURE | 787 GraphicBuffer::USAGE_HW_COMPOSER; 788 bool flexibleConsumer = (consumerUsage & disallowedFlags) == 0 && 789 (consumerUsage & allowedFlags) != 0; 790 791 surface = new Surface(gbp, useAsync); 792 ANativeWindow *anw = surface.get(); 793 794 int width, height, format; 795 android_dataspace dataSpace; 796 if ((err = anw->query(anw, NATIVE_WINDOW_WIDTH, &width)) != OK) { 797 String8 msg = String8::format("Camera %s: Failed to query Surface width: %s (%d)", 798 mCameraIdStr.string(), strerror(-err), err); 799 ALOGE("%s: %s", __FUNCTION__, msg.string()); 800 return STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 801 } 802 if ((err = anw->query(anw, NATIVE_WINDOW_HEIGHT, &height)) != OK) { 803 String8 msg = String8::format("Camera %s: Failed to query Surface height: %s (%d)", 804 mCameraIdStr.string(), strerror(-err), err); 805 ALOGE("%s: %s", __FUNCTION__, msg.string()); 806 return STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 807 } 808 if ((err = anw->query(anw, NATIVE_WINDOW_FORMAT, &format)) != OK) { 809 String8 msg = String8::format("Camera %s: Failed to query Surface format: %s (%d)", 810 mCameraIdStr.string(), strerror(-err), err); 811 ALOGE("%s: %s", __FUNCTION__, msg.string()); 812 return STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 813 } 814 if ((err = anw->query(anw, NATIVE_WINDOW_DEFAULT_DATASPACE, 815 reinterpret_cast<int*>(&dataSpace))) != OK) { 816 String8 msg = String8::format("Camera %s: Failed to query Surface dataspace: %s (%d)", 817 mCameraIdStr.string(), strerror(-err), err); 818 ALOGE("%s: %s", __FUNCTION__, msg.string()); 819 return STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 820 } 821 822 // FIXME: remove this override since the default format should be 823 // IMPLEMENTATION_DEFINED. b/9487482 824 if (format >= HAL_PIXEL_FORMAT_RGBA_8888 && 825 format <= HAL_PIXEL_FORMAT_BGRA_8888) { 826 ALOGW("%s: Camera %s: Overriding format %#x to IMPLEMENTATION_DEFINED", 827 __FUNCTION__, mCameraIdStr.string(), format); 828 format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 829 } 830 // Round dimensions to the nearest dimensions available for this format 831 if (flexibleConsumer && isPublicFormat(format) && 832 !CameraDeviceClient::roundBufferDimensionNearest(width, height, 833 format, dataSpace, mDevice->info(), /*out*/&width, /*out*/&height)) { 834 String8 msg = String8::format("Camera %s: No supported stream configurations with " 835 "format %#x defined, failed to create output stream", 836 mCameraIdStr.string(), format); 837 ALOGE("%s: %s", __FUNCTION__, msg.string()); 838 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 839 } 840 841 if (!isStreamInfoValid) { 842 streamInfo.width = width; 843 streamInfo.height = height; 844 streamInfo.format = format; 845 streamInfo.dataSpace = dataSpace; 846 streamInfo.consumerUsage = consumerUsage; 847 return binder::Status::ok(); 848 } 849 if (width != streamInfo.width) { 850 String8 msg = String8::format("Camera %s:Surface width doesn't match: %d vs %d", 851 mCameraIdStr.string(), width, streamInfo.width); 852 ALOGE("%s: %s", __FUNCTION__, msg.string()); 853 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 854 } 855 if (height != streamInfo.height) { 856 String8 msg = String8::format("Camera %s:Surface height doesn't match: %d vs %d", 857 mCameraIdStr.string(), height, streamInfo.height); 858 ALOGE("%s: %s", __FUNCTION__, msg.string()); 859 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 860 } 861 if (format != streamInfo.format) { 862 String8 msg = String8::format("Camera %s:Surface format doesn't match: %d vs %d", 863 mCameraIdStr.string(), format, streamInfo.format); 864 ALOGE("%s: %s", __FUNCTION__, msg.string()); 865 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 866 } 867 if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 868 if (dataSpace != streamInfo.dataSpace) { 869 String8 msg = String8::format("Camera %s:Surface dataSpace doesn't match: %d vs %d", 870 mCameraIdStr.string(), dataSpace, streamInfo.dataSpace); 871 ALOGE("%s: %s", __FUNCTION__, msg.string()); 872 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 873 } 874 //At the native side, there isn't a way to check whether 2 surfaces come from the same 875 //surface class type. Use usage flag to approximate the comparison. 876 if (consumerUsage != streamInfo.consumerUsage) { 877 String8 msg = String8::format( 878 "Camera %s:Surface usage flag doesn't match %" PRIu64 " vs %" PRIu64 "", 879 mCameraIdStr.string(), consumerUsage, streamInfo.consumerUsage); 880 ALOGE("%s: %s", __FUNCTION__, msg.string()); 881 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 882 } 883 } 884 return binder::Status::ok(); 885 } 886 887 bool CameraDeviceClient::roundBufferDimensionNearest(int32_t width, int32_t height, 888 int32_t format, android_dataspace dataSpace, const CameraMetadata& info, 889 /*out*/int32_t* outWidth, /*out*/int32_t* outHeight) { 890 891 camera_metadata_ro_entry streamConfigs = 892 (dataSpace == HAL_DATASPACE_DEPTH) ? 893 info.find(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS) : 894 info.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 895 896 int32_t bestWidth = -1; 897 int32_t bestHeight = -1; 898 899 // Iterate through listed stream configurations and find the one with the smallest euclidean 900 // distance from the given dimensions for the given format. 901 for (size_t i = 0; i < streamConfigs.count; i += 4) { 902 int32_t fmt = streamConfigs.data.i32[i]; 903 int32_t w = streamConfigs.data.i32[i + 1]; 904 int32_t h = streamConfigs.data.i32[i + 2]; 905 906 // Ignore input/output type for now 907 if (fmt == format) { 908 if (w == width && h == height) { 909 bestWidth = width; 910 bestHeight = height; 911 break; 912 } else if (w <= ROUNDING_WIDTH_CAP && (bestWidth == -1 || 913 CameraDeviceClient::euclidDistSquare(w, h, width, height) < 914 CameraDeviceClient::euclidDistSquare(bestWidth, bestHeight, width, height))) { 915 bestWidth = w; 916 bestHeight = h; 917 } 918 } 919 } 920 921 if (bestWidth == -1) { 922 // Return false if no configurations for this format were listed 923 return false; 924 } 925 926 // Set the outputs to the closet width/height 927 if (outWidth != NULL) { 928 *outWidth = bestWidth; 929 } 930 if (outHeight != NULL) { 931 *outHeight = bestHeight; 932 } 933 934 // Return true if at least one configuration for this format was listed 935 return true; 936 } 937 938 int64_t CameraDeviceClient::euclidDistSquare(int32_t x0, int32_t y0, int32_t x1, int32_t y1) { 939 int64_t d0 = x0 - x1; 940 int64_t d1 = y0 - y1; 941 return d0 * d0 + d1 * d1; 942 } 943 944 // Create a request object from a template. 945 binder::Status CameraDeviceClient::createDefaultRequest(int templateId, 946 /*out*/ 947 hardware::camera2::impl::CameraMetadataNative* request) 948 { 949 ATRACE_CALL(); 950 ALOGV("%s (templateId = 0x%x)", __FUNCTION__, templateId); 951 952 binder::Status res; 953 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 954 955 Mutex::Autolock icl(mBinderSerializationLock); 956 957 if (!mDevice.get()) { 958 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 959 } 960 961 CameraMetadata metadata; 962 status_t err; 963 if ( (err = mDevice->createDefaultRequest(templateId, &metadata) ) == OK && 964 request != NULL) { 965 966 request->swap(metadata); 967 } else if (err == BAD_VALUE) { 968 res = STATUS_ERROR_FMT(CameraService::ERROR_ILLEGAL_ARGUMENT, 969 "Camera %s: Template ID %d is invalid or not supported: %s (%d)", 970 mCameraIdStr.string(), templateId, strerror(-err), err); 971 972 } else { 973 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 974 "Camera %s: Error creating default request for template %d: %s (%d)", 975 mCameraIdStr.string(), templateId, strerror(-err), err); 976 } 977 return res; 978 } 979 980 binder::Status CameraDeviceClient::getCameraInfo( 981 /*out*/ 982 hardware::camera2::impl::CameraMetadataNative* info) 983 { 984 ATRACE_CALL(); 985 ALOGV("%s", __FUNCTION__); 986 987 binder::Status res; 988 989 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 990 991 Mutex::Autolock icl(mBinderSerializationLock); 992 993 if (!mDevice.get()) { 994 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 995 } 996 997 if (info != NULL) { 998 *info = mDevice->info(); // static camera metadata 999 // TODO: merge with device-specific camera metadata 1000 } 1001 1002 return res; 1003 } 1004 1005 binder::Status CameraDeviceClient::waitUntilIdle() 1006 { 1007 ATRACE_CALL(); 1008 ALOGV("%s", __FUNCTION__); 1009 1010 binder::Status res; 1011 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 1012 1013 Mutex::Autolock icl(mBinderSerializationLock); 1014 1015 if (!mDevice.get()) { 1016 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 1017 } 1018 1019 // FIXME: Also need check repeating burst. 1020 Mutex::Autolock idLock(mStreamingRequestIdLock); 1021 if (mStreamingRequestId != REQUEST_ID_NONE) { 1022 String8 msg = String8::format( 1023 "Camera %s: Try to waitUntilIdle when there are active streaming requests", 1024 mCameraIdStr.string()); 1025 ALOGE("%s: %s", __FUNCTION__, msg.string()); 1026 return STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.string()); 1027 } 1028 status_t err = mDevice->waitUntilDrained(); 1029 if (err != OK) { 1030 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 1031 "Camera %s: Error waiting to drain: %s (%d)", 1032 mCameraIdStr.string(), strerror(-err), err); 1033 } 1034 ALOGV("%s Done", __FUNCTION__); 1035 return res; 1036 } 1037 1038 binder::Status CameraDeviceClient::flush( 1039 /*out*/ 1040 int64_t* lastFrameNumber) { 1041 ATRACE_CALL(); 1042 ALOGV("%s", __FUNCTION__); 1043 1044 binder::Status res; 1045 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 1046 1047 Mutex::Autolock icl(mBinderSerializationLock); 1048 1049 if (!mDevice.get()) { 1050 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 1051 } 1052 1053 Mutex::Autolock idLock(mStreamingRequestIdLock); 1054 mStreamingRequestId = REQUEST_ID_NONE; 1055 status_t err = mDevice->flush(lastFrameNumber); 1056 if (err != OK) { 1057 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 1058 "Camera %s: Error flushing device: %s (%d)", mCameraIdStr.string(), strerror(-err), err); 1059 } 1060 return res; 1061 } 1062 1063 binder::Status CameraDeviceClient::prepare(int streamId) { 1064 ATRACE_CALL(); 1065 ALOGV("%s", __FUNCTION__); 1066 1067 binder::Status res; 1068 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 1069 1070 Mutex::Autolock icl(mBinderSerializationLock); 1071 1072 // Guard against trying to prepare non-created streams 1073 ssize_t index = NAME_NOT_FOUND; 1074 for (size_t i = 0; i < mStreamMap.size(); ++i) { 1075 if (streamId == mStreamMap.valueAt(i).streamId()) { 1076 index = i; 1077 break; 1078 } 1079 } 1080 1081 if (index == NAME_NOT_FOUND) { 1082 String8 msg = String8::format("Camera %s: Invalid stream ID (%d) specified, no stream " 1083 "with that ID exists", mCameraIdStr.string(), streamId); 1084 ALOGW("%s: %s", __FUNCTION__, msg.string()); 1085 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 1086 } 1087 1088 // Also returns BAD_VALUE if stream ID was not valid, or stream already 1089 // has been used 1090 status_t err = mDevice->prepare(streamId); 1091 if (err == BAD_VALUE) { 1092 res = STATUS_ERROR_FMT(CameraService::ERROR_ILLEGAL_ARGUMENT, 1093 "Camera %s: Stream %d has already been used, and cannot be prepared", 1094 mCameraIdStr.string(), streamId); 1095 } else if (err != OK) { 1096 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 1097 "Camera %s: Error preparing stream %d: %s (%d)", mCameraIdStr.string(), streamId, 1098 strerror(-err), err); 1099 } 1100 return res; 1101 } 1102 1103 binder::Status CameraDeviceClient::prepare2(int maxCount, int streamId) { 1104 ATRACE_CALL(); 1105 ALOGV("%s", __FUNCTION__); 1106 1107 binder::Status res; 1108 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 1109 1110 Mutex::Autolock icl(mBinderSerializationLock); 1111 1112 // Guard against trying to prepare non-created streams 1113 ssize_t index = NAME_NOT_FOUND; 1114 for (size_t i = 0; i < mStreamMap.size(); ++i) { 1115 if (streamId == mStreamMap.valueAt(i).streamId()) { 1116 index = i; 1117 break; 1118 } 1119 } 1120 1121 if (index == NAME_NOT_FOUND) { 1122 String8 msg = String8::format("Camera %s: Invalid stream ID (%d) specified, no stream " 1123 "with that ID exists", mCameraIdStr.string(), streamId); 1124 ALOGW("%s: %s", __FUNCTION__, msg.string()); 1125 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 1126 } 1127 1128 if (maxCount <= 0) { 1129 String8 msg = String8::format("Camera %s: maxCount (%d) must be greater than 0", 1130 mCameraIdStr.string(), maxCount); 1131 ALOGE("%s: %s", __FUNCTION__, msg.string()); 1132 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 1133 } 1134 1135 // Also returns BAD_VALUE if stream ID was not valid, or stream already 1136 // has been used 1137 status_t err = mDevice->prepare(maxCount, streamId); 1138 if (err == BAD_VALUE) { 1139 res = STATUS_ERROR_FMT(CameraService::ERROR_ILLEGAL_ARGUMENT, 1140 "Camera %s: Stream %d has already been used, and cannot be prepared", 1141 mCameraIdStr.string(), streamId); 1142 } else if (err != OK) { 1143 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 1144 "Camera %s: Error preparing stream %d: %s (%d)", mCameraIdStr.string(), streamId, 1145 strerror(-err), err); 1146 } 1147 1148 return res; 1149 } 1150 1151 binder::Status CameraDeviceClient::tearDown(int streamId) { 1152 ATRACE_CALL(); 1153 ALOGV("%s", __FUNCTION__); 1154 1155 binder::Status res; 1156 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 1157 1158 Mutex::Autolock icl(mBinderSerializationLock); 1159 1160 // Guard against trying to prepare non-created streams 1161 ssize_t index = NAME_NOT_FOUND; 1162 for (size_t i = 0; i < mStreamMap.size(); ++i) { 1163 if (streamId == mStreamMap.valueAt(i).streamId()) { 1164 index = i; 1165 break; 1166 } 1167 } 1168 1169 if (index == NAME_NOT_FOUND) { 1170 String8 msg = String8::format("Camera %s: Invalid stream ID (%d) specified, no stream " 1171 "with that ID exists", mCameraIdStr.string(), streamId); 1172 ALOGW("%s: %s", __FUNCTION__, msg.string()); 1173 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 1174 } 1175 1176 // Also returns BAD_VALUE if stream ID was not valid or if the stream is in 1177 // use 1178 status_t err = mDevice->tearDown(streamId); 1179 if (err == BAD_VALUE) { 1180 res = STATUS_ERROR_FMT(CameraService::ERROR_ILLEGAL_ARGUMENT, 1181 "Camera %s: Stream %d is still in use, cannot be torn down", 1182 mCameraIdStr.string(), streamId); 1183 } else if (err != OK) { 1184 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 1185 "Camera %s: Error tearing down stream %d: %s (%d)", mCameraIdStr.string(), streamId, 1186 strerror(-err), err); 1187 } 1188 1189 return res; 1190 } 1191 1192 binder::Status CameraDeviceClient::finalizeOutputConfigurations(int32_t streamId, 1193 const hardware::camera2::params::OutputConfiguration &outputConfiguration) { 1194 ATRACE_CALL(); 1195 1196 binder::Status res; 1197 if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res; 1198 1199 Mutex::Autolock icl(mBinderSerializationLock); 1200 1201 const std::vector<sp<IGraphicBufferProducer> >& bufferProducers = 1202 outputConfiguration.getGraphicBufferProducers(); 1203 1204 if (bufferProducers.size() == 0) { 1205 ALOGE("%s: bufferProducers must not be empty", __FUNCTION__); 1206 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, "Target Surface is invalid"); 1207 } 1208 1209 // streamId should be in mStreamMap if this stream already has a surface attached 1210 // to it. Otherwise, it should be in mDeferredStreams. 1211 bool streamIdConfigured = false; 1212 ssize_t deferredStreamIndex = NAME_NOT_FOUND; 1213 for (size_t i = 0; i < mStreamMap.size(); i++) { 1214 if (mStreamMap.valueAt(i).streamId() == streamId) { 1215 streamIdConfigured = true; 1216 break; 1217 } 1218 } 1219 for (size_t i = 0; i < mDeferredStreams.size(); i++) { 1220 if (streamId == mDeferredStreams[i]) { 1221 deferredStreamIndex = i; 1222 break; 1223 } 1224 1225 } 1226 if (deferredStreamIndex == NAME_NOT_FOUND && !streamIdConfigured) { 1227 String8 msg = String8::format("Camera %s: deferred surface is set to a unknown stream" 1228 "(ID %d)", mCameraIdStr.string(), streamId); 1229 ALOGW("%s: %s", __FUNCTION__, msg.string()); 1230 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 1231 } 1232 1233 if (mStreamInfoMap[streamId].finalized) { 1234 String8 msg = String8::format("Camera %s: finalizeOutputConfigurations has been called" 1235 " on stream ID %d", mCameraIdStr.string(), streamId); 1236 ALOGW("%s: %s", __FUNCTION__, msg.string()); 1237 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT, msg.string()); 1238 } 1239 1240 if (!mDevice.get()) { 1241 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive"); 1242 } 1243 1244 std::vector<sp<Surface>> consumerSurfaces; 1245 std::vector<size_t> consumerSurfaceIds; 1246 size_t surfaceId = 0; 1247 for (auto& bufferProducer : bufferProducers) { 1248 // Don't create multiple streams for the same target surface 1249 ssize_t index = mStreamMap.indexOfKey(IInterface::asBinder(bufferProducer)); 1250 if (index != NAME_NOT_FOUND) { 1251 ALOGV("Camera %s: Surface already has a stream created " 1252 " for it (ID %zd)", mCameraIdStr.string(), index); 1253 surfaceId++; 1254 continue; 1255 } 1256 1257 sp<Surface> surface; 1258 res = createSurfaceFromGbp(mStreamInfoMap[streamId], true /*isStreamInfoValid*/, 1259 surface, bufferProducer); 1260 1261 if (!res.isOk()) 1262 return res; 1263 1264 consumerSurfaces.push_back(surface); 1265 consumerSurfaceIds.push_back(surfaceId); 1266 surfaceId++; 1267 } 1268 1269 // Gracefully handle case where finalizeOutputConfigurations is called 1270 // without any new surface. 1271 if (consumerSurfaces.size() == 0) { 1272 mStreamInfoMap[streamId].finalized = true; 1273 return res; 1274 } 1275 1276 // Finish the deferred stream configuration with the surface. 1277 status_t err; 1278 err = mDevice->setConsumerSurfaces(streamId, consumerSurfaces); 1279 if (err == OK) { 1280 for (size_t i = 0; i < consumerSurfaces.size(); i++) { 1281 sp<IBinder> binder = IInterface::asBinder( 1282 consumerSurfaces[i]->getIGraphicBufferProducer()); 1283 ALOGV("%s: mStreamMap add binder %p streamId %d, surfaceId %zu", __FUNCTION__, 1284 binder.get(), streamId, consumerSurfaceIds[i]); 1285 mStreamMap.add(binder, StreamSurfaceId(streamId, consumerSurfaceIds[i])); 1286 } 1287 if (deferredStreamIndex != NAME_NOT_FOUND) { 1288 mDeferredStreams.removeItemsAt(deferredStreamIndex); 1289 } 1290 mStreamInfoMap[streamId].finalized = true; 1291 } else if (err == NO_INIT) { 1292 res = STATUS_ERROR_FMT(CameraService::ERROR_ILLEGAL_ARGUMENT, 1293 "Camera %s: Deferred surface is invalid: %s (%d)", 1294 mCameraIdStr.string(), strerror(-err), err); 1295 } else { 1296 res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION, 1297 "Camera %s: Error setting output stream deferred surface: %s (%d)", 1298 mCameraIdStr.string(), strerror(-err), err); 1299 } 1300 1301 return res; 1302 } 1303 1304 status_t CameraDeviceClient::dump(int fd, const Vector<String16>& args) { 1305 return BasicClient::dump(fd, args); 1306 } 1307 1308 status_t CameraDeviceClient::dumpClient(int fd, const Vector<String16>& args) { 1309 dprintf(fd, " CameraDeviceClient[%s] (%p) dump:\n", 1310 mCameraIdStr.string(), 1311 (getRemoteCallback() != NULL ? 1312 IInterface::asBinder(getRemoteCallback()).get() : NULL) ); 1313 dprintf(fd, " Current client UID %u\n", mClientUid); 1314 1315 dprintf(fd, " State:\n"); 1316 dprintf(fd, " Request ID counter: %d\n", mRequestIdCounter); 1317 if (mInputStream.configured) { 1318 dprintf(fd, " Current input stream ID: %d\n", mInputStream.id); 1319 } else { 1320 dprintf(fd, " No input stream configured.\n"); 1321 } 1322 if (!mStreamMap.isEmpty()) { 1323 dprintf(fd, " Current output stream/surface IDs:\n"); 1324 for (size_t i = 0; i < mStreamMap.size(); i++) { 1325 dprintf(fd, " Stream %d Surface %d\n", 1326 mStreamMap.valueAt(i).streamId(), 1327 mStreamMap.valueAt(i).surfaceId()); 1328 } 1329 } else if (!mDeferredStreams.isEmpty()) { 1330 dprintf(fd, " Current deferred surface output stream IDs:\n"); 1331 for (auto& streamId : mDeferredStreams) { 1332 dprintf(fd, " Stream %d\n", streamId); 1333 } 1334 } else { 1335 dprintf(fd, " No output streams configured.\n"); 1336 } 1337 // TODO: print dynamic/request section from most recent requests 1338 mFrameProcessor->dump(fd, args); 1339 1340 return dumpDevice(fd, args); 1341 } 1342 1343 void CameraDeviceClient::notifyError(int32_t errorCode, 1344 const CaptureResultExtras& resultExtras) { 1345 // Thread safe. Don't bother locking. 1346 sp<hardware::camera2::ICameraDeviceCallbacks> remoteCb = getRemoteCallback(); 1347 1348 if (remoteCb != 0) { 1349 remoteCb->onDeviceError(errorCode, resultExtras); 1350 } 1351 } 1352 1353 void CameraDeviceClient::notifyRepeatingRequestError(long lastFrameNumber) { 1354 sp<hardware::camera2::ICameraDeviceCallbacks> remoteCb = getRemoteCallback(); 1355 1356 if (remoteCb != 0) { 1357 remoteCb->onRepeatingRequestError(lastFrameNumber, mStreamingRequestId); 1358 } 1359 1360 Mutex::Autolock idLock(mStreamingRequestIdLock); 1361 mStreamingRequestId = REQUEST_ID_NONE; 1362 } 1363 1364 void CameraDeviceClient::notifyIdle() { 1365 // Thread safe. Don't bother locking. 1366 sp<hardware::camera2::ICameraDeviceCallbacks> remoteCb = getRemoteCallback(); 1367 1368 if (remoteCb != 0) { 1369 remoteCb->onDeviceIdle(); 1370 } 1371 Camera2ClientBase::notifyIdle(); 1372 } 1373 1374 void CameraDeviceClient::notifyShutter(const CaptureResultExtras& resultExtras, 1375 nsecs_t timestamp) { 1376 // Thread safe. Don't bother locking. 1377 sp<hardware::camera2::ICameraDeviceCallbacks> remoteCb = getRemoteCallback(); 1378 if (remoteCb != 0) { 1379 remoteCb->onCaptureStarted(resultExtras, timestamp); 1380 } 1381 Camera2ClientBase::notifyShutter(resultExtras, timestamp); 1382 } 1383 1384 void CameraDeviceClient::notifyPrepared(int streamId) { 1385 // Thread safe. Don't bother locking. 1386 sp<hardware::camera2::ICameraDeviceCallbacks> remoteCb = getRemoteCallback(); 1387 if (remoteCb != 0) { 1388 remoteCb->onPrepared(streamId); 1389 } 1390 } 1391 1392 void CameraDeviceClient::notifyRequestQueueEmpty() { 1393 // Thread safe. Don't bother locking. 1394 sp<hardware::camera2::ICameraDeviceCallbacks> remoteCb = getRemoteCallback(); 1395 if (remoteCb != 0) { 1396 remoteCb->onRequestQueueEmpty(); 1397 } 1398 } 1399 1400 void CameraDeviceClient::detachDevice() { 1401 if (mDevice == 0) return; 1402 1403 ALOGV("Camera %s: Stopping processors", mCameraIdStr.string()); 1404 1405 mFrameProcessor->removeListener(FRAME_PROCESSOR_LISTENER_MIN_ID, 1406 FRAME_PROCESSOR_LISTENER_MAX_ID, 1407 /*listener*/this); 1408 mFrameProcessor->requestExit(); 1409 ALOGV("Camera %s: Waiting for threads", mCameraIdStr.string()); 1410 mFrameProcessor->join(); 1411 ALOGV("Camera %s: Disconnecting device", mCameraIdStr.string()); 1412 1413 // WORKAROUND: HAL refuses to disconnect while there's streams in flight 1414 { 1415 mDevice->clearStreamingRequest(); 1416 1417 status_t code; 1418 if ((code = mDevice->waitUntilDrained()) != OK) { 1419 ALOGE("%s: waitUntilDrained failed with code 0x%x", __FUNCTION__, 1420 code); 1421 } 1422 } 1423 1424 Camera2ClientBase::detachDevice(); 1425 } 1426 1427 /** Device-related methods */ 1428 void CameraDeviceClient::onResultAvailable(const CaptureResult& result) { 1429 ATRACE_CALL(); 1430 ALOGV("%s", __FUNCTION__); 1431 1432 // Thread-safe. No lock necessary. 1433 sp<hardware::camera2::ICameraDeviceCallbacks> remoteCb = mRemoteCallback; 1434 if (remoteCb != NULL) { 1435 remoteCb->onResultReceived(result.mMetadata, result.mResultExtras); 1436 } 1437 } 1438 1439 binder::Status CameraDeviceClient::checkPidStatus(const char* checkLocation) { 1440 if (mDisconnected) { 1441 return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, 1442 "The camera device has been disconnected"); 1443 } 1444 status_t res = checkPid(checkLocation); 1445 return (res == OK) ? binder::Status::ok() : 1446 STATUS_ERROR(CameraService::ERROR_PERMISSION_DENIED, 1447 "Attempt to use camera from a different process than original client"); 1448 } 1449 1450 // TODO: move to Camera2ClientBase 1451 bool CameraDeviceClient::enforceRequestPermissions(CameraMetadata& metadata) { 1452 1453 const int pid = IPCThreadState::self()->getCallingPid(); 1454 const int selfPid = getpid(); 1455 camera_metadata_entry_t entry; 1456 1457 /** 1458 * Mixin default important security values 1459 * - android.led.transmit = defaulted ON 1460 */ 1461 CameraMetadata staticInfo = mDevice->info(); 1462 entry = staticInfo.find(ANDROID_LED_AVAILABLE_LEDS); 1463 for(size_t i = 0; i < entry.count; ++i) { 1464 uint8_t led = entry.data.u8[i]; 1465 1466 switch(led) { 1467 case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: { 1468 uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON; 1469 if (!metadata.exists(ANDROID_LED_TRANSMIT)) { 1470 metadata.update(ANDROID_LED_TRANSMIT, 1471 &transmitDefault, 1); 1472 } 1473 break; 1474 } 1475 } 1476 } 1477 1478 // We can do anything! 1479 if (pid == selfPid) { 1480 return true; 1481 } 1482 1483 /** 1484 * Permission check special fields in the request 1485 * - android.led.transmit = android.permission.CAMERA_DISABLE_TRANSMIT 1486 */ 1487 entry = metadata.find(ANDROID_LED_TRANSMIT); 1488 if (entry.count > 0 && entry.data.u8[0] != ANDROID_LED_TRANSMIT_ON) { 1489 String16 permissionString = 1490 String16("android.permission.CAMERA_DISABLE_TRANSMIT_LED"); 1491 if (!checkCallingPermission(permissionString)) { 1492 const int uid = IPCThreadState::self()->getCallingUid(); 1493 ALOGE("Permission Denial: " 1494 "can't disable transmit LED pid=%d, uid=%d", pid, uid); 1495 return false; 1496 } 1497 } 1498 1499 return true; 1500 } 1501 1502 status_t CameraDeviceClient::getRotationTransformLocked(int32_t* transform) { 1503 ALOGV("%s: begin", __FUNCTION__); 1504 1505 const CameraMetadata& staticInfo = mDevice->info(); 1506 return CameraUtils::getRotationTransform(staticInfo, transform); 1507 } 1508 1509 } // namespace android 1510