Add new binder methods to camera client to support generic callbacks
This is the first step in a multi-step change to move from the old specific callbacks to a generic callback. This will allow future flexibility in the interface without requiring binder rewrites. Bug 1837832
This commit is contained in:
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user