camera2 vndk: Don't try to retrieve ACameraDevice in CallbackHandler.

Its possible that the device is closing, however, it hasn't stopped its
looper yet. In that case, if we receive a callback, we'll receive a null ACameraDevice. Cache the
camera id during CallbackHandler's construction instead, like the ndk does.

Bug: 130910407

Test: AImageReaderVendorTest

Change-Id: Ia7cd40ff1ce4fe52abb5528c68e3557523a5367d
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
gugelfrei
Jayant Chowdhary 5 years ago
parent 8263e3519b
commit 8300dc1549

@ -87,7 +87,7 @@ CameraDevice::CameraDevice(
__FUNCTION__, strerror(-err), err);
setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
}
mHandler = new CallbackHandler();
mHandler = new CallbackHandler(id);
mCbLooper->registerHandler(mHandler);
const CameraMetadata& metadata = mChars->getInternalData();
@ -918,6 +918,8 @@ CameraDevice::onCaptureErrorLocked(
return;
}
CameraDevice::CallbackHandler::CallbackHandler(const char *id) : mId(id) { }
void CameraDevice::CallbackHandler::onMessageReceived(
const sp<AMessage> &msg) {
switch (msg->what()) {
@ -1012,9 +1014,9 @@ void CameraDevice::CallbackHandler::onMessageReceived(
return;
}
sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get()));
ACameraDevice* device = session->getDevice();
mCachedSessions.push(session);
sp<CaptureRequest> requestSp = nullptr;
const char *id_cstr = mId.c_str();
switch (msg->what()) {
case kWhatCaptureStart:
case kWhatCaptureResult:
@ -1063,7 +1065,7 @@ void CameraDevice::CallbackHandler::onMessageReceived(
ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
return;
}
ACaptureRequest* request = allocateACaptureRequest(requestSp, device->getId());
ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
(*onStart)(context, session.get(), request, timestamp);
freeACaptureRequest(request);
break;
@ -1086,7 +1088,7 @@ void CameraDevice::CallbackHandler::onMessageReceived(
return;
}
sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
ACaptureRequest* request = allocateACaptureRequest(requestSp, device->getId());
ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
(*onResult)(context, session.get(), request, result.get());
freeACaptureRequest(request);
break;
@ -1139,7 +1141,7 @@ void CameraDevice::CallbackHandler::onMessageReceived(
physicalMetadataCopyPtrs.push_back(physicalMetadataCopy[i].get());
}
ACaptureRequest* request = allocateACaptureRequest(requestSp, device->getId());
ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
(*onResult)(context, session.get(), request, result.get(),
physicalResultInfo.size(), physicalCameraIdPtrs.data(),
physicalMetadataCopyPtrs.data());
@ -1168,7 +1170,7 @@ void CameraDevice::CallbackHandler::onMessageReceived(
static_cast<CameraCaptureFailure*>(obj.get()));
ACameraCaptureFailure* failure =
static_cast<ACameraCaptureFailure*>(failureSp.get());
ACaptureRequest* request = allocateACaptureRequest(requestSp, device->getId());
ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
(*onFail)(context, session.get(), request, failure);
freeACaptureRequest(request);
break;
@ -1201,7 +1203,7 @@ void CameraDevice::CallbackHandler::onMessageReceived(
failure.physicalCameraId = nullptr;
}
failure.captureFailure = *failureSp;
ACaptureRequest* request = allocateACaptureRequest(requestSp, device->getId());
ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
(*onFail)(context, session.get(), request, &failure);
freeACaptureRequest(request);
break;
@ -1278,7 +1280,7 @@ void CameraDevice::CallbackHandler::onMessageReceived(
return;
}
ACaptureRequest* request = allocateACaptureRequest(requestSp, device->getId());
ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
(*onBufferLost)(context, session.get(), request, anw, frameNumber);
freeACaptureRequest(request);
break;

@ -266,9 +266,11 @@ class CameraDevice final : public RefBase {
class CallbackHandler : public AHandler {
public:
explicit CallbackHandler(const char *id);
void onMessageReceived(const sp<AMessage> &msg) override;
private:
std::string mId;
// This handler will cache all capture session sp until kWhatCleanUpSessions
// is processed. This is used to guarantee the last session reference is always
// being removed in callback thread without holding camera device lock

Loading…
Cancel
Save