1e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/*
2e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**
3e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Copyright 2013, The Android Open Source Project
4e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**
5e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Licensed under the Apache License, Version 2.0 (the "License");
6e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** you may not use this file except in compliance with the License.
7e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** You may obtain a copy of the License at
8e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**
9e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**     http://www.apache.org/licenses/LICENSE-2.0
10e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**
11e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Unless required by applicable law or agreed to in writing, software
12e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** distributed under the License is distributed on an "AS IS" BASIS,
13e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** See the License for the specific language governing permissions and
15e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** limitations under the License.
16e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin*/
17e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// #define LOG_NDEBUG 0
19e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#define LOG_TAG "ICameraDeviceUser"
20e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <utils/Log.h>
21e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <stdint.h>
22e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <sys/types.h>
23e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <binder/Parcel.h>
247b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h>
25e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <gui/IGraphicBufferProducer.h>
26e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <gui/Surface.h>
27e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <camera/CameraMetadata.h>
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/CaptureRequest.h>
29e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android {
31e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
32e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintypedef Parcel::WritableBlob WritableBlob;
33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkintypedef Parcel::ReadableBlob ReadableBlob;
34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
35e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinenum {
36e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
37e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    SUBMIT_REQUEST,
38cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    SUBMIT_REQUEST_LIST,
39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CANCEL_REQUEST,
4029478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    BEGIN_CONFIGURE,
4129478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    END_CONFIGURE,
42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    DELETE_STREAM,
43e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CREATE_STREAM,
44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CREATE_DEFAULT_REQUEST,
45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    GET_CAMERA_INFO,
462ab500c632569e2f131a1a2288459933da70c4eeZhijun He    WAIT_UNTIL_IDLE,
4729478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    FLUSH
48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
5088aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkinnamespace {
5188aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin    // Read empty strings without printing a false error message.
5288aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin    String16 readMaybeEmptyString16(const Parcel& parcel) {
5388aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        size_t len;
5488aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        const char16_t* str = parcel.readString16Inplace(&len);
5588aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        if (str != NULL) {
5688aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin            return String16(str, len);
5788aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        } else {
5888aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin            return String16();
5988aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        }
6088aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin    }
6188aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin};
6288aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin
63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass BpCameraDeviceUser : public BpInterface<ICameraDeviceUser>
64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic:
66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    BpCameraDeviceUser(const sp<IBinder>& impl)
67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        : BpInterface<ICameraDeviceUser>(impl)
68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
69e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
70e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
71e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // disconnect from camera service
72e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    void disconnect()
73e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
74e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("disconnect");
75e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
76e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
77e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(DISCONNECT, data, &reply);
78e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
79e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
80e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
81cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t submitRequest(sp<CaptureRequest> request, bool repeating,
82cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                              int64_t *lastFrameNumber)
83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
84e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
85e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
86e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        // arg0 = CaptureRequest
88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (request != 0) {
89e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            data.writeInt32(1);
90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            request->writeToParcel(&data);
91e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } else {
92e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            data.writeInt32(0);
93e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        // arg1 = streaming (bool)
96cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        data.writeInt32(repeating);
97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(SUBMIT_REQUEST, data, &reply);
99e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
100e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
101cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        status_t res = reply.readInt32();
102cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
103cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        status_t resFrameNumber = BAD_VALUE;
104cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if (reply.readInt32() != 0) {
105cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (lastFrameNumber != NULL) {
106cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                resFrameNumber = reply.readInt64(lastFrameNumber);
107cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
108cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
109cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
110cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei	if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) {
111cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            res = FAILED_TRANSACTION;
112cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
113cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        return res;
114e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
115e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
116cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t submitRequestList(List<sp<CaptureRequest> > requestList, bool repeating,
117cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                  int64_t *lastFrameNumber)
118cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    {
119cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        Parcel data, reply;
120cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
121cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
122cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        data.writeInt32(requestList.size());
123cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
124cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        for (List<sp<CaptureRequest> >::iterator it = requestList.begin();
125cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                it != requestList.end(); ++it) {
126cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            sp<CaptureRequest> request = *it;
127cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (request != 0) {
128cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                data.writeInt32(1);
129cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                if (request->writeToParcel(&data) != OK) {
130cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    return BAD_VALUE;
131cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                }
132cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            } else {
133cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                data.writeInt32(0);
134cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
135cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
136cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
137cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        data.writeInt32(repeating);
138cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
139cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        remote()->transact(SUBMIT_REQUEST_LIST, data, &reply);
140cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
141cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        reply.readExceptionCode();
142cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        status_t res = reply.readInt32();
143cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
144cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        status_t resFrameNumber = BAD_VALUE;
145cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if (reply.readInt32() != 0) {
146cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (lastFrameNumber != NULL) {
147cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                resFrameNumber = reply.readInt64(lastFrameNumber);
148cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
149cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
150cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) {
151cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            res = FAILED_TRANSACTION;
152cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
153cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        return res;
154cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    }
155cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
156cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t cancelRequest(int requestId, int64_t *lastFrameNumber)
157e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
158e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
159e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
160e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(requestId);
161e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
162e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(CANCEL_REQUEST, data, &reply);
163e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
164e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
165cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        status_t res = reply.readInt32();
166cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
167cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        status_t resFrameNumber = BAD_VALUE;
168cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if (reply.readInt32() != 0) {
169cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (lastFrameNumber != NULL) {
170cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                res = reply.readInt64(lastFrameNumber);
171cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
172cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
173cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) {
174cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            res = FAILED_TRANSACTION;
175cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
176cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        return res;
177e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
178e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
17929478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    virtual status_t beginConfigure()
18029478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    {
18129478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        ALOGV("beginConfigure");
18229478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        Parcel data, reply;
18329478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
18429478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        remote()->transact(BEGIN_CONFIGURE, data, &reply);
18529478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        reply.readExceptionCode();
18629478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        return reply.readInt32();
18729478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    }
18829478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk
18929478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    virtual status_t endConfigure()
19029478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    {
19129478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        ALOGV("endConfigure");
19229478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        Parcel data, reply;
19329478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
19429478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        remote()->transact(END_CONFIGURE, data, &reply);
19529478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        reply.readExceptionCode();
19629478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk        return reply.readInt32();
19729478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk    }
19829478402ba0683323b7c7ff4843c8c2a4f0673d5Ruben Brunk
199e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t deleteStream(int streamId)
200e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
201e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
202e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
203e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(streamId);
204e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
205e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(DELETE_STREAM, data, &reply);
206e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
207e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
208e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return reply.readInt32();
209e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
210e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
211e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t createStream(int width, int height, int format,
212e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                          const sp<IGraphicBufferProducer>& bufferProducer)
213e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
215e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
216e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(width);
217e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(height);
218e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(format);
219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(1); // marker that bufferProducer is not null
221e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeString16(String16("unknown_name")); // name of surface
222e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        sp<IBinder> b(bufferProducer->asBinder());
223e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeStrongBinder(b);
224e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
225e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(CREATE_STREAM, data, &reply);
226e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
227e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
228e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return reply.readInt32();
229e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
230e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
231e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Create a request object from a template.
232e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t createDefaultRequest(int templateId,
233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                          /*out*/
234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                          CameraMetadata* request)
235e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
236e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
237e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
238e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(templateId);
239e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply);
240e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
241e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
242e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        status_t result = reply.readInt32();
243e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
244e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        CameraMetadata out;
245e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (reply.readInt32() != 0) {
246e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            out.readFromParcel(&reply);
247e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
248e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
249e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (request != NULL) {
250e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            request->swap(out);
251e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
252e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return result;
253e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
254e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
255e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
256099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin    virtual status_t getCameraInfo(CameraMetadata* info)
257e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
258e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
259e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
260e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(GET_CAMERA_INFO, data, &reply);
261e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
262e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
263e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        status_t result = reply.readInt32();
264e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
265099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        CameraMetadata out;
266e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (reply.readInt32() != 0) {
267099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            out.readFromParcel(&reply);
268099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        }
269099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin
270099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        if (info != NULL) {
271099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            info->swap(out);
272e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
273e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
274e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return result;
275e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
276e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
2772ab500c632569e2f131a1a2288459933da70c4eeZhijun He    virtual status_t waitUntilIdle()
2782ab500c632569e2f131a1a2288459933da70c4eeZhijun He    {
2792ab500c632569e2f131a1a2288459933da70c4eeZhijun He        ALOGV("waitUntilIdle");
2802ab500c632569e2f131a1a2288459933da70c4eeZhijun He        Parcel data, reply;
2812ab500c632569e2f131a1a2288459933da70c4eeZhijun He        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
2822ab500c632569e2f131a1a2288459933da70c4eeZhijun He        remote()->transact(WAIT_UNTIL_IDLE, data, &reply);
2832ab500c632569e2f131a1a2288459933da70c4eeZhijun He        reply.readExceptionCode();
2842ab500c632569e2f131a1a2288459933da70c4eeZhijun He        return reply.readInt32();
2852ab500c632569e2f131a1a2288459933da70c4eeZhijun He    }
286e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
287cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t flush(int64_t *lastFrameNumber)
288abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    {
289abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        ALOGV("flush");
290abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        Parcel data, reply;
291abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
292abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        remote()->transact(FLUSH, data, &reply);
293abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        reply.readExceptionCode();
294cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        status_t res = reply.readInt32();
295cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
296cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        status_t resFrameNumber = BAD_VALUE;
297cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if (reply.readInt32() != 0) {
298cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (lastFrameNumber != NULL) {
299cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                res = reply.readInt64(lastFrameNumber);
300cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
301cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
302cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) {
303cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            res = FAILED_TRANSACTION;
304cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        }
305cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        return res;
306abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    }
307abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
308e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate:
309e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
310e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
311e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
312e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
313e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinIMPLEMENT_META_INTERFACE(CameraDeviceUser,
3147b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala                         "android.hardware.camera2.ICameraDeviceUser");
315e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
316e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ----------------------------------------------------------------------
317e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
318e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t BnCameraDeviceUser::onTransact(
319e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
320e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
321e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    switch(code) {
322e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case DISCONNECT: {
323e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("DISCONNECT");
324e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
325e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            disconnect();
326e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
327e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
328e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
329e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case SUBMIT_REQUEST: {
330e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
331e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
332e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // arg0 = request
333e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            sp<CaptureRequest> request;
334e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            if (data.readInt32() != 0) {
335e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                request = new CaptureRequest();
336e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                request->readFromParcel(const_cast<Parcel*>(&data));
337e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            }
338e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
339e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // arg1 = streaming (bool)
340cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            bool repeating = data.readInt32();
341e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
342e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // return code: requestId (int32)
343e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
344cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            int64_t lastFrameNumber = -1;
345cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt32(submitRequest(request, repeating, &lastFrameNumber));
346cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt32(1);
347cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt64(lastFrameNumber);
348cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
349cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            return NO_ERROR;
350cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        } break;
351cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        case SUBMIT_REQUEST_LIST: {
352cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
353cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
354cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            List<sp<CaptureRequest> > requestList;
355cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            int requestListSize = data.readInt32();
356cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            for (int i = 0; i < requestListSize; i++) {
357cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                if (data.readInt32() != 0) {
358cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    sp<CaptureRequest> request = new CaptureRequest();
359cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    if (request->readFromParcel(const_cast<Parcel*>(&data)) != OK) {
360cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                        return BAD_VALUE;
361cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    }
362cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    requestList.push_back(request);
363cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                } else {
364cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    sp<CaptureRequest> request = 0;
365cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    requestList.push_back(request);
366cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                    ALOGE("A request is missing. Sending in null request.");
367cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                }
368cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
369cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
370cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            bool repeating = data.readInt32();
371cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
372cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeNoException();
373cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            int64_t lastFrameNumber = -1;
374cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt32(submitRequestList(requestList, repeating, &lastFrameNumber));
375cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt32(1);
376cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt64(lastFrameNumber);
377e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
378e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
379e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
380e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case CANCEL_REQUEST: {
381e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
382e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int requestId = data.readInt32();
383e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
384cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            int64_t lastFrameNumber = -1;
385cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt32(cancelRequest(requestId, &lastFrameNumber));
386cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt32(1);
387cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt64(lastFrameNumber);
388e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
389e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
390e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case DELETE_STREAM: {
391e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
392e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int streamId = data.readInt32();
393e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
394e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(deleteStream(streamId));
395e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
396e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
397e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case CREATE_STREAM: {
398e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
399e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int width, height, format;
400e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
401e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            width = data.readInt32();
402e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: width = %d", __FUNCTION__, width);
403e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            height = data.readInt32();
404e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: height = %d", __FUNCTION__, height);
405e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            format = data.readInt32();
406e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: format = %d", __FUNCTION__, format);
407e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
408e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            sp<IGraphicBufferProducer> bp;
409e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            if (data.readInt32() != 0) {
41088aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin                String16 name = readMaybeEmptyString16(data);
411e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                bp = interface_cast<IGraphicBufferProducer>(
412e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                        data.readStrongBinder());
413e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
414e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                ALOGV("%s: CREATE_STREAM: bp = %p, name = %s", __FUNCTION__,
415e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                      bp.get(), String8(name).string());
416e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            } else {
417e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                ALOGV("%s: CREATE_STREAM: bp = unset, name = unset",
418e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                      __FUNCTION__);
419e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            }
420e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
421e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            status_t ret;
422e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ret = createStream(width, height, format, bp);
423e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
424e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
425e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: write noException", __FUNCTION__);
426e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(ret);
427e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: write ret = %d", __FUNCTION__, ret);
428e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
429e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
430e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
431e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
432e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case CREATE_DEFAULT_REQUEST: {
433e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
434e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
435e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int templateId = data.readInt32();
436e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
437e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CameraMetadata request;
438e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            status_t ret;
439e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ret = createDefaultRequest(templateId, &request);
440e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
441e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
442e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(ret);
443e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
444099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            // out-variables are after exception and return value
445e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(1); // to mark presence of metadata object
446e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            request.writeToParcel(const_cast<Parcel*>(reply));
447e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
448e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
449e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
450e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case GET_CAMERA_INFO: {
451e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
452e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
453099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            CameraMetadata info;
454e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            status_t ret;
455099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            ret = getCameraInfo(&info);
456e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
457e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
458e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(ret);
459e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
460099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            // out-variables are after exception and return value
461099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            reply->writeInt32(1); // to mark presence of metadata object
462099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            info.writeToParcel(reply);
463e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
464e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
465e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
4662ab500c632569e2f131a1a2288459933da70c4eeZhijun He        case WAIT_UNTIL_IDLE: {
4672ab500c632569e2f131a1a2288459933da70c4eeZhijun He            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
4682ab500c632569e2f131a1a2288459933da70c4eeZhijun He            reply->writeNoException();
4692ab500c632569e2f131a1a2288459933da70c4eeZhijun He            reply->writeInt32(waitUntilIdle());
4702ab500c632569e2f131a1a2288459933da70c4eeZhijun He            return NO_ERROR;
4712ab500c632569e2f131a1a2288459933da70c4eeZhijun He        } break;
472abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        case FLUSH: {
473abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
474abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala            reply->writeNoException();
475cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            int64_t lastFrameNumber = -1;
476cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt32(flush(&lastFrameNumber));
477cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt32(1);
478cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            reply->writeInt64(lastFrameNumber);
479abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala            return NO_ERROR;
480abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        }
481b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        case BEGIN_CONFIGURE: {
482b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
483b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            reply->writeNoException();
484b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            reply->writeInt32(beginConfigure());
485b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            return NO_ERROR;
486b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        } break;
487b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        case END_CONFIGURE: {
488b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
489b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            reply->writeNoException();
490b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            reply->writeInt32(endConfigure());
491b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk            return NO_ERROR;
492b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk        } break;
493e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        default:
494e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return BBinder::onTransact(code, data, reply, flags);
495e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
496e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
497e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
498e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ----------------------------------------------------------------------------
499e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
500e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android
501