camera: Migrate ndk_vendor client implementation to AIDL.
With HIDL deprecated, cameraservice's vndk client interfaces have been
updated to using AIDL. This CL drops support for the HIDL vndk client
interface.
When vendor partition is rebuilt for future version of android, it
should automatically pick up the new new client implementation.
Cameraservice will continue to support both HIDL and AIDL vndk clients.
The changes are simple 1:1 mapping of HIDL interface logic with AIDL
interface logic.
Bug: 243593375
Test: atest ACameraNdkVendorTest
Change-Id: Ic03bbf4e275bb3eddc4ca4e322adc84fdf03f482
diff --git a/camera/ndk/Android.bp b/camera/ndk/Android.bp
index fef873b..bfd02b3 100644
--- a/camera/ndk/Android.bp
+++ b/camera/ndk/Android.bp
@@ -141,6 +141,7 @@
],
shared_libs: [
+ "libbinder_ndk",
"libfmq",
"libhidlbase",
"libhardware",
@@ -151,15 +152,13 @@
"libcutils",
"libcamera_metadata",
"libmediandk",
- "android.frameworks.cameraservice.device@2.0",
- "android.frameworks.cameraservice.device@2.1",
- "android.frameworks.cameraservice.common@2.0",
- "android.frameworks.cameraservice.service@2.0",
- "android.frameworks.cameraservice.service@2.1",
- "android.frameworks.cameraservice.service@2.2",
+ "android.frameworks.cameraservice.common-V1-ndk",
+ "android.frameworks.cameraservice.device-V1-ndk",
+ "android.frameworks.cameraservice.service-V1-ndk",
],
static_libs: [
"android.hardware.camera.common@1.0-helper",
+ "libaidlcommonsupport",
"libarect",
],
// TODO: jchowdhary@, use header_libs instead b/131165718
diff --git a/camera/ndk/NdkCameraCaptureSession.cpp b/camera/ndk/NdkCameraCaptureSession.cpp
index 9c98778..65b8837 100644
--- a/camera/ndk/NdkCameraCaptureSession.cpp
+++ b/camera/ndk/NdkCameraCaptureSession.cpp
@@ -29,6 +29,7 @@
#include "impl/ACameraCaptureSession.h"
#include "impl/ACameraCaptureSession.inc"
+
#include "NdkCameraCaptureSession.inc"
using namespace android;
diff --git a/camera/ndk/NdkCameraDevice.cpp b/camera/ndk/NdkCameraDevice.cpp
index 691996b..8211671 100644
--- a/camera/ndk/NdkCameraDevice.cpp
+++ b/camera/ndk/NdkCameraDevice.cpp
@@ -22,18 +22,11 @@
#include <utils/Trace.h>
#include <camera/NdkCameraDevice.h>
+
#include "impl/ACameraCaptureSession.h"
using namespace android::acam;
-bool areWindowTypesEqual(ACameraWindowType *a, ACameraWindowType *b) {
-#ifdef __ANDROID_VNDK__
- return utils::isWindowNativeHandleEqual(a, b);
-#else
- return a == b;
-#endif
-}
-
EXPORT
camera_status_t ACameraDevice_close(ACameraDevice* device) {
ATRACE_CALL();
@@ -183,14 +176,15 @@
__FUNCTION__);
return ACAMERA_ERROR_INVALID_OPERATION;
}
- if (areWindowTypesEqual(out->mWindow, window)) {
+ if (out->isWindowEqual(window)) {
ALOGE("%s: Error trying to add the same window associated with the output configuration",
__FUNCTION__);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- auto insert = out->mSharedWindows.insert(window);
- camera_status_t ret = (insert.second) ? ACAMERA_OK : ACAMERA_ERROR_INVALID_PARAMETER;
+
+ bool insert = out->addSharedWindow(window);
+ camera_status_t ret = (insert) ? ACAMERA_OK : ACAMERA_ERROR_INVALID_PARAMETER;
return ret;
}
@@ -208,13 +202,13 @@
__FUNCTION__);
return ACAMERA_ERROR_INVALID_OPERATION;
}
- if (areWindowTypesEqual(out->mWindow, window)) {
+ if (out->isWindowEqual(window)) {
ALOGE("%s: Error trying to remove the same window associated with the output configuration",
__FUNCTION__);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- auto remove = out->mSharedWindows.erase(window);
+ auto remove = out->removeSharedWindow(window);
camera_status_t ret = (remove) ? ACAMERA_OK : ACAMERA_ERROR_INVALID_PARAMETER;
return ret;
}
diff --git a/camera/ndk/NdkCameraManager.cpp b/camera/ndk/NdkCameraManager.cpp
index 3d231a8..2de4a50 100644
--- a/camera/ndk/NdkCameraManager.cpp
+++ b/camera/ndk/NdkCameraManager.cpp
@@ -81,7 +81,7 @@
callback->onCameraAvailable, callback->onCameraUnavailable);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- CameraManagerGlobal::getInstance().registerAvailabilityCallback(callback);
+ CameraManagerGlobal::getInstance()->registerAvailabilityCallback(callback);
return ACAMERA_OK;
}
@@ -100,7 +100,7 @@
callback->onCameraAvailable, callback->onCameraUnavailable);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- CameraManagerGlobal::getInstance().unregisterAvailabilityCallback(callback);
+ CameraManagerGlobal::getInstance()->unregisterAvailabilityCallback(callback);
return ACAMERA_OK;
}
@@ -131,7 +131,7 @@
return ACAMERA_ERROR_INVALID_PARAMETER;
}
}
- CameraManagerGlobal::getInstance().registerExtendedAvailabilityCallback(callback);
+ CameraManagerGlobal::getInstance()->registerExtendedAvailabilityCallback(callback);
return ACAMERA_OK;
}
@@ -154,7 +154,7 @@
callback->onCameraAccessPrioritiesChanged);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- CameraManagerGlobal::getInstance().unregisterExtendedAvailabilityCallback(callback);
+ CameraManagerGlobal::getInstance()->unregisterExtendedAvailabilityCallback(callback);
return ACAMERA_OK;
}
diff --git a/camera/ndk/impl/ACameraCaptureSession.cpp b/camera/ndk/impl/ACameraCaptureSession.cpp
index 68db233..110d47a 100644
--- a/camera/ndk/impl/ACameraCaptureSession.cpp
+++ b/camera/ndk/impl/ACameraCaptureSession.cpp
@@ -23,7 +23,11 @@
ACameraCaptureSession::~ACameraCaptureSession() {
ALOGV("~ACameraCaptureSession: %p notify device end of life", this);
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<acam::CameraDevice> dev = getDevicePtr();
+#else
sp<acam::CameraDevice> dev = getDeviceSp();
+#endif
if (dev != nullptr && !dev->isClosed()) {
dev->lockDeviceForSessionOps();
{
@@ -50,7 +54,11 @@
mClosedByApp = true;
}
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<acam::CameraDevice> dev = getDevicePtr();
+#else
sp<acam::CameraDevice> dev = getDeviceSp();
+#endif
if (dev != nullptr) {
dev->lockDeviceForSessionOps();
}
@@ -75,7 +83,11 @@
camera_status_t
ACameraCaptureSession::stopRepeating() {
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<acam::CameraDevice> dev = getDevicePtr();
+#else
sp<acam::CameraDevice> dev = getDeviceSp();
+#endif
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -93,7 +105,11 @@
camera_status_t
ACameraCaptureSession::abortCaptures() {
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<acam::CameraDevice> dev = getDevicePtr();
+#else
sp<acam::CameraDevice> dev = getDeviceSp();
+#endif
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -110,7 +126,11 @@
}
camera_status_t ACameraCaptureSession::updateOutputConfiguration(ACaptureSessionOutput *output) {
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<acam::CameraDevice> dev = getDevicePtr();
+#else
sp<acam::CameraDevice> dev = getDeviceSp();
+#endif
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -129,7 +149,11 @@
ACameraDevice*
ACameraCaptureSession::getDevice() {
Mutex::Autolock _l(mSessionLock);
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<acam::CameraDevice> dev = getDevicePtr();
+#else
sp<acam::CameraDevice> dev = getDeviceSp();
+#endif
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return nullptr;
@@ -143,6 +167,17 @@
mIsClosed = true;
}
+#ifdef __ANDROID_VNDK__
+std::shared_ptr<acam::CameraDevice>
+ACameraCaptureSession::getDevicePtr() {
+ std::shared_ptr<acam::CameraDevice> device = mDevice.lock();
+ if (device == nullptr || device->isClosed()) {
+ ALOGW("Device is closed but session %d is not notified", mId);
+ return nullptr;
+ }
+ return device;
+}
+#else
sp<acam::CameraDevice>
ACameraCaptureSession::getDeviceSp() {
sp<acam::CameraDevice> device = mDevice.promote();
@@ -152,5 +187,4 @@
}
return device;
}
-
-
+#endif
diff --git a/camera/ndk/impl/ACameraCaptureSession.h b/camera/ndk/impl/ACameraCaptureSession.h
index 08a9226..cd65e8c 100644
--- a/camera/ndk/impl/ACameraCaptureSession.h
+++ b/camera/ndk/impl/ACameraCaptureSession.h
@@ -47,6 +47,21 @@
return mWindow > other.mWindow;
}
+ inline bool isWindowEqual(ACameraWindowType* window) const {
+ return mWindow == window;
+ }
+
+ // returns true if the window was successfully added, false otherwise.
+ inline bool addSharedWindow(ACameraWindowType* window) {
+ auto ret = mSharedWindows.insert(window);
+ return ret.second;
+ }
+
+ // returns the number of elements removed.
+ inline size_t removeSharedWindow(ACameraWindowType* window) {
+ return mSharedWindows.erase(window);
+ }
+
ACameraWindowType* mWindow;
std::set<ACameraWindowType *> mSharedWindows;
bool mIsShared;
@@ -65,6 +80,15 @@
*/
struct ACameraCaptureSession : public RefBase {
public:
+#ifdef __ANDROID_VNDK__
+ ACameraCaptureSession(
+ int id,
+ const ACaptureSessionOutputContainer* outputs,
+ const ACameraCaptureSession_stateCallbacks* cb,
+ std::weak_ptr<android::acam::CameraDevice> device) :
+ mId(id), mOutput(*outputs), mUserSessionCallback(*cb),
+ mDevice(std::move(device)) {}
+#else
ACameraCaptureSession(
int id,
const ACaptureSessionOutputContainer* outputs,
@@ -72,6 +96,7 @@
android::acam::CameraDevice* device) :
mId(id), mOutput(*outputs), mUserSessionCallback(*cb),
mDevice(device) {}
+#endif
// This can be called in app calling close() or after some app callback is finished
// Make sure the caller does not hold device or session lock!
@@ -114,12 +139,21 @@
// or a new session is replacing this session.
void closeByDevice();
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<android::acam::CameraDevice> getDevicePtr();
+#else
sp<android::acam::CameraDevice> getDeviceSp();
+#endif
const int mId;
const ACaptureSessionOutputContainer mOutput;
const ACameraCaptureSession_stateCallbacks mUserSessionCallback;
+#ifdef __ANDROID_VNDK__
+ const std::weak_ptr<android::acam::CameraDevice> mDevice;
+#else
const wp<android::acam::CameraDevice> mDevice;
+#endif
+
bool mIsClosed = false;
bool mClosedByApp = false;
Mutex mSessionLock;
diff --git a/camera/ndk/impl/ACameraCaptureSession.inc b/camera/ndk/impl/ACameraCaptureSession.inc
index 86bf8a5..da535f8 100644
--- a/camera/ndk/impl/ACameraCaptureSession.inc
+++ b/camera/ndk/impl/ACameraCaptureSession.inc
@@ -15,9 +15,8 @@
*/
#include "ACameraCaptureSession.h"
-
#ifdef __ANDROID_VNDK__
-#include "ndk_vendor/impl/ACameraDeviceVendor.inc"
+#include <ndk_vendor/impl/ACameraDeviceVendor.inc>
#else
#include "ACameraDevice.inc"
#endif
@@ -30,7 +29,11 @@
/*optional*/T* cbs,
int numRequests, ACaptureRequest** requests,
/*optional*/int* captureSequenceId) {
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<acam::CameraDevice> dev = getDevicePtr();
+#else
sp<acam::CameraDevice> dev = getDeviceSp();
+#endif
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
@@ -52,7 +55,11 @@
/*optional*/T* cbs,
int numRequests, ACaptureRequest** requests,
/*optional*/int* captureSequenceId) {
+#ifdef __ANDROID_VNDK__
+ std::shared_ptr<acam::CameraDevice> dev = getDevicePtr();
+#else
sp<acam::CameraDevice> dev = getDeviceSp();
+#endif
if (dev == nullptr) {
ALOGE("Error: Device associated with session %p has been closed!", this);
return ACAMERA_ERROR_SESSION_CLOSED;
diff --git a/camera/ndk/impl/ACameraDevice.cpp b/camera/ndk/impl/ACameraDevice.cpp
index 7997768..536055b 100644
--- a/camera/ndk/impl/ACameraDevice.cpp
+++ b/camera/ndk/impl/ACameraDevice.cpp
@@ -1412,7 +1412,6 @@
while (it != mSequenceLastFrameNumberMap.end()) {
int sequenceId = it->first;
int64_t lastFrameNumber = it->second.lastFrameNumber;
- bool hasCallback = true;
if (mRemote == nullptr) {
ALOGW("Camera %s closed while checking sequence complete", getId());
@@ -1425,7 +1424,6 @@
// This should not happen because we always register callback (with nullptr inside)
if (mSequenceCallbackMap.count(sequenceId) == 0) {
ALOGW("No callback found for sequenceId %d", sequenceId);
- hasCallback = false;
}
if (lastFrameNumber <= completedFrameNumber) {
diff --git a/camera/ndk/impl/ACameraManager.cpp b/camera/ndk/impl/ACameraManager.cpp
index 23d90cc..9dc262f 100644
--- a/camera/ndk/impl/ACameraManager.cpp
+++ b/camera/ndk/impl/ACameraManager.cpp
@@ -38,17 +38,16 @@
const char* CameraManagerGlobal::kContextKey = "CallbackContext";
const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
Mutex CameraManagerGlobal::sLock;
-CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
+wp<CameraManagerGlobal> CameraManagerGlobal::sInstance = nullptr;
-CameraManagerGlobal&
-CameraManagerGlobal::getInstance() {
+sp<CameraManagerGlobal> CameraManagerGlobal::getInstance() {
Mutex::Autolock _l(sLock);
- CameraManagerGlobal* instance = sInstance;
+ sp<CameraManagerGlobal> instance = sInstance.promote();
if (instance == nullptr) {
instance = new CameraManagerGlobal();
sInstance = instance;
}
- return *instance;
+ return instance;
}
CameraManagerGlobal::~CameraManagerGlobal() {
@@ -637,7 +636,7 @@
Mutex::Autolock _l(mLock);
std::vector<String8> idList;
- CameraManagerGlobal::getInstance().getCameraIdList(&idList);
+ CameraManagerGlobal::getInstance()->getCameraIdList(&idList);
int numCameras = idList.size();
ACameraIdList *out = new ACameraIdList;
@@ -687,7 +686,7 @@
const char* cameraIdStr, sp<ACameraMetadata>* characteristics) {
Mutex::Autolock _l(mLock);
- sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+ sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance()->getCameraService();
if (cs == nullptr) {
ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
return ACAMERA_ERROR_CAMERA_DISCONNECTED;
@@ -733,7 +732,7 @@
ACameraDevice* device = new ACameraDevice(cameraId, callback, chars);
- sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+ sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance()->getCameraService();
if (cs == nullptr) {
ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
delete device;
diff --git a/camera/ndk/impl/ACameraManager.h b/camera/ndk/impl/ACameraManager.h
index d53d809..0dd79da 100644
--- a/camera/ndk/impl/ACameraManager.h
+++ b/camera/ndk/impl/ACameraManager.h
@@ -46,7 +46,7 @@
*/
class CameraManagerGlobal final : public RefBase {
public:
- static CameraManagerGlobal& getInstance();
+ static sp<CameraManagerGlobal> getInstance();
sp<hardware::ICameraService> getCameraService();
void registerAvailabilityCallback(
@@ -257,7 +257,7 @@
// For the singleton instance
static Mutex sLock;
- static CameraManagerGlobal* sInstance;
+ static wp<CameraManagerGlobal> sInstance;
CameraManagerGlobal() {};
~CameraManagerGlobal();
};
@@ -271,7 +271,7 @@
*/
struct ACameraManager {
ACameraManager() :
- mGlobalManager(&(android::acam::CameraManagerGlobal::getInstance())) {}
+ mGlobalManager(android::acam::CameraManagerGlobal::getInstance()) {}
~ACameraManager();
camera_status_t getCameraIdList(ACameraIdList** cameraIdList);
static void deleteCameraIdList(ACameraIdList* cameraIdList);
diff --git a/camera/ndk/ndk_vendor/impl/ACameraCaptureSessionVendor.h b/camera/ndk/ndk_vendor/impl/ACameraCaptureSessionVendor.h
index 5a1af79..45098c3 100644
--- a/camera/ndk/ndk_vendor/impl/ACameraCaptureSessionVendor.h
+++ b/camera/ndk/ndk_vendor/impl/ACameraCaptureSessionVendor.h
@@ -14,9 +14,14 @@
* limitations under the License.
*/
-#include <string>
#include "utils.h"
+#include <android/binder_auto_utils.h>
+#include <string>
+#include <set>
+
+using ::android::acam::utils::native_handle_ptr_wrapper;
+
struct ACaptureSessionOutput {
explicit ACaptureSessionOutput(const native_handle_t* window, bool isShared = false,
const char* physicalCameraId = "") :
@@ -38,8 +43,23 @@
return mWindow > other.mWindow;
}
- android::acam::utils::native_handle_ptr_wrapper mWindow;
- std::set<android::acam::utils::native_handle_ptr_wrapper> mSharedWindows;
+ inline bool isWindowEqual(ACameraWindowType* window) const {
+ return mWindow == native_handle_ptr_wrapper(window);
+ }
+
+ // returns true if the window was successfully added, false otherwise.
+ inline bool addSharedWindow(ACameraWindowType* window) {
+ auto ret = mSharedWindows.insert(window);
+ return ret.second;
+ }
+
+ // returns the number of elements removed.
+ inline size_t removeSharedWindow(ACameraWindowType* window) {
+ return mSharedWindows.erase(window);
+ }
+
+ native_handle_ptr_wrapper mWindow;
+ std::set<native_handle_ptr_wrapper> mSharedWindows;
bool mIsShared;
int mRotation = CAMERA3_STREAM_ROTATION_0;
std::string mPhysicalCameraId;
diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp
index 0a57590..96df7db 100644
--- a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp
+++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp
@@ -17,27 +17,34 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "ACameraDeviceVendor"
-#include <vector>
-#include <inttypes.h>
-#include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
-#include <android/frameworks/cameraservice/device/2.0/types.h>
-#include <CameraMetadata.h>
-
-#include "ndk_vendor/impl/ACameraDevice.h"
#include "ACameraCaptureSession.h"
#include "ACameraMetadata.h"
#include "ACaptureRequest.h"
+#include "ndk_vendor/impl/ACameraDevice.h"
#include "utils.h"
+#include <CameraMetadata.h>
+#include <aidl/android/frameworks/cameraservice/device/CameraMetadata.h>
+#include <aidl/android/frameworks/cameraservice/device/OutputConfiguration.h>
+#include <aidl/android/frameworks/cameraservice/device/SessionConfiguration.h>
+#include <aidlcommonsupport/NativeHandle.h>
+#include <inttypes.h>
+#include <map>
+#include <utility>
+#include <vector>
-#define CHECK_TRANSACTION_AND_RET(remoteRet, status, callName) \
- if (!remoteRet.isOk()) { \
- ALOGE("%s: Transaction error during %s call %s", __FUNCTION__, callName, \
- remoteRet.description().c_str()); \
- return ACAMERA_ERROR_UNKNOWN; \
- } \
- if (status != Status::NO_ERROR) { \
- ALOGE("%s: %s call failed", __FUNCTION__, callName); \
- return utils::convertFromHidl(status); \
+#define CHECK_TRANSACTION_AND_RET(ret, callName) \
+ if (!remoteRet.isOk()) { \
+ if (remoteRet.getExceptionCode() != EX_SERVICE_SPECIFIC) { \
+ ALOGE("%s: Transaction error during %s call %d", __FUNCTION__, callName, \
+ ret.getExceptionCode()); \
+ return ACAMERA_ERROR_UNKNOWN; \
+ } else { \
+ Status errStatus = static_cast<Status>(remoteRet.getServiceSpecificError()); \
+ std::string errorMsg = \
+ aidl::android::frameworks::cameraservice::common::toString(errStatus); \
+ ALOGE("%s: %s call failed: %s", __FUNCTION__, callName, errorMsg.c_str()); \
+ return utils::convertFromAidl(errStatus); \
+ } \
}
using namespace android;
@@ -49,10 +56,10 @@
namespace android {
namespace acam {
-using HCameraMetadata = frameworks::cameraservice::device::V2_0::CameraMetadata;
-using OutputConfiguration = frameworks::cameraservice::device::V2_0::OutputConfiguration;
-using SessionConfiguration = frameworks::cameraservice::device::V2_0::SessionConfiguration;
-using hardware::Void;
+using AidlCameraMetadata = ::aidl::android::frameworks::cameraservice::device::CameraMetadata;
+using ::aidl::android::frameworks::cameraservice::device::OutputConfiguration;
+using ::aidl::android::frameworks::cameraservice::device::SessionConfiguration;
+using ::ndk::ScopedAStatus;
// Static member definitions
const char* CameraDevice::kContextKey = "Context";
@@ -81,7 +88,6 @@
mCameraId(id),
mAppCallbacks(*cb),
mChars(std::move(chars)),
- mServiceCallback(new ServiceCallback(this)),
mWrapper(wrapper),
mInError(false),
mError(ACAMERA_OK),
@@ -125,8 +131,11 @@
CameraDevice::~CameraDevice() { }
-void
-CameraDevice::postSessionMsgAndCleanup(sp<AMessage>& msg) {
+void CameraDevice::init() {
+ mServiceCallback = ndk::SharedRefBase::make<ServiceCallback>(weak_from_this());
+}
+
+void CameraDevice::postSessionMsgAndCleanup(sp<AMessage>& msg) {
msg->post();
msg.clear();
sp<AMessage> cleanupMsg = new AMessage(kWhatCleanUpSessions, mHandler);
@@ -134,8 +143,7 @@
}
// TODO: cached created request?
-camera_status_t
-CameraDevice::createCaptureRequest(
+camera_status_t CameraDevice::createCaptureRequest(
ACameraDevice_request_template templateId,
const ACameraIdList* physicalCameraIdList,
ACaptureRequest** request) const {
@@ -147,20 +155,16 @@
if (mRemote == nullptr) {
return ACAMERA_ERROR_CAMERA_DISCONNECTED;
}
- CameraMetadata rawRequest;
- Status status = Status::UNKNOWN_ERROR;
- auto remoteRet = mRemote->createDefaultRequest(
- utils::convertToHidl(templateId),
- [&status, &rawRequest](auto s, const hidl_vec<uint8_t> &metadata) {
- status = s;
- if (status == Status::NO_ERROR && utils::convertFromHidlCloned(metadata, &rawRequest)) {
- } else {
- ALOGE("%s: Couldn't create default request", __FUNCTION__);
- }
- });
- CHECK_TRANSACTION_AND_RET(remoteRet, status, "createDefaultRequest()")
+
+ AidlCameraMetadata aidlMetadata;
+ ScopedAStatus remoteRet = mRemote->createDefaultRequest(
+ utils::convertToAidl(templateId), &aidlMetadata);
+ CHECK_TRANSACTION_AND_RET(remoteRet, "createDefaultRequest()")
+
+ camera_metadata_t* rawRequest;
+ utils::cloneFromAidl(aidlMetadata, &rawRequest);
ACaptureRequest* outReq = new ACaptureRequest();
- outReq->settings = new ACameraMetadata(rawRequest.release(), ACameraMetadata::ACM_REQUEST);
+ outReq->settings = new ACameraMetadata(rawRequest, ACameraMetadata::ACM_REQUEST);
if (physicalCameraIdList != nullptr) {
for (auto i = 0; i < physicalCameraIdList->numCameras; i++) {
outReq->physicalSettings.emplace(physicalCameraIdList->cameraIds[i],
@@ -172,9 +176,8 @@
return ACAMERA_OK;
}
-camera_status_t
-CameraDevice::createCaptureSession(
- const ACaptureSessionOutputContainer* outputs,
+camera_status_t CameraDevice::createCaptureSession(
+ const ACaptureSessionOutputContainer* outputs,
const ACaptureRequest* sessionParameters,
const ACameraCaptureSession_stateCallbacks* callbacks,
/*out*/ACameraCaptureSession** session) {
@@ -199,7 +202,7 @@
}
ACameraCaptureSession* newSession = new ACameraCaptureSession(
- mNextSessionId++, outputs, callbacks, this);
+ mNextSessionId++, outputs, callbacks, weak_from_this());
// set new session as current session
newSession->incStrong((void *) ACameraDevice_createCaptureSession);
@@ -225,41 +228,39 @@
sessionConfig.outputStreams.resize(sessionOutputContainer->mOutputs.size());
size_t index = 0;
for (const auto& output : sessionOutputContainer->mOutputs) {
- sessionConfig.outputStreams[index].rotation = utils::convertToHidl(output.mRotation);
- sessionConfig.outputStreams[index].windowGroupId = -1;
- sessionConfig.outputStreams[index].windowHandles.resize(output.mSharedWindows.size() + 1);
- sessionConfig.outputStreams[index].windowHandles[0] = output.mWindow;
- sessionConfig.outputStreams[index].physicalCameraId = output.mPhysicalCameraId;
+ OutputConfiguration& outputStream = sessionConfig.outputStreams[index];
+ outputStream.rotation = utils::convertToAidl(output.mRotation);
+ outputStream.windowGroupId = -1;
+ outputStream.windowHandles.resize(output.mSharedWindows.size() + 1);
+ outputStream.windowHandles[0] = std::move(dupToAidl(output.mWindow));
+ outputStream.physicalCameraId = output.mPhysicalCameraId;
index++;
}
bool configSupported = false;
- Status status = Status::UNKNOWN_ERROR;
- auto remoteRet = mRemote->isSessionConfigurationSupported(sessionConfig,
- [&status, &configSupported](auto s, auto supported) {
- status = s;
- configSupported = supported;
- });
-
- CHECK_TRANSACTION_AND_RET(remoteRet, status, "isSessionConfigurationSupported()");
+ ScopedAStatus remoteRet = mRemote->isSessionConfigurationSupported(
+ sessionConfig, &configSupported);
+ CHECK_TRANSACTION_AND_RET(remoteRet, "isSessionConfigurationSupported()")
return configSupported ? ACAMERA_OK : ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
}
static void addMetadataToPhysicalCameraSettings(const CameraMetadata *metadata,
const std::string &cameraId, PhysicalCameraSettings *physicalCameraSettings) {
- CameraMetadata metadataCopy = *metadata;
- camera_metadata_t *camera_metadata = metadataCopy.release();
- HCameraMetadata hCameraMetadata;
- utils::convertToHidl(camera_metadata, &hCameraMetadata, /*shouldOwn*/ true);
- physicalCameraSettings->settings.metadata(std::move(hCameraMetadata));
+ const camera_metadata_t* cameraMetadata = metadata->getAndLock();
+ AidlCameraMetadata aidlCameraMetadata;
+ utils::convertToAidl(cameraMetadata, &aidlCameraMetadata);
+ metadata->unlock(cameraMetadata);
+ physicalCameraSettings->settings.set<CaptureMetadataInfo::metadata>(
+ std::move(aidlCameraMetadata));
physicalCameraSettings->id = cameraId;
}
void CameraDevice::addRequestSettingsMetadata(ACaptureRequest *aCaptureRequest,
sp<CaptureRequest> &req) {
req->mPhysicalCameraSettings.resize(1 + aCaptureRequest->physicalSettings.size());
- addMetadataToPhysicalCameraSettings(&(aCaptureRequest->settings->getInternalData()), getId(),
- &(req->mPhysicalCameraSettings[0]));
+ addMetadataToPhysicalCameraSettings(
+ &(aCaptureRequest->settings->getInternalData()),
+ getId(),&(req->mPhysicalCameraSettings[0]));
size_t i = 1;
for (auto &physicalSetting : aCaptureRequest->physicalSettings) {
addMetadataToPhysicalCameraSettings(&(physicalSetting.second->getInternalData()),
@@ -285,7 +286,7 @@
int32_t streamId = -1;
for (auto& kvPair : mConfiguredOutputs) {
- if (utils::isWindowNativeHandleEqual(kvPair.second.first, output->mWindow)) {
+ if (kvPair.second.first == output->mWindow) {
streamId = kvPair.first;
break;
}
@@ -295,56 +296,59 @@
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- OutputConfigurationWrapper outConfigW;
- OutputConfiguration &outConfig = outConfigW.mOutputConfiguration;
- outConfig.rotation = utils::convertToHidl(output->mRotation);
+ OutputConfiguration outConfig;
+ outConfig.rotation = utils::convertToAidl(output->mRotation);
outConfig.windowHandles.resize(output->mSharedWindows.size() + 1);
- outConfig.windowHandles[0] = output->mWindow;
+ outConfig.windowHandles[0] = std::move(dupToAidl(output->mWindow));
outConfig.physicalCameraId = output->mPhysicalCameraId;
int i = 1;
for (auto& anw : output->mSharedWindows) {
- outConfig.windowHandles[i++] = anw;
+ outConfig.windowHandles[i++] = std::move(dupToAidl(anw));
}
- auto remoteRet = mRemote->updateOutputConfiguration(streamId, outConfig);
+ auto remoteRet = mRemote->updateOutputConfiguration(streamId,
+ outConfig);
+
if (!remoteRet.isOk()) {
- ALOGE("%s: Transaction error in updating OutputConfiguration: %s", __FUNCTION__,
- remoteRet.description().c_str());
- return ACAMERA_ERROR_UNKNOWN;
+ if (remoteRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ Status st = static_cast<Status>(remoteRet.getServiceSpecificError());
+ switch (st) {
+ case Status::NO_ERROR:
+ break;
+ case Status::INVALID_OPERATION:
+ ALOGE("Camera device %s invalid operation", getId());
+ return ACAMERA_ERROR_INVALID_OPERATION;
+ case Status::ALREADY_EXISTS:
+ ALOGE("Camera device %s output surface already exists", getId());
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ case Status::ILLEGAL_ARGUMENT:
+ ALOGE("Camera device %s invalid input argument", getId());
+ return ACAMERA_ERROR_INVALID_PARAMETER;
+ default:
+ ALOGE("Camera device %s failed to add shared output", getId());
+ return ACAMERA_ERROR_UNKNOWN;
+ }
+ } else {
+ ALOGE("%s: Transaction error in updating OutputConfiguration: %d", __FUNCTION__,
+ remoteRet.getExceptionCode());
+ return ACAMERA_ERROR_UNKNOWN;
+ }
}
- switch (remoteRet) {
- case Status::NO_ERROR:
- break;
- case Status::INVALID_OPERATION:
- ALOGE("Camera device %s invalid operation", getId());
- return ACAMERA_ERROR_INVALID_OPERATION;
- case Status::ALREADY_EXISTS:
- ALOGE("Camera device %s output surface already exists", getId());
- return ACAMERA_ERROR_INVALID_PARAMETER;
- case Status::ILLEGAL_ARGUMENT:
- ALOGE("Camera device %s invalid input argument", getId());
- return ACAMERA_ERROR_INVALID_PARAMETER;
- default:
- ALOGE("Camera device %s failed to add shared output", getId());
- return ACAMERA_ERROR_UNKNOWN;
- }
-
- mConfiguredOutputs[streamId] =
- std::move(std::make_pair(std::move(output->mWindow), std::move(outConfigW)));
-
+ mConfiguredOutputs[streamId] = std::make_pair(output->mWindow,
+ std::move(outConfig));
return ACAMERA_OK;
}
-camera_status_t
-CameraDevice::allocateCaptureRequestLocked(
+camera_status_t CameraDevice::allocateCaptureRequestLocked(
const ACaptureRequest* request, /*out*/sp<CaptureRequest> &outReq) {
sp<CaptureRequest> req(new CaptureRequest());
req->mCaptureRequest.physicalCameraSettings.resize(1 + request->physicalSettings.size());
size_t index = 0;
allocateOneCaptureRequestMetadata(
- req->mCaptureRequest.physicalCameraSettings[index++], mCameraId, request->settings);
+ req->mCaptureRequest.physicalCameraSettings[index++],
+ mCameraId, request->settings);
for (auto& physicalEntry : request->physicalSettings) {
allocateOneCaptureRequestMetadata(
@@ -354,19 +358,20 @@
std::vector<int32_t> requestStreamIdxList;
std::vector<int32_t> requestSurfaceIdxList;
- for (auto outputTarget : request->targets->mOutputs) {
- const native_handle_t* anw = outputTarget.mWindow;
+
+ for (auto& outputTarget : request->targets->mOutputs) {
+ native_handle_ptr_wrapper anw = outputTarget.mWindow;
bool found = false;
req->mSurfaceList.push_back(anw);
// lookup stream/surface ID
for (const auto& kvPair : mConfiguredOutputs) {
int streamId = kvPair.first;
- const OutputConfigurationWrapper& outConfig = kvPair.second.second;
- const auto& windowHandles = outConfig.mOutputConfiguration.windowHandles;
+ const OutputConfiguration& outConfig = kvPair.second.second;
+ const auto& windowHandles = outConfig.windowHandles;
for (int surfaceId = 0; surfaceId < (int) windowHandles.size(); surfaceId++) {
- // If two native handles are equivalent, so are their surfaces.
- if (utils::isWindowNativeHandleEqual(windowHandles[surfaceId].getNativeHandle(),
- anw)) {
+ // If two window handles point to the same native window,
+ // they have the same surfaces.
+ if (utils::isWindowNativeHandleEqual(anw, windowHandles[surfaceId])) {
found = true;
requestStreamIdxList.push_back(streamId);
requestSurfaceIdxList.push_back(surfaceId);
@@ -378,7 +383,7 @@
}
}
if (!found) {
- ALOGE("Unconfigured output target %p in capture request!", anw);
+ ALOGE("Unconfigured output target %p in capture request!", anw.mWindow);
return ACAMERA_ERROR_INVALID_PARAMETER;
}
}
@@ -395,54 +400,57 @@
PhysicalCameraSettings& cameraSettings,
const std::string& id, const sp<ACameraMetadata>& metadata) {
cameraSettings.id = id;
- // TODO: Do we really need to copy the metadata here ?
- CameraMetadata metadataCopy = metadata->getInternalData();
- camera_metadata_t *cameraMetadata = metadataCopy.release();
- HCameraMetadata hCameraMetadata;
- utils::convertToHidl(cameraMetadata, &hCameraMetadata, true);
- if (metadata != nullptr) {
- if (hCameraMetadata.data() != nullptr &&
- mCaptureRequestMetadataQueue != nullptr &&
- mCaptureRequestMetadataQueue->write(
- reinterpret_cast<const uint8_t *>(hCameraMetadata.data()),
- hCameraMetadata.size())) {
- // The metadata field of the union would've been destructued, so no need
- // to re-size it.
- cameraSettings.settings.fmqMetadataSize(hCameraMetadata.size());
- } else {
- ALOGE("Fmq write capture result failed, falling back to hwbinder");
- cameraSettings.settings.metadata(std::move(hCameraMetadata));
- }
+
+ if (metadata == nullptr) {
+ return;
+ }
+
+ const camera_metadata_t* cameraMetadata = metadata->getInternalData().getAndLock();
+ AidlCameraMetadata aidlCameraMetadata;
+ utils::convertToAidl(cameraMetadata, &aidlCameraMetadata);
+ metadata->getInternalData().unlock(cameraMetadata);
+
+ if (aidlCameraMetadata.metadata.data() != nullptr &&
+ mCaptureRequestMetadataQueue != nullptr &&
+ mCaptureRequestMetadataQueue->write(
+ reinterpret_cast<const int8_t*>(aidlCameraMetadata.metadata.data()),
+ aidlCameraMetadata.metadata.size())) {
+ cameraSettings.settings.set<CaptureMetadataInfo::fmqMetadataSize>(
+ aidlCameraMetadata.metadata.size());
+ } else {
+ ALOGE("Fmq write capture result failed, falling back to hwbinder");
+ cameraSettings.settings.set<CaptureMetadataInfo::metadata>(std::move(aidlCameraMetadata));
}
}
-ACaptureRequest*
-CameraDevice::allocateACaptureRequest(sp<CaptureRequest>& req, const char* deviceId) {
+ACaptureRequest* CameraDevice::allocateACaptureRequest(sp<CaptureRequest>& req,
+ const char* deviceId) {
ACaptureRequest* pRequest = new ACaptureRequest();
for (size_t i = 0; i < req->mPhysicalCameraSettings.size(); i++) {
const std::string& id = req->mPhysicalCameraSettings[i].id;
- CameraMetadata clone;
- utils::convertFromHidlCloned(req->mPhysicalCameraSettings[i].settings.metadata(), &clone);
- camera_metadata_t *clonep = clone.release();
+ camera_metadata_t* clone;
+ AidlCameraMetadata& aidlCameraMetadata = req->mPhysicalCameraSettings[i].settings
+ .get<CaptureMetadataInfo::metadata>();
+ utils::cloneFromAidl(aidlCameraMetadata, &clone);
+
if (id == deviceId) {
- pRequest->settings = new ACameraMetadata(clonep, ACameraMetadata::ACM_REQUEST);
+ pRequest->settings = new ACameraMetadata(clone, ACameraMetadata::ACM_REQUEST);
} else {
pRequest->physicalSettings[req->mPhysicalCameraSettings[i].id] =
- new ACameraMetadata(clonep, ACameraMetadata::ACM_REQUEST);
+ new ACameraMetadata(clone, ACameraMetadata::ACM_REQUEST);
}
}
pRequest->targets = new ACameraOutputTargets();
for (size_t i = 0; i < req->mSurfaceList.size(); i++) {
- const native_handle_t* anw = req->mSurfaceList[i];
+ native_handle_ptr_wrapper anw = req->mSurfaceList[i];
ACameraOutputTarget outputTarget(anw);
- pRequest->targets->mOutputs.insert(outputTarget);
+ pRequest->targets->mOutputs.insert(std::move(outputTarget));
}
return pRequest;
}
-void
-CameraDevice::freeACaptureRequest(ACaptureRequest* req) {
+void CameraDevice::freeACaptureRequest(ACaptureRequest* req) {
if (req == nullptr) {
return;
}
@@ -459,7 +467,7 @@
}
if (mCurrentSession != session) {
- // Session has been replaced by other seesion or device is closed
+ // Session has been replaced by other session or device is closed
return;
}
mCurrentSession = nullptr;
@@ -471,8 +479,8 @@
return;
}
- // No new session, unconfigure now
- // Note: The unconfiguration of session won't be accounted for session
+ // No new session, un-configure now
+ // Note: The un-configuration of session won't be accounted for session
// latency because a stream configuration with 0 streams won't ever become
// active.
nsecs_t startTimeNs = systemTime();
@@ -494,8 +502,8 @@
ALOGD("%s: binder disconnect reached", __FUNCTION__);
auto ret = mRemote->disconnect();
if (!ret.isOk()) {
- ALOGE("%s: Transaction error while disconnecting device %s", __FUNCTION__,
- ret.description().c_str());
+ ALOGE("%s: Transaction error while disconnecting device %d", __FUNCTION__,
+ ret.getExceptionCode());
}
}
mRemote = nullptr;
@@ -505,8 +513,7 @@
}
}
-camera_status_t
-CameraDevice::stopRepeatingLocked() {
+camera_status_t CameraDevice::stopRepeatingLocked() {
camera_status_t ret = checkCameraClosedOrErrorLocked();
if (ret != ACAMERA_OK) {
ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret);
@@ -517,20 +524,14 @@
mRepeatingSequenceId = REQUEST_ID_NONE;
int64_t lastFrameNumber;
- Status status = Status::UNKNOWN_ERROR;
- auto remoteRet = mRemote->cancelRepeatingRequest(
- [&status, &lastFrameNumber](Status s, auto frameNumber) {
- status = s;
- lastFrameNumber = frameNumber;
- });
- CHECK_TRANSACTION_AND_RET(remoteRet, status, "cancelRepeatingRequest()");
+ ScopedAStatus remoteRet = mRemote->cancelRepeatingRequest(&lastFrameNumber);
+ CHECK_TRANSACTION_AND_RET(remoteRet, "cancelRepeatingRequest()");
checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
}
return ACAMERA_OK;
}
-camera_status_t
-CameraDevice::flushLocked(ACameraCaptureSession* session) {
+camera_status_t CameraDevice::flushLocked(ACameraCaptureSession* session) {
camera_status_t ret = checkCameraClosedOrErrorLocked();
if (ret != ACAMERA_OK) {
ALOGE("Camera %s abort captures failed! ret %d", getId(), ret);
@@ -571,20 +572,15 @@
}
int64_t lastFrameNumber;
- Status status = Status::UNKNOWN_ERROR;
- auto remoteRet = mRemote->flush([&status, &lastFrameNumber](auto s, auto frameNumber) {
- status = s;
- lastFrameNumber = frameNumber;
- });
- CHECK_TRANSACTION_AND_RET(remoteRet, status, "flush()")
+ ScopedAStatus remoteRet = mRemote->flush(&lastFrameNumber);
+ CHECK_TRANSACTION_AND_RET(remoteRet, "flush()")
if (mRepeatingSequenceId != REQUEST_ID_NONE) {
checkRepeatingSequenceCompleteLocked(mRepeatingSequenceId, lastFrameNumber);
}
return ACAMERA_OK;
}
-camera_status_t
-CameraDevice::waitUntilIdleLocked() {
+camera_status_t CameraDevice::waitUntilIdleLocked() {
camera_status_t ret = checkCameraClosedOrErrorLocked();
if (ret != ACAMERA_OK) {
ALOGE("Wait until camera %s idle failed! ret %d", getId(), ret);
@@ -597,13 +593,13 @@
}
auto remoteRet = mRemote->waitUntilIdle();
- CHECK_TRANSACTION_AND_RET(remoteRet, remoteRet, "waitUntilIdle()")
+ CHECK_TRANSACTION_AND_RET(remoteRet, "waitUntilIdle()")
return ACAMERA_OK;
}
-camera_status_t
-CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
- const ACaptureRequest* sessionParameters, nsecs_t startTimeNs) {
+camera_status_t CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
+ const ACaptureRequest* sessionParameters,
+ nsecs_t startTimeNs) {
ACaptureSessionOutputContainer emptyOutput;
if (outputs == nullptr) {
outputs = &emptyOutput;
@@ -614,31 +610,37 @@
return ret;
}
- std::set<std::pair<native_handle_ptr_wrapper, OutputConfigurationWrapper>> outputSet;
- for (auto outConfig : outputs->mOutputs) {
- const native_handle_t* anw = outConfig.mWindow;
- OutputConfigurationWrapper outConfigInsertW;
- OutputConfiguration &outConfigInsert = outConfigInsertW.mOutputConfiguration;
- outConfigInsert.rotation = utils::convertToHidl(outConfig.mRotation);
+ std::map<native_handle_ptr_wrapper, OutputConfiguration> handleToConfig;
+ for (const auto& outConfig : outputs->mOutputs) {
+ native_handle_ptr_wrapper anw = outConfig.mWindow;
+ OutputConfiguration outConfigInsert;
+ outConfigInsert.rotation = utils::convertToAidl(outConfig.mRotation);
outConfigInsert.windowGroupId = -1;
outConfigInsert.windowHandles.resize(outConfig.mSharedWindows.size() + 1);
- outConfigInsert.windowHandles[0] = anw;
+ outConfigInsert.windowHandles[0] = std::move(dupToAidl(anw));
outConfigInsert.physicalCameraId = outConfig.mPhysicalCameraId;
- native_handle_ptr_wrapper wrap(anw);
-
- outputSet.emplace(std::make_pair(std::move(anw), std::move(outConfigInsertW)));
+ handleToConfig.insert({anw, std::move(outConfigInsert)});
}
- std::set<std::pair<native_handle_ptr_wrapper, OutputConfigurationWrapper>> addSet = outputSet;
+
+ std::set<native_handle_ptr_wrapper> addSet;
+ for (auto& kvPair : handleToConfig) {
+ addSet.insert(kvPair.first);
+ }
+
std::vector<int32_t> deleteList;
// Determine which streams need to be created, which to be deleted
for (auto& kvPair : mConfiguredOutputs) {
int32_t streamId = kvPair.first;
auto& outputPair = kvPair.second;
- if (outputSet.count(outputPair)) {
- deleteList.push_back(streamId); // Need to delete a no longer needed stream
+ auto& anw = outputPair.first;
+ auto& configuredOutput = outputPair.second;
+
+ auto itr = handleToConfig.find(anw);
+ if (itr != handleToConfig.end() && (itr->second) == configuredOutput) {
+ deleteList.push_back(streamId);
} else {
- addSet.erase(outputPair); // No need to add already existing stream
+ addSet.erase(anw);
}
}
@@ -673,106 +675,96 @@
mIdle = true;
auto remoteRet = mRemote->beginConfigure();
- CHECK_TRANSACTION_AND_RET(remoteRet, remoteRet, "beginConfigure()")
+ CHECK_TRANSACTION_AND_RET(remoteRet, "beginConfigure()")
// delete to-be-deleted streams
for (auto streamId : deleteList) {
remoteRet = mRemote->deleteStream(streamId);
- CHECK_TRANSACTION_AND_RET(remoteRet, remoteRet, "deleteStream()")
+ CHECK_TRANSACTION_AND_RET(remoteRet, "deleteStream()")
mConfiguredOutputs.erase(streamId);
}
// add new streams
- for (const auto &outputPair : addSet) {
- int streamId;
- Status status = Status::UNKNOWN_ERROR;
- auto ret = mRemote->createStream(outputPair.second,
- [&status, &streamId](Status s, auto stream_id) {
- status = s;
- streamId = stream_id;
- });
- CHECK_TRANSACTION_AND_RET(ret, status, "createStream()")
- mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
+ for (const auto &anw : addSet) {
+ int32_t streamId;
+ auto itr = handleToConfig.find(anw);
+ remoteRet = mRemote->createStream(itr->second, &streamId);
+ CHECK_TRANSACTION_AND_RET(remoteRet, "createStream()")
+ mConfiguredOutputs.insert(std::make_pair(streamId,
+ std::make_pair(anw,
+ std::move(itr->second))));
+ handleToConfig.erase(itr);
}
- CameraMetadata params;
- HCameraMetadata hidlParams;
+ AidlCameraMetadata aidlParams;
if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) {
- params.append(sessionParameters->settings->getInternalData());
- const camera_metadata_t *params_metadata = params.getAndLock();
- utils::convertToHidl(params_metadata, &hidlParams);
- params.unlock(params_metadata);
+ const CameraMetadata ¶ms = sessionParameters->settings->getInternalData();
+ const camera_metadata_t* paramsMetadata = params.getAndLock();
+ utils::convertToAidl(paramsMetadata, &aidlParams);
+ params.unlock(paramsMetadata);
}
- remoteRet = mRemote->endConfigure_2_1(StreamConfigurationMode::NORMAL_MODE,
- hidlParams, startTimeNs);
- CHECK_TRANSACTION_AND_RET(remoteRet, remoteRet, "endConfigure()")
+ remoteRet = mRemote->endConfigure(StreamConfigurationMode::NORMAL_MODE,
+ aidlParams, startTimeNs);
+ CHECK_TRANSACTION_AND_RET(remoteRet, "endConfigure()")
return ACAMERA_OK;
}
-void
-CameraDevice::setRemoteDevice(sp<ICameraDeviceUser> remote) {
+void CameraDevice::setRemoteDevice(std::shared_ptr<ICameraDeviceUser> remote) {
Mutex::Autolock _l(mDeviceLock);
- mRemote = remote;
+ mRemote = std::move(remote);
}
-bool
-CameraDevice::setDeviceMetadataQueues() {
+bool CameraDevice::setDeviceMetadataQueues() {
if (mRemote == nullptr) {
ALOGE("mRemote must not be null while trying to fetch metadata queues");
return false;
}
std::shared_ptr<RequestMetadataQueue> &reqQueue = mCaptureRequestMetadataQueue;
- auto ret =
- mRemote->getCaptureRequestMetadataQueue(
- [&reqQueue](const auto &mqDescriptor) {
- reqQueue = std::make_shared<RequestMetadataQueue>(mqDescriptor);
- if (!reqQueue->isValid() || reqQueue->availableToWrite() <=0) {
- ALOGE("Empty fmq from cameraserver");
- reqQueue = nullptr;
- }
- });
+ MQDescriptor<int8_t, SynchronizedReadWrite> reqMqDescriptor;
+ ScopedAStatus ret = mRemote->getCaptureRequestMetadataQueue(&reqMqDescriptor);
if (!ret.isOk()) {
ALOGE("Transaction error trying to get capture request metadata queue");
return false;
}
+ reqQueue = std::make_shared<RequestMetadataQueue>(reqMqDescriptor);
+ if (!reqQueue->isValid() || reqQueue->availableToWrite() <= 0) {
+ ALOGE("Empty fmq from cameraserver");
+ reqQueue = nullptr;
+ }
+
+ MQDescriptor<int8_t, SynchronizedReadWrite> resMqDescriptor;
std::shared_ptr<ResultMetadataQueue> &resQueue = mCaptureResultMetadataQueue;
- ret =
- mRemote->getCaptureResultMetadataQueue(
- [&resQueue](const auto &mqDescriptor) {
- resQueue = std::make_shared<ResultMetadataQueue>(mqDescriptor);
- if (!resQueue->isValid() || resQueue->availableToWrite() <=0) {
- ALOGE("Empty fmq from cameraserver");
- }
- });
+ ret = mRemote->getCaptureResultMetadataQueue(&resMqDescriptor);
if (!ret.isOk()) {
ALOGE("Transaction error trying to get capture result metadata queue");
return false;
}
+ resQueue = std::make_shared<ResultMetadataQueue>(resMqDescriptor);
+ if (!resQueue->isValid() || resQueue->availableToWrite() <= 0) {
+ ALOGE("Empty fmq from cameraserver");
+ }
+
return true;
}
-camera_status_t
-CameraDevice::checkCameraClosedOrErrorLocked() const {
+camera_status_t CameraDevice::checkCameraClosedOrErrorLocked() const {
if (mRemote == nullptr) {
ALOGE("%s: camera device already closed", __FUNCTION__);
return ACAMERA_ERROR_CAMERA_DISCONNECTED;
}
- if (mInError) {// triggered by onDeviceError
- ALOGE("%s: camera device has encountered a serious error", __FUNCTION__);
+ if (mInError) { // triggered by onDeviceError
+ ALOGE("%s: camera device has encountered a serious error: %d", __FUNCTION__, mError);
return mError;
}
return ACAMERA_OK;
}
-void
-CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) {
+void CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) {
mInError = true;
mError = error;
- return;
}
-void
-CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) {
+void CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) {
ALOGV("updateTracker frame %" PRId64 " isError %d", frameNumber, isError);
if (isError) {
mFutureErrorSet.insert(frameNumber);
@@ -791,8 +783,7 @@
update();
}
-void
-CameraDevice::FrameNumberTracker::update() {
+void CameraDevice::FrameNumberTracker::update() {
for (auto it = mFutureErrorSet.begin(); it != mFutureErrorSet.end();) {
int64_t errorFrameNumber = *it;
if (errorFrameNumber == mCompletedFrameNumber + 1) {
@@ -811,10 +802,8 @@
ALOGV("Update complete frame %" PRId64, mCompletedFrameNumber);
}
-void
-CameraDevice::onCaptureErrorLocked(
- ErrorCode errorCode,
- const CaptureResultExtras& resultExtras) {
+void CameraDevice::onCaptureErrorLocked(ErrorCode errorCode,
+ const CaptureResultExtras& resultExtras) {
int sequenceId = resultExtras.requestId;
int64_t frameNumber = resultExtras.frameNumber;
int32_t burstId = resultExtras.burstId;
@@ -826,7 +815,7 @@
return;
}
- CallbackHolder cbh = (*it).second;
+ CallbackHolder cbh = it->second;
sp<ACameraCaptureSession> session = cbh.mSession;
if ((size_t) burstId >= cbh.mRequests.size()) {
ALOGE("%s: Error: request index %d out of bound (size %zu)",
@@ -852,7 +841,7 @@
// them and try to match the surfaces in the corresponding
// CaptureRequest.
const auto& errorWindowHandles =
- outputPairIt->second.second.mOutputConfiguration.windowHandles;
+ outputPairIt->second.second.windowHandles;
for (const auto& errorWindowHandle : errorWindowHandles) {
for (const auto &requestStreamAndWindowId :
request->mCaptureRequest.streamAndWindowIds) {
@@ -869,11 +858,11 @@
}
const auto &requestWindowHandles =
- requestSurfacePairIt->second.second.mOutputConfiguration.windowHandles;
- if (utils::isWindowNativeHandleEqual(
- requestWindowHandles[requestWindowId], errorWindowHandle)) {
- const native_handle_t* anw =
- requestWindowHandles[requestWindowId].getNativeHandle();
+ requestSurfacePairIt->second.second.windowHandles;
+
+ if (requestWindowHandles[requestWindowId] == errorWindowHandle) {
+ const native_handle_t* anw = makeFromAidl(
+ requestWindowHandles[requestWindowId]);
ALOGV("Camera %s Lost output buffer for ANW %p frame %" PRId64,
getId(), anw, frameNumber);
@@ -898,14 +887,16 @@
failure->sequenceId = sequenceId;
failure->wasImageCaptured = (errorCode == ErrorCode::CAMERA_RESULT);
- sp<AMessage> msg = new AMessage(cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureFail :
- kWhatCaptureFail, mHandler);
+ sp<AMessage> msg = new AMessage(cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureFail
+ : kWhatCaptureFail,
+ mHandler);
msg->setPointer(kContextKey, cbh.mContext);
msg->setObject(kSessionSpKey, session);
if (cbh.mIsLogicalCameraCallback) {
- if (resultExtras.errorPhysicalCameraId.size() > 0) {
- msg->setString(kFailingPhysicalCameraId, resultExtras.errorPhysicalCameraId.c_str(),
- resultExtras.errorPhysicalCameraId.size());
+ if (!resultExtras.errorPhysicalCameraId.empty()) {
+ msg->setString(kFailingPhysicalCameraId,
+ resultExtras.errorPhysicalCameraId.c_str(),
+ resultExtras.errorPhysicalCameraId.size());
}
msg->setPointer(kCallbackFpKey, (void*) cbh.mOnLogicalCameraCaptureFailed);
} else {
@@ -919,7 +910,6 @@
mFrameNumberTracker.updateTracker(frameNumber, /*isError*/true);
checkAndFireSequenceCompleteLocked();
}
- return;
}
CameraDevice::CallbackHandler::CallbackHandler(const char *id) : mId(id) { }
@@ -1020,7 +1010,7 @@
return;
}
sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get()));
- mCachedSessions.push(session);
+ mCachedSessions.push_back(session);
sp<CaptureRequest> requestSp = nullptr;
const char *id_cstr = mId.c_str();
switch (msg->what()) {
@@ -1167,7 +1157,8 @@
clone.update(ANDROID_SYNC_FRAME_NUMBER,
&physicalResult->mFrameNumber, /*data_count*/1);
sp<ACameraMetadata> metadata =
- new ACameraMetadata(clone.release(), ACameraMetadata::ACM_RESULT);
+ new ACameraMetadata(clone.release(),
+ ACameraMetadata::ACM_RESULT);
physicalMetadataCopy.push_back(metadata);
}
std::vector<const char*> physicalCameraIdPtrs;
@@ -1302,7 +1293,7 @@
return;
}
- const native_handle_t* anw;
+ native_handle_t* anw;
found = msg->findPointer(kAnwKey, (void**) &anw);
if (!found) {
ALOGE("%s: Cannot find native_handle_t!", __FUNCTION__);
@@ -1319,6 +1310,7 @@
ACaptureRequest* request = allocateACaptureRequest(requestSp, id_cstr);
(*onBufferLost)(context, session.get(), request, anw, frameNumber);
freeACaptureRequest(request);
+ native_handle_delete(anw); // clean up anw as it was copied from AIDL
break;
}
}
@@ -1329,10 +1321,10 @@
CameraDevice::CallbackHolder::CallbackHolder(
sp<ACameraCaptureSession> session,
- const Vector<sp<CaptureRequest> >& requests,
+ std::vector<sp<CaptureRequest>> requests,
bool isRepeating,
ACameraCaptureSession_captureCallbacks* cbs) :
- mSession(session), mRequests(requests),
+ mSession(std::move(session)), mRequests(std::move(requests)),
mIsRepeating(isRepeating),
mIs2Callback(false),
mIsLogicalCameraCallback(false) {
@@ -1346,10 +1338,10 @@
CameraDevice::CallbackHolder::CallbackHolder(
sp<ACameraCaptureSession> session,
- const Vector<sp<CaptureRequest> >& requests,
+ std::vector<sp<CaptureRequest>> requests,
bool isRepeating,
ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs) :
- mSession(session), mRequests(requests),
+ mSession(std::move(session)), mRequests(std::move(requests)),
mIsRepeating(isRepeating),
mIs2Callback(false),
mIsLogicalCameraCallback(true) {
@@ -1363,10 +1355,10 @@
CameraDevice::CallbackHolder::CallbackHolder(
sp<ACameraCaptureSession> session,
- const Vector<sp<CaptureRequest> >& requests,
+ std::vector<sp<CaptureRequest>> requests,
bool isRepeating,
ACameraCaptureSession_captureCallbacksV2* cbs) :
- mSession(session), mRequests(requests),
+ mSession(std::move(session)), mRequests(std::move(requests)),
mIsRepeating(isRepeating),
mIs2Callback(true),
mIsLogicalCameraCallback(false) {
@@ -1380,10 +1372,10 @@
CameraDevice::CallbackHolder::CallbackHolder(
sp<ACameraCaptureSession> session,
- const Vector<sp<CaptureRequest> >& requests,
+ std::vector<sp<CaptureRequest>> requests,
bool isRepeating,
ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs) :
- mSession(session), mRequests(requests),
+ mSession(std::move(session)), mRequests(std::move(requests)),
mIsRepeating(isRepeating),
mIs2Callback(true),
mIsLogicalCameraCallback(true) {
@@ -1501,23 +1493,21 @@
/**
* Camera service callback implementation
*/
-android::hardware::Return<void>
-CameraDevice::ServiceCallback::onDeviceError(
- ErrorCode errorCode,
- const CaptureResultExtras& resultExtras) {
+ScopedAStatus CameraDevice::ServiceCallback::onDeviceError(
+ ErrorCode errorCode, const CaptureResultExtras& resultExtras) {
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();
+
+ std::shared_ptr<CameraDevice> dev = mDevice.lock();
if (dev == nullptr) {
- return ret; // device has been closed
+ return ScopedAStatus::ok(); // device has been closed
}
sp<ACameraCaptureSession> session = dev->mCurrentSession.promote();
Mutex::Autolock _l(dev->mDeviceLock);
if (dev->mRemote == nullptr) {
- return ret; // device has been closed
+ return ScopedAStatus::ok(); // device has been closed
}
switch (errorCode) {
case ErrorCode::CAMERA_DISCONNECTED:
@@ -1570,26 +1560,25 @@
dev->onCaptureErrorLocked(errorCode, resultExtras);
break;
}
- return ret;
+ return ScopedAStatus::ok();
}
-android::hardware::Return<void>
-CameraDevice::ServiceCallback::onDeviceIdle() {
+ScopedAStatus CameraDevice::ServiceCallback::onDeviceIdle() {
ALOGV("Camera is now idle");
- auto ret = Void();
- sp<CameraDevice> dev = mDevice.promote();
+
+ std::shared_ptr<CameraDevice> dev = mDevice.lock();
if (dev == nullptr) {
- return ret; // device has been closed
+ return ScopedAStatus::ok(); // device has been closed
}
Mutex::Autolock _l(dev->mDeviceLock);
if (dev->isClosed() || dev->mRemote == nullptr) {
- return ret;
+ return ScopedAStatus::ok();
}
if (dev->mIdle) {
// Already in idle state. Possibly other thread did waitUntilIdle
- return ret;
+ return ScopedAStatus::ok();
}
if (dev->mCurrentSession != nullptr) {
@@ -1597,13 +1586,14 @@
if (dev->mBusySession != dev->mCurrentSession) {
ALOGE("Current session != busy session");
dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
- return ret;
+ return ScopedAStatus::ok();
}
sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler);
msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context);
msg->setObject(kSessionSpKey, dev->mBusySession);
- msg->setPointer(kCallbackFpKey, (void*) dev->mBusySession->mUserSessionCallback.onReady);
+ msg->setPointer(kCallbackFpKey,
+ (void*) dev->mBusySession->mUserSessionCallback.onReady);
// Make sure we clear the sp first so the session destructor can
// only happen on handler thread (where we don't hold device/session lock)
dev->mBusySession.clear();
@@ -1611,22 +1601,20 @@
}
dev->mIdle = true;
dev->mFlushing = false;
- return ret;
+ return ScopedAStatus::ok();
}
-android::hardware::Return<void>
-CameraDevice::ServiceCallback::onCaptureStarted(
- const CaptureResultExtras& resultExtras,
- uint64_t timestamp) {
- auto ret = Void();
- sp<CameraDevice> dev = mDevice.promote();
+
+ndk::ScopedAStatus CameraDevice::ServiceCallback::onCaptureStarted(
+ const CaptureResultExtras& resultExtras, int64_t timestamp) {
+ std::shared_ptr<CameraDevice> dev = mDevice.lock();
if (dev == nullptr) {
- return ret; // device has been closed
+ return ScopedAStatus::ok(); // device has been closed
}
Mutex::Autolock _l(dev->mDeviceLock);
if (dev->isClosed() || dev->mRemote == nullptr) {
- return ret;
+ return ScopedAStatus::ok();
}
int32_t sequenceId = resultExtras.requestId;
@@ -1635,7 +1623,7 @@
auto it = dev->mSequenceCallbackMap.find(sequenceId);
if (it != dev->mSequenceCallbackMap.end()) {
- CallbackHolder cbh = (*it).second;
+ CallbackHolder &cbh = it->second;
ACameraCaptureSession_captureCallback_start onStart = cbh.mOnCaptureStarted;
ACameraCaptureSession_captureCallback_startV2 onStart2 = cbh.mOnCaptureStarted2;
bool v2Callback = cbh.mIs2Callback;
@@ -1646,6 +1634,7 @@
dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
}
sp<CaptureRequest> request = cbh.mRequests[burstId];
+ ALOGE("%s: request = %p", __FUNCTION__, request.get());
sp<AMessage> msg = nullptr;
if (v2Callback) {
msg = new AMessage(kWhatCaptureStart2, dev->mHandler);
@@ -1661,24 +1650,22 @@
msg->setInt64(kFrameNumberKey, frameNumber);
dev->postSessionMsgAndCleanup(msg);
}
- return ret;
+ return ScopedAStatus::ok();
}
-android::hardware::Return<void>
-CameraDevice::ServiceCallback::onResultReceived(
- const FmqSizeOrMetadata& resultMetadata,
+ScopedAStatus CameraDevice::ServiceCallback::onResultReceived(
+ const CaptureMetadataInfo& resultMetadata,
const CaptureResultExtras& resultExtras,
- const hidl_vec<PhysicalCaptureResultInfo>& physicalResultInfos) {
- auto ret = Void();
+ const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) {
- sp<CameraDevice> dev = mDevice.promote();
+ std::shared_ptr<CameraDevice> dev = mDevice.lock();
if (dev == nullptr) {
- return ret; // device has been closed
+ return ScopedAStatus::ok(); // device has been closed
}
int32_t sequenceId = resultExtras.requestId;
int64_t frameNumber = resultExtras.frameNumber;
int32_t burstId = resultExtras.burstId;
- bool isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount);
+ bool isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount);
if (!isPartialResult) {
ALOGV("SeqId %d frame %" PRId64 " result arrive.", sequenceId, frameNumber);
@@ -1686,7 +1673,7 @@
Mutex::Autolock _l(dev->mDeviceLock);
if (dev->mRemote == nullptr) {
- return ret; // device has been disconnected
+ return ScopedAStatus::ok(); // device has been disconnected
}
if (dev->isClosed()) {
@@ -1694,7 +1681,7 @@
dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
}
// early return to avoid callback sent to closed devices
- return ret;
+ return ScopedAStatus::ok();
}
CameraMetadata metadataCopy;
@@ -1702,11 +1689,12 @@
dev->mCaptureResultMetadataQueue.get(), &metadataCopy);
if (status != ACAMERA_OK) {
ALOGE("%s: result metadata couldn't be converted", __FUNCTION__);
- return ret;
+ return ScopedAStatus::ok();
}
- metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize, /*data_count*/2);
- metadataCopy.update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, /*data_count*/1);
+ metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize,
+ /* data_count= */ 2);
+ metadataCopy.update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, /* data_count= */1);
auto it = dev->mSequenceCallbackMap.find(sequenceId);
if (it != dev->mSequenceCallbackMap.end()) {
@@ -1730,7 +1718,7 @@
&localPhysicalResult[i].physicalMetadata);
if (status != ACAMERA_OK) {
ALOGE("%s: physical camera result metadata couldn't be converted", __FUNCTION__);
- return ret;
+ return ScopedAStatus::ok();
}
}
sp<ACameraPhysicalCaptureResultInfo> physicalResult(
@@ -1762,17 +1750,14 @@
dev->checkAndFireSequenceCompleteLocked();
}
- return ret;
+ return ScopedAStatus::ok();
}
-android::hardware::Return<void>
-CameraDevice::ServiceCallback::onRepeatingRequestError(
- uint64_t lastFrameNumber, int32_t stoppedSequenceId) {
- auto ret = Void();
-
- sp<CameraDevice> dev = mDevice.promote();
+ScopedAStatus CameraDevice::ServiceCallback::onRepeatingRequestError(int64_t lastFrameNumber,
+ int32_t stoppedSequenceId) {
+ std::shared_ptr<CameraDevice> dev = mDevice.lock();
if (dev == nullptr) {
- return ret; // device has been closed
+ return ScopedAStatus::ok(); // device has been closed
}
Mutex::Autolock _l(dev->mDeviceLock);
@@ -1784,33 +1769,41 @@
dev->checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
- return ret;
+ return ScopedAStatus::ok();
}
camera_status_t CameraDevice::ServiceCallback::readOneResultMetadata(
- const FmqSizeOrMetadata& fmqSizeOrMetadata, ResultMetadataQueue* metadataQueue,
+ const CaptureMetadataInfo& captureMetadataInfo, ResultMetadataQueue* metadataQueue,
CameraMetadata* metadata) {
if (metadataQueue == nullptr || metadata == nullptr) {
return ACAMERA_ERROR_INVALID_PARAMETER;
}
bool converted;
- HCameraMetadata hCameraMetadata;
- if (fmqSizeOrMetadata.getDiscriminator() ==
- FmqSizeOrMetadata::hidl_discriminator::fmqMetadataSize) {
- hCameraMetadata.resize(fmqSizeOrMetadata.fmqMetadataSize());
- bool read = metadataQueue->read(
- hCameraMetadata.data(), fmqSizeOrMetadata.fmqMetadataSize());
+ AidlCameraMetadata aidlCameraMetadata;
+ std::vector<uint8_t>& metadataVec = aidlCameraMetadata.metadata;
+ camera_metadata_t* clonedMetadata;
+ if (captureMetadataInfo.getTag() == CaptureMetadataInfo::fmqMetadataSize) {
+ int64_t size = captureMetadataInfo.get<CaptureMetadataInfo::fmqMetadataSize>();
+ metadataVec.resize(size);
+ bool read = metadataQueue->read(reinterpret_cast<int8_t*>(metadataVec.data()), size);
if (!read) {
ALOGE("%s capture request settings could't be read from fmq", __FUNCTION__);
return ACAMERA_ERROR_UNKNOWN;
}
// TODO: Do we actually need to clone here ?
- converted = utils::convertFromHidlCloned(hCameraMetadata, metadata);
+ converted = utils::cloneFromAidl(aidlCameraMetadata, &clonedMetadata);
} else {
- converted = utils::convertFromHidlCloned(fmqSizeOrMetadata.metadata(), metadata);
+ const AidlCameraMetadata &embeddedMetadata =
+ captureMetadataInfo.get<CaptureMetadataInfo::metadata>();
+ converted = utils::cloneFromAidl(embeddedMetadata, &clonedMetadata);
}
- return converted ? ACAMERA_OK : ACAMERA_ERROR_UNKNOWN;
+ if (converted) {
+ *metadata = CameraMetadata(clonedMetadata);
+ return ACAMERA_OK;
+ }
+
+ return ACAMERA_ERROR_UNKNOWN;
}
} // namespace acam
diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.h b/camera/ndk/ndk_vendor/impl/ACameraDevice.h
index c306206..cad23aa 100644
--- a/camera/ndk/ndk_vendor/impl/ACameraDevice.h
+++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.h
@@ -16,54 +16,63 @@
#ifndef _ACAMERA_DEVICE_H
#define _ACAMERA_DEVICE_H
-#include <memory>
-#include <map>
-#include <set>
-#include <atomic>
-#include <utility>
-#include <vector>
-#include <utils/StrongPointer.h>
-#include <utils/Mutex.h>
-#include <utils/List.h>
-#include <utils/Vector.h>
-#include <android/frameworks/cameraservice/device/2.1/ICameraDeviceUser.h>
-#include <android/frameworks/cameraservice/device/2.0/ICameraDeviceCallback.h>
-#include <android/frameworks/cameraservice/device/2.0/types.h>
-#include <fmq/MessageQueue.h>
-#include <media/stagefright/foundation/ALooper.h>
-#include <media/stagefright/foundation/AHandler.h>
-#include <media/stagefright/foundation/AMessage.h>
-
-#include <camera/NdkCameraManager.h>
-#include <camera/NdkCameraCaptureSession.h>
-
#include "ACameraMetadata.h"
#include "utils.h"
+#include <aidl/android/frameworks/cameraservice/common/Status.h>
+#include <aidl/android/frameworks/cameraservice/device/BnCameraDeviceCallback.h>
+#include <aidl/android/frameworks/cameraservice/device/CaptureResultExtras.h>
+#include <aidl/android/frameworks/cameraservice/device/ErrorCode.h>
+#include <aidl/android/frameworks/cameraservice/device/CaptureMetadataInfo.h>
+#include <aidl/android/frameworks/cameraservice/device/ICameraDeviceUser.h>
+#include <aidl/android/frameworks/cameraservice/device/PhysicalCameraSettings.h>
+#include <aidl/android/frameworks/cameraservice/device/PhysicalCaptureResultInfo.h>
+#include <aidl/android/frameworks/cameraservice/device/StreamConfigurationMode.h>
+#include <aidl/android/frameworks/cameraservice/device/SubmitInfo.h>
+#include <aidl/android/frameworks/cameraservice/service/CameraStatusAndId.h>
+#include <atomic>
+#include <camera/NdkCameraCaptureSession.h>
+#include <camera/NdkCameraManager.h>
+#include <fmq/AidlMessageQueue.h>
+#include <fmq/MessageQueue.h>
+#include <map>
+#include <media/stagefright/foundation/AHandler.h>
+#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <memory>
+#include <set>
+#include <utility>
+#include <utils/List.h>
+#include <utils/Mutex.h>
+#include <utils/StrongPointer.h>
+#include <utils/Vector.h>
+#include <vector>
+
namespace android {
namespace acam {
-using ICameraDeviceCallback = frameworks::cameraservice::device::V2_0::ICameraDeviceCallback;
-using ICameraDeviceUser_2_0 = frameworks::cameraservice::device::V2_0::ICameraDeviceUser;
-using ICameraDeviceUser = frameworks::cameraservice::device::V2_1::ICameraDeviceUser;
-using CaptureResultExtras = frameworks::cameraservice::device::V2_0::CaptureResultExtras;
-using PhysicalCaptureResultInfo = frameworks::cameraservice::device::V2_0::PhysicalCaptureResultInfo;
-using PhysicalCameraSettings = frameworks::cameraservice::device::V2_0::PhysicalCameraSettings;
-using SubmitInfo = frameworks::cameraservice::device::V2_0::SubmitInfo;
-using CaptureResultExtras = frameworks::cameraservice::device::V2_0::CaptureResultExtras;
-using ErrorCode = frameworks::cameraservice::device::V2_0::ErrorCode;
-using FmqSizeOrMetadata = frameworks::cameraservice::device::V2_0::FmqSizeOrMetadata;
-using StreamConfigurationMode = frameworks::cameraservice::device::V2_0::StreamConfigurationMode;
-using Status = frameworks::cameraservice::common::V2_0::Status;
-using ResultMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>;
-using RequestMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>;
-using CameraStatusAndId = frameworks::cameraservice::service::V2_0::CameraStatusAndId;
+using ::aidl::android::frameworks::cameraservice::common::Status;
+using ::aidl::android::frameworks::cameraservice::device::BnCameraDeviceCallback;
+using ::aidl::android::frameworks::cameraservice::device::CaptureResultExtras;
+using ::aidl::android::frameworks::cameraservice::device::ErrorCode;
+using ::aidl::android::frameworks::cameraservice::device::CaptureMetadataInfo;
+using ::aidl::android::frameworks::cameraservice::device::ICameraDeviceCallback;
+using ::aidl::android::frameworks::cameraservice::device::ICameraDeviceUser;
+using ::aidl::android::frameworks::cameraservice::device::OutputConfiguration;
+using ::aidl::android::frameworks::cameraservice::device::PhysicalCameraSettings;
+using ::aidl::android::frameworks::cameraservice::device::PhysicalCaptureResultInfo;
+using ::aidl::android::frameworks::cameraservice::device::StreamConfigurationMode;
+using ::aidl::android::frameworks::cameraservice::device::SubmitInfo;
+using ::aidl::android::frameworks::cameraservice::service::CameraStatusAndId;
+using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
+using ::android::AidlMessageQueue;
+using ::android::acam::utils::native_handle_ptr_wrapper;
-using hardware::hidl_vec;
-using hardware::hidl_string;
-using utils::native_handle_ptr_wrapper;
+
+using ResultMetadataQueue = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
+using RequestMetadataQueue = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
+
using utils::CaptureRequest;
-using utils::OutputConfigurationWrapper;
// Wrap ACameraCaptureFailure so it can be ref-counted
struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure { };
@@ -83,13 +92,16 @@
int64_t mFrameNumber;
};
-class CameraDevice final : public RefBase {
+class CameraDevice final : public std::enable_shared_from_this<CameraDevice> {
public:
CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
sp<ACameraMetadata> chars,
ACameraDevice* wrapper);
~CameraDevice();
+ // Called to initialize fields that require shared_ptr to `this`
+ void init();
+
inline const char* getId() const { return mCameraId.c_str(); }
camera_status_t createCaptureRequest(
@@ -107,30 +119,35 @@
const ACaptureSessionOutputContainer* sessionOutputContainer) const;
// Callbacks from camera service
- class ServiceCallback : public ICameraDeviceCallback {
+ class ServiceCallback : public BnCameraDeviceCallback {
public:
- explicit ServiceCallback(CameraDevice* device) : mDevice(device) {}
- android::hardware::Return<void> onDeviceError(ErrorCode errorCode,
- const CaptureResultExtras& resultExtras) override;
- android::hardware::Return<void> onDeviceIdle() override;
- android::hardware::Return<void> onCaptureStarted(const CaptureResultExtras& resultExtras,
- uint64_t timestamp) override;
- android::hardware::Return<void> onResultReceived(const FmqSizeOrMetadata& result,
- const CaptureResultExtras& resultExtras,
- const hidl_vec<PhysicalCaptureResultInfo>& physicalResultInfos) override;
- android::hardware::Return<void> onRepeatingRequestError(uint64_t lastFrameNumber,
- int32_t stoppedSequenceId) override;
+ explicit ServiceCallback(std::weak_ptr<CameraDevice> device) :
+ mDevice(std::move(device)) {}
+
+ ndk::ScopedAStatus onDeviceError(ErrorCode in_errorCode,
+ const CaptureResultExtras& in_resultExtras) override;
+ ndk::ScopedAStatus onDeviceIdle() override;
+
+ ndk::ScopedAStatus onCaptureStarted(const CaptureResultExtras& in_resultExtras,
+ int64_t in_timestamp) override;
+ ndk::ScopedAStatus onRepeatingRequestError(int64_t in_lastFrameNumber,
+ int32_t in_repeatingRequestId) override;
+ ndk::ScopedAStatus onResultReceived(const CaptureMetadataInfo& in_result,
+ const CaptureResultExtras& in_resultExtras,
+ const std::vector<PhysicalCaptureResultInfo>&
+ in_physicalCaptureResultInfos) override;
+
private:
- camera_status_t readOneResultMetadata(const FmqSizeOrMetadata& fmqSizeOrMetadata,
+ camera_status_t readOneResultMetadata(const CaptureMetadataInfo& captureMetadataInfo,
ResultMetadataQueue* metadataQueue, CameraMetadata* metadata);
- const wp<CameraDevice> mDevice;
+ const std::weak_ptr<CameraDevice> mDevice;
};
- inline sp<ICameraDeviceCallback> getServiceCallback() {
+ inline std::shared_ptr<BnCameraDeviceCallback> getServiceCallback() {
return mServiceCallback;
};
// Camera device is only functional after remote being set
- void setRemoteDevice(sp<ICameraDeviceUser> remote);
+ void setRemoteDevice(std::shared_ptr<ICameraDeviceUser> remote);
bool setDeviceMetadataQueues();
inline ACameraDevice* getWrapper() const { return mWrapper; };
@@ -208,15 +225,15 @@
void postSessionMsgAndCleanup(sp<AMessage>& msg);
mutable Mutex mDeviceLock;
- const hidl_string mCameraId; // Camera ID
+ const std::string mCameraId; // Camera ID
const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
const sp<ACameraMetadata> mChars; // Camera characteristics
- const sp<ServiceCallback> mServiceCallback;
+ std::shared_ptr<ServiceCallback> mServiceCallback;
ACameraDevice* mWrapper;
// stream id -> pair of (ACameraWindowType* from application, OutputConfiguration used for
// camera service)
- std::map<int, std::pair<native_handle_ptr_wrapper, OutputConfigurationWrapper>> mConfiguredOutputs;
+ std::map<int, std::pair<native_handle_ptr_wrapper, OutputConfiguration>> mConfiguredOutputs;
// TODO: maybe a bool will suffice for synchronous implementation?
std::atomic_bool mClosing;
@@ -232,7 +249,7 @@
// This will avoid a busy session being deleted before it's back to idle state
sp<ACameraCaptureSession> mBusySession;
- sp<ICameraDeviceUser> mRemote;
+ std::shared_ptr<ICameraDeviceUser> mRemote;
// Looper thread to handle callback to app
sp<ALooper> mCbLooper;
@@ -281,7 +298,7 @@
// 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
- Vector<sp<ACameraCaptureSession>> mCachedSessions;
+ std::vector<sp<ACameraCaptureSession>> mCachedSessions;
};
sp<CallbackHandler> mHandler;
@@ -303,19 +320,19 @@
struct CallbackHolder {
CallbackHolder(sp<ACameraCaptureSession> session,
- const Vector<sp<CaptureRequest>>& requests,
+ std::vector<sp<CaptureRequest>> requests,
bool isRepeating,
ACameraCaptureSession_captureCallbacks* cbs);
CallbackHolder(sp<ACameraCaptureSession> session,
- const Vector<sp<CaptureRequest>>& requests,
+ std::vector<sp<CaptureRequest>> requests,
bool isRepeating,
ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs);
CallbackHolder(sp<ACameraCaptureSession> session,
- const Vector<sp<CaptureRequest> >& requests,
+ std::vector<sp<CaptureRequest> > requests,
bool isRepeating,
ACameraCaptureSession_captureCallbacksV2* cbs);
CallbackHolder(sp<ACameraCaptureSession> session,
- const Vector<sp<CaptureRequest> >& requests,
+ std::vector<sp<CaptureRequest> > requests,
bool isRepeating,
ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs);
void clearCallbacks() {
@@ -359,7 +376,7 @@
}
sp<ACameraCaptureSession> mSession;
- Vector<sp<CaptureRequest>> mRequests;
+ std::vector<sp<CaptureRequest>> mRequests;
const bool mIsRepeating;
const bool mIs2Callback;
const bool mIsLogicalCameraCallback;
@@ -401,7 +418,7 @@
// Misc variables
int32_t mShadingMapSize[2]; // const after constructor
int32_t mPartialResultCount; // const after constructor
- std::shared_ptr<ResultMetadataQueue> mCaptureRequestMetadataQueue = nullptr;
+ std::shared_ptr<RequestMetadataQueue> mCaptureRequestMetadataQueue = nullptr;
std::shared_ptr<ResultMetadataQueue> mCaptureResultMetadataQueue = nullptr;
};
@@ -415,7 +432,10 @@
struct ACameraDevice {
ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
sp<ACameraMetadata> chars) :
- mDevice(new android::acam::CameraDevice(id, cb, std::move(chars), this)) {}
+ mDevice(std::make_shared<android::acam::CameraDevice>(id, cb,
+ std::move(chars), this)) {
+ mDevice->init();
+ }
~ACameraDevice();
/*******************
@@ -446,19 +466,20 @@
/***********************
* Device interal APIs *
***********************/
- inline android::sp<android::acam::ICameraDeviceCallback> getServiceCallback() {
+ inline std::shared_ptr<android::acam::BnCameraDeviceCallback> getServiceCallback() {
return mDevice->getServiceCallback();
};
// Camera device is only functional after remote being set
- inline void setRemoteDevice(android::sp<android::acam::ICameraDeviceUser> remote) {
+ inline void setRemoteDevice(std::shared_ptr<
+ ::aidl::android::frameworks::cameraservice::device::ICameraDeviceUser> remote) {
mDevice->setRemoteDevice(remote);
}
inline bool setDeviceMetadataQueues() {
return mDevice->setDeviceMetadataQueues();
}
private:
- android::sp<android::acam::CameraDevice> mDevice;
+ std::shared_ptr<android::acam::CameraDevice> mDevice;
};
#endif // _ACAMERA_DEVICE_H
diff --git a/camera/ndk/ndk_vendor/impl/ACameraDeviceVendor.inc b/camera/ndk/ndk_vendor/impl/ACameraDeviceVendor.inc
index 8bd5a52..1e724eb 100644
--- a/camera/ndk/ndk_vendor/impl/ACameraDeviceVendor.inc
+++ b/camera/ndk/ndk_vendor/impl/ACameraDeviceVendor.inc
@@ -14,17 +14,14 @@
* limitations under the License.
*/
-#include <vector>
-#include <inttypes.h>
-#include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
-#include <android/frameworks/cameraservice/device/2.0/types.h>
-#include <CameraMetadata.h>
-
-#include "ndk_vendor/impl/ACameraDevice.h"
#include "ACameraCaptureSession.h"
#include "ACameraMetadata.h"
#include "ACaptureRequest.h"
#include "utils.h"
+#include <CameraMetadata.h>
+#include <inttypes.h>
+#include <ndk_vendor/impl/ACameraDevice.h>
+#include <vector>
using namespace android;
@@ -32,22 +29,22 @@
namespace acam {
template<class T>
-camera_status_t
-CameraDevice::captureLocked(
+camera_status_t CameraDevice::captureLocked(
sp<ACameraCaptureSession> session,
/*optional*/T* cbs,
- int numRequests, ACaptureRequest** requests,
+ int numRequests,
+ ACaptureRequest** requests,
/*optional*/int* captureSequenceId) {
return submitRequestsLocked(
session, cbs, numRequests, requests, captureSequenceId, /*isRepeating*/false);
}
template<class T>
-camera_status_t
-CameraDevice::setRepeatingRequestsLocked(
+camera_status_t CameraDevice::setRepeatingRequestsLocked(
sp<ACameraCaptureSession> session,
/*optional*/T* cbs,
- int numRequests, ACaptureRequest** requests,
+ int numRequests,
+ ACaptureRequest** requests,
/*optional*/int* captureSequenceId) {
return submitRequestsLocked(
session, cbs, numRequests, requests, captureSequenceId, /*isRepeating*/true);
@@ -56,11 +53,10 @@
template<class T>
camera_status_t CameraDevice::submitRequestsLocked(
sp<ACameraCaptureSession> session,
- /*optional*/T* cbs,
- int numRequests, ACaptureRequest** requests,
+ /*optional*/T* cbs, int numRequests,
+ ACaptureRequest** requests,
/*out*/int* captureSequenceId,
- bool isRepeating)
-{
+ bool isRepeating) {
camera_status_t ret = checkCameraClosedOrErrorLocked();
if (ret != ACAMERA_OK) {
ALOGE("Camera %s submit capture request failed! ret %d", getId(), ret);
@@ -68,9 +64,10 @@
}
// Form two vectors of capture request, one for internal tracking
- std::vector<frameworks::cameraservice::device::V2_0::CaptureRequest> requestList;
- Vector<sp<CaptureRequest>> requestsV;
- requestsV.setCapacity(numRequests);
+
+ std::vector<::aidl::android::frameworks::cameraservice::device::CaptureRequest> requestList;
+ std::vector<sp<CaptureRequest>> requestsV;
+ requestsV.reserve(numRequests);
for (int i = 0; i < numRequests; i++) {
sp<CaptureRequest> req;
ret = allocateCaptureRequestLocked(requests[i], req);
@@ -87,7 +84,7 @@
ALOGE("Capture request without output target cannot be submitted!");
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- requestList.push_back(utils::convertToHidl(req.get()));
+ requestList.push_back(utils::convertToAidl(req.get()));
requestsV.push_back(req);
}
if (isRepeating) {
@@ -100,18 +97,20 @@
SubmitInfo info;
Status status;
- auto remoteRet = mRemote->submitRequestList(requestList, isRepeating,
- [&status, &info](auto s, auto &submitInfo) {
- status = s;
- info = submitInfo;
- });
- if (!remoteRet.isOk()) {
- ALOGE("%s: Transaction error for submitRequestList call: %s", __FUNCTION__,
- remoteRet.description().c_str());
+ ndk::ScopedAStatus remoteRet = mRemote->submitRequestList(requestList, isRepeating, &info);
+ if (!remoteRet.isOk()) {
+ if (remoteRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ Status errStatus = static_cast<Status>(remoteRet.getServiceSpecificError());
+ ALOGE("%s: submitRequestList call failed: %s",
+ __FUNCTION__, toString(errStatus).c_str());
+ return utils::convertFromAidl(errStatus);
+ } else {
+ ALOGE("%s: Transaction error for submitRequestList call: %d", __FUNCTION__,
+ remoteRet.getExceptionCode());
+ return ACAMERA_ERROR_UNKNOWN;
+ }
}
- if (status != Status::NO_ERROR) {
- return utils::convertFromHidl(status);
- }
+
int32_t sequenceId = info.requestId;
int64_t lastFrameNumber = info.lastFrameNumber;
if (sequenceId < 0) {
diff --git a/camera/ndk/ndk_vendor/impl/ACameraManager.cpp b/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
index bb4ef56..3aa7817 100644
--- a/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
+++ b/camera/ndk/ndk_vendor/impl/ACameraManager.cpp
@@ -17,28 +17,29 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "ACameraManagerVendor"
-#include <memory>
-#include "ndk_vendor/impl/ACameraManager.h"
#include "ACameraMetadata.h"
#include "ndk_vendor/impl/ACameraDevice.h"
+#include "ndk_vendor/impl/ACameraManager.h"
#include "utils.h"
+
#include <CameraMetadata.h>
-#include <camera_metadata_hidden.h>
-
-#include <utils/Vector.h>
-#include <cutils/properties.h>
-#include <stdlib.h>
-
#include <VendorTagDescriptor.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <camera_metadata_hidden.h>
+#include <cutils/properties.h>
+#include <memory>
+#include <utils/Vector.h>
using namespace android::acam;
namespace android {
namespace acam {
-using frameworks::cameraservice::common::V2_0::ProviderIdAndVendorTagSections;
-using android::hardware::camera::common::V1_0::helper::VendorTagDescriptor;
-using android::hardware::camera::common::V1_0::helper::VendorTagDescriptorCache;
+using ::aidl::android::frameworks::cameraservice::common::ProviderIdAndVendorTagSections;
+using ::android::hardware::camera::common::V1_0::helper::VendorTagDescriptor;
+using ::android::hardware::camera::common::V1_0::helper::VendorTagDescriptorCache;
+using ::ndk::ScopedAStatus;
// Static member definitions
const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
@@ -47,52 +48,55 @@
const char* CameraManagerGlobal::kContextKey = "CallbackContext";
const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
Mutex CameraManagerGlobal::sLock;
-CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
+std::weak_ptr<CameraManagerGlobal> CameraManagerGlobal::sInstance =
+ std::weak_ptr<CameraManagerGlobal>();
/**
- * The vendor tag descriptor class that takes HIDL vendor tag information as
+ * The vendor tag descriptor class that takes AIDL vendor tag information as
* input. Not part of vendor available VendorTagDescriptor class because that class is used by
* default HAL implementation code as well.
+ *
+ * This is a class instead of a free-standing function because VendorTagDescriptor has some
+ * protected fields that need to be initialized during conversion.
*/
-class HidlVendorTagDescriptor : public VendorTagDescriptor {
+class AidlVendorTagDescriptor : public VendorTagDescriptor {
public:
/**
- * Create a VendorTagDescriptor object from the HIDL VendorTagSection
+ * Create a VendorTagDescriptor object from the AIDL VendorTagSection
* vector.
*
* Returns OK on success, or a negative error code.
*/
- static status_t createDescriptorFromHidl(const hidl_vec<VendorTagSection>& vts,
+ static status_t createDescriptorFromAidl(const std::vector<VendorTagSection>& vts,
/*out*/ sp<VendorTagDescriptor> *descriptor);
};
-status_t HidlVendorTagDescriptor::createDescriptorFromHidl(const hidl_vec<VendorTagSection> &vts,
- sp<VendorTagDescriptor> *descriptor) {
- int tagCount = 0;
+status_t AidlVendorTagDescriptor::createDescriptorFromAidl(const std::vector<VendorTagSection>& vts,
+ sp<VendorTagDescriptor>* descriptor){
+ size_t tagCount = 0;
for (size_t s = 0; s < vts.size(); s++) {
tagCount += vts[s].tags.size();
}
if (tagCount < 0 || tagCount > INT32_MAX) {
- ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount);
+ ALOGE("%s: tag count %zu from vendor tag sections is invalid.", __FUNCTION__, tagCount);
return BAD_VALUE;
}
- Vector<uint32_t> tagArray;
- LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount,
- "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount);
+ std::vector<int64_t> tagArray;
+ tagArray.resize(tagCount);
- sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor();
+ sp<AidlVendorTagDescriptor> desc = new AidlVendorTagDescriptor();
desc->mTagCount = tagCount;
- KeyedVector<uint32_t, String8> tagToSectionMap;
+ std::map<int64_t, std::string> tagToSectionMap;
int idx = 0;
for (size_t s = 0; s < vts.size(); s++) {
const VendorTagSection& section = vts[s];
const char *sectionName = section.sectionName.c_str();
- if (sectionName == NULL) {
+ if (sectionName == nullptr) {
ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s);
return BAD_VALUE;
}
@@ -106,15 +110,15 @@
return BAD_VALUE;
}
- tagArray.editItemAt(idx++) = section.tags[j].tagId;
+ tagArray[idx++] = section.tags[j].tagId;
const char *tagName = section.tags[j].tagName.c_str();
- if (tagName == NULL) {
+ if (tagName == nullptr) {
ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag);
return BAD_VALUE;
}
desc->mTagToNameMap.add(tag, String8(tagName));
- tagToSectionMap.add(tag, sectionString);
+ tagToSectionMap.insert({tag, section.sectionName});
int tagType = (int) section.tags[j].tagType;
if (tagType < 0 || tagType >= NUM_TYPES) {
@@ -127,8 +131,12 @@
for (size_t i = 0; i < tagArray.size(); ++i) {
uint32_t tag = tagArray[i];
- String8 sectionString = tagToSectionMap.valueFor(tag);
-
+ auto itr = tagToSectionMap.find(tag);
+ if (itr == tagToSectionMap.end()) {
+ ALOGE("%s: Couldn't find previously added tag in map.", __FUNCTION__);
+ return UNKNOWN_ERROR;
+ }
+ String8 sectionString = String8(itr->second.c_str());
// Set up tag to section index map
ssize_t index = desc->mSections.indexOf(sectionString);
LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index);
@@ -147,38 +155,37 @@
return OK;
}
-CameraManagerGlobal&
-CameraManagerGlobal::getInstance() {
+std::shared_ptr<CameraManagerGlobal> CameraManagerGlobal::getInstance() {
Mutex::Autolock _l(sLock);
- CameraManagerGlobal* instance = sInstance;
+ std::shared_ptr<CameraManagerGlobal> instance = sInstance.lock();
if (instance == nullptr) {
- instance = new CameraManagerGlobal();
+ instance = std::make_shared<CameraManagerGlobal>();
sInstance = instance;
}
- return *instance;
+ return instance;
}
CameraManagerGlobal::~CameraManagerGlobal() {
- // clear sInstance so next getInstance call knows to create a new one
Mutex::Autolock _sl(sLock);
- sInstance = nullptr;
Mutex::Autolock _l(mLock);
if (mCameraService != nullptr) {
- mCameraService->unlinkToDeath(mDeathNotifier);
+ AIBinder_unlinkToDeath(mCameraService->asBinder().get(),
+ mDeathRecipient.get(), this);
auto stat = mCameraService->removeListener(mCameraServiceListener);
if (!stat.isOk()) {
- ALOGE("Failed to remove listener to camera service %s", stat.description().c_str());
+ ALOGE("Failed to remove listener to camera service %d:%d", stat.getExceptionCode(),
+ stat.getServiceSpecificError());
}
}
- mDeathNotifier.clear();
+
if (mCbLooper != nullptr) {
mCbLooper->unregisterHandler(mHandler->id());
mCbLooper->stop();
}
mCbLooper.clear();
mHandler.clear();
- mCameraServiceListener.clear();
- mCameraService.clear();
+ mCameraServiceListener.reset();
+ mCameraService.reset();
}
static bool isCameraServiceDisabled() {
@@ -191,23 +198,28 @@
sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();
Status status = Status::NO_ERROR;
std::vector<ProviderIdAndVendorTagSections> providerIdsAndVts;
- auto remoteRet = mCameraService->getCameraVendorTagSections([&status, &providerIdsAndVts]
- (Status s,
- auto &IdsAndVts) {
- status = s;
- providerIdsAndVts = IdsAndVts; });
+ ScopedAStatus remoteRet = mCameraService->getCameraVendorTagSections(&providerIdsAndVts);
- if (!remoteRet.isOk() || status != Status::NO_ERROR) {
- ALOGE("Failed to retrieve VendorTagSections %s", remoteRet.description().c_str());
+ if (!remoteRet.isOk()) {
+ if (remoteRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ Status errStatus = static_cast<Status>(remoteRet.getServiceSpecificError());
+ ALOGE("%s: Failed to retrieve VendorTagSections %s",
+ __FUNCTION__, toString(status).c_str());
+ } else {
+ ALOGE("%s: Binder error when retrieving VendorTagSections: %d", __FUNCTION__,
+ remoteRet.getExceptionCode());
+ }
return false;
}
+
// Convert each providers VendorTagSections into a VendorTagDescriptor and
// add it to the cache
for (auto &providerIdAndVts : providerIdsAndVts) {
sp<VendorTagDescriptor> vendorTagDescriptor;
- if (HidlVendorTagDescriptor::createDescriptorFromHidl(providerIdAndVts.vendorTagSections,
- &vendorTagDescriptor) != OK) {
- ALOGE("Failed to convert from Hidl: VendorTagDescriptor");
+ status_t ret = AidlVendorTagDescriptor::createDescriptorFromAidl(
+ providerIdAndVts.vendorTagSections, &vendorTagDescriptor);
+ if (ret != OK) {
+ ALOGE("Failed to convert from Aidl: VendorTagDescriptor: %d", ret);
return false;
}
tagCache->addVendorDescriptor(providerIdAndVts.providerId, vendorTagDescriptor);
@@ -216,101 +228,125 @@
return true;
}
-sp<ICameraService> CameraManagerGlobal::getCameraService() {
+std::shared_ptr<ICameraService> CameraManagerGlobal::getCameraService() {
Mutex::Autolock _l(mLock);
- if (mCameraService.get() == nullptr) {
- if (isCameraServiceDisabled()) {
- return mCameraService;
- }
- sp<ICameraService> cameraServiceBinder;
- do {
- cameraServiceBinder = ICameraService::getService();
- if (cameraServiceBinder != nullptr) {
- break;
- }
- ALOGW("CameraService not published, waiting...");
- usleep(kCameraServicePollDelay);
- } while(true);
- if (mDeathNotifier == nullptr) {
- mDeathNotifier = new DeathNotifier(this);
- }
- cameraServiceBinder->linkToDeath(mDeathNotifier, 0);
- mCameraService = cameraServiceBinder;
+ if (mCameraService != nullptr) {
+ // Camera service already set up. Return existing value.
+ return mCameraService;
+ }
- // Setup looper thread to perfrom availiability callbacks
- if (mCbLooper == nullptr) {
- mCbLooper = new ALooper;
- mCbLooper->setName("C2N-mgr-looper");
- status_t err = mCbLooper->start(
- /*runOnCallingThread*/false,
- /*canCallJava*/ true,
- PRIORITY_DEFAULT);
- if (err != OK) {
- ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
- __FUNCTION__, strerror(-err), err);
- mCbLooper.clear();
- return nullptr;
- }
- if (mHandler == nullptr) {
- mHandler = new CallbackHandler(this);
- }
- mCbLooper->registerHandler(mHandler);
- }
+ if (isCameraServiceDisabled()) {
+ // Camera service is disabled. return nullptr.
+ return mCameraService;
+ }
- // register ICameraServiceListener
- if (mCameraServiceListener == nullptr) {
- mCameraServiceListener = new CameraServiceListener(this);
- }
- hidl_vec<frameworks::cameraservice::service::V2_1::CameraStatusAndId> cameraStatuses{};
- Status status = Status::NO_ERROR;
- auto remoteRet = mCameraService->addListener_2_1(mCameraServiceListener,
- [&status, &cameraStatuses](Status s,
- auto &retStatuses) {
- status = s;
- cameraStatuses = retStatuses;
- });
- if (!remoteRet.isOk() || status != Status::NO_ERROR) {
- ALOGE("Failed to add listener to camera service %s", remoteRet.description().c_str());
- }
+ std::string serviceName = ICameraService::descriptor;
+ serviceName += "/default";
- // Setup vendor tags
- if (!setupVendorTags()) {
- ALOGE("Unable to set up vendor tags");
+ bool isDeclared = AServiceManager_isDeclared(serviceName.c_str());
+ if (!isDeclared) {
+ ALOGE("%s: No ICameraService instance declared: %s", __FUNCTION__, serviceName.c_str());
+ return nullptr;
+ }
+
+ // Before doing any more make sure there is a binder threadpool alive
+ // This is a no-op if the binder threadpool was already started by this process.
+ ABinderProcess_startThreadPool();
+
+ std::shared_ptr<ICameraService> cameraService =
+ ICameraService::fromBinder(ndk::SpAIBinder(
+ AServiceManager_waitForService(serviceName.c_str())));
+ if (cameraService == nullptr) {
+ ALOGE("%s: Could not get ICameraService instance.", __FUNCTION__);
+ return nullptr;
+ }
+
+ if (mDeathRecipient.get() == nullptr) {
+ mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(
+ AIBinder_DeathRecipient_new(CameraManagerGlobal::binderDeathCallback));
+ }
+ AIBinder_linkToDeath(cameraService->asBinder().get(),
+ mDeathRecipient.get(), /*cookie=*/ this);
+
+ mCameraService = cameraService;
+
+ // Setup looper thread to perform availability callbacks
+ if (mCbLooper == nullptr) {
+ mCbLooper = new ALooper;
+ mCbLooper->setName("C2N-mgr-looper");
+ status_t err = mCbLooper->start(
+ /*runOnCallingThread*/false,
+ /*canCallJava*/ true,
+ PRIORITY_DEFAULT);
+ if (err != OK) {
+ ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
+ __FUNCTION__, strerror(-err), err);
+ mCbLooper.clear();
return nullptr;
}
+ if (mHandler == nullptr) {
+ mHandler = new CallbackHandler(weak_from_this());
+ }
+ mCbLooper->registerHandler(mHandler);
+ }
- for (auto& c : cameraStatuses) {
- onStatusChangedLocked(c.v2_0);
+ // register ICameraServiceListener
+ if (mCameraServiceListener == nullptr) {
+ mCameraServiceListener = ndk::SharedRefBase::make<CameraServiceListener>(weak_from_this());
+ }
- for (auto& unavailablePhysicalId : c.unavailPhysicalCameraIds) {
- PhysicalCameraStatusAndId statusAndId;
- statusAndId.deviceStatus = CameraDeviceStatus::STATUS_NOT_PRESENT;
- statusAndId.cameraId = c.v2_0.cameraId;
- statusAndId.physicalCameraId = unavailablePhysicalId;
- onStatusChangedLocked(statusAndId);
- }
+ std::vector<CameraStatusAndId> cameraStatuses;
+ Status status = Status::NO_ERROR;
+ ScopedAStatus remoteRet = mCameraService->addListener(mCameraServiceListener,
+ &cameraStatuses);
+
+ if (!remoteRet.isOk()) {
+ if (remoteRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ Status errStatus = static_cast<Status>(remoteRet.getServiceSpecificError());
+ ALOGE("%s: Failed to add listener to camera service: %s", __FUNCTION__,
+ toString(errStatus).c_str());
+ } else {
+ ALOGE("%s: Transaction failed when adding listener to camera service: %d",
+ __FUNCTION__, remoteRet.getExceptionCode());
+ }
+ }
+
+ // Setup vendor tags
+ if (!setupVendorTags()) {
+ ALOGE("Unable to set up vendor tags");
+ return nullptr;
+ }
+
+ for (auto& csi: cameraStatuses){
+ onStatusChangedLocked(csi.deviceStatus, csi.cameraId);
+
+ for (auto& unavailablePhysicalId : csi.unavailPhysicalCameraIds) {
+ onStatusChangedLocked(CameraDeviceStatus::STATUS_NOT_PRESENT,
+ csi.cameraId, unavailablePhysicalId);
}
}
return mCameraService;
}
-void CameraManagerGlobal::DeathNotifier::serviceDied(uint64_t cookie, const wp<IBase> &who) {
- (void) cookie;
- (void) who;
+void CameraManagerGlobal::binderDeathCallback(void* /*cookie*/) {
+ AutoMutex _l(sLock);
+
ALOGE("Camera service binderDied!");
- sp<CameraManagerGlobal> cm = mCameraManager.promote();
- if (cm != nullptr) {
- AutoMutex lock(cm->mLock);
- for (auto& pair : cm->mDeviceStatusMap) {
- CameraStatusAndId cameraStatusAndId;
- cameraStatusAndId.cameraId = pair.first;
- cameraStatusAndId.deviceStatus = pair.second.getStatus();
- cm->onStatusChangedLocked(cameraStatusAndId);
- }
- cm->mCameraService.clear();
- // TODO: consider adding re-connect call here?
+ std::shared_ptr<CameraManagerGlobal> instance = sInstance.lock();
+ if (instance == nullptr) {
+ return;
}
+
+ // Remove cameraService from the static instance
+ AutoMutex lock(instance->mLock);
+ for (auto& pair : instance->mDeviceStatusMap) {
+ const auto &cameraId = pair.first;
+ const auto &deviceStatus = pair.second.getStatus();
+ instance->onStatusChangedLocked(deviceStatus, cameraId);
+ }
+ instance->mCameraService.reset();
+ // TODO: consider adding re-connect call here?
}
void CameraManagerGlobal::registerAvailabilityCallback(
@@ -362,41 +398,45 @@
void CameraManagerGlobal::registerAvailCallback(const T *callback) {
Mutex::Autolock _l(mLock);
Callback cb(callback);
- auto pair = mCallbacks.insert(cb);
+ auto res = mCallbacks.insert(cb);
+ if (!res.second) {
+ ALOGE("%s: Failed to register callback. Couldn't insert in map.", __FUNCTION__);
+ return;
+ }
// Send initial callbacks if callback is newly registered
- if (pair.second) {
- for (auto& pair : mDeviceStatusMap) {
- const hidl_string& cameraId = pair.first;
- CameraDeviceStatus status = pair.second.getStatus();
+ for (auto& pair : mDeviceStatusMap) {
+ const std::string& cameraId = pair.first;
+ CameraDeviceStatus status = pair.second.getStatus();
+ {
// Camera available/unavailable callback
sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
ACameraManager_AvailabilityCallback cbFunc = isStatusAvailable(status) ?
- cb.mAvailable : cb.mUnavailable;
+ cb.mAvailable : cb.mUnavailable;
msg->setPointer(kCallbackFpKey, (void *) cbFunc);
msg->setPointer(kContextKey, cb.mContext);
msg->setString(kCameraIdKey, AString(cameraId.c_str()));
mPendingCallbackCnt++;
msg->post();
+ }
- // Physical camera unavailable callback
- std::set<hidl_string> unavailPhysicalIds = pair.second.getUnavailablePhysicalIds();
- for (const auto& physicalCameraId : unavailPhysicalIds) {
- sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
- ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
- cb.mPhysicalCamUnavailable;
- msg->setPointer(kCallbackFpKey, (void *) cbFunc);
- msg->setPointer(kContextKey, cb.mContext);
- msg->setString(kCameraIdKey, AString(cameraId.c_str()));
- msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
- mPendingCallbackCnt++;
- msg->post();
- }
+ // Physical camera unavailable callback
+ std::set<std::string> unavailPhysicalIds = pair.second.getUnavailablePhysicalIds();
+ for (const auto& physicalCameraId : unavailPhysicalIds) {
+ sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
+ ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
+ cb.mPhysicalCamUnavailable;
+ msg->setPointer(kCallbackFpKey, (void *) cbFunc);
+ msg->setPointer(kContextKey, cb.mContext);
+ msg->setString(kCameraIdKey, AString(cameraId.c_str()));
+ msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
+ mPendingCallbackCnt++;
+ msg->post();
}
}
}
-void CameraManagerGlobal::getCameraIdList(std::vector<hidl_string>* cameraIds) {
+void CameraManagerGlobal::getCameraIdList(std::vector<std::string>* cameraIds) {
// Ensure that we have initialized/refreshed the list of available devices
auto cs = getCameraService();
Mutex::Autolock _l(mLock);
@@ -507,33 +547,31 @@
}
void CameraManagerGlobal::CallbackHandler::notifyParent() {
- sp<CameraManagerGlobal> parent = mParent.promote();
+ std::shared_ptr<CameraManagerGlobal> parent = mParent.lock();
if (parent != nullptr) {
parent->onCallbackCalled();
}
}
-hardware::Return<void> CameraManagerGlobal::CameraServiceListener::onStatusChanged(
- const CameraStatusAndId &statusAndId) {
- sp<CameraManagerGlobal> cm = mCameraManager.promote();
+ScopedAStatus CameraManagerGlobal::CameraServiceListener::onStatusChanged(
+ CameraDeviceStatus status, const std::string &cameraId) {
+ std::shared_ptr<CameraManagerGlobal> cm = mCameraManager.lock();
if (cm != nullptr) {
- cm->onStatusChanged(statusAndId);
+ cm->onStatusChanged(status, cameraId);
} else {
ALOGE("Cannot deliver status change. Global camera manager died");
}
- return Void();
+ return ScopedAStatus::ok();
}
void CameraManagerGlobal::onStatusChanged(
- const CameraStatusAndId &statusAndId) {
+ const CameraDeviceStatus &status, const std::string &cameraId) {
Mutex::Autolock _l(mLock);
- onStatusChangedLocked(statusAndId);
+ onStatusChangedLocked(status, cameraId);
}
void CameraManagerGlobal::onStatusChangedLocked(
- const CameraStatusAndId &statusAndId) {
- hidl_string cameraId = statusAndId.cameraId;
- CameraDeviceStatus status = statusAndId.deviceStatus;
+ const CameraDeviceStatus &status, const std::string &cameraId) {
if (!validStatus(status)) {
ALOGE("%s: Invalid status %d", __FUNCTION__, status);
return;
@@ -567,28 +605,28 @@
}
}
-hardware::Return<void> CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged(
- const PhysicalCameraStatusAndId &statusAndId) {
- sp<CameraManagerGlobal> cm = mCameraManager.promote();
+ScopedAStatus CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged(
+ CameraDeviceStatus in_status, const std::string& in_cameraId,
+ const std::string& in_physicalCameraId) {
+ std::shared_ptr<CameraManagerGlobal> cm = mCameraManager.lock();
if (cm != nullptr) {
- cm->onStatusChanged(statusAndId);
+ cm->onStatusChanged(in_status, in_cameraId, in_physicalCameraId);
} else {
ALOGE("Cannot deliver status change. Global camera manager died");
}
- return Void();
+ return ScopedAStatus::ok();
}
void CameraManagerGlobal::onStatusChanged(
- const PhysicalCameraStatusAndId &statusAndId) {
+ const CameraDeviceStatus &status, const std::string& cameraId,
+ const std::string& physicalCameraId) {
Mutex::Autolock _l(mLock);
- onStatusChangedLocked(statusAndId);
+ onStatusChangedLocked(status, cameraId, physicalCameraId);
}
void CameraManagerGlobal::onStatusChangedLocked(
- const PhysicalCameraStatusAndId &statusAndId) {
- hidl_string cameraId = statusAndId.cameraId;
- hidl_string physicalCameraId = statusAndId.physicalCameraId;
- CameraDeviceStatus status = statusAndId.deviceStatus;
+ const CameraDeviceStatus &status, const std::string& cameraId,
+ const std::string& physicalCameraId) {
if (!validStatus(status)) {
ALOGE("%s: Invalid status %d", __FUNCTION__, status);
return;
@@ -642,20 +680,20 @@
}
bool CameraManagerGlobal::CameraStatus::addUnavailablePhysicalId(
- const hidl_string& physicalCameraId) {
+ const std::string& physicalCameraId) {
std::lock_guard<std::mutex> lock(mLock);
auto result = unavailablePhysicalIds.insert(physicalCameraId);
return result.second;
}
bool CameraManagerGlobal::CameraStatus::removeUnavailablePhysicalId(
- const hidl_string& physicalCameraId) {
+ const std::string& physicalCameraId) {
std::lock_guard<std::mutex> lock(mLock);
auto count = unavailablePhysicalIds.erase(physicalCameraId);
return count > 0;
}
-std::set<hidl_string> CameraManagerGlobal::CameraStatus::getUnavailablePhysicalIds() {
+std::set<std::string> CameraManagerGlobal::CameraStatus::getUnavailablePhysicalIds() {
std::lock_guard<std::mutex> lock(mLock);
return unavailablePhysicalIds;
}
@@ -666,16 +704,15 @@
/**
* ACameraManger Implementation
*/
-camera_status_t
-ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
+camera_status_t ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
Mutex::Autolock _l(mLock);
- std::vector<hidl_string> idList;
- CameraManagerGlobal::getInstance().getCameraIdList(&idList);
+ std::vector<std::string> idList;
+ CameraManagerGlobal::getInstance()->getCameraIdList(&idList);
int numCameras = idList.size();
ACameraIdList *out = new ACameraIdList;
- if (!out) {
+ if (out == nullptr) {
ALOGE("Allocate memory for ACameraIdList failed!");
return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
}
@@ -717,33 +754,37 @@
}
}
-camera_status_t ACameraManager::getCameraCharacteristics(
- const char *cameraIdStr, sp<ACameraMetadata> *characteristics) {
+camera_status_t ACameraManager::getCameraCharacteristics(const char *cameraIdStr,
+ sp<ACameraMetadata> *characteristics) {
+ using AidlCameraMetadata = ::aidl::android::frameworks::cameraservice::device::CameraMetadata;
Mutex::Autolock _l(mLock);
- sp<ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+ std::shared_ptr<ICameraService> cs = CameraManagerGlobal::getInstance()->getCameraService();
if (cs == nullptr) {
ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
return ACAMERA_ERROR_CAMERA_DISCONNECTED;
}
- CameraMetadata rawMetadata;
- Status status = Status::NO_ERROR;
- auto serviceRet =
- cs->getCameraCharacteristics(cameraIdStr,
- [&status, &rawMetadata] (auto s ,
- const hidl_vec<uint8_t> &metadata) {
- status = s;
- if (status == Status::NO_ERROR) {
- utils::convertFromHidlCloned(metadata, &rawMetadata);
- }
- });
- if (!serviceRet.isOk() || status != Status::NO_ERROR) {
- ALOGE("Get camera characteristics from camera service failed");
+ AidlCameraMetadata rawMetadata;
+ ScopedAStatus serviceRet = cs->getCameraCharacteristics(cameraIdStr, &rawMetadata);
+
+ if (!serviceRet.isOk()) {
+ if (serviceRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ Status errStatus = static_cast<Status>(serviceRet.getServiceSpecificError());
+ ALOGE("%s: Get camera characteristics from camera service failed: %s",
+ __FUNCTION__, toString(errStatus).c_str());
+ } else {
+ ALOGE("%s: Transaction error when getting camera "
+ "characteristics from camera service: %d",
+ __FUNCTION__, serviceRet.getExceptionCode());
+ }
return ACAMERA_ERROR_UNKNOWN; // should not reach here
}
- *characteristics = new ACameraMetadata(
- rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
+ camera_metadata_t* metadataBuffer;
+ ::android::acam::utils::cloneFromAidl(rawMetadata, &metadataBuffer);
+
+ *characteristics = new ACameraMetadata(metadataBuffer,
+ ACameraMetadata::ACM_CHARACTERISTICS);
return ACAMERA_OK;
}
@@ -763,42 +804,41 @@
ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(rawChars));
- sp<ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
+ std::shared_ptr<ICameraService> cs = CameraManagerGlobal::getInstance()->getCameraService();
if (cs == nullptr) {
ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
delete device;
return ACAMERA_ERROR_CAMERA_DISCONNECTED;
}
- sp<ICameraDeviceCallback> callbacks = device->getServiceCallback();
- sp<ICameraDeviceUser_2_0> deviceRemote_2_0;
+ std::shared_ptr<BnCameraDeviceCallback> deviceCallback = device->getServiceCallback();
+ std::shared_ptr<ICameraDeviceUser> deviceRemote;
// No way to get package name from native.
// Send a zero length package name and let camera service figure it out from UID
- Status status = Status::NO_ERROR;
- auto serviceRet = cs->connectDevice(
- callbacks, cameraId, [&status, &deviceRemote_2_0](auto s, auto &device) {
- status = s;
- deviceRemote_2_0 = device;
- });
-
- if (!serviceRet.isOk() || status != Status::NO_ERROR) {
- ALOGE("%s: connect camera device failed", __FUNCTION__);
- delete device;
- return utils::convertFromHidl(status);
+ ScopedAStatus serviceRet = cs->connectDevice(deviceCallback,
+ std::string(cameraId), &deviceRemote);
+ if (!serviceRet.isOk()) {
+ if (serviceRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
+ Status errStatus = static_cast<Status>(serviceRet.getServiceSpecificError());
+ ALOGE("%s: connect camera device failed: %s",
+ __FUNCTION__, toString(errStatus).c_str());
+ delete device;
+ return utils::convertFromAidl(errStatus);
+ } else {
+ ALOGE("%s: Transaction failed when connecting camera device: %d",
+ __FUNCTION__, serviceRet.getExceptionCode());
+ delete device;
+ return ACAMERA_ERROR_UNKNOWN;
+ }
}
- if (deviceRemote_2_0 == nullptr) {
+
+ if (deviceRemote == nullptr) {
ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
delete device;
return ACAMERA_ERROR_CAMERA_DISCONNECTED;
}
- auto castResult = ICameraDeviceUser::castFrom(deviceRemote_2_0);
- if (!castResult.isOk()) {
- ALOGE("%s: failed to cast remote device to version 2.1", __FUNCTION__);
- delete device;
- return ACAMERA_ERROR_CAMERA_DISCONNECTED;
- }
- sp<ICameraDeviceUser> deviceRemote = castResult;
+
device->setRemoteDevice(deviceRemote);
device->setDeviceMetadataQueues();
*outDevice = device;
@@ -821,7 +861,7 @@
sp<VendorTagDescriptorCache> vtCache = VendorTagDescriptorCache::getGlobalVendorTagCache();
sp<VendorTagDescriptor> vTags = nullptr;
vtCache->getVendorTagDescriptor(vendorTagId, &vTags);
- status_t status= metadata.getTagFromName(name, vTags.get(), tag);
+ status_t status = CameraMetadata::getTagFromName(name, vTags.get(), tag);
return status == OK ? ACAMERA_OK : ACAMERA_ERROR_METADATA_NOT_FOUND;
}
diff --git a/camera/ndk/ndk_vendor/impl/ACameraManager.h b/camera/ndk/ndk_vendor/impl/ACameraManager.h
index 4663529..85acee7 100644
--- a/camera/ndk/ndk_vendor/impl/ACameraManager.h
+++ b/camera/ndk/ndk_vendor/impl/ACameraManager.h
@@ -17,39 +17,35 @@
#ifndef _ACAMERA_MANAGER_H
#define _ACAMERA_MANAGER_H
-#include <camera/NdkCameraManager.h>
-
-#include <android-base/parseint.h>
-#include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
-#include <android/frameworks/cameraservice/service/2.1/ICameraService.h>
-#include <android/frameworks/cameraservice/service/2.2/ICameraService.h>
-#include <android/frameworks/cameraservice/service/2.1/ICameraServiceListener.h>
-
#include <CameraMetadata.h>
-#include <utils/StrongPointer.h>
-#include <utils/Mutex.h>
-
-#include <media/stagefright/foundation/ALooper.h>
-#include <media/stagefright/foundation/AHandler.h>
-#include <media/stagefright/foundation/AMessage.h>
-
-#include <set>
+#include <aidl/android/frameworks/cameraservice/common/Status.h>
+#include <aidl/android/frameworks/cameraservice/common/VendorTag.h>
+#include <aidl/android/frameworks/cameraservice/common/VendorTagSection.h>
+#include <aidl/android/frameworks/cameraservice/service/BnCameraServiceListener.h>
+#include <aidl/android/frameworks/cameraservice/service/CameraDeviceStatus.h>
+#include <aidl/android/frameworks/cameraservice/service/CameraStatusAndId.h>
+#include <aidl/android/frameworks/cameraservice/service/ICameraService.h>
+#include <android-base/parseint.h>
+#include <camera/NdkCameraManager.h>
#include <map>
+#include <media/stagefright/foundation/AHandler.h>
+#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <set>
+#include <utility>
+#include <utils/Mutex.h>
+#include <utils/StrongPointer.h>
namespace android {
namespace acam {
-using ICameraService = frameworks::cameraservice::service::V2_2::ICameraService;
-using CameraDeviceStatus = frameworks::cameraservice::service::V2_0::CameraDeviceStatus;
-using ICameraServiceListener = frameworks::cameraservice::service::V2_1::ICameraServiceListener;
-using PhysicalCameraStatusAndId = frameworks::cameraservice::service::V2_1::PhysicalCameraStatusAndId;
-using CameraStatusAndId = frameworks::cameraservice::service::V2_0::CameraStatusAndId;
-using Status = frameworks::cameraservice::common::V2_0::Status;
-using VendorTagSection = frameworks::cameraservice::common::V2_0::VendorTagSection;
-using VendorTag = frameworks::cameraservice::common::V2_0::VendorTag;
-using IBase = android::hidl::base::V1_0::IBase;
-using android::hardware::hidl_string;
-using hardware::Void;
+using ::aidl::android::frameworks::cameraservice::common::Status;
+using ::aidl::android::frameworks::cameraservice::common::VendorTag;
+using ::aidl::android::frameworks::cameraservice::common::VendorTagSection;
+using ::aidl::android::frameworks::cameraservice::service::BnCameraServiceListener;
+using ::aidl::android::frameworks::cameraservice::service::CameraDeviceStatus;
+using ::aidl::android::frameworks::cameraservice::service::CameraStatusAndId;
+using ::aidl::android::frameworks::cameraservice::service::ICameraService;
/**
* Per-process singleton instance of CameraManger. Shared by all ACameraManager
@@ -58,15 +54,18 @@
*
* TODO: maybe CameraManagerGlobal is better suited in libcameraclient?
*/
-class CameraManagerGlobal final : public RefBase {
+class CameraManagerGlobal final: public std::enable_shared_from_this<CameraManagerGlobal> {
public:
- static CameraManagerGlobal& getInstance();
- sp<ICameraService> getCameraService();
+ static std::shared_ptr<CameraManagerGlobal> getInstance();
+ static void binderDeathCallback(void* cookie);
- void registerAvailabilityCallback(
- const ACameraManager_AvailabilityCallbacks *callback);
- void unregisterAvailabilityCallback(
- const ACameraManager_AvailabilityCallbacks *callback);
+ CameraManagerGlobal() {};
+ ~CameraManagerGlobal();
+
+ std::shared_ptr<ICameraService> getCameraService();
+
+ void registerAvailabilityCallback(const ACameraManager_AvailabilityCallbacks *callback);
+ void unregisterAvailabilityCallback(const ACameraManager_AvailabilityCallbacks *callback);
void registerExtendedAvailabilityCallback(
const ACameraManager_ExtendedAvailabilityCallbacks* callback);
@@ -76,35 +75,28 @@
/**
* Return camera IDs that support camera2
*/
- void getCameraIdList(std::vector<hidl_string> *cameraIds);
+ void getCameraIdList(std::vector<std::string> *cameraIds);
private:
- sp<ICameraService> mCameraService;
+ std::shared_ptr<ICameraService> mCameraService;
const int kCameraServicePollDelay = 500000; // 0.5s
Mutex mLock;
- class DeathNotifier : public android::hardware::hidl_death_recipient {
- public:
- explicit DeathNotifier(CameraManagerGlobal* cm) : mCameraManager(cm) {}
- protected:
- // IBinder::DeathRecipient implementation
- virtual void serviceDied(uint64_t cookie, const wp<IBase> &who);
- private:
- const wp<CameraManagerGlobal> mCameraManager;
- };
- sp<DeathNotifier> mDeathNotifier;
+ ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
- class CameraServiceListener final : public ICameraServiceListener {
+ class CameraServiceListener final : public BnCameraServiceListener {
public:
- explicit CameraServiceListener(CameraManagerGlobal* cm) : mCameraManager(cm) {}
- android::hardware::Return<void> onStatusChanged(
- const CameraStatusAndId &statusAndId) override;
- android::hardware::Return<void> onPhysicalCameraStatusChanged(
- const PhysicalCameraStatusAndId &statusAndId) override;
+ explicit CameraServiceListener(std::weak_ptr<CameraManagerGlobal> cm) :
+ mCameraManager(std::move(cm)) {}
+ ndk::ScopedAStatus onPhysicalCameraStatusChanged(
+ CameraDeviceStatus in_status, const std::string& in_cameraId,
+ const std::string& in_physicalCameraId) override;
+ ndk::ScopedAStatus onStatusChanged(CameraDeviceStatus in_status,
+ const std::string& in_cameraId) override;
private:
- const wp<CameraManagerGlobal> mCameraManager;
+ const std::weak_ptr<CameraManagerGlobal> mCameraManager;
};
- sp<CameraServiceListener> mCameraServiceListener;
+ std::shared_ptr<CameraServiceListener> mCameraServiceListener;
// Wrapper of ACameraManager_AvailabilityCallbacks so we can store it in std::set
struct Callback {
@@ -180,20 +172,22 @@
static const nsecs_t kCallbackDrainTimeout;
class CallbackHandler : public AHandler {
public:
- CallbackHandler(wp<CameraManagerGlobal> parent) : mParent(parent) {}
+ CallbackHandler(std::weak_ptr<CameraManagerGlobal> parent) : mParent(std::move(parent)) {}
void onMessageReceived(const sp<AMessage> &msg) override;
private:
- wp<CameraManagerGlobal> mParent;
+ std::weak_ptr<CameraManagerGlobal> mParent;
void notifyParent();
void onMessageReceivedInternal(const sp<AMessage> &msg);
};
sp<CallbackHandler> mHandler;
sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on
- void onStatusChanged(const CameraStatusAndId &statusAndId);
- void onStatusChangedLocked(const CameraStatusAndId &statusAndId);
- void onStatusChanged(const PhysicalCameraStatusAndId &statusAndId);
- void onStatusChangedLocked(const PhysicalCameraStatusAndId &statusAndId);
+ void onStatusChanged(const CameraDeviceStatus &status, const std::string &cameraId);
+ void onStatusChangedLocked(const CameraDeviceStatus &status, const std::string &cameraId);
+ void onStatusChanged(const CameraDeviceStatus &status, const std::string &cameraId,
+ const std::string &physicalCameraId);
+ void onStatusChangedLocked(const CameraDeviceStatus &status, const std::string &cameraId,
+ const std::string &physicalCameraId);
bool setupVendorTags();
// Utils for status
@@ -203,7 +197,7 @@
// The sort logic must match the logic in
// libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds
struct CameraIdComparator {
- bool operator()(const hidl_string& a, const hidl_string& b) const {
+ bool operator()(const std::string& a, const std::string& b) const {
uint32_t aUint = 0, bUint = 0;
bool aIsUint = base::ParseUint(a.c_str(), &aUint);
bool bIsUint = base::ParseUint(b.c_str(), &bUint);
@@ -225,29 +219,29 @@
private:
CameraDeviceStatus status = CameraDeviceStatus::STATUS_NOT_PRESENT;
mutable std::mutex mLock;
- std::set<hidl_string> unavailablePhysicalIds;
+ std::set<std::string> unavailablePhysicalIds;
public:
CameraStatus(CameraDeviceStatus st): status(st) { };
CameraStatus() = default;
- bool addUnavailablePhysicalId(const hidl_string& physicalCameraId);
- bool removeUnavailablePhysicalId(const hidl_string& physicalCameraId);
+ bool addUnavailablePhysicalId(const std::string& physicalCameraId);
+ bool removeUnavailablePhysicalId(const std::string& physicalCameraId);
CameraDeviceStatus getStatus();
void updateStatus(CameraDeviceStatus newStatus);
- std::set<hidl_string> getUnavailablePhysicalIds();
+ std::set<std::string> getUnavailablePhysicalIds();
};
template <class T>
void registerAvailCallback(const T *callback);
// Map camera_id -> status
- std::map<hidl_string, CameraStatus, CameraIdComparator> mDeviceStatusMap;
+ std::map<std::string, CameraStatus, CameraIdComparator> mDeviceStatusMap;
// For the singleton instance
static Mutex sLock;
- static CameraManagerGlobal* sInstance;
- CameraManagerGlobal() {};
- ~CameraManagerGlobal();
+ // Static instance is stored in a weak pointer, so will only exist if there is at least one
+ // active consumer of CameraManagerGlobal
+ static std::weak_ptr<CameraManagerGlobal> sInstance;
};
} // namespace acam;
@@ -259,7 +253,7 @@
*/
struct ACameraManager {
ACameraManager() :
- mGlobalManager(&(android::acam::CameraManagerGlobal::getInstance())) {}
+ mGlobalManager(android::acam::CameraManagerGlobal::getInstance()) {}
~ACameraManager();
camera_status_t getCameraIdList(ACameraIdList** cameraIdList);
static void deleteCameraIdList(ACameraIdList* cameraIdList);
@@ -277,7 +271,7 @@
kCameraIdListNotInit = -1
};
android::Mutex mLock;
- android::sp<android::acam::CameraManagerGlobal> mGlobalManager;
+ std::shared_ptr<android::acam::CameraManagerGlobal> mGlobalManager;
};
#endif //_ACAMERA_MANAGER_H
diff --git a/camera/ndk/ndk_vendor/impl/ACaptureRequestVendor.h b/camera/ndk/ndk_vendor/impl/ACaptureRequestVendor.h
index 5715d77..fcb7e34 100644
--- a/camera/ndk/ndk_vendor/impl/ACaptureRequestVendor.h
+++ b/camera/ndk/ndk_vendor/impl/ACaptureRequestVendor.h
@@ -16,6 +16,7 @@
#include "utils.h"
+using ::android::acam::utils::native_handle_ptr_wrapper;
struct ACameraOutputTarget {
explicit ACameraOutputTarget(const native_handle_t* window) : mWindow(window) {};
@@ -32,5 +33,5 @@
return mWindow > other.mWindow;
}
- android::acam::utils::native_handle_ptr_wrapper mWindow;
+ native_handle_ptr_wrapper mWindow;
};
diff --git a/camera/ndk/ndk_vendor/impl/utils.cpp b/camera/ndk/ndk_vendor/impl/utils.cpp
index e4fb204..73a527b 100644
--- a/camera/ndk/ndk_vendor/impl/utils.cpp
+++ b/camera/ndk/ndk_vendor/impl/utils.cpp
@@ -16,66 +16,75 @@
#define LOG_TAG "ACameraVendorUtils"
-#include <utils/Log.h>
-
#include "utils.h"
+#include <aidlcommonsupport/NativeHandle.h>
+#include <utils/Log.h>
+
namespace android {
namespace acam {
namespace utils {
-// Convert CaptureRequest wrappable by sp<> to hidl CaptureRequest.
-frameworks::cameraservice::device::V2_0::CaptureRequest
-convertToHidl(const CaptureRequest *captureRequest) {
- frameworks::cameraservice::device::V2_0::CaptureRequest hCaptureRequest;
- hCaptureRequest.physicalCameraSettings = captureRequest->mCaptureRequest.physicalCameraSettings;
- hCaptureRequest.streamAndWindowIds = captureRequest->mCaptureRequest.streamAndWindowIds;
- return hCaptureRequest;
+// Convert CaptureRequest wrappable by sp<> to aidl CaptureRequest.
+AidlCaptureRequest convertToAidl(const CaptureRequest *captureRequest) {
+ AidlCaptureRequest aidlCaptureRequest;
+ aidlCaptureRequest.physicalCameraSettings =
+ captureRequest->mCaptureRequest.physicalCameraSettings;
+ aidlCaptureRequest.streamAndWindowIds = captureRequest->mCaptureRequest.streamAndWindowIds;
+ return aidlCaptureRequest;
}
-HRotation convertToHidl(int rotation) {
- HRotation hRotation = HRotation::R0;
+OutputConfiguration::Rotation convertToAidl(int rotation) {
+ using AidlRotation = OutputConfiguration::Rotation;
+
+ AidlRotation aRot = AidlRotation ::R0;
switch(rotation) {
case CAMERA3_STREAM_ROTATION_90:
- hRotation = HRotation::R90;
+ aRot = AidlRotation::R90;
break;
case CAMERA3_STREAM_ROTATION_180:
- hRotation = HRotation::R180;
+ aRot = AidlRotation::R180;
break;
case CAMERA3_STREAM_ROTATION_270:
- hRotation = HRotation::R270;
+ aRot = AidlRotation::R270;
break;
default:
break;
}
- return hRotation;
+ return aRot;
}
-bool convertFromHidlCloned(const HCameraMetadata &metadata, CameraMetadata *rawMetadata) {
- const camera_metadata *buffer = (camera_metadata_t*)(metadata.data());
- size_t expectedSize = metadata.size();
+bool cloneFromAidl(const AidlCameraMetadata& srcMetadata, camera_metadata_t** dst) {
+ const camera_metadata *buffer = (camera_metadata_t*)(srcMetadata.metadata.data());
+ size_t expectedSize = srcMetadata.metadata.size();
int ret = validate_camera_metadata_structure(buffer, &expectedSize);
- if (ret == OK || ret == CAMERA_METADATA_VALIDATION_SHIFTED) {
- *rawMetadata = buffer;
- } else {
- ALOGE("%s: Malformed camera metadata received from caller", __FUNCTION__);
+ if (ret != OK && ret != CAMERA_METADATA_VALIDATION_SHIFTED) {
+ ALOGE("%s: Malformed camera srcMetadata received from caller", __FUNCTION__);
return false;
}
- return true;
+
+ camera_metadata_t* clonedBuffer = clone_camera_metadata(buffer);
+ if (clonedBuffer != nullptr) {
+ *dst = clonedBuffer;
+ return true;
+ }
+
+ ALOGE("%s: Failed to clone srcMetadata buffer.", __FUNCTION__);
+ return false;
}
-// Note: existing data in dst will be gone. dst owns memory if shouldOwn is set
-// to true.
-void convertToHidl(const camera_metadata_t *src, HCameraMetadata* dst, bool shouldOwn) {
+// Note: existing data in dst will be gone.
+void convertToAidl(const camera_metadata_t *src, AidlCameraMetadata* dst) {
if (src == nullptr) {
return;
}
size_t size = get_camera_metadata_size(src);
- dst->setToExternal((uint8_t *) src, size, shouldOwn);
- return;
+ uint8_t* metadataStart = (uint8_t*)src;
+ uint8_t* metadataEnd = metadataStart + size;
+ dst->metadata.assign(metadataStart, metadataEnd);
}
-TemplateId convertToHidl(ACameraDevice_request_template templateId) {
+TemplateId convertToAidl(ACameraDevice_request_template templateId) {
switch(templateId) {
case TEMPLATE_STILL_CAPTURE:
return TemplateId::STILL_CAPTURE;
@@ -92,7 +101,7 @@
}
}
-camera_status_t convertFromHidl(Status status) {
+camera_status_t convertFromAidl(Status status) {
camera_status_t ret = ACAMERA_OK;
switch(status) {
case Status::NO_ERROR:
@@ -146,6 +155,14 @@
return true;
}
+bool isWindowNativeHandleEqual(const native_handle_t *nh1,
+ const aidl::android::hardware::common::NativeHandle& nh2) {
+ native_handle_t* tempNh = makeFromAidl(nh2);
+ bool equal = isWindowNativeHandleEqual(nh1, tempNh);
+ native_handle_delete(tempNh);
+ return equal;
+}
+
bool isWindowNativeHandleLessThan(const native_handle_t *nh1, const native_handle_t *nh2) {
if (isWindowNativeHandleEqual(nh1, nh2)) {
return false;
@@ -166,32 +183,6 @@
return !isWindowNativeHandleLessThan(nh1, nh2) && !isWindowNativeHandleEqual(nh1, nh2);
}
-bool areWindowNativeHandlesEqual(hidl_vec<hidl_handle> handles1, hidl_vec<hidl_handle> handles2) {
- if (handles1.size() != handles2.size()) {
- return false;
- }
- for (int i = 0; i < handles1.size(); i++) {
- if (!isWindowNativeHandleEqual(handles1[i], handles2[i])) {
- return false;
- }
- }
- return true;
-}
-
-bool areWindowNativeHandlesLessThan(hidl_vec<hidl_handle> handles1, hidl_vec<hidl_handle>handles2) {
- if (handles1.size() != handles2.size()) {
- return handles1.size() < handles2.size();
- }
- for (int i = 0; i < handles1.size(); i++) {
- const native_handle_t *handle1 = handles1[i].getNativeHandle();
- const native_handle_t *handle2 = handles2[i].getNativeHandle();
- if (!isWindowNativeHandleEqual(handle1, handle2)) {
- return isWindowNativeHandleLessThan(handle1, handle2);
- }
- }
- return false;
-}
-
} // namespace utils
} // namespace acam
} // namespace android
diff --git a/camera/ndk/ndk_vendor/impl/utils.h b/camera/ndk/ndk_vendor/impl/utils.h
index 62779a4..7ad74ad 100644
--- a/camera/ndk/ndk_vendor/impl/utils.h
+++ b/camera/ndk/ndk_vendor/impl/utils.h
@@ -14,46 +14,39 @@
* limitations under the License.
*/
-#include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
-#include <android/frameworks/cameraservice/device/2.0/ICameraDeviceUser.h>
-#include <android/frameworks/cameraservice/device/2.0/types.h>
-#include <camera/NdkCameraDevice.h>
+#ifndef CAMERA_NDK_VENDOR_UTILS_H
+#define CAMERA_NDK_VENDOR_UTILS_H
+
#include <CameraMetadata.h>
+#include <aidl/android/frameworks/cameraservice/common/Status.h>
+#include <aidl/android/frameworks/cameraservice/device/CameraMetadata.h>
+#include <aidl/android/frameworks/cameraservice/device/CaptureRequest.h>
+#include <aidl/android/frameworks/cameraservice/device/ICameraDeviceUser.h>
+#include <aidl/android/frameworks/cameraservice/device/OutputConfiguration.h>
+#include <aidl/android/frameworks/cameraservice/device/PhysicalCameraSettings.h>
+#include <aidl/android/frameworks/cameraservice/device/TemplateId.h>
+#include <aidl/android/frameworks/cameraservice/service/ICameraService.h>
+#include <camera/NdkCameraDevice.h>
#include <hardware/camera3.h>
-
-#ifndef CAMERA_NDK_VENDOR_H
-#define CAMERA_NDK_VENDOR_H
-
-using android::hardware::hidl_vec;
-using android::hardware::hidl_handle;
+#include <utils/RefBase.h>
namespace android {
namespace acam {
namespace utils {
-using CameraMetadata = hardware::camera::common::V1_0::helper::CameraMetadata;
-using HCameraMetadata = frameworks::cameraservice::service::V2_0::CameraMetadata;
-using Status = frameworks::cameraservice::common::V2_0::Status;
-using TemplateId = frameworks::cameraservice::device::V2_0::TemplateId;
-using PhysicalCameraSettings = frameworks::cameraservice::device::V2_0::PhysicalCameraSettings;
-using HRotation = frameworks::cameraservice::device::V2_0::OutputConfiguration::Rotation;
-using OutputConfiguration = frameworks::cameraservice::device::V2_0::OutputConfiguration;
-
-// Utility class so that CaptureRequest can be stored by sp<>
-struct CaptureRequest : public RefBase {
- frameworks::cameraservice::device::V2_0::CaptureRequest mCaptureRequest;
- std::vector<const native_handle_t *> mSurfaceList;
- //Physical camera settings metadata is stored here, since the capture request
- //might not contain it. That's since, fmq might have consumed it.
- hidl_vec<PhysicalCameraSettings> mPhysicalCameraSettings;
-};
-
-bool areWindowNativeHandlesEqual(hidl_vec<hidl_handle> handles1, hidl_vec<hidl_handle>handles2);
-
-bool areWindowNativeHandlesLessThan(hidl_vec<hidl_handle> handles1, hidl_vec<hidl_handle>handles2);
+using ::aidl::android::frameworks::cameraservice::common::Status;
+using ::aidl::android::frameworks::cameraservice::device::OutputConfiguration;
+using ::aidl::android::frameworks::cameraservice::device::PhysicalCameraSettings;
+using ::aidl::android::frameworks::cameraservice::device::TemplateId;
+using ::aidl::android::hardware::common::NativeHandle;
+using ::android::hardware::camera::common::V1_0::helper::CameraMetadata;
+using AidlCameraMetadata = ::aidl::android::frameworks::cameraservice::device::CameraMetadata;
+using AidlCaptureRequest = ::aidl::android::frameworks::cameraservice::device::CaptureRequest;
bool isWindowNativeHandleEqual(const native_handle_t *nh1, const native_handle_t *nh2);
+bool isWindowNativeHandleEqual(const native_handle_t* nh1, const NativeHandle& nh2);
+
bool isWindowNativeHandleLessThan(const native_handle_t *nh1, const native_handle_t *nh2);
// Convenience wrapper over isWindowNativeHandleLessThan and isWindowNativeHandleEqual
@@ -88,117 +81,30 @@
};
-// Wrapper around OutputConfiguration. This is needed since HIDL
-// OutputConfiguration is auto-generated and marked final. Therefore, operator
-// overloads outside the class, will not get picked by clang while trying to
-// store OutputConfiguration in maps/sets.
-struct OutputConfigurationWrapper {
- OutputConfiguration mOutputConfiguration;
-
- operator const OutputConfiguration &() const {
- return mOutputConfiguration;
- }
-
- OutputConfigurationWrapper() {
- mOutputConfiguration.rotation = OutputConfiguration::Rotation::R0;
- // The ndk currently doesn't support deferred surfaces
- mOutputConfiguration.isDeferred = false;
- mOutputConfiguration.width = 0;
- mOutputConfiguration.height = 0;
- // ndk doesn't support inter OutputConfiguration buffer sharing.
- mOutputConfiguration.windowGroupId = -1;
- };
-
- OutputConfigurationWrapper(const OutputConfigurationWrapper &other) {
- *this = other;
- }
-
- // Needed to make sure that OutputConfiguration in
- // OutputConfigurationWrapper, when copied doesn't call hidl_handle's
- // assignment operator / copy constructor, which will lead to native handle
- // cloning, which is not what we want for app callbacks which have the native
- // handle as parameter.
- OutputConfigurationWrapper &operator=(const OutputConfigurationWrapper &other) {
- const OutputConfiguration &outputConfiguration = other.mOutputConfiguration;
- mOutputConfiguration.rotation = outputConfiguration.rotation;
- mOutputConfiguration.isDeferred = outputConfiguration.isDeferred;
- mOutputConfiguration.width = outputConfiguration.width;
- mOutputConfiguration.height = outputConfiguration.height;
- mOutputConfiguration.windowGroupId = outputConfiguration.windowGroupId;
- mOutputConfiguration.windowHandles.resize(outputConfiguration.windowHandles.size());
- mOutputConfiguration.physicalCameraId = outputConfiguration.physicalCameraId;
- size_t i = 0;
- for (const auto &handle : outputConfiguration.windowHandles) {
- mOutputConfiguration.windowHandles[i++] = handle.getNativeHandle();
- }
- return *this;
- }
-
- bool operator ==(const OutputConfiguration &other) const {
- const OutputConfiguration &self = mOutputConfiguration;
- return self.rotation == other.rotation && self.windowGroupId == other.windowGroupId &&
- self.physicalCameraId == other.physicalCameraId && self.width == other.width &&
- self.height == other.height && self.isDeferred == other.isDeferred &&
- areWindowNativeHandlesEqual(self.windowHandles, other.windowHandles);
- }
-
- bool operator < (const OutputConfiguration &other) const {
- if (*this == other) {
- return false;
- }
- const OutputConfiguration &self = mOutputConfiguration;
- if (self.windowGroupId != other.windowGroupId) {
- return self.windowGroupId < other.windowGroupId;
- }
-
- if (self.width != other.width) {
- return self.width < other.width;
- }
-
- if (self.height != other.height) {
- return self.height < other.height;
- }
-
- if (self.rotation != other.rotation) {
- return static_cast<uint32_t>(self.rotation) < static_cast<uint32_t>(other.rotation);
- }
-
- if (self.isDeferred != other.isDeferred) {
- return self.isDeferred < other.isDeferred;
- }
-
- if (self.physicalCameraId != other.physicalCameraId) {
- return self.physicalCameraId < other.physicalCameraId;
- }
- return areWindowNativeHandlesLessThan(self.windowHandles, other.windowHandles);
- }
-
- bool operator != (const OutputConfiguration &other) const {
- return !(*this == other);
- }
-
- bool operator > (const OutputConfiguration &other) const {
- return (*this != other) && !(*this < other);
- }
+// Utility class so that CaptureRequest can be stored by sp<>
+struct CaptureRequest: public RefBase {
+ AidlCaptureRequest mCaptureRequest;
+ std::vector<native_handle_ptr_wrapper> mSurfaceList;
+ // Physical camera settings metadata is stored here, as the capture request
+ // might not contain it. That's since, fmq might have consumed it.
+ std::vector<PhysicalCameraSettings> mPhysicalCameraSettings;
};
-// Convert CaptureRequest wrappable by sp<> to hidl CaptureRequest.
-frameworks::cameraservice::device::V2_0::CaptureRequest convertToHidl(
- const CaptureRequest *captureRequest);
+AidlCaptureRequest convertToAidl(const CaptureRequest *captureRequest);
-HRotation convertToHidl(int rotation);
+OutputConfiguration::Rotation convertToAidl(int rotation);
-bool convertFromHidlCloned(const HCameraMetadata &metadata, CameraMetadata *rawMetadata);
+bool cloneFromAidl(const AidlCameraMetadata & srcMetadata, camera_metadata_t** dst);
// Note: existing data in dst will be gone.
-void convertToHidl(const camera_metadata_t *src, HCameraMetadata* dst, bool shouldOwn = false);
+void convertToAidl(const camera_metadata_t *src, AidlCameraMetadata * dst);
-TemplateId convertToHidl(ACameraDevice_request_template templateId);
+TemplateId convertToAidl(ACameraDevice_request_template templateId);
-camera_status_t convertFromHidl(Status status);
+camera_status_t convertFromAidl(Status status);
} // namespace utils
} // namespace acam
} // namespace android
-#endif // CAMERA_NDK_VENDOR_H
+#endif // CAMERA_NDK_VENDOR_UTILS_H
diff --git a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp
index 63cdb76..3a13a73 100644
--- a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp
+++ b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp
@@ -254,20 +254,22 @@
&mLogicalCaptureCallbacksV2, 1, &mStillRequest, &seqId);
}
- bool checkCallbacks(int pictureCount) {
+ bool checkCallbacks(int pictureCount, bool printLog = false) {
std::lock_guard<std::mutex> lock(mMutex);
if (mCompletedCaptureCallbackCount != pictureCount) {
- ALOGE("Completed capture callback count not as expected. expected %d actual %d",
- pictureCount, mCompletedCaptureCallbackCount);
+ ALOGE_IF(printLog,
+ "Completed capture callback count not as expected. expected %d actual %d",
+ pictureCount, mCompletedCaptureCallbackCount);
return false;
}
return true;
}
- bool checkCallbacksV2(int pictureCount) {
+ bool checkCallbacksV2(int pictureCount, bool printLog = false) {
std::lock_guard<std::mutex> lock(mMutex);
if (mCaptureStartedCallbackCount != pictureCount) {
- ALOGE("Capture started callback count not as expected. expected %d actual %d",
- pictureCount, mCaptureStartedCallbackCount);
+ ALOGE_IF(printLog,
+ "Capture started callback count not as expected. expected %d actual %d",
+ pictureCount, mCaptureStartedCallbackCount);
return false;
}
return true;
@@ -670,15 +672,22 @@
// Sleep until all capture finished
for (int i = 0; i < kCaptureWaitRetry * pictureCount; i++) {
usleep(kCaptureWaitUs);
- if (testCase.getAcquiredImageCount() == pictureCount) {
+ bool receivedAllCallbacks = v2 ? cameraHelper.checkCallbacksV2(pictureCount)
+ : cameraHelper.checkCallbacks(pictureCount);
+
+ bool acquiredAllImages = testCase.getAcquiredImageCount() == pictureCount;
+ if (acquiredAllImages) {
ALOGI("Session take ~%d ms to capture %d images", i * kCaptureWaitUs / 1000,
pictureCount);
+ }
+ // Wait for all images to be acquired and all callbacks to be processed
+ if (acquiredAllImages && receivedAllCallbacks) {
break;
}
}
return testCase.getAcquiredImageCount() == pictureCount &&
- v2 ? cameraHelper.checkCallbacksV2(pictureCount) :
- cameraHelper.checkCallbacks(pictureCount);
+ v2 ? cameraHelper.checkCallbacksV2(pictureCount, /* printLog= */true) :
+ cameraHelper.checkCallbacks(pictureCount, /* printLog= */true);
}
bool testTakePicturesNative(const char* id) {