summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ui/Camera.h2
-rw-r--r--include/ui/ICameraClient.h19
-rw-r--r--libs/ui/Camera.cpp12
-rw-r--r--libs/ui/ICameraClient.cpp43
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);
}