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