summaryrefslogtreecommitdiffstats
path: root/camera/camera2/ICameraDeviceUser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'camera/camera2/ICameraDeviceUser.cpp')
-rw-r--r--camera/camera2/ICameraDeviceUser.cpp99
1 files changed, 98 insertions, 1 deletions
diff --git a/camera/camera2/ICameraDeviceUser.cpp b/camera/camera2/ICameraDeviceUser.cpp
index 89c6fb7..9700258 100644
--- a/camera/camera2/ICameraDeviceUser.cpp
+++ b/camera/camera2/ICameraDeviceUser.cpp
@@ -42,10 +42,13 @@ enum {
END_CONFIGURE,
DELETE_STREAM,
CREATE_STREAM,
+ CREATE_INPUT_STREAM,
+ GET_INPUT_SURFACE,
CREATE_DEFAULT_REQUEST,
GET_CAMERA_INFO,
WAIT_UNTIL_IDLE,
- FLUSH
+ FLUSH,
+ PREPARE
};
namespace {
@@ -225,6 +228,50 @@ public:
return reply.readInt32();
}
+ virtual status_t createInputStream(int width, int height, int format)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
+ data.writeInt32(width);
+ data.writeInt32(height);
+ data.writeInt32(format);
+
+ remote()->transact(CREATE_INPUT_STREAM, data, &reply);
+
+ reply.readExceptionCode();
+ return reply.readInt32();
+ }
+
+ // get the buffer producer of the input stream
+ virtual status_t getInputBufferProducer(
+ sp<IGraphicBufferProducer> *producer) {
+ if (producer == NULL) {
+ return BAD_VALUE;
+ }
+
+ Parcel data, reply;
+ data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
+
+ remote()->transact(GET_INPUT_SURFACE, data, &reply);
+
+ reply.readExceptionCode();
+ status_t result = reply.readInt32() ;
+ if (result != OK) {
+ return result;
+ }
+
+ sp<IGraphicBufferProducer> bp = NULL;
+ if (reply.readInt32() != 0) {
+ String16 name = readMaybeEmptyString16(reply);
+ bp = interface_cast<IGraphicBufferProducer>(
+ reply.readStrongBinder());
+ }
+
+ *producer = bp;
+
+ return *producer == NULL ? INVALID_OPERATION : OK;
+ }
+
// Create a request object from a template.
virtual status_t createDefaultRequest(int templateId,
/*out*/
@@ -302,6 +349,20 @@ public:
return res;
}
+ virtual status_t prepare(int streamId)
+ {
+ ALOGV("prepare");
+ Parcel data, reply;
+
+ data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
+ data.writeInt32(streamId);
+
+ remote()->transact(PREPARE, data, &reply);
+
+ reply.readExceptionCode();
+ return reply.readInt32();
+ }
+
private:
@@ -409,7 +470,35 @@ status_t BnCameraDeviceUser::onTransact(
return NO_ERROR;
} break;
+ case CREATE_INPUT_STREAM: {
+ CHECK_INTERFACE(ICameraDeviceUser, data, reply);
+ int width, height, format;
+
+ width = data.readInt32();
+ height = data.readInt32();
+ format = data.readInt32();
+ status_t ret = createInputStream(width, height, format);
+
+ reply->writeNoException();
+ reply->writeInt32(ret);
+ return NO_ERROR;
+
+ } break;
+ case GET_INPUT_SURFACE: {
+ CHECK_INTERFACE(ICameraDeviceUser, data, reply);
+
+ sp<IGraphicBufferProducer> bp;
+ status_t ret = getInputBufferProducer(&bp);
+ sp<IBinder> b(IInterface::asBinder(ret == OK ? bp : NULL));
+ reply->writeNoException();
+ reply->writeInt32(ret);
+ reply->writeInt32(1);
+ reply->writeString16(String16("camera input")); // name of surface
+ reply->writeStrongBinder(b);
+
+ return NO_ERROR;
+ } break;
case CREATE_DEFAULT_REQUEST: {
CHECK_INTERFACE(ICameraDeviceUser, data, reply);
@@ -471,6 +560,14 @@ status_t BnCameraDeviceUser::onTransact(
reply->writeInt32(endConfigure());
return NO_ERROR;
} break;
+ case PREPARE: {
+ CHECK_INTERFACE(ICameraDeviceUser, data, reply);
+ int streamId = data.readInt32();
+ reply->writeNoException();
+ reply->writeInt32(prepare(streamId));
+ return NO_ERROR;
+ } break;
+
default:
return BBinder::onTransact(code, data, reply, flags);
}