From 8300dc1549954d8e50431ca9da0cf0601a8e14fa Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Fri, 19 Apr 2019 16:08:44 -0700 Subject: [PATCH] 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 --- camera/ndk/ndk_vendor/impl/ACameraDevice.cpp | 18 ++++++++++-------- camera/ndk/ndk_vendor/impl/ACameraDevice.h | 2 ++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp index b18c897c6c..1fdff40841 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp +++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp @@ -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 &msg) { switch (msg->what()) { @@ -1012,9 +1014,9 @@ void CameraDevice::CallbackHandler::onMessageReceived( return; } sp session(static_cast(obj.get())); - ACameraDevice* device = session->getDevice(); mCachedSessions.push(session); sp 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 result(static_cast(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(obj.get())); ACameraCaptureFailure* failure = static_cast(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; diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.h b/camera/ndk/ndk_vendor/impl/ACameraDevice.h index 7036017ab7..829b08452e 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraDevice.h +++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.h @@ -266,9 +266,11 @@ class CameraDevice final : public RefBase { class CallbackHandler : public AHandler { public: + explicit CallbackHandler(const char *id); void onMessageReceived(const sp &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