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

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

Loading…
Cancel
Save