From edec62de621a69e66db6b753dacb4919da16f3ae Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Tue, 19 Mar 2019 17:59:24 -0700 Subject: [PATCH] Camera: Include the physical camera device during errors The physical camera device ID must be present as part of the capture result extras in case of corresponding result failure notification. Bug: 128835627 Test: Camera CTS, AImageReaderVendorTest --gtest_filter=AImageReaderVendorTest.LogicalCameraPhysicalStream Change-Id: I042af8bd85eaadd389b059c2833f352ceb2f40fc --- camera/CaptureResult.cpp | 20 +++++++ camera/include/camera/CaptureResult.h | 10 +++- camera/ndk/impl/ACameraDevice.cpp | 52 ++++++++++++++++- camera/ndk/impl/ACameraDevice.h | 5 +- .../include/camera/NdkCameraCaptureSession.h | 52 ++++++++++++++++- camera/ndk/ndk_vendor/impl/ACameraDevice.cpp | 57 +++++++++++++++++-- camera/ndk/ndk_vendor/impl/ACameraDevice.h | 5 +- .../tests/AImageReaderVendorTest.cpp | 8 ++- .../device3/Camera3Device.cpp | 24 +++++++- .../camera/libcameraservice/hidl/Convert.cpp | 2 + 10 files changed, 221 insertions(+), 14 deletions(-) diff --git a/camera/CaptureResult.cpp b/camera/CaptureResult.cpp index 928a6bca0a..1d8e8c42d0 100644 --- a/camera/CaptureResult.cpp +++ b/camera/CaptureResult.cpp @@ -39,6 +39,16 @@ status_t CaptureResultExtras::readFromParcel(const android::Parcel *parcel) { parcel->readInt64(&frameNumber); parcel->readInt32(&partialResultCount); parcel->readInt32(&errorStreamId); + auto physicalCameraIdPresent = parcel->readBool(); + if (physicalCameraIdPresent) { + String16 cameraId; + status_t res = OK; + if ((res = parcel->readString16(&cameraId)) != OK) { + ALOGE("%s: Failed to read camera id: %d", __FUNCTION__, res); + return res; + } + errorPhysicalCameraId = cameraId; + } return OK; } @@ -56,6 +66,16 @@ status_t CaptureResultExtras::writeToParcel(android::Parcel *parcel) const { parcel->writeInt64(frameNumber); parcel->writeInt32(partialResultCount); parcel->writeInt32(errorStreamId); + if (errorPhysicalCameraId.size() > 0) { + parcel->writeBool(true); + status_t res = OK; + if ((res = parcel->writeString16(errorPhysicalCameraId)) != OK) { + ALOGE("%s: Failed to write physical camera ID to parcel: %d", __FUNCTION__, res); + return res; + } + } else { + parcel->writeBool(false); + } return OK; } diff --git a/camera/include/camera/CaptureResult.h b/camera/include/camera/CaptureResult.h index 56fa17886f..ef830b50b7 100644 --- a/camera/include/camera/CaptureResult.h +++ b/camera/include/camera/CaptureResult.h @@ -69,6 +69,13 @@ struct CaptureResultExtras : public android::Parcelable { */ int32_t errorStreamId; + /** + * For capture result errors, the physical camera ID in case the respective request contains + * a reference to physical camera device. + * Empty otherwise. + */ + String16 errorPhysicalCameraId; + /** * Constructor initializes object as invalid by setting requestId to be -1. */ @@ -79,7 +86,8 @@ struct CaptureResultExtras : public android::Parcelable { precaptureTriggerId(0), frameNumber(0), partialResultCount(0), - errorStreamId(-1) { + errorStreamId(-1), + errorPhysicalCameraId() { } /** diff --git a/camera/ndk/impl/ACameraDevice.cpp b/camera/ndk/impl/ACameraDevice.cpp index 5e4fcd07fd..e52f075750 100644 --- a/camera/ndk/impl/ACameraDevice.cpp +++ b/camera/ndk/impl/ACameraDevice.cpp @@ -45,6 +45,7 @@ const char* CameraDevice::kCaptureFailureKey = "CaptureFailure"; const char* CameraDevice::kSequenceIdKey = "SequenceId"; const char* CameraDevice::kFrameNumberKey = "FrameNumber"; const char* CameraDevice::kAnwKey = "Anw"; +const char* CameraDevice::kFailingPhysicalCameraId= "FailingPhysicalCameraId"; /** * CameraDevice Implementation @@ -818,10 +819,19 @@ CameraDevice::onCaptureErrorLocked( failure->wasImageCaptured = (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT); - sp msg = new AMessage(kWhatCaptureFail, mHandler); + sp msg = new AMessage(cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureFail : + kWhatCaptureFail, mHandler); msg->setPointer(kContextKey, cbh.mContext); msg->setObject(kSessionSpKey, session); - msg->setPointer(kCallbackFpKey, (void*) onError); + if (cbh.mIsLogicalCameraCallback) { + if (resultExtras.errorPhysicalCameraId.size() > 0) { + String8 cameraId(resultExtras.errorPhysicalCameraId); + msg->setString(kFailingPhysicalCameraId, cameraId.string(), cameraId.size()); + } + msg->setPointer(kCallbackFpKey, (void*) cbh.mOnLogicalCameraCaptureFailed); + } else { + msg->setPointer(kCallbackFpKey, (void*) onError); + } msg->setObject(kCaptureRequestKey, request); msg->setObject(kCaptureFailureKey, failure); postSessionMsgAndCleanup(msg); @@ -846,6 +856,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureSeqEnd: case kWhatCaptureSeqAbort: case kWhatCaptureBufferLost: @@ -917,6 +928,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureSeqEnd: case kWhatCaptureSeqAbort: case kWhatCaptureBufferLost: @@ -935,6 +947,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureBufferLost: found = msg->findObject(kCaptureRequestKey, &obj); if (!found) { @@ -1089,6 +1102,39 @@ void CameraDevice::CallbackHandler::onMessageReceived( freeACaptureRequest(request); break; } + case kWhatLogicalCaptureFail: + { + ACameraCaptureSession_logicalCamera_captureCallback_failed onFail; + found = msg->findPointer(kCallbackFpKey, (void**) &onFail); + if (!found) { + ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__); + return; + } + if (onFail == nullptr) { + return; + } + + found = msg->findObject(kCaptureFailureKey, &obj); + if (!found) { + ALOGE("%s: Cannot find capture failure!", __FUNCTION__); + return; + } + sp failureSp( + static_cast(obj.get())); + ALogicalCameraCaptureFailure failure; + AString physicalCameraId; + found = msg->findString(kFailingPhysicalCameraId, &physicalCameraId); + if (found && !physicalCameraId.empty()) { + failure.physicalCameraId = physicalCameraId.c_str(); + } else { + failure.physicalCameraId = nullptr; + } + failure.captureFailure = *failureSp; + ACaptureRequest* request = allocateACaptureRequest(requestSp, mId); + (*onFail)(context, session.get(), request, &failure); + freeACaptureRequest(request); + break; + } case kWhatCaptureSeqEnd: { ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd; @@ -1184,6 +1230,7 @@ CameraDevice::CallbackHolder::CallbackHolder( if (cbs != nullptr) { mOnCaptureCompleted = cbs->onCaptureCompleted; + mOnCaptureFailed = cbs->onCaptureFailed; } } @@ -1199,6 +1246,7 @@ CameraDevice::CallbackHolder::CallbackHolder( if (lcbs != nullptr) { mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted; + mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed; } } diff --git a/camera/ndk/impl/ACameraDevice.h b/camera/ndk/impl/ACameraDevice.h index 103efd5218..88916b2fae 100644 --- a/camera/ndk/impl/ACameraDevice.h +++ b/camera/ndk/impl/ACameraDevice.h @@ -210,6 +210,7 @@ class CameraDevice final : public RefBase { kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted kWhatCaptureFail, // onCaptureFailed + kWhatLogicalCaptureFail, // onLogicalCameraCaptureFailed kWhatCaptureSeqEnd, // onCaptureSequenceCompleted kWhatCaptureSeqAbort, // onCaptureSequenceAborted kWhatCaptureBufferLost,// onCaptureBufferLost @@ -229,6 +230,7 @@ class CameraDevice final : public RefBase { static const char* kSequenceIdKey; static const char* kFrameNumberKey; static const char* kAnwKey; + static const char* kFailingPhysicalCameraId; class CallbackHandler : public AHandler { public: @@ -277,6 +279,7 @@ class CameraDevice final : public RefBase { mOnCaptureProgressed = nullptr; mOnCaptureCompleted = nullptr; mOnLogicalCameraCaptureCompleted = nullptr; + mOnLogicalCameraCaptureFailed = nullptr; mOnCaptureFailed = nullptr; mOnCaptureSequenceCompleted = nullptr; mOnCaptureSequenceAborted = nullptr; @@ -285,7 +288,6 @@ class CameraDevice final : public RefBase { mContext = cbs->context; mOnCaptureStarted = cbs->onCaptureStarted; mOnCaptureProgressed = cbs->onCaptureProgressed; - mOnCaptureFailed = cbs->onCaptureFailed; mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted; mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted; mOnCaptureBufferLost = cbs->onCaptureBufferLost; @@ -301,6 +303,7 @@ class CameraDevice final : public RefBase { ACameraCaptureSession_captureCallback_result mOnCaptureProgressed; ACameraCaptureSession_captureCallback_result mOnCaptureCompleted; ACameraCaptureSession_logicalCamera_captureCallback_result mOnLogicalCameraCaptureCompleted; + ACameraCaptureSession_logicalCamera_captureCallback_failed mOnLogicalCameraCaptureFailed; ACameraCaptureSession_captureCallback_failed mOnCaptureFailed; ACameraCaptureSession_captureCallback_sequenceEnd mOnCaptureSequenceCompleted; ACameraCaptureSession_captureCallback_sequenceAbort mOnCaptureSequenceAborted; diff --git a/camera/ndk/include/camera/NdkCameraCaptureSession.h b/camera/ndk/include/camera/NdkCameraCaptureSession.h index d13a818648..07176cf7f9 100644 --- a/camera/ndk/include/camera/NdkCameraCaptureSession.h +++ b/camera/ndk/include/camera/NdkCameraCaptureSession.h @@ -676,6 +676,41 @@ typedef void (*ACameraCaptureSession_logicalCamera_captureCallback_result)( size_t physicalResultCount, const char** physicalCameraIds, const ACameraMetadata** physicalResults); +/// Struct to describe a logical camera capture failure +typedef struct ALogicalCameraCaptureFailure { + /** + * The {@link ACameraCaptureFailure} contains information about regular logical device capture + * failure. + */ + struct ACameraCaptureFailure captureFailure; + + /** + * The physical camera device ID in case the capture failure comes from a capture request + * with configured physical camera streams for a logical camera. physicalCameraId will be set + * to NULL in case the capture request has no associated physical camera device. + * + */ + const char* physicalCameraId; +} ALogicalCameraCaptureFailure; + +/** + * The definition of logical camera capture failure callback. + * + * @param context The optional application context provided by user in + * {@link ACameraCaptureSession_captureCallbacks}. + * @param session The camera capture session of interest. + * @param request The capture request of interest. Note that this pointer points to a copy of + * capture request sent by application, so the address is different to what + * application sent but the content will match. This request will be freed by + * framework immediately after this callback returns. + * @param failure The {@link ALogicalCameraCaptureFailure} desribes the capture failure. The memory + * is managed by camera framework. Do not access this pointer after this callback + * returns. + */ +typedef void (*ACameraCaptureSession_logicalCamera_captureCallback_failed)( + void* context, ACameraCaptureSession* session, + ACaptureRequest* request, ALogicalCameraCaptureFailure* failure); + /** * This has the same functionality as ACameraCaptureSession_captureCallbacks, * with the exception that an onLogicalCameraCaptureCompleted callback is @@ -707,10 +742,25 @@ typedef struct ACameraCaptureSession_logicalCamera_captureCallbacks { */ ACameraCaptureSession_logicalCamera_captureCallback_result onLogicalCameraCaptureCompleted; + /** + * This callback is called instead of {@link onLogicalCameraCaptureCompleted} when the + * camera device failed to produce a capture result for the + * request. + * + *

Other requests are unaffected, and some or all image buffers from + * the capture may have been pushed to their respective output + * streams.

+ * + *

Note that the ACaptureRequest pointer in the callback will not match what application has + * submitted, but the contents the ACaptureRequest will match what application submitted.

+ * + * @see ALogicalCameraCaptureFailure + */ + ACameraCaptureSession_logicalCamera_captureCallback_failed onLogicalCameraCaptureFailed; + /** * Same as ACameraCaptureSession_captureCallbacks */ - ACameraCaptureSession_captureCallback_failed onCaptureFailed; ACameraCaptureSession_captureCallback_sequenceEnd onCaptureSequenceCompleted; ACameraCaptureSession_captureCallback_sequenceAbort onCaptureSequenceAborted; ACameraCaptureSession_captureCallback_bufferLost onCaptureBufferLost; diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp index a38a31e79c..bb1bf44e39 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp +++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp @@ -54,6 +54,7 @@ const char* CameraDevice::kCaptureFailureKey = "CaptureFailure"; const char* CameraDevice::kSequenceIdKey = "SequenceId"; const char* CameraDevice::kFrameNumberKey = "FrameNumber"; const char* CameraDevice::kAnwKey = "Anw"; +const char* CameraDevice::kFailingPhysicalCameraId= "FailingPhysicalCameraId"; /** * CameraDevice Implementation @@ -852,10 +853,19 @@ CameraDevice::onCaptureErrorLocked( failure->sequenceId = sequenceId; failure->wasImageCaptured = (errorCode == ErrorCode::CAMERA_RESULT); - sp msg = new AMessage(kWhatCaptureFail, mHandler); + sp msg = new AMessage(cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureFail : + kWhatCaptureFail, mHandler); msg->setPointer(kContextKey, cbh.mContext); msg->setObject(kSessionSpKey, session); - msg->setPointer(kCallbackFpKey, (void*) onError); + if (cbh.mIsLogicalCameraCallback) { + if (resultExtras.errorPhysicalCameraId.size() > 0) { + msg->setString(kFailingPhysicalCameraId, resultExtras.errorPhysicalCameraId.c_str(), + resultExtras.errorPhysicalCameraId.size()); + } + msg->setPointer(kCallbackFpKey, (void*) cbh.mOnLogicalCameraCaptureFailed); + } else { + msg->setPointer(kCallbackFpKey, (void*) onError); + } msg->setObject(kCaptureRequestKey, request); msg->setObject(kCaptureFailureKey, failure); postSessionMsgAndCleanup(msg); @@ -877,6 +887,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureSeqEnd: case kWhatCaptureSeqAbort: case kWhatCaptureBufferLost: @@ -948,6 +959,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureSeqEnd: case kWhatCaptureSeqAbort: case kWhatCaptureBufferLost: @@ -967,6 +979,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureBufferLost: found = msg->findObject(kCaptureRequestKey, &obj); if (!found) { @@ -1119,6 +1132,39 @@ void CameraDevice::CallbackHandler::onMessageReceived( freeACaptureRequest(request); break; } + case kWhatLogicalCaptureFail: + { + ACameraCaptureSession_logicalCamera_captureCallback_failed onFail; + found = msg->findPointer(kCallbackFpKey, (void**) &onFail); + if (!found) { + ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__); + return; + } + if (onFail == nullptr) { + return; + } + + found = msg->findObject(kCaptureFailureKey, &obj); + if (!found) { + ALOGE("%s: Cannot find capture failure!", __FUNCTION__); + return; + } + sp failureSp( + static_cast(obj.get())); + ALogicalCameraCaptureFailure failure; + AString physicalCameraId; + found = msg->findString(kFailingPhysicalCameraId, &physicalCameraId); + if (found && !physicalCameraId.empty()) { + failure.physicalCameraId = physicalCameraId.c_str(); + } else { + failure.physicalCameraId = nullptr; + } + failure.captureFailure = *failureSp; + ACaptureRequest* request = allocateACaptureRequest(requestSp, device->getId()); + (*onFail)(context, session.get(), request, &failure); + freeACaptureRequest(request); + break; + } case kWhatCaptureSeqEnd: { ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd; @@ -1214,6 +1260,7 @@ CameraDevice::CallbackHolder::CallbackHolder( if (cbs != nullptr) { mOnCaptureCompleted = cbs->onCaptureCompleted; + mOnCaptureFailed = cbs->onCaptureFailed; } } @@ -1229,6 +1276,7 @@ CameraDevice::CallbackHolder::CallbackHolder( if (lcbs != nullptr) { mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted; + mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed; } } @@ -1326,8 +1374,9 @@ android::hardware::Return CameraDevice::ServiceCallback::onDeviceError( ErrorCode errorCode, const CaptureResultExtras& resultExtras) { - ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d", - errorCode, resultExtras.frameNumber, resultExtras.requestId, resultExtras.burstId); + ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d" + " physical camera ID %s", errorCode, resultExtras.frameNumber, resultExtras.requestId, + resultExtras.burstId, resultExtras.errorPhysicalCameraId.c_str()); auto ret = Void(); sp dev = mDevice.promote(); if (dev == nullptr) { diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.h b/camera/ndk/ndk_vendor/impl/ACameraDevice.h index 28092fd373..d4d74d1d8c 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraDevice.h +++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.h @@ -239,6 +239,7 @@ class CameraDevice final : public RefBase { kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted kWhatCaptureFail, // onCaptureFailed + kWhatLogicalCaptureFail, // onLogicalCameraCaptureFailed kWhatCaptureSeqEnd, // onCaptureSequenceCompleted kWhatCaptureSeqAbort, // onCaptureSequenceAborted kWhatCaptureBufferLost,// onCaptureBufferLost @@ -258,6 +259,7 @@ class CameraDevice final : public RefBase { static const char* kSequenceIdKey; static const char* kFrameNumberKey; static const char* kAnwKey; + static const char* kFailingPhysicalCameraId; class CallbackHandler : public AHandler { public: @@ -304,6 +306,7 @@ class CameraDevice final : public RefBase { mOnCaptureProgressed = nullptr; mOnCaptureCompleted = nullptr; mOnLogicalCameraCaptureCompleted = nullptr; + mOnLogicalCameraCaptureFailed = nullptr; mOnCaptureFailed = nullptr; mOnCaptureSequenceCompleted = nullptr; mOnCaptureSequenceAborted = nullptr; @@ -312,7 +315,6 @@ class CameraDevice final : public RefBase { mContext = cbs->context; mOnCaptureStarted = cbs->onCaptureStarted; mOnCaptureProgressed = cbs->onCaptureProgressed; - mOnCaptureFailed = cbs->onCaptureFailed; mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted; mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted; mOnCaptureBufferLost = cbs->onCaptureBufferLost; @@ -329,6 +331,7 @@ class CameraDevice final : public RefBase { ACameraCaptureSession_captureCallback_result mOnCaptureProgressed; ACameraCaptureSession_captureCallback_result mOnCaptureCompleted; ACameraCaptureSession_logicalCamera_captureCallback_result mOnLogicalCameraCaptureCompleted; + ACameraCaptureSession_logicalCamera_captureCallback_failed mOnLogicalCameraCaptureFailed; ACameraCaptureSession_captureCallback_failed mOnCaptureFailed; ACameraCaptureSession_captureCallback_sequenceEnd mOnCaptureSequenceCompleted; ACameraCaptureSession_captureCallback_sequenceAbort mOnCaptureSequenceAborted; diff --git a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp index 2398922048..f78188e81a 100644 --- a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp +++ b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp @@ -317,7 +317,13 @@ class CameraHelper { } ch->mCompletedCaptureCallbackCount++; }, - nullptr, // onCaptureFailed + [] (void * /*ctx*/, ACameraCaptureSession* /*session*/, ACaptureRequest* /*request*/, + ALogicalCameraCaptureFailure* failure) { + if (failure->physicalCameraId) { + ALOGD("%s: Physical camera id: %s result failure", __FUNCTION__, + failure->physicalCameraId); + } + }, nullptr, // onCaptureSequenceCompleted nullptr, // onCaptureSequenceAborted nullptr, // onCaptureBufferLost diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 22e09e4f16..7ff4f18a24 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -3777,10 +3777,12 @@ void Camera3Device::notifyError(const camera3_error_msg_t &msg, hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR; int streamId = 0; + String16 physicalCameraId; if (msg.error_stream != NULL) { Camera3Stream *stream = Camera3Stream::cast(msg.error_stream); streamId = stream->getId(); + physicalCameraId = String16(stream->physicalCameraId()); } ALOGV("Camera %s: %s: HAL error, frame %d, stream %d: %d", mId.string(), __FUNCTION__, msg.frame_number, @@ -3802,13 +3804,29 @@ void Camera3Device::notifyError(const camera3_error_msg_t &msg, InFlightRequest &r = mInFlightMap.editValueAt(idx); r.requestStatus = msg.error_code; resultExtras = r.resultExtras; - if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT == errorCode + bool logicalDeviceResultError = false; + if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT == + errorCode) { + if (physicalCameraId.size() > 0) { + String8 cameraId(physicalCameraId); + if (r.physicalCameraIds.find(cameraId) == r.physicalCameraIds.end()) { + ALOGE("%s: Reported result failure for physical camera device: %s " + " which is not part of the respective request!", + __FUNCTION__, cameraId.string()); + break; + } + resultExtras.errorPhysicalCameraId = physicalCameraId; + } else { + logicalDeviceResultError = true; + } + } + + if (logicalDeviceResultError || hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST == errorCode) { r.skipResultMetadata = true; } - if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT == - errorCode) { + if (logicalDeviceResultError) { // In case of missing result check whether the buffers // returned. If they returned, then remove inflight // request. diff --git a/services/camera/libcameraservice/hidl/Convert.cpp b/services/camera/libcameraservice/hidl/Convert.cpp index a87812b6b4..51d08ff604 100644 --- a/services/camera/libcameraservice/hidl/Convert.cpp +++ b/services/camera/libcameraservice/hidl/Convert.cpp @@ -142,6 +142,8 @@ HCaptureResultExtras convertToHidl(const CaptureResultExtras &captureResultExtra hCaptureResultExtras.frameNumber = captureResultExtras.frameNumber; hCaptureResultExtras.partialResultCount = captureResultExtras.partialResultCount; hCaptureResultExtras.errorStreamId = captureResultExtras.errorStreamId; + hCaptureResultExtras.errorPhysicalCameraId = hidl_string(String8( + captureResultExtras.errorPhysicalCameraId).string()); return hCaptureResultExtras; }