diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2015-12-17 16:50:35 -0800 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2016-03-02 10:27:36 -0800 |
commit | d56db1d2bee182d1851097a9c712712fc094d117 (patch) | |
tree | 243fda59e2b4d51491af628b49b3a35b267e0051 /camera/CameraBase.cpp | |
parent | cf7913e2389a5e850e01aa6f905d252ee54c9891 (diff) |
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
Diffstat (limited to 'camera/CameraBase.cpp')
-rw-r--r-- | camera/CameraBase.cpp | 77 |
1 files changed, 56 insertions, 21 deletions
diff --git a/camera/CameraBase.cpp b/camera/CameraBase.cpp index 9ee7ae5014..9aa0b4e303 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 @@ namespace { // 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 @@ const sp<ICameraService>& CameraBase<TCam, TCamTraits>::getCameraService() 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> CameraBase<TCam, TCamTraits>::connect(int cameraId, 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 @@ void CameraBase<TCam, TCamTraits>::notifyCallback(int32_t msgType, 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>; |