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