ICamera.cpp revision 484566c410afdfbc4b6bc5aa1732aef37428a5b8
1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Copyright 2008, The Android Open Source Project
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Licensed under the Apache License, Version 2.0 (the "License");
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** you may not use this file except in compliance with the License.
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** You may obtain a copy of the License at
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**     http://www.apache.org/licenses/LICENSE-2.0
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov**
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** Unless required by applicable law or agreed to in writing, software
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** distributed under the License is distributed on an "AS IS" BASIS,
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** See the License for the specific language governing permissions and
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov** limitations under the License.
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov//#define LOG_NDEBUG 0
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define LOG_TAG "ICamera"
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <utils/Log.h>
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdint.h>
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <sys/types.h>
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <binder/Parcel.h>
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <camera/ICamera.h>
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <gui/IGraphicBufferProducer.h>
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <gui/Surface.h>
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovnamespace android {
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovenum {
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    SET_PREVIEW_DISPLAY,
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    SET_PREVIEW_TEXTURE,
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    SET_PREVIEW_CALLBACK_FLAG,
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    START_PREVIEW,
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    STOP_PREVIEW,
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    AUTO_FOCUS,
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    CANCEL_AUTO_FOCUS,
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    TAKE_PICTURE,
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    SET_PARAMETERS,
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    GET_PARAMETERS,
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    SEND_COMMAND,
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    CONNECT,
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    LOCK,
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    UNLOCK,
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    PREVIEW_ENABLED,
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    START_RECORDING,
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    STOP_RECORDING,
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    RECORDING_ENABLED,
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    RELEASE_RECORDING_FRAME,
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    STORE_META_DATA_IN_BUFFERS,
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovclass BpCamera: public BpInterface<ICamera>
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovpublic:
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    BpCamera(const sp<IBinder>& impl)
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        : BpInterface<ICamera>(impl)
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // disconnect from camera service
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    void disconnect()
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("disconnect");
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(DISCONNECT, data, &reply);
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // pass the buffered Surface to the camera service
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t setPreviewDisplay(const sp<Surface>& surface)
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("setPreviewDisplay");
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Surface::writeToParcel(surface, &data);
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(SET_PREVIEW_DISPLAY, data, &reply);
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // pass the buffered IGraphicBufferProducer to the camera service
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t setPreviewTexture(const sp<IGraphicBufferProducer>& bufferProducer)
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("setPreviewTexture");
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        sp<IBinder> b(bufferProducer->asBinder());
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeStrongBinder(b);
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(SET_PREVIEW_TEXTURE, data, &reply);
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // set the preview callback flag to affect how the received frames from
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // preview are handled. See Camera.h for details.
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    void setPreviewCallbackFlag(int flag)
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("setPreviewCallbackFlag(%d)", flag);
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInt32(flag);
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(SET_PREVIEW_CALLBACK_FLAG, data, &reply);
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // start preview mode, must call setPreviewDisplay first
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t startPreview()
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("startPreview");
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(START_PREVIEW, data, &reply);
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // start recording mode, must call setPreviewDisplay first
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t startRecording()
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("startRecording");
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(START_RECORDING, data, &reply);
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // stop preview mode
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    void stopPreview()
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("stopPreview");
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(STOP_PREVIEW, data, &reply);
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // stop recording mode
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    void stopRecording()
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("stopRecording");
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(STOP_RECORDING, data, &reply);
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    void releaseRecordingFrame(const sp<IMemory>& mem)
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("releaseRecordingFrame");
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeStrongBinder(mem->asBinder());
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(RELEASE_RECORDING_FRAME, data, &reply);
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t storeMetaDataInBuffers(bool enabled)
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("storeMetaDataInBuffers: %s", enabled? "true": "false");
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInt32(enabled);
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // check preview state
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    bool previewEnabled()
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("previewEnabled");
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(PREVIEW_ENABLED, data, &reply);
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // check recording state
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    bool recordingEnabled()
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("recordingEnabled");
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(RECORDING_ENABLED, data, &reply);
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // auto focus
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t autoFocus()
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("autoFocus");
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(AUTO_FOCUS, data, &reply);
189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        status_t ret = reply.readInt32();
190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return ret;
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // cancel focus
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t cancelAutoFocus()
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("cancelAutoFocus");
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(CANCEL_AUTO_FOCUS, data, &reply);
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        status_t ret = reply.readInt32();
201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return ret;
202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // take a picture - returns an IMemory (ref-counted mmap)
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t takePicture(int msgType)
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("takePicture: 0x%x", msgType);
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInt32(msgType);
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(TAKE_PICTURE, data, &reply);
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        status_t ret = reply.readInt32();
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return ret;
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // set preview/capture parameters - key/value pairs
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    status_t setParameters(const String8& params)
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("setParameters");
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeString8(params);
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(SET_PARAMETERS, data, &reply);
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    // get preview/capture parameters - key/value pairs
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    String8 getParameters() const
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("getParameters");
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(GET_PARAMETERS, data, &reply);
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readString8();
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        ALOGV("sendCommand");
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInt32(cmd);
242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInt32(arg1);
243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInt32(arg2);
244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(SEND_COMMAND, data, &reply);
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    virtual status_t connect(const sp<ICameraClient>& cameraClient)
248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeStrongBinder(cameraClient->asBinder());
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(CONNECT, data, &reply);
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    virtual status_t lock()
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(LOCK, data, &reply);
260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    virtual status_t unlock()
263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    {
264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        Parcel data, reply;
265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        remote()->transact(UNLOCK, data, &reply);
267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return reply.readInt32();
268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov};
270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovIMPLEMENT_META_INTERFACE(Camera, "android.hardware.ICamera");
272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ----------------------------------------------------------------------
274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatus_t BnCamera::onTransact(
276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    switch(code) {
279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case DISCONNECT: {
280b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("DISCONNECT");
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            disconnect();
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
284b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case SET_PREVIEW_DISPLAY: {
286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("SET_PREVIEW_DISPLAY");
287b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
288b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            sp<Surface> surface = Surface::readFromParcel(data);
289b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(setPreviewDisplay(surface));
290b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
291b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case SET_PREVIEW_TEXTURE: {
293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("SET_PREVIEW_TEXTURE");
294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            sp<IGraphicBufferProducer> st =
296b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(setPreviewTexture(st));
298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case SET_PREVIEW_CALLBACK_FLAG: {
301b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("SET_PREVIEW_CALLBACK_TYPE");
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int callback_flag = data.readInt32();
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            setPreviewCallbackFlag(callback_flag);
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
306b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case START_PREVIEW: {
308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("START_PREVIEW");
309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(startPreview());
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
313b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case START_RECORDING: {
314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("START_RECORDING");
315b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
316b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(startRecording());
317b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case STOP_PREVIEW: {
320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("STOP_PREVIEW");
321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            stopPreview();
323b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
324b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
325b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case STOP_RECORDING: {
326b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("STOP_RECORDING");
327b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
328b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            stopRecording();
329b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
330b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
331b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case RELEASE_RECORDING_FRAME: {
332b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("RELEASE_RECORDING_FRAME");
333b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
334b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            sp<IMemory> mem = interface_cast<IMemory>(data.readStrongBinder());
335b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            releaseRecordingFrame(mem);
336b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
337b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case STORE_META_DATA_IN_BUFFERS: {
339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("STORE_META_DATA_IN_BUFFERS");
340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            bool enabled = data.readInt32();
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(storeMetaDataInBuffers(enabled));
343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case PREVIEW_ENABLED: {
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("PREVIEW_ENABLED");
347b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(previewEnabled());
349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case RECORDING_ENABLED: {
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("RECORDING_ENABLED");
353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(recordingEnabled());
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
357b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case AUTO_FOCUS: {
358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("AUTO_FOCUS");
359b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
360b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(autoFocus());
361b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case CANCEL_AUTO_FOCUS: {
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("CANCEL_AUTO_FOCUS");
365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(cancelAutoFocus());
367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case TAKE_PICTURE: {
370b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("TAKE_PICTURE");
371b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int msgType = data.readInt32();
373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(takePicture(msgType));
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
375b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
376b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case SET_PARAMETERS: {
377b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("SET_PARAMETERS");
378b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
379b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            String8 params(data.readString8());
380b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(setParameters(params));
381b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
382b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } break;
383b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case GET_PARAMETERS: {
384b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("GET_PARAMETERS");
385b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
386b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             reply->writeString8(getParameters());
387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } break;
389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case SEND_COMMAND: {
390b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ALOGV("SEND_COMMAND");
391b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
392b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int command = data.readInt32();
393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int arg1 = data.readInt32();
394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int arg2 = data.readInt32();
395b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(sendCommand(command, arg1, arg2));
396b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
397b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } break;
398b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case CONNECT: {
399b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
400b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder());
401b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(connect(cameraClient));
402b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
403b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
404b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case LOCK: {
405b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
406b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(lock());
407b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
408b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
409b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        case UNLOCK: {
410b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            CHECK_INTERFACE(ICamera, data, reply);
411b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            reply->writeInt32(unlock());
412b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return NO_ERROR;
413b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } break;
414b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        default:
415b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return BBinder::onTransact(code, data, reply, flags);
416b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
417b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
418b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
419b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// ----------------------------------------------------------------------------
420b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
421b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}; // namespace android
422b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov