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>
258ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
26df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/Surface.h>
273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android {
293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianenum {
313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
321ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala    SET_PREVIEW_TARGET,
333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    SET_PREVIEW_CALLBACK_FLAG,
343ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    SET_PREVIEW_CALLBACK_TARGET,
353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    START_PREVIEW,
363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    STOP_PREVIEW,
373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    AUTO_FOCUS,
383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    CANCEL_AUTO_FOCUS,
393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    TAKE_PICTURE,
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    SET_PARAMETERS,
413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    GET_PARAMETERS,
423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    SEND_COMMAND,
433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    CONNECT,
443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOCK,
453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    UNLOCK,
463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    PREVIEW_ENABLED,
473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    START_RECORDING,
483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    STOP_RECORDING,
493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    RECORDING_ENABLED,
503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    RELEASE_RECORDING_FRAME,
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    {
653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("disconnect");
663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(DISCONNECT, data, &reply);
69bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        reply.readExceptionCode();
703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
728ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    // pass the buffered IGraphicBufferProducer to the camera service
731ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala    status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)
74bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    {
751ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        ALOGV("setPreviewTarget");
76bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        Parcel data, reply;
77bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
788ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        sp<IBinder> b(bufferProducer->asBinder());
79bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        data.writeStrongBinder(b);
801ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        remote()->transact(SET_PREVIEW_TARGET, data, &reply);
81bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        return reply.readInt32();
82bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    }
83bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis
843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // set the preview callback flag to affect how the received frames from
853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // preview are handled. See Camera.h for details.
863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void setPreviewCallbackFlag(int flag)
873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setPreviewCallbackFlag(%d)", flag);
893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInt32(flag);
923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(SET_PREVIEW_CALLBACK_FLAG, data, &reply);
933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
953ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    status_t setPreviewCallbackTarget(
963ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            const sp<IGraphicBufferProducer>& callbackProducer)
973ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    {
983ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGV("setPreviewCallbackTarget");
993ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        Parcel data, reply;
1003ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1013ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        sp<IBinder> b(callbackProducer->asBinder());
1023ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        data.writeStrongBinder(b);
1033ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        remote()->transact(SET_PREVIEW_CALLBACK_TARGET, data, &reply);
1043ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        return reply.readInt32();
1053ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
1063ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
1071ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala    // start preview mode, must call setPreviewTarget first
1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t startPreview()
1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("startPreview");
1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(START_PREVIEW, data, &reply);
1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1171ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala    // start recording mode, must call setPreviewTarget first
1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t startRecording()
1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("startRecording");
1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(START_RECORDING, data, &reply);
1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // stop preview mode
1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void stopPreview()
1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("stopPreview");
1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(STOP_PREVIEW, data, &reply);
1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // stop recording mode
1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void stopRecording()
1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("stopRecording");
1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(STOP_RECORDING, data, &reply);
1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    void releaseRecordingFrame(const sp<IMemory>& mem)
1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("releaseRecordingFrame");
1483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeStrongBinder(mem->asBinder());
1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(RELEASE_RECORDING_FRAME, data, &reply);
1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
154e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    status_t storeMetaDataInBuffers(bool enabled)
155e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    {
1563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("storeMetaDataInBuffers: %s", enabled? "true": "false");
157e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        Parcel data, reply;
158e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
159e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        data.writeInt32(enabled);
160e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
161e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        return reply.readInt32();
162e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    }
163e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // check preview state
1653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    bool previewEnabled()
1663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("previewEnabled");
1683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(PREVIEW_ENABLED, data, &reply);
1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // check recording state
1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    bool recordingEnabled()
1763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("recordingEnabled");
1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(RECORDING_ENABLED, data, &reply);
1813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
1823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // auto focus
1853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t autoFocus()
1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("autoFocus");
1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
1903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(AUTO_FOCUS, data, &reply);
1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        status_t ret = reply.readInt32();
1923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return ret;
1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // cancel focus
1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t cancelAutoFocus()
1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("cancelAutoFocus");
1993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(CANCEL_AUTO_FOCUS, data, &reply);
2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        status_t ret = reply.readInt32();
2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return ret;
2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // take a picture - returns an IMemory (ref-counted mmap)
207e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong    status_t takePicture(int msgType)
2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("takePicture: 0x%x", msgType);
2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
212e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong        data.writeInt32(msgType);
2133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(TAKE_PICTURE, data, &reply);
2143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        status_t ret = reply.readInt32();
2153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return ret;
2163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // set preview/capture parameters - key/value pairs
2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    status_t setParameters(const String8& params)
2203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("setParameters");
2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeString8(params);
2253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(SET_PARAMETERS, data, &reply);
2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // get preview/capture parameters - key/value pairs
2303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    String8 getParameters() const
2313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("getParameters");
2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(GET_PARAMETERS, data, &reply);
2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readString8();
2373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("sendCommand");
2413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInt32(cmd);
2443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInt32(arg1);
2453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInt32(arg2);
2463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(SEND_COMMAND, data, &reply);
2473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual status_t connect(const sp<ICameraClient>& cameraClient)
2503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeStrongBinder(cameraClient->asBinder());
2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(CONNECT, data, &reply);
2553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual status_t lock()
2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(LOCK, data, &reply);
2623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual status_t unlock()
2653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
2663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
2673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
2683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(UNLOCK, data, &reply);
2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return reply.readInt32();
2703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
2713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
2723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianIMPLEMENT_META_INTERFACE(Camera, "android.hardware.ICamera");
2743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ----------------------------------------------------------------------
2763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t BnCamera::onTransact(
2783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
2793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    switch(code) {
2813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case DISCONNECT: {
2823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("DISCONNECT");
2833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
2843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            disconnect();
285bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeNoException();
2863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
2873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
2881ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        case SET_PREVIEW_TARGET: {
2891ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala            ALOGV("SET_PREVIEW_TARGET");
290bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis            CHECK_INTERFACE(ICamera, data, reply);
2918ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            sp<IGraphicBufferProducer> st =
2928ba01021b573889802e67e029225a96f0dfa471aAndy McFadden                interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
2931ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala            reply->writeInt32(setPreviewTarget(st));
294bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis            return NO_ERROR;
295bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        } break;
2963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case SET_PREVIEW_CALLBACK_FLAG: {
2973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("SET_PREVIEW_CALLBACK_TYPE");
2983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
2993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            int callback_flag = data.readInt32();
3003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            setPreviewCallbackFlag(callback_flag);
3013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3033ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        case SET_PREVIEW_CALLBACK_TARGET: {
3043ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            ALOGV("SET_PREVIEW_CALLBACK_TARGET");
3053ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            CHECK_INTERFACE(ICamera, data, reply);
3063ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            sp<IGraphicBufferProducer> cp =
3073ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
3083ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            reply->writeInt32(setPreviewCallbackTarget(cp));
3093ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            return NO_ERROR;
3103ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
3113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case START_PREVIEW: {
3123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("START_PREVIEW");
3133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(startPreview());
3153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case START_RECORDING: {
3183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("START_RECORDING");
3193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(startRecording());
3213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case STOP_PREVIEW: {
3243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("STOP_PREVIEW");
3253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            stopPreview();
3273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case STOP_RECORDING: {
3303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("STOP_RECORDING");
3313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            stopRecording();
3333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case RELEASE_RECORDING_FRAME: {
3363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("RELEASE_RECORDING_FRAME");
3373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            sp<IMemory> mem = interface_cast<IMemory>(data.readStrongBinder());
3393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            releaseRecordingFrame(mem);
3403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
341e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        } break;
342e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        case STORE_META_DATA_IN_BUFFERS: {
3433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("STORE_META_DATA_IN_BUFFERS");
344e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            CHECK_INTERFACE(ICamera, data, reply);
345e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            bool enabled = data.readInt32();
346e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            reply->writeInt32(storeMetaDataInBuffers(enabled));
347e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            return NO_ERROR;
348e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong        } break;
3493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case PREVIEW_ENABLED: {
3503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("PREVIEW_ENABLED");
3513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(previewEnabled());
3533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case RECORDING_ENABLED: {
3563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("RECORDING_ENABLED");
3573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(recordingEnabled());
3593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case AUTO_FOCUS: {
3623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("AUTO_FOCUS");
3633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(autoFocus());
3653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case CANCEL_AUTO_FOCUS: {
3683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("CANCEL_AUTO_FOCUS");
3693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(cancelAutoFocus());
3713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case TAKE_PICTURE: {
3743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("TAKE_PICTURE");
3753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
376e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong            int msgType = data.readInt32();
377e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong            reply->writeInt32(takePicture(msgType));
3783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
3803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case SET_PARAMETERS: {
3813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("SET_PARAMETERS");
3823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            String8 params(data.readString8());
3843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(setParameters(params));
3853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         } break;
3873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case GET_PARAMETERS: {
3883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("GET_PARAMETERS");
3893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian             reply->writeString8(getParameters());
3913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         } break;
3933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case SEND_COMMAND: {
3943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("SEND_COMMAND");
3953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
3963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            int command = data.readInt32();
3973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            int arg1 = data.readInt32();
3983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            int arg2 = data.readInt32();
3993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(sendCommand(command, arg1, arg2));
4003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         } break;
4023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case CONNECT: {
4033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder());
4053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(connect(cameraClient));
4063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
4083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case LOCK: {
4093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(lock());
4113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
4133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case UNLOCK: {
4143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICamera, data, reply);
4153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            reply->writeInt32(unlock());
4163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
4173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
4183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        default:
4193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
4203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
4213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ----------------------------------------------------------------------------
4243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
426