Camera: Switch camera2 to auto-gen C++ binder interfaces
- Move camera service AIDL files to frameworks/av
- Build C++ interface stubs with AIDL tools
- Add necessary native-side parcelables and update existing ones
- Remove manually-written stubs, rearrange remaining manual stubs
- Adjust implementations to work with auto-generated stubs
- Adjust method signatures for auto-gen differences
- Add rich error messages using binder::Status
Bug: 25091611
Change-Id: I6f69f34b9d1a3f8d1fb7db87357363f8fa8483ff
diff --git a/camera/CameraBase.cpp b/camera/CameraBase.cpp
index 9ee7ae5..9aa0b4e 100644
--- a/camera/CameraBase.cpp
+++ b/camera/CameraBase.cpp
@@ -21,12 +21,13 @@
#include <utils/threads.h>
#include <utils/Mutex.h>
+#include <android/hardware/ICameraService.h>
+
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binder/IMemory.h>
#include <camera/CameraBase.h>
-#include <camera/ICameraService.h>
// needed to instantiate
#include <camera/Camera.h>
@@ -35,8 +36,28 @@
namespace android {
+namespace hardware {
+
+status_t CameraInfo::writeToParcel(Parcel* parcel) const {
+ status_t res;
+ res = parcel->writeInt32(facing);
+ if (res != OK) return res;
+ res = parcel->writeInt32(orientation);
+ return res;
+}
+
+status_t CameraInfo::readFromParcel(const Parcel* parcel) {
+ status_t res;
+ res = parcel->readInt32(&facing);
+ if (res != OK) return res;
+ res = parcel->readInt32(&orientation);
+ return res;
+}
+
+}
+
namespace {
- sp<ICameraService> gCameraService;
+ sp<::android::hardware::ICameraService> gCameraService;
const int kCameraServicePollDelay = 500000; // 0.5s
const char* kCameraServiceName = "media.camera";
@@ -65,7 +86,7 @@
// establish binder interface to camera service
template <typename TCam, typename TCamTraits>
-const sp<ICameraService>& CameraBase<TCam, TCamTraits>::getCameraService()
+const sp<::android::hardware::ICameraService>& CameraBase<TCam, TCamTraits>::getCameraService()
{
Mutex::Autolock _l(gLock);
if (gCameraService.get() == 0) {
@@ -83,7 +104,7 @@
gDeathNotifier = new DeathNotifier();
}
binder->linkToDeath(gDeathNotifier);
- gCameraService = interface_cast<ICameraService>(binder);
+ gCameraService = interface_cast<::android::hardware::ICameraService>(binder);
}
ALOGE_IF(gCameraService == 0, "no CameraService!?");
return gCameraService;
@@ -98,18 +119,20 @@
sp<TCam> c = new TCam(cameraId);
sp<TCamCallbacks> cl = c;
status_t status = NO_ERROR;
- const sp<ICameraService>& cs = getCameraService();
+ const sp<::android::hardware::ICameraService>& cs = getCameraService();
- if (cs != 0) {
+ binder::Status ret;
+ if (cs != nullptr) {
TCamConnectService fnConnectService = TCamTraits::fnConnectService;
- status = (cs.get()->*fnConnectService)(cl, cameraId, clientPackageName, clientUid,
- clientPid, /*out*/ c->mCamera);
+ ret = (cs.get()->*fnConnectService)(cl, cameraId, clientPackageName, clientUid,
+ clientPid, /*out*/ &c->mCamera);
}
- if (status == OK && c->mCamera != 0) {
+ if (ret.isOk() && c->mCamera != nullptr) {
IInterface::asBinder(c->mCamera)->linkToDeath(c);
c->mStatus = NO_ERROR;
} else {
- ALOGW("An error occurred while connecting to camera: %d", cameraId);
+ ALOGW("An error occurred while connecting to camera %d: %s", cameraId,
+ (cs != nullptr) ? "Service not available" : ret.toString8().string());
c.clear();
}
return c;
@@ -182,38 +205,50 @@
template <typename TCam, typename TCamTraits>
int CameraBase<TCam, TCamTraits>::getNumberOfCameras() {
- const sp<ICameraService> cs = getCameraService();
+ const sp<::android::hardware::ICameraService> cs = getCameraService();
if (!cs.get()) {
// as required by the public Java APIs
return 0;
}
- return cs->getNumberOfCameras();
+ int32_t count;
+ binder::Status res = cs->getNumberOfCameras(
+ ::android::hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE,
+ &count);
+ if (!res.isOk()) {
+ ALOGE("Error reading number of cameras: %s",
+ res.toString8().string());
+ count = 0;
+ }
+ return count;
}
// this can be in BaseCamera but it should be an instance method
template <typename TCam, typename TCamTraits>
status_t CameraBase<TCam, TCamTraits>::getCameraInfo(int cameraId,
- struct CameraInfo* cameraInfo) {
- const sp<ICameraService>& cs = getCameraService();
+ struct hardware::CameraInfo* cameraInfo) {
+ const sp<::android::hardware::ICameraService>& cs = getCameraService();
if (cs == 0) return UNKNOWN_ERROR;
- return cs->getCameraInfo(cameraId, cameraInfo);
+ binder::Status res = cs->getCameraInfo(cameraId, cameraInfo);
+ return res.isOk() ? OK : res.serviceSpecificErrorCode();
}
template <typename TCam, typename TCamTraits>
status_t CameraBase<TCam, TCamTraits>::addServiceListener(
- const sp<ICameraServiceListener>& listener) {
- const sp<ICameraService>& cs = getCameraService();
+ const sp<::android::hardware::ICameraServiceListener>& listener) {
+ const sp<::android::hardware::ICameraService>& cs = getCameraService();
if (cs == 0) return UNKNOWN_ERROR;
- return cs->addListener(listener);
+ binder::Status res = cs->addListener(listener);
+ return res.isOk() ? OK : res.serviceSpecificErrorCode();
}
template <typename TCam, typename TCamTraits>
status_t CameraBase<TCam, TCamTraits>::removeServiceListener(
- const sp<ICameraServiceListener>& listener) {
- const sp<ICameraService>& cs = getCameraService();
+ const sp<::android::hardware::ICameraServiceListener>& listener) {
+ const sp<::android::hardware::ICameraService>& cs = getCameraService();
if (cs == 0) return UNKNOWN_ERROR;
- return cs->removeListener(listener);
+ binder::Status res = cs->removeListener(listener);
+ return res.isOk() ? OK : res.serviceSpecificErrorCode();
}
template class CameraBase<Camera>;