From dd045bf3607fe6ab5881872c484241627731cc82 Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Mon, 20 Aug 2018 12:39:19 -0700 Subject: [PATCH] Camera NDK: don't explicit delete ACameraMetadata To fix the warning in RefBase destructor. Test: NDK CTS tests, and ARCore measure app. Bug: 112775599 Change-Id: Ia448ac6d7e6c17699c16d287f65fc2826c9d7578 --- camera/ndk/NdkCameraManager.cpp | 10 +++++++++- camera/ndk/NdkCameraMetadata.cpp | 6 ++++-- camera/ndk/NdkCaptureRequest.cpp | 2 +- camera/ndk/impl/ACameraDevice.cpp | 6 +++--- camera/ndk/impl/ACameraDevice.h | 8 ++++---- camera/ndk/impl/ACameraManager.cpp | 10 ++++------ camera/ndk/impl/ACameraManager.h | 2 +- camera/ndk/impl/ACaptureRequest.h | 2 +- 8 files changed, 27 insertions(+), 19 deletions(-) diff --git a/camera/ndk/NdkCameraManager.cpp b/camera/ndk/NdkCameraManager.cpp index 60b4763d85..f14a4c9757 100644 --- a/camera/ndk/NdkCameraManager.cpp +++ b/camera/ndk/NdkCameraManager.cpp @@ -23,6 +23,7 @@ #include #include "impl/ACameraManager.h" +#include "impl/ACameraMetadata.h" using namespace android; @@ -107,7 +108,14 @@ camera_status_t ACameraManager_getCameraCharacteristics( __FUNCTION__, mgr, cameraId, chars); return ACAMERA_ERROR_INVALID_PARAMETER; } - return mgr->getCameraCharacteristics(cameraId, chars); + sp spChars; + camera_status_t status = mgr->getCameraCharacteristics(cameraId, &spChars); + if (status != ACAMERA_OK) { + return status; + } + spChars->incStrong((void*) ACameraManager_getCameraCharacteristics); + *chars = spChars.get(); + return ACAMERA_OK; } EXPORT diff --git a/camera/ndk/NdkCameraMetadata.cpp b/camera/ndk/NdkCameraMetadata.cpp index 65de81ff81..34ec2da100 100644 --- a/camera/ndk/NdkCameraMetadata.cpp +++ b/camera/ndk/NdkCameraMetadata.cpp @@ -57,13 +57,15 @@ ACameraMetadata* ACameraMetadata_copy(const ACameraMetadata* src) { ALOGE("%s: src is null!", __FUNCTION__); return nullptr; } - return new ACameraMetadata(*src); + ACameraMetadata* copy = new ACameraMetadata(*src); + copy->incStrong((void*) ACameraMetadata_copy); + return copy; } EXPORT void ACameraMetadata_free(ACameraMetadata* metadata) { ATRACE_CALL(); if (metadata != nullptr) { - delete metadata; + metadata->decStrong((void*) ACameraMetadata_free); } } diff --git a/camera/ndk/NdkCaptureRequest.cpp b/camera/ndk/NdkCaptureRequest.cpp index ac1856b6f1..ddb69d77ac 100644 --- a/camera/ndk/NdkCaptureRequest.cpp +++ b/camera/ndk/NdkCaptureRequest.cpp @@ -137,7 +137,7 @@ void ACaptureRequest_free(ACaptureRequest* request) { if (request == nullptr) { return; } - delete request->settings; + request->settings.clear(); delete request->targets; delete request; return; diff --git a/camera/ndk/impl/ACameraDevice.cpp b/camera/ndk/impl/ACameraDevice.cpp index 907debc96e..c908323e08 100644 --- a/camera/ndk/impl/ACameraDevice.cpp +++ b/camera/ndk/impl/ACameraDevice.cpp @@ -50,11 +50,11 @@ const char* CameraDevice::kAnwKey = "Anw"; CameraDevice::CameraDevice( const char* id, ACameraDevice_StateCallbacks* cb, - std::unique_ptr chars, + sp chars, ACameraDevice* wrapper) : mCameraId(id), mAppCallbacks(*cb), - mChars(std::move(chars)), + mChars(chars), mServiceCallback(new ServiceCallback(this)), mWrapper(wrapper), mInError(false), @@ -436,7 +436,7 @@ CameraDevice::freeACaptureRequest(ACaptureRequest* req) { if (req == nullptr) { return; } - delete req->settings; + req->settings.clear(); delete req->targets; delete req; } diff --git a/camera/ndk/impl/ACameraDevice.h b/camera/ndk/impl/ACameraDevice.h index 136914823a..7d64081ae1 100644 --- a/camera/ndk/impl/ACameraDevice.h +++ b/camera/ndk/impl/ACameraDevice.h @@ -48,7 +48,7 @@ struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {}; class CameraDevice final : public RefBase { public: CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb, - std::unique_ptr chars, + sp chars, ACameraDevice* wrapper); ~CameraDevice(); @@ -156,7 +156,7 @@ class CameraDevice final : public RefBase { mutable Mutex mDeviceLock; const String8 mCameraId; // Camera ID const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app - const std::unique_ptr mChars; // Camera characteristics + const sp mChars; // Camera characteristics const sp mServiceCallback; ACameraDevice* mWrapper; @@ -294,8 +294,8 @@ class CameraDevice final : public RefBase { */ struct ACameraDevice { ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb, - std::unique_ptr chars) : - mDevice(new CameraDevice(id, cb, std::move(chars), this)) {} + sp chars) : + mDevice(new CameraDevice(id, cb, chars, this)) {} ~ACameraDevice() {}; diff --git a/camera/ndk/impl/ACameraManager.cpp b/camera/ndk/impl/ACameraManager.cpp index c59d0e7cf6..ee67677e9b 100644 --- a/camera/ndk/impl/ACameraManager.cpp +++ b/camera/ndk/impl/ACameraManager.cpp @@ -402,7 +402,7 @@ ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) { } camera_status_t ACameraManager::getCameraCharacteristics( - const char *cameraIdStr, ACameraMetadata **characteristics) { + const char* cameraIdStr, sp* characteristics) { Mutex::Autolock _l(mLock); sp cs = CameraManagerGlobal::getInstance().getCameraService(); @@ -437,18 +437,16 @@ ACameraManager::openCamera( const char* cameraId, ACameraDevice_StateCallbacks* callback, /*out*/ACameraDevice** outDevice) { - ACameraMetadata* rawChars; - camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars); + sp chars; + camera_status_t ret = getCameraCharacteristics(cameraId, &chars); Mutex::Autolock _l(mLock); if (ret != ACAMERA_OK) { ALOGE("%s: cannot get camera characteristics for camera %s. err %d", __FUNCTION__, cameraId, ret); return ACAMERA_ERROR_INVALID_PARAMETER; } - std::unique_ptr chars(rawChars); - rawChars = nullptr; - ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(chars)); + ACameraDevice* device = new ACameraDevice(cameraId, callback, chars); sp cs = CameraManagerGlobal::getInstance().getCameraService(); if (cs == nullptr) { diff --git a/camera/ndk/impl/ACameraManager.h b/camera/ndk/impl/ACameraManager.h index cc42f77c2c..ce65769cc8 100644 --- a/camera/ndk/impl/ACameraManager.h +++ b/camera/ndk/impl/ACameraManager.h @@ -186,7 +186,7 @@ struct ACameraManager { static void deleteCameraIdList(ACameraIdList* cameraIdList); camera_status_t getCameraCharacteristics( - const char *cameraId, ACameraMetadata **characteristics); + const char* cameraId, android::sp* characteristics); camera_status_t openCamera(const char* cameraId, ACameraDevice_StateCallbacks* callback, /*out*/ACameraDevice** device); diff --git a/camera/ndk/impl/ACaptureRequest.h b/camera/ndk/impl/ACaptureRequest.h index 06b2cc3c27..b11dafb093 100644 --- a/camera/ndk/impl/ACaptureRequest.h +++ b/camera/ndk/impl/ACaptureRequest.h @@ -55,7 +55,7 @@ struct ACaptureRequest { return ACAMERA_OK; } - ACameraMetadata* settings; + sp settings; ACameraOutputTargets* targets; void* context; };