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