ICameraService.cpp revision d1176ef16677b6c94fb893edb6a864cdccc0b190
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 18bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin#define LOG_TAG "BpCameraService" 19bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin#include <utils/Log.h> 20d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <utils/Errors.h> 21bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <stdint.h> 233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <sys/types.h> 243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/Parcel.h> 263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IPCThreadState.h> 273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IServiceManager.h> 283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/ICameraService.h> 30bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <camera/ICameraServiceListener.h> 31c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraUser.h> 32c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraCallbacks.h> 33c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICamera.h> 34c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICameraClient.h> 357b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h> 367b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceCallbacks.h> 372b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He#include <camera/CameraMetadata.h> 38d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <camera/VendorTagDescriptor.h> 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 42bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinnamespace { 43bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 44bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinenum { 45bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_SECURITY = -1, 46bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_BAD_PARCELABLE = -2, 47bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_ILLEGAL_ARGUMENT = -3, 48bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_NULL_POINTER = -4, 49bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_ILLEGAL_STATE = -5, 50bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin EX_HAS_REPLY_HEADER = -128, // special; see below 51bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin}; 52bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 53bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinstatic bool readExceptionCode(Parcel& reply) { 54bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin int32_t exceptionCode = reply.readExceptionCode(); 55bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 56bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (exceptionCode != 0) { 57bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin const char* errorMsg; 58bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin switch(exceptionCode) { 59bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_SECURITY: 60bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "Security"; 61bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 62bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_BAD_PARCELABLE: 63bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "BadParcelable"; 64bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 65bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_NULL_POINTER: 66bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "NullPointer"; 67bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 68bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_ILLEGAL_STATE: 69bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "IllegalState"; 70bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 71bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin // Binder should be handling this code inside Parcel::readException 72bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin // but lets have a to-string here anyway just in case. 73bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin case EX_HAS_REPLY_HEADER: 74bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "HasReplyHeader"; 75bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin break; 76bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin default: 77bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin errorMsg = "Unknown"; 78bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin } 79bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 80bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin ALOGE("Binder transmission error %s (%d)", errorMsg, exceptionCode); 81bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin return true; 82bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin } 83bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 84bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin return false; 85bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin} 86bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 87bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin}; 88bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass BpCameraService: public BpInterface<ICameraService> 903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian BpCameraService(const sp<IBinder>& impl) 933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian : BpInterface<ICameraService>(impl) 943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 9735a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang // get number of cameras available 9835a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang virtual int32_t getNumberOfCameras() 9935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang { 10035a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang Parcel data, reply; 10135a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 10235a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply); 103bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 104bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return 0; 10535a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang return reply.readInt32(); 10635a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang } 10735a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang 108ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang // get information about a camera 109ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang virtual status_t getCameraInfo(int cameraId, 110ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang struct CameraInfo* cameraInfo) { 111ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang Parcel data, reply; 112ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 113ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang data.writeInt32(cameraId); 114ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang remote()->transact(BnCameraService::GET_CAMERA_INFO, data, &reply); 115bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 116bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return -EPROTO; 117bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin status_t result = reply.readInt32(); 118bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (reply.readInt32() != 0) { 119bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin cameraInfo->facing = reply.readInt32(); 120bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin cameraInfo->orientation = reply.readInt32(); 121bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin } 122bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin return result; 123ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang } 124ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang 1252b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He // get camera characteristics (static metadata) 1262b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He virtual status_t getCameraCharacteristics(int cameraId, 1272b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He CameraMetadata* cameraInfo) { 1282b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He Parcel data, reply; 1292b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 1302b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He data.writeInt32(cameraId); 1312b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He remote()->transact(BnCameraService::GET_CAMERA_CHARACTERISTICS, data, &reply); 1322b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He 1332b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He if (readExceptionCode(reply)) return -EPROTO; 1342b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He status_t result = reply.readInt32(); 1352b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He 1362b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He CameraMetadata out; 1372b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He if (reply.readInt32() != 0) { 1382b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He out.readFromParcel(&reply); 1392b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He } 1402b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He 1412b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He if (cameraInfo != NULL) { 1422b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He cameraInfo->swap(out); 1432b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He } 1442b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He 1452b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He return result; 1462b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He } 1472b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He 148d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk // Get enumeration and description of vendor tags for camera 149d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk virtual status_t getCameraVendorTagDescriptor(/*out*/sp<VendorTagDescriptor>& desc) { 150d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Parcel data, reply; 151d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 152d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk remote()->transact(BnCameraService::GET_CAMERA_VENDOR_TAG_DESCRIPTOR, data, &reply); 153d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 154d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (readExceptionCode(reply)) return -EPROTO; 155d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk status_t result = reply.readInt32(); 156d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 157d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (reply.readInt32() != 0) { 158d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk sp<VendorTagDescriptor> d; 159d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (VendorTagDescriptor::createFromParcel(&reply, /*out*/d) == OK) { 160d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk desc = d; 161d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 162d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 163d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return result; 164d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 165d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 166e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin // connect to camera service (android.hardware.Camera) 1670f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk virtual status_t connect(const sp<ICameraClient>& cameraClient, int cameraId, 1680f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk const String16 &clientPackageName, int clientUid, 1690f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk /*out*/ 1700f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<ICamera>& device) 1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian { 1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Parcel data, reply; 1733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian data.writeStrongBinder(cameraClient->asBinder()); 17535a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang data.writeInt32(cameraId); 176ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala data.writeString16(clientPackageName); 177ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala data.writeInt32(clientUid); 1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian remote()->transact(BnCameraService::CONNECT, data, &reply); 179bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 1800f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (readExceptionCode(reply)) return -EPROTO; 1810f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk status_t status = reply.readInt32(); 1820f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (reply.readInt32() != 0) { 1830f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk device = interface_cast<ICamera>(reply.readStrongBinder()); 1840f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } 1850f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk return status; 1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 187634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 188634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin // connect to camera service (pro client) 1890f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk virtual status_t connectPro(const sp<IProCameraCallbacks>& cameraCb, int cameraId, 1900f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk const String16 &clientPackageName, int clientUid, 1910f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk /*out*/ 1920f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<IProCameraUser>& device) 193634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin { 194634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin Parcel data, reply; 195634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 196634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeStrongBinder(cameraCb->asBinder()); 197634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin data.writeInt32(cameraId); 198c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin data.writeString16(clientPackageName); 199c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin data.writeInt32(clientUid); 200634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin remote()->transact(BnCameraService::CONNECT_PRO, data, &reply); 201bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 2020f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (readExceptionCode(reply)) return -EPROTO; 2030f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk status_t status = reply.readInt32(); 2040f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (reply.readInt32() != 0) { 2050f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk device = interface_cast<IProCameraUser>(reply.readStrongBinder()); 2060f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } 2070f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk return status; 208634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } 209bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 2107b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala // connect to camera service (android.hardware.camera2.CameraDevice) 2110f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk virtual status_t connectDevice( 212e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const sp<ICameraDeviceCallbacks>& cameraCb, 213e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int cameraId, 214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16& clientPackageName, 2150f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk int clientUid, 2160f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk /*out*/ 2170f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<ICameraDeviceUser>& device) 218e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin { 219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin Parcel data, reply; 220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 221e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeStrongBinder(cameraCb->asBinder()); 222e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(cameraId); 223e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeString16(clientPackageName); 224e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin data.writeInt32(clientUid); 225e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin remote()->transact(BnCameraService::CONNECT_DEVICE, data, &reply); 226e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 2270f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (readExceptionCode(reply)) return -EPROTO; 2280f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk status_t status = reply.readInt32(); 2290f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (reply.readInt32() != 0) { 2300f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk device = interface_cast<ICameraDeviceUser>(reply.readStrongBinder()); 2310f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } 2320f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk return status; 233e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } 234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin 235bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin virtual status_t addListener(const sp<ICameraServiceListener>& listener) 236bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin { 237bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin Parcel data, reply; 238bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 239bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin data.writeStrongBinder(listener->asBinder()); 240bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin remote()->transact(BnCameraService::ADD_LISTENER, data, &reply); 241bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 242bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return -EPROTO; 243bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin return reply.readInt32(); 244bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin } 245bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 246bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin virtual status_t removeListener(const sp<ICameraServiceListener>& listener) 247bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin { 248bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin Parcel data, reply; 249bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); 250bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin data.writeStrongBinder(listener->asBinder()); 251bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin remote()->transact(BnCameraService::REMOVE_LISTENER, data, &reply); 252bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 253bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin if (readExceptionCode(reply)) return -EPROTO; 254bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin return reply.readInt32(); 255bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin } 2563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianIMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService"); 2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------- 2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t BnCameraService::onTransact( 2633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 2643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian switch(code) { 26635a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang case GET_NUMBER_OF_CAMERAS: { 26735a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang CHECK_INTERFACE(ICameraService, data, reply); 268bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 26935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang reply->writeInt32(getNumberOfCameras()); 27035a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang return NO_ERROR; 27135a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang } break; 272ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang case GET_CAMERA_INFO: { 273ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang CHECK_INTERFACE(ICameraService, data, reply); 274bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin CameraInfo cameraInfo = CameraInfo(); 275ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang memset(&cameraInfo, 0, sizeof(cameraInfo)); 276ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang status_t result = getCameraInfo(data.readInt32(), &cameraInfo); 277bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 278bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeInt32(result); 279bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin 280bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin // Fake a parcelable object here 281bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeInt32(1); // means the parcelable is included 282ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang reply->writeInt32(cameraInfo.facing); 283ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang reply->writeInt32(cameraInfo.orientation); 284ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang return NO_ERROR; 285ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang } break; 2862b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He case GET_CAMERA_CHARACTERISTICS: { 2872b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He CHECK_INTERFACE(ICameraService, data, reply); 2882b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He CameraMetadata info; 2892b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He status_t result = getCameraCharacteristics(data.readInt32(), &info); 2902b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He reply->writeNoException(); 2912b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He reply->writeInt32(result); 2922b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He 2932b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He // out-variables are after exception and return value 2942b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He reply->writeInt32(1); // means the parcelable is included 2952b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He info.writeToParcel(reply); 2962b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He return NO_ERROR; 2972b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He } break; 298d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk case GET_CAMERA_VENDOR_TAG_DESCRIPTOR: { 299d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk CHECK_INTERFACE(ICameraService, data, reply); 300d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk sp<VendorTagDescriptor> d; 301d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk status_t result = getCameraVendorTagDescriptor(d); 302d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk reply->writeNoException(); 303d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk reply->writeInt32(result); 304d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 305d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk // out-variables are after exception and return value 306d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk reply->writeInt32(1); // means the parcelable is included 307d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (d == NULL) { 308d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk reply->writeInt32(0); 309d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } else { 310d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk d->writeToParcel(reply); 311d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 312d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return NO_ERROR; 313d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } break; 3143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian case CONNECT: { 3153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian CHECK_INTERFACE(ICameraService, data, reply); 316ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala sp<ICameraClient> cameraClient = 317ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala interface_cast<ICameraClient>(data.readStrongBinder()); 318ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int32_t cameraId = data.readInt32(); 319ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16 clientName = data.readString16(); 320ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int32_t clientUid = data.readInt32(); 3210f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<ICamera> camera; 3220f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk status_t status = connect(cameraClient, cameraId, 3230f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk clientName, clientUid, /*out*/ camera); 324bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 3250f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(status); 3260f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (camera != NULL) { 3270f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(1); 3280f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeStrongBinder(camera->asBinder()); 3290f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } else { 3300f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(0); 3310f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } 3323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return NO_ERROR; 3333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } break; 334634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin case CONNECT_PRO: { 335634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin CHECK_INTERFACE(ICameraService, data, reply); 336bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin sp<IProCameraCallbacks> cameraClient = 337bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin interface_cast<IProCameraCallbacks>(data.readStrongBinder()); 338c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin int32_t cameraId = data.readInt32(); 339c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin const String16 clientName = data.readString16(); 340c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin int32_t clientUid = data.readInt32(); 3410f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<IProCameraUser> camera; 3420f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk status_t status = connectPro(cameraClient, cameraId, 3430f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk clientName, clientUid, /*out*/ camera); 344bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 3450f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(status); 3460f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (camera != NULL) { 3470f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(1); 3480f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeStrongBinder(camera->asBinder()); 3490f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } else { 3500f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(0); 3510f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } 352e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin return NO_ERROR; 353e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin } break; 354e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin case CONNECT_DEVICE: { 355e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin CHECK_INTERFACE(ICameraService, data, reply); 356e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin sp<ICameraDeviceCallbacks> cameraClient = 357e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin interface_cast<ICameraDeviceCallbacks>(data.readStrongBinder()); 358e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int32_t cameraId = data.readInt32(); 359e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin const String16 clientName = data.readString16(); 360e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin int32_t clientUid = data.readInt32(); 3610f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<ICameraDeviceUser> camera; 3620f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk status_t status = connectDevice(cameraClient, cameraId, 3630f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk clientName, clientUid, /*out*/ camera); 364e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin reply->writeNoException(); 3650f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(status); 3660f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk if (camera != NULL) { 3670f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(1); 3680f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeStrongBinder(camera->asBinder()); 3690f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } else { 3700f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk reply->writeInt32(0); 3710f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk } 372634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin return NO_ERROR; 373634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin } break; 374bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin case ADD_LISTENER: { 375bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin CHECK_INTERFACE(ICameraService, data, reply); 376bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin sp<ICameraServiceListener> listener = 377bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin interface_cast<ICameraServiceListener>(data.readStrongBinder()); 378bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 379bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin reply->writeInt32(addListener(listener)); 380bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin return NO_ERROR; 381bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin } break; 382bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin case REMOVE_LISTENER: { 383bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin CHECK_INTERFACE(ICameraService, data, reply); 384bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin sp<ICameraServiceListener> listener = 385bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin interface_cast<ICameraServiceListener>(data.readStrongBinder()); 386bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin reply->writeNoException(); 387bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin reply->writeInt32(removeListener(listener)); 388bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin return NO_ERROR; 389bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin } break; 3903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian default: 3913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 3923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------------- 3963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 398