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,
38e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CANCEL_REQUEST,
39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    DELETE_STREAM,
40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CREATE_STREAM,
41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    CREATE_DEFAULT_REQUEST,
42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    GET_CAMERA_INFO,
432ab500c632569e2f131a1a2288459933da70c4eeZhijun He    WAIT_UNTIL_IDLE,
44abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    FLUSH
45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
4788aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkinnamespace {
4888aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin    // Read empty strings without printing a false error message.
4988aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin    String16 readMaybeEmptyString16(const Parcel& parcel) {
5088aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        size_t len;
5188aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        const char16_t* str = parcel.readString16Inplace(&len);
5288aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        if (str != NULL) {
5388aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin            return String16(str, len);
5488aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        } else {
5588aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin            return String16();
5688aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin        }
5788aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin    }
5888aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin};
5988aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin
60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass BpCameraDeviceUser : public BpInterface<ICameraDeviceUser>
61e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
62e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic:
63e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    BpCameraDeviceUser(const sp<IBinder>& impl)
64e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        : BpInterface<ICameraDeviceUser>(impl)
65e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
66e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
67e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
68e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // disconnect from camera service
69e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    void disconnect()
70e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
71e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("disconnect");
72e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
73e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
74e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(DISCONNECT, data, &reply);
75e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
76e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
77e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
78e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual int submitRequest(sp<CaptureRequest> request, bool streaming)
79e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
80e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
81e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
82e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
83e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        // arg0 = CaptureRequest
84e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (request != 0) {
85e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            data.writeInt32(1);
86e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            request->writeToParcel(&data);
87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } else {
88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            data.writeInt32(0);
89e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
90e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
91e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        // arg1 = streaming (bool)
92e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(streaming);
93e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(SUBMIT_REQUEST, data, &reply);
95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
96e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return reply.readInt32();
98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
99e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
100e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t cancelRequest(int requestId)
101e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
102e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
103e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
104e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(requestId);
105e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
106e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(CANCEL_REQUEST, data, &reply);
107e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
108e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
109e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return reply.readInt32();
110e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
111e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
112e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t deleteStream(int streamId)
113e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
114e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
115e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
116e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(streamId);
117e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
118e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(DELETE_STREAM, data, &reply);
119e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
120e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
121e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return reply.readInt32();
122e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
123e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
124e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t createStream(int width, int height, int format,
125e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                          const sp<IGraphicBufferProducer>& bufferProducer)
126e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
127e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
128e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
129e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(width);
130e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(height);
131e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(format);
132e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
133e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(1); // marker that bufferProducer is not null
134e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeString16(String16("unknown_name")); // name of surface
135e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        sp<IBinder> b(bufferProducer->asBinder());
136e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeStrongBinder(b);
137e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
138e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(CREATE_STREAM, data, &reply);
139e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
140e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return reply.readInt32();
142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
143e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
144e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // Create a request object from a template.
145e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual status_t createDefaultRequest(int templateId,
146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                          /*out*/
147e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                          CameraMetadata* request)
148e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
149e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
150e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(templateId);
152e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply);
153e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
154e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
155e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        status_t result = reply.readInt32();
156e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
157e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        CameraMetadata out;
158e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (reply.readInt32() != 0) {
159e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            out.readFromParcel(&reply);
160e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
161e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
162e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (request != NULL) {
163e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            request->swap(out);
164e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
165e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return result;
166e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
167e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
168e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
169099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin    virtual status_t getCameraInfo(CameraMetadata* info)
170e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
171e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
172e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
173e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(GET_CAMERA_INFO, data, &reply);
174e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
175e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        reply.readExceptionCode();
176e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        status_t result = reply.readInt32();
177e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
178099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        CameraMetadata out;
179e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        if (reply.readInt32() != 0) {
180099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            out.readFromParcel(&reply);
181099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        }
182099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin
183099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin        if (info != NULL) {
184099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            info->swap(out);
185e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
186e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
187e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        return result;
188e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
189e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
1902ab500c632569e2f131a1a2288459933da70c4eeZhijun He    virtual status_t waitUntilIdle()
1912ab500c632569e2f131a1a2288459933da70c4eeZhijun He    {
1922ab500c632569e2f131a1a2288459933da70c4eeZhijun He        ALOGV("waitUntilIdle");
1932ab500c632569e2f131a1a2288459933da70c4eeZhijun He        Parcel data, reply;
1942ab500c632569e2f131a1a2288459933da70c4eeZhijun He        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
1952ab500c632569e2f131a1a2288459933da70c4eeZhijun He        remote()->transact(WAIT_UNTIL_IDLE, data, &reply);
1962ab500c632569e2f131a1a2288459933da70c4eeZhijun He        reply.readExceptionCode();
1972ab500c632569e2f131a1a2288459933da70c4eeZhijun He        return reply.readInt32();
1982ab500c632569e2f131a1a2288459933da70c4eeZhijun He    }
199e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
200abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    virtual status_t flush()
201abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    {
202abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        ALOGV("flush");
203abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        Parcel data, reply;
204abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
205abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        remote()->transact(FLUSH, data, &reply);
206abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        reply.readExceptionCode();
207abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        return reply.readInt32();
208abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    }
209abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
210e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinprivate:
211e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
212e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
213e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
215e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinIMPLEMENT_META_INTERFACE(CameraDeviceUser,
2167b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala                         "android.hardware.camera2.ICameraDeviceUser");
217e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
218e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ----------------------------------------------------------------------
219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t BnCameraDeviceUser::onTransact(
221e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
222e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
223e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    switch(code) {
224e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case DISCONNECT: {
225e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("DISCONNECT");
226e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
227e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            disconnect();
228e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
229e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
230e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
231e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case SUBMIT_REQUEST: {
232e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // arg0 = request
235e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            sp<CaptureRequest> request;
236e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            if (data.readInt32() != 0) {
237e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                request = new CaptureRequest();
238e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                request->readFromParcel(const_cast<Parcel*>(&data));
239e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            }
240e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
241e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // arg1 = streaming (bool)
242e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            bool streaming = data.readInt32();
243e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
244e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            // return code: requestId (int32)
245e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
246e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(submitRequest(request, streaming));
247e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
248e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
249e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
250e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case CANCEL_REQUEST: {
251e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
252e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int requestId = data.readInt32();
253e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
254e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(cancelRequest(requestId));
255e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
256e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
257e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case DELETE_STREAM: {
258e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
259e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int streamId = data.readInt32();
260e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
261e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(deleteStream(streamId));
262e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
263e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
264e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case CREATE_STREAM: {
265e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
266e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int width, height, format;
267e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
268e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            width = data.readInt32();
269e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: width = %d", __FUNCTION__, width);
270e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            height = data.readInt32();
271e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: height = %d", __FUNCTION__, height);
272e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            format = data.readInt32();
273e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: format = %d", __FUNCTION__, format);
274e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
275e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            sp<IGraphicBufferProducer> bp;
276e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            if (data.readInt32() != 0) {
27788aef23d00a509693a955b6a207c0fb023fbc92dIgor Murashkin                String16 name = readMaybeEmptyString16(data);
278e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                bp = interface_cast<IGraphicBufferProducer>(
279e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                        data.readStrongBinder());
280e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
281e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                ALOGV("%s: CREATE_STREAM: bp = %p, name = %s", __FUNCTION__,
282e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                      bp.get(), String8(name).string());
283e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            } else {
284e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                ALOGV("%s: CREATE_STREAM: bp = unset, name = unset",
285e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                      __FUNCTION__);
286e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            }
287e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
288e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            status_t ret;
289e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ret = createStream(width, height, format, bp);
290e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
291e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
292e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: write noException", __FUNCTION__);
293e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(ret);
294e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ALOGV("%s: CREATE_STREAM: write ret = %d", __FUNCTION__, ret);
295e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
296e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
297e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
298e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
299e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case CREATE_DEFAULT_REQUEST: {
300e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
301e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
302e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int templateId = data.readInt32();
303e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
304e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CameraMetadata request;
305e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            status_t ret;
306e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            ret = createDefaultRequest(templateId, &request);
307e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
308e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
309e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(ret);
310e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
311099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            // out-variables are after exception and return value
312e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(1); // to mark presence of metadata object
313e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            request.writeToParcel(const_cast<Parcel*>(reply));
314e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
315e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
316e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
317e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case GET_CAMERA_INFO: {
318e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
319e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
320099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            CameraMetadata info;
321e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            status_t ret;
322099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            ret = getCameraInfo(&info);
323e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
324e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
325e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeInt32(ret);
326e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
327099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            // out-variables are after exception and return value
328099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            reply->writeInt32(1); // to mark presence of metadata object
329099b457f3203fa51387e21bd450495abb973ab31Igor Murashkin            info.writeToParcel(reply);
330e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
331e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
332e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
3332ab500c632569e2f131a1a2288459933da70c4eeZhijun He        case WAIT_UNTIL_IDLE: {
3342ab500c632569e2f131a1a2288459933da70c4eeZhijun He            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
3352ab500c632569e2f131a1a2288459933da70c4eeZhijun He            reply->writeNoException();
3362ab500c632569e2f131a1a2288459933da70c4eeZhijun He            reply->writeInt32(waitUntilIdle());
3372ab500c632569e2f131a1a2288459933da70c4eeZhijun He            return NO_ERROR;
3382ab500c632569e2f131a1a2288459933da70c4eeZhijun He        } break;
339abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        case FLUSH: {
340abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
341abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala            reply->writeNoException();
342abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala            reply->writeInt32(flush());
343abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala            return NO_ERROR;
344abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        }
345e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        default:
346e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return BBinder::onTransact(code, data, reply, flags);
347e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
348e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
349e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
350e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ----------------------------------------------------------------------------
351e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
352e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android
353