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 c9db01e0bd..25a81ebc28 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 @@ -867,10 +868,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); @@ -895,6 +905,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureSeqEnd: case kWhatCaptureSeqAbort: case kWhatCaptureBufferLost: @@ -966,6 +977,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureSeqEnd: case kWhatCaptureSeqAbort: case kWhatCaptureBufferLost: @@ -984,6 +996,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureBufferLost: found = msg->findObject(kCaptureRequestKey, &obj); if (!found) { @@ -1138,6 +1151,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; @@ -1233,6 +1279,7 @@ CameraDevice::CallbackHolder::CallbackHolder( if (cbs != nullptr) { mOnCaptureCompleted = cbs->onCaptureCompleted; + mOnCaptureFailed = cbs->onCaptureFailed; } } @@ -1248,6 +1295,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 56741cef00..c92a95f822 100644 --- a/camera/ndk/impl/ACameraDevice.h +++ b/camera/ndk/impl/ACameraDevice.h @@ -214,6 +214,7 @@ class CameraDevice final : public RefBase { kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted kWhatCaptureFail, // onCaptureFailed + kWhatLogicalCaptureFail, // onLogicalCameraCaptureFailed kWhatCaptureSeqEnd, // onCaptureSequenceCompleted kWhatCaptureSeqAbort, // onCaptureSequenceAborted kWhatCaptureBufferLost,// onCaptureBufferLost @@ -233,6 +234,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: @@ -281,6 +283,7 @@ class CameraDevice final : public RefBase { mOnCaptureProgressed = nullptr; mOnCaptureCompleted = nullptr; mOnLogicalCameraCaptureCompleted = nullptr; + mOnLogicalCameraCaptureFailed = nullptr; mOnCaptureFailed = nullptr; mOnCaptureSequenceCompleted = nullptr; mOnCaptureSequenceAborted = nullptr; @@ -289,7 +292,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; @@ -305,6 +307,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 d7d774b727..bffab22658 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp +++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp @@ -55,6 +55,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 @@ -894,10 +895,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); @@ -919,6 +929,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureSeqEnd: case kWhatCaptureSeqAbort: case kWhatCaptureBufferLost: @@ -990,6 +1001,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureSeqEnd: case kWhatCaptureSeqAbort: case kWhatCaptureBufferLost: @@ -1009,6 +1021,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: + case kWhatLogicalCaptureFail: case kWhatCaptureBufferLost: found = msg->findObject(kCaptureRequestKey, &obj); if (!found) { @@ -1161,6 +1174,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; @@ -1256,6 +1302,7 @@ CameraDevice::CallbackHolder::CallbackHolder( if (cbs != nullptr) { mOnCaptureCompleted = cbs->onCaptureCompleted; + mOnCaptureFailed = cbs->onCaptureFailed; } } @@ -1271,6 +1318,7 @@ CameraDevice::CallbackHolder::CallbackHolder( if (lcbs != nullptr) { mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted; + mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed; } } @@ -1368,8 +1416,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 47e6f56ef8..7036017ab7 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraDevice.h +++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.h @@ -242,6 +242,7 @@ class CameraDevice final : public RefBase { kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted kWhatCaptureFail, // onCaptureFailed + kWhatLogicalCaptureFail, // onLogicalCameraCaptureFailed kWhatCaptureSeqEnd, // onCaptureSequenceCompleted kWhatCaptureSeqAbort, // onCaptureSequenceAborted kWhatCaptureBufferLost,// onCaptureBufferLost @@ -261,6 +262,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: @@ -307,6 +309,7 @@ class CameraDevice final : public RefBase { mOnCaptureProgressed = nullptr; mOnCaptureCompleted = nullptr; mOnLogicalCameraCaptureCompleted = nullptr; + mOnLogicalCameraCaptureFailed = nullptr; mOnCaptureFailed = nullptr; mOnCaptureSequenceCompleted = nullptr; mOnCaptureSequenceAborted = nullptr; @@ -315,7 +318,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; @@ -332,6 +334,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 c51f93b198..7368775711 100644 --- a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp +++ b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp @@ -323,7 +323,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 ef99deac01..bc0dafefd5 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -3782,10 +3782,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, @@ -3807,13 +3809,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 c2ed23a61b..866c3b5780 100644 --- a/services/camera/libcameraservice/hidl/Convert.cpp +++ b/services/camera/libcameraservice/hidl/Convert.cpp @@ -157,6 +157,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; }