diff options
-rw-r--r-- | include/ui/Camera.h | 2 | ||||
-rw-r--r-- | include/ui/ICameraClient.h | 19 | ||||
-rw-r--r-- | libs/ui/Camera.cpp | 12 | ||||
-rw-r--r-- | libs/ui/ICameraClient.cpp | 43 |
4 files changed, 76 insertions, 0 deletions
diff --git a/include/ui/Camera.h b/include/ui/Camera.h index fd851d9efcf1..901c7a98f9a1 100644 --- a/include/ui/Camera.h +++ b/include/ui/Camera.h @@ -143,6 +143,8 @@ public: virtual void errorCallback(status_t error); virtual void autoFocusCallback(bool focused); virtual void recordingCallback(const sp<IMemory>& frame); + virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); + virtual void dataCallback(int32_t msgType, const sp<IMemory>& frame); sp<ICamera> remote(); diff --git a/include/ui/ICameraClient.h b/include/ui/ICameraClient.h index 73b951cf3cc0..1645ef802686 100644 --- a/include/ui/ICameraClient.h +++ b/include/ui/ICameraClient.h @@ -29,6 +29,23 @@ class ICameraClient: public IInterface public: DECLARE_META_INTERFACE(CameraClient); + // msgType in notifyCallback function + enum { + ERROR, + SHUTTER, + FOCUSED, + ZOOM + } notify_callback_message_type; + + // msgType in dataCallback function + enum { + PREVIEW, + RECORD, + POSTVIEW, + RAW, + COMPRESSED + } data_callback_message_type; + virtual void shutterCallback() = 0; virtual void rawCallback(const sp<IMemory>& picture) = 0; virtual void jpegCallback(const sp<IMemory>& picture) = 0; @@ -36,6 +53,8 @@ public: virtual void errorCallback(status_t error) = 0; virtual void autoFocusCallback(bool focused) = 0; virtual void recordingCallback(const sp<IMemory>& frame) = 0; + virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) = 0; + virtual void dataCallback(int32_t msgType, const sp<IMemory>& data) = 0; }; diff --git a/libs/ui/Camera.cpp b/libs/ui/Camera.cpp index 41577c45574a..ed4f3b82d830 100644 --- a/libs/ui/Camera.cpp +++ b/libs/ui/Camera.cpp @@ -397,6 +397,18 @@ void Camera::errorCallback(status_t error) } } +// callback from camera service +void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) +{ + LOGV("notifyCallback"); +} + +// callback from camera service when image is ready +void Camera::dataCallback(int32_t msgType, const sp<IMemory>& frame) +{ + LOGV("dataCallback"); +} + void Camera::binderDied(const wp<IBinder>& who) { LOGW("ICamera died"); if (mErrorCallback) { diff --git a/libs/ui/ICameraClient.cpp b/libs/ui/ICameraClient.cpp index 4bec9d2ae6c3..ae07b67a8ead 100644 --- a/libs/ui/ICameraClient.cpp +++ b/libs/ui/ICameraClient.cpp @@ -32,6 +32,8 @@ enum { ERROR_CALLBACK, AUTOFOCUS_CALLBACK, RECORDING_CALLBACK, + NOTIFY_CALLBACK, + DATA_CALLBACK, }; class BpCameraClient: public BpInterface<ICameraClient> @@ -110,6 +112,30 @@ public: data.writeInt32(focused); remote()->transact(AUTOFOCUS_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); } + + // generic callback from camera service to app + void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) + { + LOGV("notifyCallback"); + Parcel data, reply; + data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); + data.writeInt32(msgType); + data.writeInt32(ext1); + data.writeInt32(ext2); + remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); + } + + // generic data callback from camera service to app with image data + void dataCallback(int32_t msgType, const sp<IMemory>& imageData) + { + LOGV("dataCallback"); + Parcel data, reply; + data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor()); + data.writeInt32(msgType); + data.writeStrongBinder(imageData->asBinder()); + remote()->transact(DATA_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY); + } + }; IMPLEMENT_META_INTERFACE(CameraClient, "android.hardware.ICameraClient"); @@ -174,6 +200,23 @@ status_t BnCameraClient::onTransact( autoFocusCallback(focused); return NO_ERROR; } break; + case NOTIFY_CALLBACK: { + LOGV("NOTIFY_CALLBACK"); + CHECK_INTERFACE(ICameraClient, data, reply); + int32_t msgType = data.readInt32(); + int32_t ext1 = data.readInt32(); + int32_t ext2 = data.readInt32(); + notifyCallback(msgType, ext1, ext2); + return NO_ERROR; + } break; + case DATA_CALLBACK: { + LOGV("RAW_CALLBACK"); + CHECK_INTERFACE(ICameraClient, data, reply); + int32_t msgType = data.readInt32(); + sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder()); + dataCallback(msgType, imageData); + return NO_ERROR; + } break; default: return BBinder::onTransact(code, data, reply, flags); } |