diff options
Diffstat (limited to 'camera/camera2')
-rw-r--r-- | camera/camera2/ICameraDeviceCallbacks.cpp | 48 | ||||
-rw-r--r-- | camera/camera2/ICameraDeviceUser.cpp | 136 |
2 files changed, 160 insertions, 24 deletions
diff --git a/camera/camera2/ICameraDeviceCallbacks.cpp b/camera/camera2/ICameraDeviceCallbacks.cpp index 613358a..4cc7b5d 100644 --- a/camera/camera2/ICameraDeviceCallbacks.cpp +++ b/camera/camera2/ICameraDeviceCallbacks.cpp @@ -28,6 +28,7 @@ #include <camera/camera2/ICameraDeviceCallbacks.h> #include "camera/CameraMetadata.h" +#include "camera/CaptureResult.h" namespace android { @@ -46,12 +47,14 @@ public: { } - void onDeviceError(CameraErrorCode errorCode) + void onDeviceError(CameraErrorCode errorCode, const CaptureResultExtras& resultExtras) { ALOGV("onDeviceError"); Parcel data, reply; data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor()); data.writeInt32(static_cast<int32_t>(errorCode)); + data.writeInt32(1); // to mark presence of CaptureResultExtras object + resultExtras.writeToParcel(&data); remote()->transact(CAMERA_ERROR, data, &reply, IBinder::FLAG_ONEWAY); data.writeNoException(); } @@ -65,25 +68,28 @@ public: data.writeNoException(); } - void onCaptureStarted(int32_t requestId, int64_t timestamp) + void onCaptureStarted(const CaptureResultExtras& result, int64_t timestamp) { ALOGV("onCaptureStarted"); Parcel data, reply; data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor()); - data.writeInt32(requestId); + data.writeInt32(1); // to mark presence of CaptureResultExtras object + result.writeToParcel(&data); data.writeInt64(timestamp); remote()->transact(CAPTURE_STARTED, data, &reply, IBinder::FLAG_ONEWAY); data.writeNoException(); } - void onResultReceived(int32_t requestId, const CameraMetadata& result) { + void onResultReceived(const CameraMetadata& metadata, + const CaptureResultExtras& resultExtras) { ALOGV("onResultReceived"); Parcel data, reply; data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor()); - data.writeInt32(requestId); data.writeInt32(1); // to mark presence of metadata object - result.writeToParcel(&data); + metadata.writeToParcel(&data); + data.writeInt32(1); // to mark presence of CaptureResult object + resultExtras.writeToParcel(&data); remote()->transact(RESULT_RECEIVED, data, &reply, IBinder::FLAG_ONEWAY); data.writeNoException(); } @@ -104,7 +110,13 @@ status_t BnCameraDeviceCallbacks::onTransact( CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply); CameraErrorCode errorCode = static_cast<CameraErrorCode>(data.readInt32()); - onDeviceError(errorCode); + CaptureResultExtras resultExtras; + if (data.readInt32() != 0) { + resultExtras.readFromParcel(const_cast<Parcel*>(&data)); + } else { + ALOGE("No CaptureResultExtras object is present!"); + } + onDeviceError(errorCode, resultExtras); data.readExceptionCode(); return NO_ERROR; } break; @@ -118,23 +130,33 @@ status_t BnCameraDeviceCallbacks::onTransact( case CAPTURE_STARTED: { ALOGV("onCaptureStarted"); CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply); - int32_t requestId = data.readInt32(); + CaptureResultExtras result; + if (data.readInt32() != 0) { + result.readFromParcel(const_cast<Parcel*>(&data)); + } else { + ALOGE("No CaptureResultExtras object is present in result!"); + } int64_t timestamp = data.readInt64(); - onCaptureStarted(requestId, timestamp); + onCaptureStarted(result, timestamp); data.readExceptionCode(); return NO_ERROR; } break; case RESULT_RECEIVED: { ALOGV("onResultReceived"); CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply); - int32_t requestId = data.readInt32(); - CameraMetadata result; + CameraMetadata metadata; if (data.readInt32() != 0) { - result.readFromParcel(const_cast<Parcel*>(&data)); + metadata.readFromParcel(const_cast<Parcel*>(&data)); } else { ALOGW("No metadata object is present in result"); } - onResultReceived(requestId, result); + CaptureResultExtras resultExtras; + if (data.readInt32() != 0) { + resultExtras.readFromParcel(const_cast<Parcel*>(&data)); + } else { + ALOGW("No capture result extras object is present in result"); + } + onResultReceived(metadata, resultExtras); data.readExceptionCode(); return NO_ERROR; } break; diff --git a/camera/camera2/ICameraDeviceUser.cpp b/camera/camera2/ICameraDeviceUser.cpp index 1e5822f..ad65955 100644 --- a/camera/camera2/ICameraDeviceUser.cpp +++ b/camera/camera2/ICameraDeviceUser.cpp @@ -35,6 +35,7 @@ typedef Parcel::ReadableBlob ReadableBlob; enum { DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, SUBMIT_REQUEST, + SUBMIT_REQUEST_LIST, CANCEL_REQUEST, DELETE_STREAM, CREATE_STREAM, @@ -75,7 +76,8 @@ public: reply.readExceptionCode(); } - virtual int submitRequest(sp<CaptureRequest> request, bool streaming) + virtual status_t submitRequest(sp<CaptureRequest> request, bool repeating, + int64_t *lastFrameNumber) { Parcel data, reply; data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); @@ -89,15 +91,67 @@ public: } // arg1 = streaming (bool) - data.writeInt32(streaming); + data.writeInt32(repeating); remote()->transact(SUBMIT_REQUEST, data, &reply); reply.readExceptionCode(); - return reply.readInt32(); + status_t res = reply.readInt32(); + + status_t resFrameNumber = BAD_VALUE; + if (reply.readInt32() != 0) { + if (lastFrameNumber != NULL) { + resFrameNumber = reply.readInt64(lastFrameNumber); + } + } + + if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { + res = FAILED_TRANSACTION; + } + return res; } - virtual status_t cancelRequest(int requestId) + virtual status_t submitRequestList(List<sp<CaptureRequest> > requestList, bool repeating, + int64_t *lastFrameNumber) + { + Parcel data, reply; + data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); + + data.writeInt32(requestList.size()); + + for (List<sp<CaptureRequest> >::iterator it = requestList.begin(); + it != requestList.end(); ++it) { + sp<CaptureRequest> request = *it; + if (request != 0) { + data.writeInt32(1); + if (request->writeToParcel(&data) != OK) { + return BAD_VALUE; + } + } else { + data.writeInt32(0); + } + } + + data.writeInt32(repeating); + + remote()->transact(SUBMIT_REQUEST_LIST, data, &reply); + + reply.readExceptionCode(); + status_t res = reply.readInt32(); + + status_t resFrameNumber = BAD_VALUE; + if (reply.readInt32() != 0) { + if (lastFrameNumber != NULL) { + resFrameNumber = reply.readInt64(lastFrameNumber); + } + } + if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { + res = FAILED_TRANSACTION; + } + return res; + } + + virtual status_t cancelRequest(int requestId, int64_t *lastFrameNumber) { Parcel data, reply; data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); @@ -106,7 +160,18 @@ public: remote()->transact(CANCEL_REQUEST, data, &reply); reply.readExceptionCode(); - return reply.readInt32(); + status_t res = reply.readInt32(); + + status_t resFrameNumber = BAD_VALUE; + if (reply.readInt32() != 0) { + if (lastFrameNumber != NULL) { + res = reply.readInt64(lastFrameNumber); + } + } + if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { + res = FAILED_TRANSACTION; + } + return res; } virtual status_t deleteStream(int streamId) @@ -197,14 +262,25 @@ public: return reply.readInt32(); } - virtual status_t flush() + virtual status_t flush(int64_t *lastFrameNumber) { ALOGV("flush"); Parcel data, reply; data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor()); remote()->transact(FLUSH, data, &reply); reply.readExceptionCode(); - return reply.readInt32(); + status_t res = reply.readInt32(); + + status_t resFrameNumber = BAD_VALUE; + if (reply.readInt32() != 0) { + if (lastFrameNumber != NULL) { + res = reply.readInt64(lastFrameNumber); + } + } + if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { + res = FAILED_TRANSACTION; + } + return res; } private: @@ -239,11 +315,43 @@ status_t BnCameraDeviceUser::onTransact( } // arg1 = streaming (bool) - bool streaming = data.readInt32(); + bool repeating = data.readInt32(); // return code: requestId (int32) reply->writeNoException(); - reply->writeInt32(submitRequest(request, streaming)); + int64_t lastFrameNumber = -1; + reply->writeInt32(submitRequest(request, repeating, &lastFrameNumber)); + reply->writeInt32(1); + reply->writeInt64(lastFrameNumber); + + return NO_ERROR; + } break; + case SUBMIT_REQUEST_LIST: { + CHECK_INTERFACE(ICameraDeviceUser, data, reply); + + List<sp<CaptureRequest> > requestList; + int requestListSize = data.readInt32(); + for (int i = 0; i < requestListSize; i++) { + if (data.readInt32() != 0) { + sp<CaptureRequest> request = new CaptureRequest(); + if (request->readFromParcel(const_cast<Parcel*>(&data)) != OK) { + return BAD_VALUE; + } + requestList.push_back(request); + } else { + sp<CaptureRequest> request = 0; + requestList.push_back(request); + ALOGE("A request is missing. Sending in null request."); + } + } + + bool repeating = data.readInt32(); + + reply->writeNoException(); + int64_t lastFrameNumber = -1; + reply->writeInt32(submitRequestList(requestList, repeating, &lastFrameNumber)); + reply->writeInt32(1); + reply->writeInt64(lastFrameNumber); return NO_ERROR; } break; @@ -251,7 +359,10 @@ status_t BnCameraDeviceUser::onTransact( CHECK_INTERFACE(ICameraDeviceUser, data, reply); int requestId = data.readInt32(); reply->writeNoException(); - reply->writeInt32(cancelRequest(requestId)); + int64_t lastFrameNumber = -1; + reply->writeInt32(cancelRequest(requestId, &lastFrameNumber)); + reply->writeInt32(1); + reply->writeInt64(lastFrameNumber); return NO_ERROR; } break; case DELETE_STREAM: { @@ -339,7 +450,10 @@ status_t BnCameraDeviceUser::onTransact( case FLUSH: { CHECK_INTERFACE(ICameraDeviceUser, data, reply); reply->writeNoException(); - reply->writeInt32(flush()); + int64_t lastFrameNumber = -1; + reply->writeInt32(flush(&lastFrameNumber)); + reply->writeInt32(1); + reply->writeInt64(lastFrameNumber); return NO_ERROR; } default: |