blob: a7549f2a37f2f0cf3488f648f2a03215c76ce9da [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,
51 PREPARE
Igor Murashkine7ee7632013-06-11 18:10:18 -070052};
53
Igor Murashkin88aef232013-08-23 17:47:06 -070054namespace {
55 // Read empty strings without printing a false error message.
56 String16 readMaybeEmptyString16(const Parcel& parcel) {
57 size_t len;
58 const char16_t* str = parcel.readString16Inplace(&len);
59 if (str != NULL) {
60 return String16(str, len);
61 } else {
62 return String16();
63 }
64 }
65};
66
Igor Murashkine7ee7632013-06-11 18:10:18 -070067class BpCameraDeviceUser : public BpInterface<ICameraDeviceUser>
68{
69public:
70 BpCameraDeviceUser(const sp<IBinder>& impl)
71 : BpInterface<ICameraDeviceUser>(impl)
72 {
73 }
74
75 // disconnect from camera service
76 void disconnect()
77 {
78 ALOGV("disconnect");
79 Parcel data, reply;
80 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
81 remote()->transact(DISCONNECT, data, &reply);
82 reply.readExceptionCode();
83 }
84
Jianing Weicb0652e2014-03-12 18:29:36 -070085 virtual status_t submitRequest(sp<CaptureRequest> request, bool repeating,
86 int64_t *lastFrameNumber)
Igor Murashkine7ee7632013-06-11 18:10:18 -070087 {
88 Parcel data, reply;
89 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
90
91 // arg0 = CaptureRequest
92 if (request != 0) {
93 data.writeInt32(1);
94 request->writeToParcel(&data);
95 } else {
96 data.writeInt32(0);
97 }
98
99 // arg1 = streaming (bool)
Jianing Weicb0652e2014-03-12 18:29:36 -0700100 data.writeInt32(repeating);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700101
102 remote()->transact(SUBMIT_REQUEST, data, &reply);
103
104 reply.readExceptionCode();
Jianing Weicb0652e2014-03-12 18:29:36 -0700105 status_t res = reply.readInt32();
106
107 status_t resFrameNumber = BAD_VALUE;
108 if (reply.readInt32() != 0) {
109 if (lastFrameNumber != NULL) {
110 resFrameNumber = reply.readInt64(lastFrameNumber);
111 }
112 }
113
John Lin19fa0fe2015-02-02 18:10:42 +0800114 if ((res < NO_ERROR) || (resFrameNumber != NO_ERROR)) {
Jianing Weicb0652e2014-03-12 18:29:36 -0700115 res = FAILED_TRANSACTION;
116 }
117 return res;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700118 }
119
Jianing Weicb0652e2014-03-12 18:29:36 -0700120 virtual status_t submitRequestList(List<sp<CaptureRequest> > requestList, bool repeating,
121 int64_t *lastFrameNumber)
122 {
123 Parcel data, reply;
124 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
125
126 data.writeInt32(requestList.size());
127
128 for (List<sp<CaptureRequest> >::iterator it = requestList.begin();
129 it != requestList.end(); ++it) {
130 sp<CaptureRequest> request = *it;
131 if (request != 0) {
132 data.writeInt32(1);
133 if (request->writeToParcel(&data) != OK) {
134 return BAD_VALUE;
135 }
136 } else {
137 data.writeInt32(0);
138 }
139 }
140
141 data.writeInt32(repeating);
142
143 remote()->transact(SUBMIT_REQUEST_LIST, data, &reply);
144
145 reply.readExceptionCode();
146 status_t res = reply.readInt32();
147
148 status_t resFrameNumber = BAD_VALUE;
149 if (reply.readInt32() != 0) {
150 if (lastFrameNumber != NULL) {
151 resFrameNumber = reply.readInt64(lastFrameNumber);
152 }
153 }
John Lin19fa0fe2015-02-02 18:10:42 +0800154 if ((res < NO_ERROR) || (resFrameNumber != NO_ERROR)) {
Jianing Weicb0652e2014-03-12 18:29:36 -0700155 res = FAILED_TRANSACTION;
156 }
157 return res;
158 }
159
160 virtual status_t cancelRequest(int requestId, int64_t *lastFrameNumber)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700161 {
162 Parcel data, reply;
163 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
164 data.writeInt32(requestId);
165
166 remote()->transact(CANCEL_REQUEST, data, &reply);
167
168 reply.readExceptionCode();
Jianing Weicb0652e2014-03-12 18:29:36 -0700169 status_t res = reply.readInt32();
170
171 status_t resFrameNumber = BAD_VALUE;
172 if (reply.readInt32() != 0) {
173 if (lastFrameNumber != NULL) {
John Lin19fa0fe2015-02-02 18:10:42 +0800174 resFrameNumber = reply.readInt64(lastFrameNumber);
Jianing Weicb0652e2014-03-12 18:29:36 -0700175 }
176 }
177 if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) {
178 res = FAILED_TRANSACTION;
179 }
180 return res;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700181 }
182
Ruben Brunk29478402014-05-22 13:09:57 -0700183 virtual status_t beginConfigure()
184 {
185 ALOGV("beginConfigure");
186 Parcel data, reply;
187 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
188 remote()->transact(BEGIN_CONFIGURE, data, &reply);
189 reply.readExceptionCode();
190 return reply.readInt32();
191 }
192
Zhijun He1fa89992015-06-01 15:44:31 -0700193 virtual status_t endConfigure(bool isConstrainedHighSpeed)
Ruben Brunk29478402014-05-22 13:09:57 -0700194 {
195 ALOGV("endConfigure");
196 Parcel data, reply;
197 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
Zhijun He1fa89992015-06-01 15:44:31 -0700198 data.writeInt32(isConstrainedHighSpeed);
199
Ruben Brunk29478402014-05-22 13:09:57 -0700200 remote()->transact(END_CONFIGURE, data, &reply);
201 reply.readExceptionCode();
202 return reply.readInt32();
203 }
204
Igor Murashkine7ee7632013-06-11 18:10:18 -0700205 virtual status_t deleteStream(int streamId)
206 {
207 Parcel data, reply;
208 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
209 data.writeInt32(streamId);
210
211 remote()->transact(DELETE_STREAM, data, &reply);
212
213 reply.readExceptionCode();
214 return reply.readInt32();
215 }
216
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700217 virtual status_t createStream(const OutputConfiguration& outputConfiguration)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700218 {
219 Parcel data, reply;
220 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700221 if (outputConfiguration.getGraphicBufferProducer() != NULL) {
222 data.writeInt32(1); // marker that OutputConfiguration is not null. Mimic aidl behavior
223 outputConfiguration.writeToParcel(data);
224 } else {
225 data.writeInt32(0);
226 }
Igor Murashkine7ee7632013-06-11 18:10:18 -0700227 remote()->transact(CREATE_STREAM, data, &reply);
228
229 reply.readExceptionCode();
230 return reply.readInt32();
231 }
232
Chien-Yu Chen618ff8a2015-03-13 11:27:17 -0700233 virtual status_t createInputStream(int width, int height, int format)
234 {
235 Parcel data, reply;
236 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
237 data.writeInt32(width);
238 data.writeInt32(height);
239 data.writeInt32(format);
240
241 remote()->transact(CREATE_INPUT_STREAM, data, &reply);
242
243 reply.readExceptionCode();
244 return reply.readInt32();
245 }
246
247 // get the buffer producer of the input stream
248 virtual status_t getInputBufferProducer(
249 sp<IGraphicBufferProducer> *producer) {
250 if (producer == NULL) {
251 return BAD_VALUE;
252 }
253
254 Parcel data, reply;
255 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
256
257 remote()->transact(GET_INPUT_SURFACE, data, &reply);
258
259 reply.readExceptionCode();
260 status_t result = reply.readInt32() ;
261 if (result != OK) {
262 return result;
263 }
264
265 sp<IGraphicBufferProducer> bp = NULL;
266 if (reply.readInt32() != 0) {
267 String16 name = readMaybeEmptyString16(reply);
268 bp = interface_cast<IGraphicBufferProducer>(
269 reply.readStrongBinder());
270 }
271
272 *producer = bp;
273
274 return *producer == NULL ? INVALID_OPERATION : OK;
275 }
276
Igor Murashkine7ee7632013-06-11 18:10:18 -0700277 // Create a request object from a template.
278 virtual status_t createDefaultRequest(int templateId,
279 /*out*/
280 CameraMetadata* request)
281 {
282 Parcel data, reply;
283 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
284 data.writeInt32(templateId);
285 remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply);
286
287 reply.readExceptionCode();
288 status_t result = reply.readInt32();
289
290 CameraMetadata out;
291 if (reply.readInt32() != 0) {
292 out.readFromParcel(&reply);
293 }
294
295 if (request != NULL) {
296 request->swap(out);
297 }
298 return result;
299 }
300
301
Igor Murashkin099b4572013-07-12 17:52:16 -0700302 virtual status_t getCameraInfo(CameraMetadata* info)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700303 {
304 Parcel data, reply;
305 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
Igor Murashkine7ee7632013-06-11 18:10:18 -0700306 remote()->transact(GET_CAMERA_INFO, data, &reply);
307
Igor Murashkine7ee7632013-06-11 18:10:18 -0700308 reply.readExceptionCode();
309 status_t result = reply.readInt32();
310
Igor Murashkin099b4572013-07-12 17:52:16 -0700311 CameraMetadata out;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700312 if (reply.readInt32() != 0) {
Igor Murashkin099b4572013-07-12 17:52:16 -0700313 out.readFromParcel(&reply);
314 }
315
316 if (info != NULL) {
317 info->swap(out);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700318 }
319
320 return result;
321 }
322
Zhijun He2ab500c2013-07-23 08:02:53 -0700323 virtual status_t waitUntilIdle()
324 {
325 ALOGV("waitUntilIdle");
326 Parcel data, reply;
327 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
328 remote()->transact(WAIT_UNTIL_IDLE, data, &reply);
329 reply.readExceptionCode();
330 return reply.readInt32();
331 }
Igor Murashkine7ee7632013-06-11 18:10:18 -0700332
Jianing Weicb0652e2014-03-12 18:29:36 -0700333 virtual status_t flush(int64_t *lastFrameNumber)
Eino-Ville Talvalaabaa51d2013-08-14 11:37:00 -0700334 {
335 ALOGV("flush");
336 Parcel data, reply;
337 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
338 remote()->transact(FLUSH, data, &reply);
339 reply.readExceptionCode();
Jianing Weicb0652e2014-03-12 18:29:36 -0700340 status_t res = reply.readInt32();
341
342 status_t resFrameNumber = BAD_VALUE;
343 if (reply.readInt32() != 0) {
344 if (lastFrameNumber != NULL) {
John Lin19fa0fe2015-02-02 18:10:42 +0800345 resFrameNumber = reply.readInt64(lastFrameNumber);
Jianing Weicb0652e2014-03-12 18:29:36 -0700346 }
347 }
348 if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) {
349 res = FAILED_TRANSACTION;
350 }
351 return res;
Eino-Ville Talvalaabaa51d2013-08-14 11:37:00 -0700352 }
353
Eino-Ville Talvala4d44cad2015-04-11 13:15:45 -0700354 virtual status_t prepare(int streamId)
355 {
356 ALOGV("prepare");
357 Parcel data, reply;
358
359 data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
360 data.writeInt32(streamId);
361
362 remote()->transact(PREPARE, data, &reply);
363
364 reply.readExceptionCode();
365 return reply.readInt32();
366 }
367
Igor Murashkine7ee7632013-06-11 18:10:18 -0700368private:
369
370
371};
372
373IMPLEMENT_META_INTERFACE(CameraDeviceUser,
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -0700374 "android.hardware.camera2.ICameraDeviceUser");
Igor Murashkine7ee7632013-06-11 18:10:18 -0700375
376// ----------------------------------------------------------------------
377
378status_t BnCameraDeviceUser::onTransact(
379 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
380{
381 switch(code) {
382 case DISCONNECT: {
383 ALOGV("DISCONNECT");
384 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
385 disconnect();
386 reply->writeNoException();
387 return NO_ERROR;
388 } break;
389 case SUBMIT_REQUEST: {
390 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
391
392 // arg0 = request
393 sp<CaptureRequest> request;
394 if (data.readInt32() != 0) {
395 request = new CaptureRequest();
396 request->readFromParcel(const_cast<Parcel*>(&data));
397 }
398
399 // arg1 = streaming (bool)
Jianing Weicb0652e2014-03-12 18:29:36 -0700400 bool repeating = data.readInt32();
Igor Murashkine7ee7632013-06-11 18:10:18 -0700401
402 // return code: requestId (int32)
403 reply->writeNoException();
Jianing Weicb0652e2014-03-12 18:29:36 -0700404 int64_t lastFrameNumber = -1;
405 reply->writeInt32(submitRequest(request, repeating, &lastFrameNumber));
406 reply->writeInt32(1);
407 reply->writeInt64(lastFrameNumber);
408
409 return NO_ERROR;
410 } break;
411 case SUBMIT_REQUEST_LIST: {
412 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
413
414 List<sp<CaptureRequest> > requestList;
415 int requestListSize = data.readInt32();
416 for (int i = 0; i < requestListSize; i++) {
417 if (data.readInt32() != 0) {
418 sp<CaptureRequest> request = new CaptureRequest();
419 if (request->readFromParcel(const_cast<Parcel*>(&data)) != OK) {
420 return BAD_VALUE;
421 }
422 requestList.push_back(request);
423 } else {
424 sp<CaptureRequest> request = 0;
425 requestList.push_back(request);
426 ALOGE("A request is missing. Sending in null request.");
427 }
428 }
429
430 bool repeating = data.readInt32();
431
432 reply->writeNoException();
433 int64_t lastFrameNumber = -1;
434 reply->writeInt32(submitRequestList(requestList, repeating, &lastFrameNumber));
435 reply->writeInt32(1);
436 reply->writeInt64(lastFrameNumber);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700437
438 return NO_ERROR;
439 } break;
440 case CANCEL_REQUEST: {
441 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
442 int requestId = data.readInt32();
443 reply->writeNoException();
Jianing Weicb0652e2014-03-12 18:29:36 -0700444 int64_t lastFrameNumber = -1;
445 reply->writeInt32(cancelRequest(requestId, &lastFrameNumber));
446 reply->writeInt32(1);
447 reply->writeInt64(lastFrameNumber);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700448 return NO_ERROR;
449 } break;
450 case DELETE_STREAM: {
451 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
452 int streamId = data.readInt32();
453 reply->writeNoException();
454 reply->writeInt32(deleteStream(streamId));
455 return NO_ERROR;
456 } break;
457 case CREATE_STREAM: {
458 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700459
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700460 status_t ret = BAD_VALUE;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700461 if (data.readInt32() != 0) {
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700462 OutputConfiguration outputConfiguration(data);
463 ret = createStream(outputConfiguration);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700464 } else {
Yin-Chia Yehb97babb2015-03-12 13:42:44 -0700465 ALOGE("%s: cannot take an empty OutputConfiguration", __FUNCTION__);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700466 }
467
Igor Murashkine7ee7632013-06-11 18:10:18 -0700468 reply->writeNoException();
469 ALOGV("%s: CREATE_STREAM: write noException", __FUNCTION__);
470 reply->writeInt32(ret);
471 ALOGV("%s: CREATE_STREAM: write ret = %d", __FUNCTION__, ret);
472
473 return NO_ERROR;
474 } break;
Chien-Yu Chen618ff8a2015-03-13 11:27:17 -0700475 case CREATE_INPUT_STREAM: {
476 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
477 int width, height, format;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700478
Chien-Yu Chen618ff8a2015-03-13 11:27:17 -0700479 width = data.readInt32();
480 height = data.readInt32();
481 format = data.readInt32();
482 status_t ret = createInputStream(width, height, format);
483
484 reply->writeNoException();
485 reply->writeInt32(ret);
486 return NO_ERROR;
487
488 } break;
489 case GET_INPUT_SURFACE: {
490 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
491
492 sp<IGraphicBufferProducer> bp;
493 status_t ret = getInputBufferProducer(&bp);
494 sp<IBinder> b(IInterface::asBinder(ret == OK ? bp : NULL));
495
496 reply->writeNoException();
497 reply->writeInt32(ret);
498 reply->writeInt32(1);
499 reply->writeString16(String16("camera input")); // name of surface
500 reply->writeStrongBinder(b);
501
502 return NO_ERROR;
503 } break;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700504 case CREATE_DEFAULT_REQUEST: {
505 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
506
507 int templateId = data.readInt32();
508
509 CameraMetadata request;
510 status_t ret;
511 ret = createDefaultRequest(templateId, &request);
512
513 reply->writeNoException();
514 reply->writeInt32(ret);
515
Igor Murashkin099b4572013-07-12 17:52:16 -0700516 // out-variables are after exception and return value
Igor Murashkine7ee7632013-06-11 18:10:18 -0700517 reply->writeInt32(1); // to mark presence of metadata object
518 request.writeToParcel(const_cast<Parcel*>(reply));
519
520 return NO_ERROR;
521 } break;
522 case GET_CAMERA_INFO: {
523 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
524
Igor Murashkin099b4572013-07-12 17:52:16 -0700525 CameraMetadata info;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700526 status_t ret;
Igor Murashkin099b4572013-07-12 17:52:16 -0700527 ret = getCameraInfo(&info);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700528
529 reply->writeNoException();
530 reply->writeInt32(ret);
531
Igor Murashkin099b4572013-07-12 17:52:16 -0700532 // out-variables are after exception and return value
533 reply->writeInt32(1); // to mark presence of metadata object
534 info.writeToParcel(reply);
Igor Murashkine7ee7632013-06-11 18:10:18 -0700535
536 return NO_ERROR;
537 } break;
Zhijun He2ab500c2013-07-23 08:02:53 -0700538 case WAIT_UNTIL_IDLE: {
539 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
540 reply->writeNoException();
541 reply->writeInt32(waitUntilIdle());
542 return NO_ERROR;
543 } break;
Eino-Ville Talvalaabaa51d2013-08-14 11:37:00 -0700544 case FLUSH: {
545 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
546 reply->writeNoException();
Jianing Weicb0652e2014-03-12 18:29:36 -0700547 int64_t lastFrameNumber = -1;
548 reply->writeInt32(flush(&lastFrameNumber));
549 reply->writeInt32(1);
550 reply->writeInt64(lastFrameNumber);
Eino-Ville Talvalaabaa51d2013-08-14 11:37:00 -0700551 return NO_ERROR;
552 }
Ruben Brunkb2119af2014-05-09 19:57:56 -0700553 case BEGIN_CONFIGURE: {
554 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
555 reply->writeNoException();
556 reply->writeInt32(beginConfigure());
557 return NO_ERROR;
558 } break;
559 case END_CONFIGURE: {
560 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
Zhijun He1fa89992015-06-01 15:44:31 -0700561 bool isConstrainedHighSpeed = data.readInt32();
Ruben Brunkb2119af2014-05-09 19:57:56 -0700562 reply->writeNoException();
Zhijun He1fa89992015-06-01 15:44:31 -0700563 reply->writeInt32(endConfigure(isConstrainedHighSpeed));
Ruben Brunkb2119af2014-05-09 19:57:56 -0700564 return NO_ERROR;
565 } break;
Eino-Ville Talvala4d44cad2015-04-11 13:15:45 -0700566 case PREPARE: {
567 CHECK_INTERFACE(ICameraDeviceUser, data, reply);
568 int streamId = data.readInt32();
569 reply->writeNoException();
570 reply->writeInt32(prepare(streamId));
571 return NO_ERROR;
572 } break;
573
Igor Murashkine7ee7632013-06-11 18:10:18 -0700574 default:
575 return BBinder::onTransact(code, data, reply, flags);
576 }
577}
578
579// ----------------------------------------------------------------------------
580
581}; // namespace android