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/ndk/impl/ACameraDevice.cpp b/camera/ndk/impl/ACameraDevice.cpp
index 5f89fa3..1ab6af8 100644
--- a/camera/ndk/impl/ACameraDevice.cpp
+++ b/camera/ndk/impl/ACameraDevice.cpp
@@ -20,6 +20,8 @@
#include <vector>
#include <utility>
#include <inttypes.h>
+#include <android/hardware/ICameraService.h>
+#include <camera2/SubmitInfo.h>
#include <gui/Surface.h>
#include "ACameraDevice.h"
#include "ACameraMetadata.h"
@@ -117,13 +119,14 @@
return ACAMERA_ERROR_CAMERA_DISCONNECTED;
}
CameraMetadata rawRequest;
- status_t remoteRet = mRemote->createDefaultRequest(templateId, &rawRequest);
- if (remoteRet == BAD_VALUE) {
+ binder::Status remoteRet = mRemote->createDefaultRequest(templateId, &rawRequest);
+ if (remoteRet.serviceSpecificErrorCode() ==
+ hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
ALOGW("Create capture request failed! template %d is not supported on this device",
templateId);
return ACAMERA_ERROR_UNSUPPORTED;
- } else if (remoteRet != OK) {
- ALOGE("Create capture request failed! error %d", remoteRet);
+ } else if (!remoteRet.isOk()) {
+ ALOGE("Create capture request failed: %s", remoteRet.toString8().string());
return ACAMERA_ERROR_UNKNOWN;
}
ACaptureRequest* outReq = new ACaptureRequest();
@@ -201,8 +204,8 @@
return ret;
}
- // Form List/Vector of capture request
- List<sp<CaptureRequest> > requestList;
+ // Form two vectors of capture request, one for internal tracking
+ std::vector<hardware::camera2::CaptureRequest> requestList;
Vector<sp<CaptureRequest> > requestsV;
requestsV.setCapacity(numRequests);
for (int i = 0; i < numRequests; i++) {
@@ -216,7 +219,7 @@
ALOGE("Capture request without output target cannot be submitted!");
return ACAMERA_ERROR_INVALID_PARAMETER;
}
- requestList.push_back(req);
+ requestList.push_back(*(req.get()));
requestsV.push_back(req);
}
@@ -228,10 +231,11 @@
}
}
- int sequenceId;
- int64_t lastFrameNumber;
-
- sequenceId = mRemote->submitRequestList(requestList, isRepeating, &lastFrameNumber);
+ binder::Status remoteRet;
+ hardware::camera2::utils::SubmitInfo info;
+ remoteRet = mRemote->submitRequestList(requestList, isRepeating, &info);
+ int sequenceId = info.mRequestId;
+ int64_t lastFrameNumber = info.mLastFrameNumber;
if (sequenceId < 0) {
ALOGE("Camera %s submit request remote failure: ret %d", getId(), sequenceId);
return ACAMERA_ERROR_UNKNOWN;
@@ -371,9 +375,9 @@
mRepeatingSequenceId = REQUEST_ID_NONE;
int64_t lastFrameNumber;
- status_t remoteRet = mRemote->cancelRequest(repeatingSequenceId, &lastFrameNumber);
- if (remoteRet != OK) {
- ALOGE("Stop repeating request fails in remote! ret %d", remoteRet);
+ binder::Status remoteRet = mRemote->cancelRequest(repeatingSequenceId, &lastFrameNumber);
+ if (!remoteRet.isOk()) {
+ ALOGE("Stop repeating request fails in remote: %s", remoteRet.toString8().string());
return ACAMERA_ERROR_UNKNOWN;
}
checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
@@ -394,9 +398,9 @@
return ACAMERA_ERROR_INVALID_OPERATION;
}
- status_t remoteRet = mRemote->waitUntilIdle();
- if (remoteRet != OK) {
- ALOGE("Camera device %s waitUntilIdle failed! ret %d", getId(), remoteRet);
+ binder::Status remoteRet = mRemote->waitUntilIdle();
+ if (!remoteRet.isOk()) {
+ ALOGE("Camera device %s waitUntilIdle failed: %s", getId(), remoteRet.toString8().string());
// TODO: define a function to convert status_t -> camera_status_t
return ACAMERA_ERROR_UNKNOWN;
}
@@ -508,17 +512,18 @@
}
mIdle = true;
- status_t remoteRet = mRemote->beginConfigure();
- if (remoteRet != ACAMERA_OK) {
- ALOGE("Camera device %s begin configure failed, ret %d", getId(), remoteRet);
+ binder::Status remoteRet = mRemote->beginConfigure();
+ if (!remoteRet.isOk()) {
+ ALOGE("Camera device %s begin configure failed: %s", getId(), remoteRet.toString8().string());
return ACAMERA_ERROR_UNKNOWN;
}
// delete to-be-deleted streams
for (auto streamId : deleteList) {
remoteRet = mRemote->deleteStream(streamId);
- if (remoteRet != ACAMERA_OK) {
- ALOGE("Camera device %s fails to remove stream %d", getId(), streamId);
+ if (!remoteRet.isOk()) {
+ ALOGE("Camera device %s failed to remove stream %d: %s", getId(), streamId,
+ remoteRet.toString8().string());
return ACAMERA_ERROR_UNKNOWN;
}
mConfiguredOutputs.erase(streamId);
@@ -526,21 +531,23 @@
// add new streams
for (auto outConfig : addSet) {
- remoteRet = mRemote->createStream(outConfig);
- if (remoteRet < 0) {
- ALOGE("Camera device %s fails to create stream", getId());
+ int streamId;
+ remoteRet = mRemote->createStream(outConfig, &streamId);
+ if (!remoteRet.isOk()) {
+ ALOGE("Camera device %s failed to create stream: %s", getId(),
+ remoteRet.toString8().string());
return ACAMERA_ERROR_UNKNOWN;
}
- int streamId = remoteRet; // Weird, right?
mConfiguredOutputs.insert(std::make_pair(streamId, outConfig));
}
- remoteRet = mRemote->endConfigure();
- if (remoteRet == BAD_VALUE) {
- ALOGE("Camera device %s cannnot support app output configuration", getId());
+ remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false);
+ if (remoteRet.serviceSpecificErrorCode() == hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
+ ALOGE("Camera device %s cannnot support app output configuration: %s", getId(),
+ remoteRet.toString8().string());
return ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
- } else if (remoteRet != ACAMERA_OK) {
- ALOGE("Camera device %s end configure failed, ret %d", getId(), remoteRet);
+ } else if (!remoteRet.isOk()) {
+ ALOGE("Camera device %s end configure failed: %s", getId(), remoteRet.toString8().string());
return ACAMERA_ERROR_UNKNOWN;
}
@@ -548,7 +555,7 @@
}
void
-CameraDevice::setRemoteDevice(sp<ICameraDeviceUser> remote) {
+CameraDevice::setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote) {
Mutex::Autolock _l(mDeviceLock);
mRemote = remote;
}
@@ -615,14 +622,14 @@
void
CameraDevice::onCaptureErrorLocked(
- ICameraDeviceCallbacks::CameraErrorCode errorCode,
+ int32_t errorCode,
const CaptureResultExtras& resultExtras) {
int sequenceId = resultExtras.requestId;
int64_t frameNumber = resultExtras.frameNumber;
int32_t burstId = resultExtras.burstId;
// No way to report buffer error now
- if (errorCode == ICameraDeviceCallbacks::CameraErrorCode::ERROR_CAMERA_BUFFER) {
+ if (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER) {
ALOGE("Camera %s Lost output buffer for frame %" PRId64,
getId(), frameNumber);
return;
@@ -646,7 +653,7 @@
failure->reason = CAPTURE_FAILURE_REASON_ERROR;
failure->sequenceId = sequenceId;
failure->wasImageCaptured = (errorCode ==
- ICameraDeviceCallbacks::CameraErrorCode::ERROR_CAMERA_RESULT);
+ hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT);
sp<AMessage> msg = new AMessage(kWhatCaptureFail, mHandler);
msg->setPointer(kContextKey, cbh.mCallbacks.context);
@@ -999,21 +1006,21 @@
/**
* Camera service callback implementation
*/
-void
+binder::Status
CameraDevice::ServiceCallback::onDeviceError(
- CameraErrorCode errorCode,
+ int32_t errorCode,
const CaptureResultExtras& resultExtras) {
ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d",
errorCode, resultExtras.frameNumber, resultExtras.requestId, resultExtras.burstId);
-
+ binder::Status ret = binder::Status::ok();
sp<CameraDevice> dev = mDevice.promote();
if (dev == nullptr) {
- return; // device has been closed
+ return ret; // device has been closed
}
Mutex::Autolock _l(dev->mDeviceLock);
if (dev->mRemote == nullptr) {
- return; // device has been closed
+ return ret; // device has been closed
}
switch (errorCode) {
case ERROR_CAMERA_DISCONNECTED:
@@ -1061,24 +1068,26 @@
dev->onCaptureErrorLocked(errorCode, resultExtras);
break;
}
+ return ret;
}
-void
+binder::Status
CameraDevice::ServiceCallback::onDeviceIdle() {
ALOGV("Camera is now idle");
+ binder::Status ret = binder::Status::ok();
sp<CameraDevice> dev = mDevice.promote();
if (dev == nullptr) {
- return; // device has been closed
+ return ret; // device has been closed
}
Mutex::Autolock _l(dev->mDeviceLock);
if (dev->isClosed() || dev->mRemote == nullptr) {
- return;
+ return ret;
}
if (dev->mIdle) {
// Already in idle state. Possibly other thread did waitUntilIdle
- return;
+ return ret;
}
if (dev->mCurrentSession != nullptr) {
@@ -1086,7 +1095,7 @@
if (dev->mBusySession != dev->mCurrentSession) {
ALOGE("Current session != busy session");
dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
- return;
+ return ret;
}
sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler);
msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context);
@@ -1098,19 +1107,22 @@
msg->post();
}
dev->mIdle = true;
+ return ret;
}
-void
+binder::Status
CameraDevice::ServiceCallback::onCaptureStarted(
const CaptureResultExtras& resultExtras,
int64_t timestamp) {
+ binder::Status ret = binder::Status::ok();
+
sp<CameraDevice> dev = mDevice.promote();
if (dev == nullptr) {
- return; // device has been closed
+ return ret; // device has been closed
}
Mutex::Autolock _l(dev->mDeviceLock);
if (dev->isClosed() || dev->mRemote == nullptr) {
- return;
+ return ret;
}
int sequenceId = resultExtras.requestId;
@@ -1136,15 +1148,18 @@
msg->setInt64(kTimeStampKey, timestamp);
msg->post();
}
+ return ret;
}
-void
+binder::Status
CameraDevice::ServiceCallback::onResultReceived(
const CameraMetadata& metadata,
const CaptureResultExtras& resultExtras) {
+ binder::Status ret = binder::Status::ok();
+
sp<CameraDevice> dev = mDevice.promote();
if (dev == nullptr) {
- return; // device has been closed
+ return ret; // device has been closed
}
int sequenceId = resultExtras.requestId;
int64_t frameNumber = resultExtras.frameNumber;
@@ -1157,7 +1172,7 @@
Mutex::Autolock _l(dev->mDeviceLock);
if (dev->mRemote == nullptr) {
- return; // device has been disconnected
+ return ret; // device has been disconnected
}
if (dev->isClosed()) {
@@ -1165,7 +1180,7 @@
dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
}
// early return to avoid callback sent to closed devices
- return;
+ return ret;
}
CameraMetadata metadataCopy = metadata;
@@ -1201,12 +1216,14 @@
dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
dev->checkAndFireSequenceCompleteLocked();
}
+
+ return ret;
}
-void
+binder::Status
CameraDevice::ServiceCallback::onPrepared(int) {
// Prepare not yet implemented in NDK
- return;
+ return binder::Status::ok();
}
} // namespace android