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