From f1e98d857ec377f2c9b916073d40732e6ebb7ced Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Fri, 6 Sep 2013 09:32:43 -0700 Subject: Camera API 2, Device 2/3: Implement idle and shutter callbacks - Update callback Binder interface - Rename frameId to be requestId to be consistent and disambiguate from frameNumber. - Implement shutter callback from HAL2/3 notify() - Add in-flight tracking to HAL2 - Add requestId to in-flight tracking - Report requestId from shutter callback - Implement idle callback from HAL3 process_capture_result - Add new idle tracker thread - Update all idle waiting to use the tracker - Add reporting from request thread, all streams to tracker - Remove existing idle waiting infrastructure Bug: 10549462 Change-Id: I867bfc248e3848c50e71527e3561fe92dc037958 --- camera/IProCameraCallbacks.cpp | 8 ++-- camera/ProCamera.cpp | 6 +-- camera/camera2/ICameraDeviceCallbacks.cpp | 68 +++++++++++++++++++++++-------- camera/tests/ProCameraTests.cpp | 5 +-- 4 files changed, 60 insertions(+), 27 deletions(-) (limited to 'camera') diff --git a/camera/IProCameraCallbacks.cpp b/camera/IProCameraCallbacks.cpp index 0fdb85a..bd3d420 100644 --- a/camera/IProCameraCallbacks.cpp +++ b/camera/IProCameraCallbacks.cpp @@ -67,11 +67,11 @@ public: IBinder::FLAG_ONEWAY); } - void onResultReceived(int32_t frameId, camera_metadata* result) { + void onResultReceived(int32_t requestId, camera_metadata* result) { ALOGV("onResultReceived"); Parcel data, reply; data.writeInterfaceToken(IProCameraCallbacks::getInterfaceDescriptor()); - data.writeInt32(frameId); + data.writeInt32(requestId); CameraMetadata::writeToParcel(data, result); remote()->transact(RESULT_RECEIVED, data, &reply, IBinder::FLAG_ONEWAY); } @@ -107,10 +107,10 @@ status_t BnProCameraCallbacks::onTransact( case RESULT_RECEIVED: { ALOGV("RESULT_RECEIVED"); CHECK_INTERFACE(IProCameraCallbacks, data, reply); - int32_t frameId = data.readInt32(); + int32_t requestId = data.readInt32(); camera_metadata_t *result = NULL; CameraMetadata::readFromParcel(data, &result); - onResultReceived(frameId, result); + onResultReceived(requestId, result); return NO_ERROR; break; } diff --git a/camera/ProCamera.cpp b/camera/ProCamera.cpp index 577c760..ba5a48c 100644 --- a/camera/ProCamera.cpp +++ b/camera/ProCamera.cpp @@ -90,8 +90,8 @@ void ProCamera::onLockStatusChanged( } } -void ProCamera::onResultReceived(int32_t frameId, camera_metadata* result) { - ALOGV("%s: frameId = %d, result = %p", __FUNCTION__, frameId, result); +void ProCamera::onResultReceived(int32_t requestId, camera_metadata* result) { + ALOGV("%s: requestId = %d, result = %p", __FUNCTION__, requestId, result); sp listener; { @@ -112,7 +112,7 @@ void ProCamera::onResultReceived(int32_t frameId, camera_metadata* result) { result = tmp.release(); if (listener != NULL) { - listener->onResultReceived(frameId, result); + listener->onResultReceived(requestId, result); } else { free_camera_metadata(result); } diff --git a/camera/camera2/ICameraDeviceCallbacks.cpp b/camera/camera2/ICameraDeviceCallbacks.cpp index 3cec1f4..613358a 100644 --- a/camera/camera2/ICameraDeviceCallbacks.cpp +++ b/camera/camera2/ICameraDeviceCallbacks.cpp @@ -32,7 +32,9 @@ namespace android { enum { - NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION, + CAMERA_ERROR = IBinder::FIRST_CALL_TRANSACTION, + CAMERA_IDLE, + CAPTURE_STARTED, RESULT_RECEIVED, }; @@ -44,19 +46,37 @@ public: { } - // generic callback from camera service to app - void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) + void onDeviceError(CameraErrorCode errorCode) { - ALOGV("notifyCallback"); + ALOGV("onDeviceError"); Parcel data, reply; data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor()); - data.writeInt32(msgType); - data.writeInt32(ext1); - data.writeInt32(ext2); - remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); + data.writeInt32(static_cast(errorCode)); + remote()->transact(CAMERA_ERROR, data, &reply, IBinder::FLAG_ONEWAY); data.writeNoException(); } + void onDeviceIdle() + { + ALOGV("onDeviceIdle"); + Parcel data, reply; + data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor()); + remote()->transact(CAMERA_IDLE, data, &reply, IBinder::FLAG_ONEWAY); + data.writeNoException(); + } + + void onCaptureStarted(int32_t requestId, int64_t timestamp) + { + ALOGV("onCaptureStarted"); + Parcel data, reply; + data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor()); + data.writeInt32(requestId); + data.writeInt64(timestamp); + remote()->transact(CAPTURE_STARTED, data, &reply, IBinder::FLAG_ONEWAY); + data.writeNoException(); + } + + void onResultReceived(int32_t requestId, const CameraMetadata& result) { ALOGV("onResultReceived"); Parcel data, reply; @@ -79,18 +99,33 @@ status_t BnCameraDeviceCallbacks::onTransact( { ALOGV("onTransact - code = %d", code); switch(code) { - case NOTIFY_CALLBACK: { - ALOGV("NOTIFY_CALLBACK"); + case CAMERA_ERROR: { + ALOGV("onDeviceError"); + CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply); + CameraErrorCode errorCode = + static_cast(data.readInt32()); + onDeviceError(errorCode); + data.readExceptionCode(); + return NO_ERROR; + } break; + case CAMERA_IDLE: { + ALOGV("onDeviceIdle"); CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply); - int32_t msgType = data.readInt32(); - int32_t ext1 = data.readInt32(); - int32_t ext2 = data.readInt32(); - notifyCallback(msgType, ext1, ext2); + onDeviceIdle(); + data.readExceptionCode(); + return NO_ERROR; + } break; + case CAPTURE_STARTED: { + ALOGV("onCaptureStarted"); + CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply); + int32_t requestId = data.readInt32(); + int64_t timestamp = data.readInt64(); + onCaptureStarted(requestId, timestamp); data.readExceptionCode(); return NO_ERROR; } break; case RESULT_RECEIVED: { - ALOGV("RESULT_RECEIVED"); + ALOGV("onResultReceived"); CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply); int32_t requestId = data.readInt32(); CameraMetadata result; @@ -102,8 +137,7 @@ status_t BnCameraDeviceCallbacks::onTransact( onResultReceived(requestId, result); data.readExceptionCode(); return NO_ERROR; - break; - } + } break; default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/camera/tests/ProCameraTests.cpp b/camera/tests/ProCameraTests.cpp index e9aa99d..1f5867a 100644 --- a/camera/tests/ProCameraTests.cpp +++ b/camera/tests/ProCameraTests.cpp @@ -284,9 +284,9 @@ protected: } } - virtual void onResultReceived(int32_t frameId, + virtual void onResultReceived(int32_t requestId, camera_metadata* request) { - dout << "Result received frameId = " << frameId + dout << "Result received requestId = " << requestId << ", requestPtr = " << (void*)request << std::endl; QueueEvent(RESULT_RECEIVED); free_camera_metadata(request); @@ -1276,4 +1276,3 @@ TEST_F(ProCameraTest, ServiceListenersFunctional) { } } } - -- cgit v1.1