Merge "Camera: Include the physical camera device during errors"

gugelfrei
TreeHugger Robot 5 years ago committed by Android (Google) Code Review
commit 09cc4b1d53

@ -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;
}

@ -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() {
}
/**

@ -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<AMessage> msg = new AMessage(kWhatCaptureFail, mHandler);
sp<AMessage> 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<CameraCaptureFailure> failureSp(
static_cast<CameraCaptureFailure*>(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;
}
}

@ -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;

@ -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.
*
* <p>Other requests are unaffected, and some or all image buffers from
* the capture may have been pushed to their respective output
* streams.</p>
*
* <p>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.</p>
*
* @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;

@ -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<AMessage> msg = new AMessage(kWhatCaptureFail, mHandler);
sp<AMessage> 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<CameraCaptureFailure> failureSp(
static_cast<CameraCaptureFailure*>(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<void>
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<CameraDevice> dev = mDevice.promote();
if (dev == nullptr) {

@ -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;

@ -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

@ -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.

@ -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;
}

Loading…
Cancel
Save