1634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin/*
2634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin**
3634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Copyright 2013, The Android Open Source Project
4634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin**
5634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Licensed under the Apache License, Version 2.0 (the "License");
6634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** you may not use this file except in compliance with the License.
7634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** You may obtain a copy of the License at
8634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin**
9634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin**     http://www.apache.org/licenses/LICENSE-2.0
10634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin**
11634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** Unless required by applicable law or agreed to in writing, software
12634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** distributed under the License is distributed on an "AS IS" BASIS,
13634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** See the License for the specific language governing permissions and
15634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin** limitations under the License.
16634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin*/
17634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// #define LOG_NDEBUG 0
19634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#define LOG_TAG "IProCameraUser"
20634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Log.h>
21634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <stdint.h>
22634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <sys/types.h>
23634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <binder/Parcel.h>
24634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <camera/IProCameraUser.h>
25634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gui/IGraphicBufferProducer.h>
26634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <gui/Surface.h>
27e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include "camera/CameraMetadata.h"
28634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
29634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinnamespace android {
30634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
31634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinenum {
32634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
33634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    CONNECT,
34634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    EXCLUSIVE_TRY_LOCK,
35634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    EXCLUSIVE_LOCK,
36634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    EXCLUSIVE_UNLOCK,
37634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    HAS_EXCLUSIVE_LOCK,
38634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    SUBMIT_REQUEST,
39634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    CANCEL_REQUEST,
40fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    DELETE_STREAM,
41985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    CREATE_STREAM,
42985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    CREATE_DEFAULT_REQUEST,
437b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    GET_CAMERA_INFO,
44634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin};
45634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
46634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinclass BpProCameraUser: public BpInterface<IProCameraUser>
47634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
48634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinpublic:
49634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    BpProCameraUser(const sp<IBinder>& impl)
50634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        : BpInterface<IProCameraUser>(impl)
51634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
52634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
53634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
54634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // disconnect from camera service
55634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    void disconnect()
56634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
57634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        ALOGV("disconnect");
58634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
59634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
60634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(DISCONNECT, data, &reply);
61bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        reply.readExceptionCode();
62634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
63634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
64634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual status_t connect(const sp<IProCameraCallbacks>& cameraClient)
65634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
66634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
67634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
68634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeStrongBinder(cameraClient->asBinder());
69634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(CONNECT, data, &reply);
70634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return reply.readInt32();
71634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
72634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
73634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /* Shared ProCameraUser */
74634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
75634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual status_t exclusiveTryLock()
76634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
77634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
78634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
79634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(EXCLUSIVE_TRY_LOCK, data, &reply);
80634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return reply.readInt32();
81634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
82634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual status_t exclusiveLock()
83634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
84634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
85634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
86634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(EXCLUSIVE_LOCK, data, &reply);
87634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return reply.readInt32();
88634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
89634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
90634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual status_t exclusiveUnlock()
91634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
92634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
93634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
94634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(EXCLUSIVE_UNLOCK, data, &reply);
95634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return reply.readInt32();
96634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
97634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
98634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual bool hasExclusiveLock()
99634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
100634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
101634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
102634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(HAS_EXCLUSIVE_LOCK, data, &reply);
103634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return !!reply.readInt32();
104634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
105634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
106634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual int submitRequest(camera_metadata_t* metadata, bool streaming)
107634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
108634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
109634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
110634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
111634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
112985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        // arg0+arg1
113e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        CameraMetadata::writeToParcel(data, metadata);
114634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
115634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // arg2 = streaming (bool)
116634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInt32(streaming);
117634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
118634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(SUBMIT_REQUEST, data, &reply);
119634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return reply.readInt32();
120634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
121634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
122634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual status_t cancelRequest(int requestId)
123634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
124634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
125634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
126634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInt32(requestId);
127634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
128634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(CANCEL_REQUEST, data, &reply);
129634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return reply.readInt32();
130634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
131634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
132fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    virtual status_t deleteStream(int streamId)
133634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
134634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
135634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
136634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInt32(streamId);
137634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
138fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        remote()->transact(DELETE_STREAM, data, &reply);
139634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        return reply.readInt32();
140634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
141634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
142985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    virtual status_t createStream(int width, int height, int format,
14376f8b43909817179b317880202360863b8f976d0Igor Murashkin                          const sp<IGraphicBufferProducer>& bufferProducer,
144985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin                          /*out*/
145985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin                          int* streamId)
146985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    {
147985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        Parcel data, reply;
148985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
149985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        data.writeInt32(width);
150985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        data.writeInt32(height);
151985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        data.writeInt32(format);
152985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
15376f8b43909817179b317880202360863b8f976d0Igor Murashkin        sp<IBinder> b(bufferProducer->asBinder());
15476f8b43909817179b317880202360863b8f976d0Igor Murashkin        data.writeStrongBinder(b);
15576f8b43909817179b317880202360863b8f976d0Igor Murashkin
156985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        remote()->transact(CREATE_STREAM, data, &reply);
157985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
158985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        int sId = reply.readInt32();
159985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        if (streamId) {
160985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            *streamId = sId;
161985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        }
162985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        return reply.readInt32();
163985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    }
164985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
165985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    // Create a request object from a template.
166985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    virtual status_t createDefaultRequest(int templateId,
167985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin                                 /*out*/
168985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin                                  camera_metadata** request)
169985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    {
170985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        Parcel data, reply;
171985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
172985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        data.writeInt32(templateId);
173985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        remote()->transact(CREATE_DEFAULT_REQUEST, data, &reply);
174e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        CameraMetadata::readFromParcel(reply, /*out*/request);
175985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        return reply.readInt32();
176985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin    }
177985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
178985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
1797b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    virtual status_t getCameraInfo(int cameraId, camera_metadata** info)
1807b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    {
1817b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        Parcel data, reply;
1827b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor());
1837b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        data.writeInt32(cameraId);
1847b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        remote()->transact(GET_CAMERA_INFO, data, &reply);
185e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        CameraMetadata::readFromParcel(reply, /*out*/info);
1867b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        return reply.readInt32();
1877b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin    }
1887b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
1897b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
190985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkinprivate:
191985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
192985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
193634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin};
194634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
195634a51509ee50475f3e9f8ccf897e90fc72ded31Igor MurashkinIMPLEMENT_META_INTERFACE(ProCameraUser, "android.hardware.IProCameraUser");
196634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
197634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// ----------------------------------------------------------------------
198634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
199634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkinstatus_t BnProCameraUser::onTransact(
200634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
201634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin{
202634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    switch(code) {
203634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case DISCONNECT: {
204634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            ALOGV("DISCONNECT");
205634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
206634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            disconnect();
207bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeNoException();
208634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
209634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
210634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case CONNECT: {
211634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
212634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            sp<IProCameraCallbacks> cameraClient =
213634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                   interface_cast<IProCameraCallbacks>(data.readStrongBinder());
214634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            reply->writeInt32(connect(cameraClient));
215634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
216634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
217634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
218634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        /* Shared ProCameraUser */
219634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case EXCLUSIVE_TRY_LOCK: {
220634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
221634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            reply->writeInt32(exclusiveTryLock());
222634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
223634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
224634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case EXCLUSIVE_LOCK: {
225634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
226634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            reply->writeInt32(exclusiveLock());
227634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
228634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
229634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case EXCLUSIVE_UNLOCK: {
230634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
231634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            reply->writeInt32(exclusiveUnlock());
232634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
233634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
234634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case HAS_EXCLUSIVE_LOCK: {
235634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
236634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            reply->writeInt32(hasExclusiveLock());
237634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
238634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
239634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case SUBMIT_REQUEST: {
240634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
241634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            camera_metadata_t* metadata;
242e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CameraMetadata::readFromParcel(data, /*out*/&metadata);
243634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
244634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            // arg2 = streaming (bool)
245634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            bool streaming = data.readInt32();
246634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
247634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            // return code: requestId (int32)
248634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            reply->writeInt32(submitRequest(metadata, streaming));
249634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
250634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
251634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
252634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case CANCEL_REQUEST: {
253634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
254634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            int requestId = data.readInt32();
255634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            reply->writeInt32(cancelRequest(requestId));
256634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
257634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
258fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        case DELETE_STREAM: {
259634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
260634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            int streamId = data.readInt32();
261fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin            reply->writeInt32(deleteStream(streamId));
262634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
263634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
264985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        case CREATE_STREAM: {
265985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
266985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            int width, height, format;
267985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
268985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            width = data.readInt32();
269985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            height = data.readInt32();
270985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            format = data.readInt32();
271985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
27276f8b43909817179b317880202360863b8f976d0Igor Murashkin            sp<IGraphicBufferProducer> bp =
27376f8b43909817179b317880202360863b8f976d0Igor Murashkin               interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
274985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
275985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            int streamId = -1;
276985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            status_t ret;
27776f8b43909817179b317880202360863b8f976d0Igor Murashkin            ret = createStream(width, height, format, bp, &streamId);
278985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
279985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            reply->writeInt32(streamId);
280985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            reply->writeInt32(ret);
281985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
282985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            return NO_ERROR;
283985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        } break;
284985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
285985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        case CREATE_DEFAULT_REQUEST: {
286985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
287985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
288985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            int templateId = data.readInt32();
289985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
290985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            camera_metadata_t* request = NULL;
291985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            status_t ret;
292985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            ret = createDefaultRequest(templateId, &request);
293985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
294e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CameraMetadata::writeToParcel(*reply, request);
295985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            reply->writeInt32(ret);
296985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin
2977b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            free_camera_metadata(request);
2987b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
2997b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            return NO_ERROR;
3007b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        } break;
3017b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin        case GET_CAMERA_INFO: {
3027b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            CHECK_INTERFACE(IProCameraUser, data, reply);
3037b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
3047b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            int cameraId = data.readInt32();
3057b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
3067b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            camera_metadata_t* info = NULL;
3077b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            status_t ret;
3087b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            ret = getCameraInfo(cameraId, &info);
3097b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
310e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CameraMetadata::writeToParcel(*reply, info);
3117b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            reply->writeInt32(ret);
3127b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
3137b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin            free_camera_metadata(info);
3147b33a74bbc514b99c16be7fff9a34e892bc19264Igor Murashkin
315985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin            return NO_ERROR;
316985fd30a10f6fec4293f071fd258c4726cff5a3dIgor Murashkin        } break;
317634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        default:
318634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return BBinder::onTransact(code, data, reply, flags);
319634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
320634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}
321634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
322634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin// ----------------------------------------------------------------------------
323634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
324634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin}; // namespace android
325