3 ** Copyright 2013, The Android Open Source Project
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
9 ** http://www.apache.org/licenses/LICENSE-2.0
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
18 // #define LOG_NDEBUG 0
19 #define LOG_TAG "IProCameraUser"
20 #include <utils/Log.h>
22 #include <sys/types.h>
23 #include <binder/Parcel.h>
24 #include <camera/IProCameraUser.h>
25 #include <gui/IGraphicBufferProducer.h>
26 #include <gui/Surface.h>
27 #include "camera/CameraMetadata.h"
32 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
42 CREATE_DEFAULT_REQUEST,
46 class BpProCameraUser: public BpInterface<IProCameraUser>
49 BpProCameraUser(const sp<IBinder>& impl)
50 : BpInterface<IProCameraUser>(impl)
54 // disconnect from camera service
59 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
60 remote()->transact(DISCONNECT, data, &reply);
61 reply.readExceptionCode();
64 virtual status_t connect(const sp<IProCameraCallbacks>& cameraClient)
67 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
68 data.writeStrongBinder(cameraClient->asBinder());
69 remote()->transact(CONNECT, data, &reply);
70 return reply.readInt32();
73 /* Shared ProCameraUser */
75 virtual status_t exclusiveTryLock()
78 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
79 remote()->transact(EXCLUSIVE_TRY_LOCK, data, &reply);
80 return reply.readInt32();
82 virtual status_t exclusiveLock()
85 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
86 remote()->transact(EXCLUSIVE_LOCK, data, &reply);
87 return reply.readInt32();
90 virtual status_t exclusiveUnlock()
93 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
94 remote()->transact(EXCLUSIVE_UNLOCK, data, &reply);
95 return reply.readInt32();
98 virtual bool hasExclusiveLock()
101 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
102 remote()->transact(HAS_EXCLUSIVE_LOCK, data, &reply);
103 return !!reply.readInt32();
106 virtual int submitRequest(camera_metadata_t* metadata, bool streaming)
110 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
113 CameraMetadata::writeToParcel(data, metadata);
115 // arg2 = streaming (bool)
116 data.writeInt32(streaming);
118 remote()->transact(SUBMIT_REQUEST, data, &reply);
119 return reply.readInt32();
122 virtual status_t cancelRequest(int requestId)
125 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
126 data.writeInt32(requestId);
128 remote()->transact(CANCEL_REQUEST, data, &reply);
129 return reply.readInt32();
132 virtual status_t deleteStream(int streamId)
135 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
136 data.writeInt32(streamId);
138 remote()->transact(DELETE_STREAM, data, &reply);
139 return reply.readInt32();
142 virtual status_t createStream(int width, int height, int format,
143 const sp<IGraphicBufferProducer>& bufferProducer,
148 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
149 data.writeInt32(width);
150 data.writeInt32(height);
151 data.writeInt32(format);
153 sp<IBinder> b(bufferProducer->asBinder());
154 data.writeStrongBinder(b);
156 remote()->transact(CREATE_STREAM, data, &reply);
158 int sId = reply.readInt32();
162 return reply.readInt32();
165 // Create a request object from a template.
166 virtual status_t createDefaultRequest(int templateId,
168 camera_metadata** request)
171 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
172 data.writeInt32(templateId);
173 remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply);
174 CameraMetadata::readFromParcel(reply, /*out*/request);
175 return reply.readInt32();
179 virtual status_t getCameraInfo(int cameraId, camera_metadata** info)
182 data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
183 data.writeInt32(cameraId);
184 remote()->transact(GET_CAMERA_INFO, data, &reply);
185 CameraMetadata::readFromParcel(reply, /*out*/info);
186 return reply.readInt32();
195 IMPLEMENT_META_INTERFACE(ProCameraUser, "android.hardware.IProCameraUser");
197 // ----------------------------------------------------------------------
199 status_t BnProCameraUser::onTransact(
200 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
205 CHECK_INTERFACE(IProCameraUser, data, reply);
207 reply->writeNoException();
211 CHECK_INTERFACE(IProCameraUser, data, reply);
212 sp<IProCameraCallbacks> cameraClient =
213 interface_cast<IProCameraCallbacks>(data.readStrongBinder());
214 reply->writeInt32(connect(cameraClient));
218 /* Shared ProCameraUser */
219 case EXCLUSIVE_TRY_LOCK: {
220 CHECK_INTERFACE(IProCameraUser, data, reply);
221 reply->writeInt32(exclusiveTryLock());
224 case EXCLUSIVE_LOCK: {
225 CHECK_INTERFACE(IProCameraUser, data, reply);
226 reply->writeInt32(exclusiveLock());
229 case EXCLUSIVE_UNLOCK: {
230 CHECK_INTERFACE(IProCameraUser, data, reply);
231 reply->writeInt32(exclusiveUnlock());
234 case HAS_EXCLUSIVE_LOCK: {
235 CHECK_INTERFACE(IProCameraUser, data, reply);
236 reply->writeInt32(hasExclusiveLock());
239 case SUBMIT_REQUEST: {
240 CHECK_INTERFACE(IProCameraUser, data, reply);
241 camera_metadata_t* metadata;
242 CameraMetadata::readFromParcel(data, /*out*/&metadata);
244 // arg2 = streaming (bool)
245 bool streaming = data.readInt32();
247 // return code: requestId (int32)
248 reply->writeInt32(submitRequest(metadata, streaming));
252 case CANCEL_REQUEST: {
253 CHECK_INTERFACE(IProCameraUser, data, reply);
254 int requestId = data.readInt32();
255 reply->writeInt32(cancelRequest(requestId));
258 case DELETE_STREAM: {
259 CHECK_INTERFACE(IProCameraUser, data, reply);
260 int streamId = data.readInt32();
261 reply->writeInt32(deleteStream(streamId));
264 case CREATE_STREAM: {
265 CHECK_INTERFACE(IProCameraUser, data, reply);
266 int width, height, format;
268 width = data.readInt32();
269 height = data.readInt32();
270 format = data.readInt32();
272 sp<IGraphicBufferProducer> bp =
273 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
277 ret = createStream(width, height, format, bp, &streamId);
279 reply->writeInt32(streamId);
280 reply->writeInt32(ret);
285 case CREATE_DEFAULT_REQUEST: {
286 CHECK_INTERFACE(IProCameraUser, data, reply);
288 int templateId = data.readInt32();
290 camera_metadata_t* request = NULL;
292 ret = createDefaultRequest(templateId, &request);
294 CameraMetadata::writeToParcel(*reply, request);
295 reply->writeInt32(ret);
297 free_camera_metadata(request);
301 case GET_CAMERA_INFO: {
302 CHECK_INTERFACE(IProCameraUser, data, reply);
304 int cameraId = data.readInt32();
306 camera_metadata_t* info = NULL;
308 ret = getCameraInfo(cameraId, &info);
310 CameraMetadata::writeToParcel(*reply, info);
311 reply->writeInt32(ret);
313 free_camera_metadata(info);
318 return BBinder::onTransact(code, data, reply, flags);
322 // ----------------------------------------------------------------------------
324 }; // namespace android