blob: 2a9fd2b2d1e0d824b025191d15df97d5e858518f [file] [log] [blame]
Igor Murashkine7ee7632013-06-11 18:10:18 -07001/*
2**
3** Copyright 2013, The Android Open Source Project
4**
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
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
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.
16*/
17
18// #define LOG_NDEBUG 0
19#define LOG_TAG "ICameraDeviceUser"
20#include <utils/Log.h>
21#include <stdint.h>
22#include <sys/types.h>
23#include <binder/Parcel.h>
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070024#include <camera/camera2/ICameraDeviceUser.h>
Igor Murashkine7ee7632013-06-11 18:10:18 -070025#include <gui/IGraphicBufferProducer.h>
26#include <gui/Surface.h>
27#include <camera/CameraMetadata.h>
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070028#include <camera/camera2/CaptureRequest.h>
Yin-Chia Yehb97babb2015-03-12 13:42:44 -070029#include <camera/camera2/OutputConfiguration.h>
Igor Murashkine7ee7632013-06-11 18:10:18 -070030
31namespace android {
32
33typedef Parcel::WritableBlob WritableBlob;
34typedef Parcel::ReadableBlob ReadableBlob;
35
36enum {
37 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
38 SUBMIT_REQUEST,
Jianing Weicb0652e2014-03-12 18:29:36 -070039 SUBMIT_REQUEST_LIST,
Igor Murashkine7ee7632013-06-11 18:10:18 -070040 CANCEL_REQUEST,
Ruben Brunk29478402014-05-22 13:09:57 -070041 BEGIN_CONFIGURE,
42 END_CONFIGURE,
Igor Murashkine7ee7632013-06-11 18:10:18 -070043 DELETE_STREAM,
44 CREATE_STREAM,
Chien-Yu Chen618ff8a2015-03-13 11:27:17 -070045 CREATE_INPUT_STREAM,
46 GET_INPUT_SURFACE,
Igor Murashkine7ee7632013-06-11 18:10:18 -070047 CREATE_DEFAULT_REQUEST,
48 GET_CAMERA_INFO,
Zhijun He2ab500c2013-07-23 08:02:53 -070049 WAIT_UNTIL_IDLE,
Eino-Ville Talvala4d44cad2015-04-11 13:15:45 -070050 FLUSH,
Eino-Ville Talvalab25e3c82015-07-15 16:04:27 -070051 PREPARE,
Ruben Brunkc78ac262015-08-13 17:58:46 -070052 TEAR_DOWN,
53 PREPARE2
Igor Murashkine7ee7632013-06-11 18:10:18 -070054};
55
Igor Murashkin88aef232013-08-23 17:47:06 -070056namespace {
57 // Read empty strings without printing a false error message.
58 String16 readMaybeEmptyString16(const Parcel& parcel) {
59 size_t len;
60 const char16_t* str = parcel.readString16Inplace(&len);
61 if (str != NULL) {
62 return String16(str, len);
63 } else {
64 return String16();
65 }
66 }
67};
68
Igor Murashkine7ee7632013-06-11 18:10:18 -070069class BpCameraDeviceUser : public BpInterface<ICameraDeviceUser>
70{
71public:
72 BpCameraDeviceUser(const sp<IBinder>& impl)
73 : BpInterface<ICameraDeviceUser>(impl)
74 {
75 }
76
77 // disconnect from camera service
78 void disconnect()
79 {
80 ALOGV("disconnect");
81 Parcel data, reply;
82 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
83 remote()->transact(DISCONNECT, data, &reply);
84 reply.readExceptionCode();
85 }
86
Ruben Brunk3450ba72015-06-16 11:00:37 -070087 virtual int submitRequest(sp<CaptureRequest> request, bool repeating,
Jianing Weicb0652e2014-03-12 18:29:36 -070088 int64_t *lastFrameNumber)
Igor Murashkine7ee7632013-06-11 18:10:18 -070089 {
90 Parcel data, reply;
91 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
92
93 // arg0 = CaptureRequest
94 if (request != 0) {
95 data.writeInt32(1);
96 request->writeToParcel(&data);
97 } else {
98 data.writeInt32(0);
99 }
100
101 // arg1 = streaming (bool)
Jianing Weicb0652e2014-03-12 18:29:36 -0700102 data.writeInt32(repeating);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700103
104 remote()->transact(SUBMIT_REQUEST, data, &reply);
105
106 reply.readExceptionCode();
Jianing Weicb0652e2014-03-12 18:29:36 -0700107 status_t res = reply.readInt32();
108
109 status_t resFrameNumber = BAD_VALUE;
110 if (reply.readInt32() != 0) {
111 if (lastFrameNumber != NULL) {
112 resFrameNumber = reply.readInt64(lastFrameNumber);
113 }
114 }
115
Ruben Brunk3450ba72015-06-16 11:00:37 -0700116 if (res < 0 || (resFrameNumber != NO_ERROR)) {
Jianing Weicb0652e2014-03-12 18:29:36 -0700117 res = FAILED_TRANSACTION;
118 }
119 return res;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700120 }
121
Ruben Brunk3450ba72015-06-16 11:00:37 -0700122 virtual int submitRequestList(List<sp<CaptureRequest> > requestList, bool repeating,
Jianing Weicb0652e2014-03-12 18:29:36 -0700123 int64_t *lastFrameNumber)
124 {
125 Parcel data, reply;
126 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
127
128 data.writeInt32(requestList.size());
129
130 for (List<sp<CaptureRequest> >::iterator it = requestList.begin();
131 it != requestList.end(); ++it) {
132 sp<CaptureRequest> request = *it;
133 if (request != 0) {
134 data.writeInt32(1);
135 if (request->writeToParcel(&data) != OK) {
136 return BAD_VALUE;
137 }
138 } else {
139 data.writeInt32(0);
140 }
141 }
142
143 data.writeInt32(repeating);
144
145 remote()->transact(SUBMIT_REQUEST_LIST, data, &reply);
146
147 reply.readExceptionCode();
148 status_t res = reply.readInt32();
149
150 status_t resFrameNumber = BAD_VALUE;
151 if (reply.readInt32() != 0) {
152 if (lastFrameNumber != NULL) {
153 resFrameNumber = reply.readInt64(lastFrameNumber);
154 }
155 }
Ruben Brunk3450ba72015-06-16 11:00:37 -0700156 if (res < 0 || (resFrameNumber != NO_ERROR)) {
Jianing Weicb0652e2014-03-12 18:29:36 -0700157 res = FAILED_TRANSACTION;
158 }
159 return res;
160 }
161
162 virtual status_t cancelRequest(int requestId, int64_t *lastFrameNumber)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700163 {
164 Parcel data, reply;
165 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
166 data.writeInt32(requestId);
167
168 remote()->transact(CANCEL_REQUEST, data, &reply);
169
170 reply.readExceptionCode();
Jianing Weicb0652e2014-03-12 18:29:36 -0700171 status_t res = reply.readInt32();
172
173 status_t resFrameNumber = BAD_VALUE;
174 if (reply.readInt32() != 0) {
175 if (lastFrameNumber != NULL) {
John Lin19fa0fe2015-02-02 18:10:42 +0800176 resFrameNumber = reply.readInt64(lastFrameNumber);
Jianing Weicb0652e2014-03-12 18:29:36 -0700177 }
178 }
179 if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) {
180 res = FAILED_TRANSACTION;
181 }
182 return res;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700183 }
184
Ruben Brunk29478402014-05-22 13:09:57 -0700185 virtual status_t beginConfigure()
186 {
187 ALOGV("beginConfigure");
188 Parcel data, reply;
189 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
190 remote()->transact(BEGIN_CONFIGURE, data, &reply);
191 reply.readExceptionCode();
192 return reply.readInt32();
193 }
194
Zhijun He1fa89992015-06-01 15:44:31 -0700195 virtual status_t endConfigure(bool isConstrainedHighSpeed)
Ruben Brunk29478402014-05-22 13:09:57 -0700196 {
197 ALOGV("endConfigure");
198 Parcel data, reply;
199 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
Zhijun He1fa89992015-06-01 15:44:31 -0700200 data.writeInt32(isConstrainedHighSpeed);
201
Ruben Brunk29478402014-05-22 13:09:57 -0700202 remote()->transact(END_CONFIGURE, data, &reply);
203 reply.readExceptionCode();
204 return reply.readInt32();
205 }
206
Igor Murashkine7ee7632013-06-11 18:10:18 -0700207 virtual status_t deleteStream(int streamId)
208 {
209 Parcel data, reply;
210 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
211 data.writeInt32(streamId);
212
213 remote()->transact(DELETE_STREAM, data, &reply);
214
215 reply.readExceptionCode();
216 return reply.readInt32();
217 }
218
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700219 virtual status_t createStream(const OutputConfiguration& outputConfiguration)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700220 {
221 Parcel data, reply;
222 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700223 if (outputConfiguration.getGraphicBufferProducer() != NULL) {
224 data.writeInt32(1); // marker that OutputConfiguration is not null. Mimic aidl behavior
225 outputConfiguration.writeToParcel(data);
226 } else {
227 data.writeInt32(0);
228 }
Igor Murashkine7ee7632013-06-11 18:10:18 -0700229 remote()->transact(CREATE_STREAM, data, &reply);
230
231 reply.readExceptionCode();
232 return reply.readInt32();
233 }
234
Chien-Yu Chen618ff8a2015-03-13 11:27:17 -0700235 virtual status_t createInputStream(int width, int height, int format)
236 {
237 Parcel data, reply;
238 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
239 data.writeInt32(width);
240 data.writeInt32(height);
241 data.writeInt32(format);
242
243 remote()->transact(CREATE_INPUT_STREAM, data, &reply);
244
245 reply.readExceptionCode();
246 return reply.readInt32();
247 }
248
249 // get the buffer producer of the input stream
250 virtual status_t getInputBufferProducer(
251 sp<IGraphicBufferProducer> *producer) {
252 if (producer == NULL) {
253 return BAD_VALUE;
254 }
255
256 Parcel data, reply;
257 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
258
259 remote()->transact(GET_INPUT_SURFACE, data, &reply);
260
261 reply.readExceptionCode();
262 status_t result = reply.readInt32() ;
263 if (result != OK) {
264 return result;
265 }
266
267 sp<IGraphicBufferProducer> bp = NULL;
268 if (reply.readInt32() != 0) {
269 String16 name = readMaybeEmptyString16(reply);
270 bp = interface_cast<IGraphicBufferProducer>(
271 reply.readStrongBinder());
272 }
273
274 *producer = bp;
275
276 return *producer == NULL ? INVALID_OPERATION : OK;
277 }
278
Igor Murashkine7ee7632013-06-11 18:10:18 -0700279 // Create a request object from a template.
280 virtual status_t createDefaultRequest(int templateId,
281 /*out*/
282 CameraMetadata* request)
283 {
284 Parcel data, reply;
285 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
286 data.writeInt32(templateId);
287 remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply);
288
289 reply.readExceptionCode();
290 status_t result = reply.readInt32();
291
292 CameraMetadata out;
293 if (reply.readInt32() != 0) {
294 out.readFromParcel(&reply);
295 }
296
297 if (request != NULL) {
298 request->swap(out);
299 }
300 return result;
301 }
302
303
Igor Murashkin099b4572013-07-12 17:52:16 -0700304 virtual status_t getCameraInfo(CameraMetadata* info)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700305 {
306 Parcel data, reply;
307 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
Igor Murashkine7ee7632013-06-11 18:10:18 -0700308 remote()->transact(GET_CAMERA_INFO, data, &reply);
309
Igor Murashkine7ee7632013-06-11 18:10:18 -0700310 reply.readExceptionCode();
311 status_t result = reply.readInt32();
312
Igor Murashkin099b4572013-07-12 17:52:16 -0700313 CameraMetadata out;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700314 if (reply.readInt32() != 0) {
Igor Murashkin099b4572013-07-12 17:52:16 -0700315 out.readFromParcel(&reply);
316 }
317
318 if (info != NULL) {
319 info->swap(out);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700320 }
321
322 return result;
323 }
324
Zhijun He2ab500c2013-07-23 08:02:53 -0700325 virtual status_t waitUntilIdle()
326 {
327 ALOGV("waitUntilIdle");
328 Parcel data, reply;
329 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
330 remote()->transact(WAIT_UNTIL_IDLE, data, &reply);
331 reply.readExceptionCode();
332 return reply.readInt32();
333 }
Igor Murashkine7ee7632013-06-11 18:10:18 -0700334
Jianing Weicb0652e2014-03-12 18:29:36 -0700335 virtual status_t flush(int64_t *lastFrameNumber)
Eino-Ville Talvalaabaa51d2013-08-14 11:37:00 -0700336 {
337 ALOGV("flush");
338 Parcel data, reply;
339 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
340 remote()->transact(FLUSH, data, &reply);
341 reply.readExceptionCode();
Jianing Weicb0652e2014-03-12 18:29:36 -0700342 status_t res = reply.readInt32();
343
344 status_t resFrameNumber = BAD_VALUE;
345 if (reply.readInt32() != 0) {
346 if (lastFrameNumber != NULL) {
John Lin19fa0fe2015-02-02 18:10:42 +0800347 resFrameNumber = reply.readInt64(lastFrameNumber);
Jianing Weicb0652e2014-03-12 18:29:36 -0700348 }
349 }
350 if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) {
351 res = FAILED_TRANSACTION;
352 }
353 return res;
Eino-Ville Talvalaabaa51d2013-08-14 11:37:00 -0700354 }
355
Eino-Ville Talvala4d44cad2015-04-11 13:15:45 -0700356 virtual status_t prepare(int streamId)
357 {
358 ALOGV("prepare");
359 Parcel data, reply;
360
361 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
362 data.writeInt32(streamId);
363
364 remote()->transact(PREPARE, data, &reply);
365
366 reply.readExceptionCode();
367 return reply.readInt32();
368 }
369
Ruben Brunkc78ac262015-08-13 17:58:46 -0700370 virtual status_t prepare2(int maxCount, int streamId)
371 {
372 ALOGV("prepare2");
373 Parcel data, reply;
374
375 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
376 data.writeInt32(maxCount);
377 data.writeInt32(streamId);
378
379 remote()->transact(PREPARE2, data, &reply);
380
381 reply.readExceptionCode();
382 return reply.readInt32();
383 }
384
Eino-Ville Talvalab25e3c82015-07-15 16:04:27 -0700385 virtual status_t tearDown(int streamId)
386 {
387 ALOGV("tearDown");
388 Parcel data, reply;
389
390 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
391 data.writeInt32(streamId);
392
393 remote()->transact(TEAR_DOWN, data, &reply);
394
395 reply.readExceptionCode();
396 return reply.readInt32();
397 }
398
Igor Murashkine7ee7632013-06-11 18:10:18 -0700399private:
400
401
402};
403
404IMPLEMENT_META_INTERFACE(CameraDeviceUser,
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -0700405 "android.hardware.camera2.ICameraDeviceUser");
Igor Murashkine7ee7632013-06-11 18:10:18 -0700406
407// ----------------------------------------------------------------------
408
409status_t BnCameraDeviceUser::onTransact(
410 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
411{
412 switch(code) {
413 case DISCONNECT: {
414 ALOGV("DISCONNECT");
415 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
416 disconnect();
417 reply->writeNoException();
418 return NO_ERROR;
419 } break;
420 case SUBMIT_REQUEST: {
421 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
422
423 // arg0 = request
424 sp<CaptureRequest> request;
425 if (data.readInt32() != 0) {
426 request = new CaptureRequest();
427 request->readFromParcel(const_cast<Parcel*>(&data));
428 }
429
430 // arg1 = streaming (bool)
Jianing Weicb0652e2014-03-12 18:29:36 -0700431 bool repeating = data.readInt32();
Igor Murashkine7ee7632013-06-11 18:10:18 -0700432
433 // return code: requestId (int32)
434 reply->writeNoException();
Jianing Weicb0652e2014-03-12 18:29:36 -0700435 int64_t lastFrameNumber = -1;
436 reply->writeInt32(submitRequest(request, repeating, &lastFrameNumber));
437 reply->writeInt32(1);
438 reply->writeInt64(lastFrameNumber);
439
440 return NO_ERROR;
441 } break;
442 case SUBMIT_REQUEST_LIST: {
443 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
444
445 List<sp<CaptureRequest> > requestList;
446 int requestListSize = data.readInt32();
447 for (int i = 0; i < requestListSize; i++) {
448 if (data.readInt32() != 0) {
449 sp<CaptureRequest> request = new CaptureRequest();
450 if (request->readFromParcel(const_cast<Parcel*>(&data)) != OK) {
451 return BAD_VALUE;
452 }
453 requestList.push_back(request);
454 } else {
455 sp<CaptureRequest> request = 0;
456 requestList.push_back(request);
457 ALOGE("A request is missing. Sending in null request.");
458 }
459 }
460
461 bool repeating = data.readInt32();
462
463 reply->writeNoException();
464 int64_t lastFrameNumber = -1;
465 reply->writeInt32(submitRequestList(requestList, repeating, &lastFrameNumber));
466 reply->writeInt32(1);
467 reply->writeInt64(lastFrameNumber);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700468
469 return NO_ERROR;
470 } break;
471 case CANCEL_REQUEST: {
472 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
473 int requestId = data.readInt32();
474 reply->writeNoException();
Jianing Weicb0652e2014-03-12 18:29:36 -0700475 int64_t lastFrameNumber = -1;
476 reply->writeInt32(cancelRequest(requestId, &lastFrameNumber));
477 reply->writeInt32(1);
478 reply->writeInt64(lastFrameNumber);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700479 return NO_ERROR;
480 } break;
481 case DELETE_STREAM: {
482 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
483 int streamId = data.readInt32();
484 reply->writeNoException();
485 reply->writeInt32(deleteStream(streamId));
486 return NO_ERROR;
487 } break;
488 case CREATE_STREAM: {
489 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700490
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700491 status_t ret = BAD_VALUE;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700492 if (data.readInt32() != 0) {
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700493 OutputConfiguration outputConfiguration(data);
494 ret = createStream(outputConfiguration);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700495 } else {
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700496 ALOGE("%s: cannot take an empty OutputConfiguration", __FUNCTION__);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700497 }
498
Igor Murashkine7ee7632013-06-11 18:10:18 -0700499 reply->writeNoException();
500 ALOGV("%s: CREATE_STREAM: write noException", __FUNCTION__);
501 reply->writeInt32(ret);
502 ALOGV("%s: CREATE_STREAM: write ret = %d", __FUNCTION__, ret);
503
504 return NO_ERROR;
505 } break;
Chien-Yu Chen618ff8a2015-03-13 11:27:17 -0700506 case CREATE_INPUT_STREAM: {
507 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
508 int width, height, format;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700509
Chien-Yu Chen618ff8a2015-03-13 11:27:17 -0700510 width = data.readInt32();
511 height = data.readInt32();
512 format = data.readInt32();
513 status_t ret = createInputStream(width, height, format);
514
515 reply->writeNoException();
516 reply->writeInt32(ret);
517 return NO_ERROR;
518
519 } break;
520 case GET_INPUT_SURFACE: {
521 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
522
523 sp<IGraphicBufferProducer> bp;
524 status_t ret = getInputBufferProducer(&bp);
525 sp<IBinder> b(IInterface::asBinder(ret == OK ? bp : NULL));
526
527 reply->writeNoException();
528 reply->writeInt32(ret);
529 reply->writeInt32(1);
530 reply->writeString16(String16("camera input")); // name of surface
531 reply->writeStrongBinder(b);
532
533 return NO_ERROR;
534 } break;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700535 case CREATE_DEFAULT_REQUEST: {
536 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
537
538 int templateId = data.readInt32();
539
540 CameraMetadata request;
541 status_t ret;
542 ret = createDefaultRequest(templateId, &request);
543
544 reply->writeNoException();
545 reply->writeInt32(ret);
546
Igor Murashkin099b4572013-07-12 17:52:16 -0700547 // out-variables are after exception and return value
Igor Murashkine7ee7632013-06-11 18:10:18 -0700548 reply->writeInt32(1); // to mark presence of metadata object
549 request.writeToParcel(const_cast<Parcel*>(reply));
550
551 return NO_ERROR;
552 } break;
553 case GET_CAMERA_INFO: {
554 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
555
Igor Murashkin099b4572013-07-12 17:52:16 -0700556 CameraMetadata info;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700557 status_t ret;
Igor Murashkin099b4572013-07-12 17:52:16 -0700558 ret = getCameraInfo(&info);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700559
560 reply->writeNoException();
561 reply->writeInt32(ret);
562
Igor Murashkin099b4572013-07-12 17:52:16 -0700563 // out-variables are after exception and return value
564 reply->writeInt32(1); // to mark presence of metadata object
565 info.writeToParcel(reply);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700566
567 return NO_ERROR;
568 } break;
Zhijun He2ab500c2013-07-23 08:02:53 -0700569 case WAIT_UNTIL_IDLE: {
570 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
571 reply->writeNoException();
572 reply->writeInt32(waitUntilIdle());
573 return NO_ERROR;
574 } break;
Eino-Ville Talvalaabaa51d2013-08-14 11:37:00 -0700575 case FLUSH: {
576 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
577 reply->writeNoException();
Jianing Weicb0652e2014-03-12 18:29:36 -0700578 int64_t lastFrameNumber = -1;
579 reply->writeInt32(flush(&lastFrameNumber));
580 reply->writeInt32(1);
581 reply->writeInt64(lastFrameNumber);
Eino-Ville Talvalaabaa51d2013-08-14 11:37:00 -0700582 return NO_ERROR;
583 }
Ruben Brunkb2119af2014-05-09 19:57:56 -0700584 case BEGIN_CONFIGURE: {
585 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
586 reply->writeNoException();
587 reply->writeInt32(beginConfigure());
588 return NO_ERROR;
589 } break;
590 case END_CONFIGURE: {
591 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
Zhijun He1fa89992015-06-01 15:44:31 -0700592 bool isConstrainedHighSpeed = data.readInt32();
Ruben Brunkb2119af2014-05-09 19:57:56 -0700593 reply->writeNoException();
Zhijun He1fa89992015-06-01 15:44:31 -0700594 reply->writeInt32(endConfigure(isConstrainedHighSpeed));
Ruben Brunkb2119af2014-05-09 19:57:56 -0700595 return NO_ERROR;
596 } break;
Eino-Ville Talvala4d44cad2015-04-11 13:15:45 -0700597 case PREPARE: {
598 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
599 int streamId = data.readInt32();
600 reply->writeNoException();
601 reply->writeInt32(prepare(streamId));
602 return NO_ERROR;
603 } break;
Eino-Ville Talvalab25e3c82015-07-15 16:04:27 -0700604 case TEAR_DOWN: {
605 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
606 int streamId = data.readInt32();
607 reply->writeNoException();
608 reply->writeInt32(tearDown(streamId));
609 return NO_ERROR;
610 } break;
Ruben Brunkc78ac262015-08-13 17:58:46 -0700611 case PREPARE2: {
612 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
613 int maxCount = data.readInt32();
614 int streamId = data.readInt32();
615 reply->writeNoException();
616 reply->writeInt32(prepare2(maxCount, streamId));
617 return NO_ERROR;
618 } break;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700619 default:
620 return BBinder::onTransact(code, data, reply, flags);
621 }
622}
623
624// ----------------------------------------------------------------------------
625
626}; // namespace android