ICamera.cpp revision bfa33aae4f54c0020a0568b16a3acb7b30b6ca3d
13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/*
23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright 2008, The Android Open Source Project
43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** you may not use this file except in compliance with the License.
73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** You may obtain a copy of the License at
83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Unless required by applicable law or agreed to in writing, software
123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** See the License for the specific language governing permissions and
153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** limitations under the License.
163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian*/
173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian//#define LOG_NDEBUG 0
193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define LOG_TAG "ICamera"
203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/Log.h>
213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <stdint.h>
223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <sys/types.h>
233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/Parcel.h>
243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/ICamera.h>
253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android {
273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianenum {
293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    SET_PREVIEW_DISPLAY,
31bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    SET_PREVIEW_TEXTURE,
323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    SET_PREVIEW_CALLBACK_FLAG,
333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    START_PREVIEW,
343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    STOP_PREVIEW,
353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    AUTO_FOCUS,
363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    CANCEL_AUTO_FOCUS,
373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    TAKE_PICTURE,
383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    SET_PARAMETERS,
393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    GET_PARAMETERS,
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    SEND_COMMAND,
413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    CONNECT,
423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOCK,
433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    UNLOCK,
443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    PREVIEW_ENABLED,
453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    START_RECORDING,
463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    STOP_RECORDING,
473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    RECORDING_ENABLED,
483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    RELEASE_RECORDING_FRAME,
49e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    GET_NUM_VIDEO_BUFFERS,
50e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    GET_VIDEO_BUFFER,
51e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    STORE_META_DATA_IN_BUFFERS,
523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass BpCamera: public BpInterface<ICamera>
553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic:
573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    BpCamera(const sp<IBinder>& impl)
583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        : BpInterface<ICamera>(impl)
593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // disconnect from camera service
633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void disconnect()
643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("disconnect");
663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(DISCONNECT, data, &reply);
693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
714b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis    // pass the buffered Surface to the camera service
724b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis    status_t setPreviewDisplay(const sp<Surface>& surface)
733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("setPreviewDisplay");
753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
774b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis        Surface::writeToParcel(surface, &data);
783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(SET_PREVIEW_DISPLAY, data, &reply);
793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
82bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    // pass the buffered SurfaceTexture to the camera service
83bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    status_t setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture)
84bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    {
85bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        LOGV("setPreviewTexture");
86bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        Parcel data, reply;
87bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
88bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        sp<IBinder> b(surfaceTexture->asBinder());
89bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        data.writeStrongBinder(b);
90bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        remote()->transact(SET_PREVIEW_TEXTURE, data, &reply);
91bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        return reply.readInt32();
92bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    }
93bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis
943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // set the preview callback flag to affect how the received frames from
953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // preview are handled. See Camera.h for details.
963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void setPreviewCallbackFlag(int flag)
973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("setPreviewCallbackFlag(%d)", flag);
993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInt32(flag);
1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(SET_PREVIEW_CALLBACK_FLAG, data, &reply);
1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // start preview mode, must call setPreviewDisplay first
1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t startPreview()
1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("startPreview");
1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(START_PREVIEW, data, &reply);
1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // start recording mode, must call setPreviewDisplay first
1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t startRecording()
1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("startRecording");
1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(START_RECORDING, data, &reply);
1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // stop preview mode
1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void stopPreview()
1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("stopPreview");
1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(STOP_PREVIEW, data, &reply);
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // stop recording mode
1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void stopRecording()
1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("stopRecording");
1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(STOP_RECORDING, data, &reply);
1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void releaseRecordingFrame(const sp<IMemory>& mem)
1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("releaseRecordingFrame");
1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeStrongBinder(mem->asBinder());
1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(RELEASE_RECORDING_FRAME, data, &reply);
1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
152e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    int32_t getNumberOfVideoBuffers() const
153e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    {
154e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        LOGV("getNumberOfVideoBuffers");
155e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        Parcel data, reply;
156e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
157e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        remote()->transact(GET_NUM_VIDEO_BUFFERS, data, &reply);
158e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        return reply.readInt32();
159e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    }
160e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
161e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    sp<IMemory> getVideoBuffer(int32_t index) const
162e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    {
163e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        LOGV("getVideoBuffer: %d", index);
164e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        Parcel data, reply;
165e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
166e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        data.writeInt32(index);
167e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        remote()->transact(GET_VIDEO_BUFFER, data, &reply);
168e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        sp<IMemory> mem = interface_cast<IMemory>(
169e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong                            reply.readStrongBinder());
170e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        return mem;
171e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    }
172e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
173e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    status_t storeMetaDataInBuffers(bool enabled)
174e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    {
175e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        LOGV("storeMetaDataInBuffers: %s", enabled? "true": "false");
176e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        Parcel data, reply;
177e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
178e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        data.writeInt32(enabled);
179e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
180e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        return reply.readInt32();
181e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    }
182e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
1833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // check preview state
1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    bool previewEnabled()
1853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("previewEnabled");
1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(PREVIEW_ENABLED, data, &reply);
1903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // check recording state
1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    bool recordingEnabled()
1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("recordingEnabled");
1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(RECORDING_ENABLED, data, &reply);
2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // auto focus
2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t autoFocus()
2053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("autoFocus");
2073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(AUTO_FOCUS, data, &reply);
2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        status_t ret = reply.readInt32();
2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return ret;
2123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // cancel focus
2153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t cancelAutoFocus()
2163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("cancelAutoFocus");
2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(CANCEL_AUTO_FOCUS, data, &reply);
2213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        status_t ret = reply.readInt32();
2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return ret;
2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // take a picture - returns an IMemory (ref-counted mmap)
2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t takePicture()
2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("takePicture");
2293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(TAKE_PICTURE, data, &reply);
2323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        status_t ret = reply.readInt32();
2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return ret;
2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // set preview/capture parameters - key/value pairs
2373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t setParameters(const String8& params)
2383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("setParameters");
2403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeString8(params);
2433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(SET_PARAMETERS, data, &reply);
2443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // get preview/capture parameters - key/value pairs
2483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    String8 getParameters() const
2493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGV("getParameters");
2513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(GET_PARAMETERS, data, &reply);
2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readString8();
2553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2588cc76ae259ad81d5a40277bbf5532696ebae8da8Wu-cheng Li        LOGV("sendCommand");
2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInt32(cmd);
2623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInt32(arg1);
2633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInt32(arg2);
2643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(SEND_COMMAND, data, &reply);
2653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual status_t connect(const sp<ICameraClient>& cameraClient)
2683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeStrongBinder(cameraClient->asBinder());
2723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(CONNECT, data, &reply);
2733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual status_t lock()
2763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(LOCK, data, &reply);
2803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual status_t unlock()
2833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(UNLOCK, data, &reply);
2873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
2903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianIMPLEMENT_META_INTERFACE(Camera, "android.hardware.ICamera");
2923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ----------------------------------------------------------------------
2943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t BnCamera::onTransact(
2963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
2973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    switch(code) {
2993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case DISCONNECT: {
3003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("DISCONNECT");
3013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            disconnect();
3033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case SET_PREVIEW_DISPLAY: {
3063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("SET_PREVIEW_DISPLAY");
3073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3084b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis            sp<Surface> surface = Surface::readFromParcel(data);
3093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(setPreviewDisplay(surface));
3103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
312bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        case SET_PREVIEW_TEXTURE: {
313bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis            LOGV("SET_PREVIEW_TEXTURE");
314bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis            CHECK_INTERFACE(ICamera, data, reply);
315bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis            sp<ISurfaceTexture> st = interface_cast<ISurfaceTexture>(data.readStrongBinder());
316bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis            reply->writeInt32(setPreviewTexture(st));
317bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis            return NO_ERROR;
318bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        } break;
3193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case SET_PREVIEW_CALLBACK_FLAG: {
3203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("SET_PREVIEW_CALLBACK_TYPE");
3213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            int callback_flag = data.readInt32();
3233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            setPreviewCallbackFlag(callback_flag);
3243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case START_PREVIEW: {
3273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("START_PREVIEW");
3283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(startPreview());
3303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case START_RECORDING: {
3333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("START_RECORDING");
3343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(startRecording());
3363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case STOP_PREVIEW: {
3393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("STOP_PREVIEW");
3403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            stopPreview();
3423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case STOP_RECORDING: {
3453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("STOP_RECORDING");
3463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            stopRecording();
3483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case RELEASE_RECORDING_FRAME: {
3513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("RELEASE_RECORDING_FRAME");
3523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            sp<IMemory> mem = interface_cast<IMemory>(data.readStrongBinder());
3543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            releaseRecordingFrame(mem);
3553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
357e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        case GET_NUM_VIDEO_BUFFERS: {
358e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            LOGV("GET_NUM_VIDEO_BUFFERS");
359e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            CHECK_INTERFACE(ICamera, data, reply);
360e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            reply->writeInt32(getNumberOfVideoBuffers());
361e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            return NO_ERROR;
362e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        } break;
363e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        case GET_VIDEO_BUFFER: {
364e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            LOGV("GET_VIDEO_BUFFER");
365e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            CHECK_INTERFACE(ICamera, data, reply);
366e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            int32_t index = data.readInt32();
367e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            reply->writeStrongBinder(getVideoBuffer(index)->asBinder());
368e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            return NO_ERROR;
369e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        } break;
370e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        case STORE_META_DATA_IN_BUFFERS: {
371e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            LOGV("STORE_META_DATA_IN_BUFFERS");
372e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            CHECK_INTERFACE(ICamera, data, reply);
373e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            bool enabled = data.readInt32();
374e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            reply->writeInt32(storeMetaDataInBuffers(enabled));
375e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            return NO_ERROR;
376e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        } break;
3773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case PREVIEW_ENABLED: {
3783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("PREVIEW_ENABLED");
3793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(previewEnabled());
3813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case RECORDING_ENABLED: {
3843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("RECORDING_ENABLED");
3853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(recordingEnabled());
3873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case AUTO_FOCUS: {
3903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("AUTO_FOCUS");
3913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(autoFocus());
3933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case CANCEL_AUTO_FOCUS: {
3963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("CANCEL_AUTO_FOCUS");
3973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(cancelAutoFocus());
3993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
4013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case TAKE_PICTURE: {
4023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("TAKE_PICTURE");
4033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(takePicture());
4053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
4073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case SET_PARAMETERS: {
4083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("SET_PARAMETERS");
4093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            String8 params(data.readString8());
4113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(setParameters(params));
4123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         } break;
4143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case GET_PARAMETERS: {
4153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("GET_PARAMETERS");
4163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian             reply->writeString8(getParameters());
4183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         } break;
4203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case SEND_COMMAND: {
4213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGV("SEND_COMMAND");
4223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            int command = data.readInt32();
4243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            int arg1 = data.readInt32();
4253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            int arg2 = data.readInt32();
4263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(sendCommand(command, arg1, arg2));
4273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         } break;
4293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case CONNECT: {
4303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder());
4323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(connect(cameraClient));
4333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
4353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case LOCK: {
4363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(lock());
4383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
4403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case UNLOCK: {
4413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(unlock());
4433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
4453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        default:
4463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
4473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
4483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ----------------------------------------------------------------------------
4513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
453