ICameraService.cpp revision 65d14b9825311f9d1847cf282bd0419e71bac666
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>
2165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin#include <utils/String16.h>
22bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <stdint.h>
243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <sys/types.h>
253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/Parcel.h>
273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IPCThreadState.h>
283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IServiceManager.h>
293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/ICameraService.h>
31bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <camera/ICameraServiceListener.h>
32c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraUser.h>
33c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraCallbacks.h>
34c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICamera.h>
35c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICameraClient.h>
367b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h>
377b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceCallbacks.h>
382b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He#include <camera/CameraMetadata.h>
39d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <camera/VendorTagDescriptor.h>
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android {
423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
43bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinnamespace {
44bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
45bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinenum {
46bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    EX_SECURITY = -1,
47bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    EX_BAD_PARCELABLE = -2,
48bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    EX_ILLEGAL_ARGUMENT = -3,
49bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    EX_NULL_POINTER = -4,
50bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    EX_ILLEGAL_STATE = -5,
51bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    EX_HAS_REPLY_HEADER = -128,  // special; see below
52bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin};
53bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
54bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkinstatic bool readExceptionCode(Parcel& reply) {
55bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    int32_t exceptionCode = reply.readExceptionCode();
56bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
57bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    if (exceptionCode != 0) {
58bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        const char* errorMsg;
59bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        switch(exceptionCode) {
60bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            case EX_SECURITY:
61bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                errorMsg = "Security";
62bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                break;
63bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            case EX_BAD_PARCELABLE:
64bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                errorMsg = "BadParcelable";
65bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                break;
66bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            case EX_NULL_POINTER:
67bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                errorMsg = "NullPointer";
68bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                break;
69bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            case EX_ILLEGAL_STATE:
70bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                errorMsg = "IllegalState";
71bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                break;
72bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            // Binder should be handling this code inside Parcel::readException
73bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            // but lets have a to-string here anyway just in case.
74bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            case EX_HAS_REPLY_HEADER:
75bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                errorMsg = "HasReplyHeader";
76bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                break;
77bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            default:
78bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                errorMsg = "Unknown";
79bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        }
80bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
81bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        ALOGE("Binder transmission error %s (%d)", errorMsg, exceptionCode);
82bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        return true;
83bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    }
84bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
85bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    return false;
86bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin}
87bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
88bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin};
89bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass BpCameraService: public BpInterface<ICameraService>
913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic:
933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    BpCameraService(const sp<IBinder>& impl)
943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        : BpInterface<ICameraService>(impl)
953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
9835a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    // get number of cameras available
9935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    virtual int32_t getNumberOfCameras()
10035a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    {
10135a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang        Parcel data, reply;
10235a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
10335a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang        remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply);
104bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
105bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        if (readExceptionCode(reply)) return 0;
10635a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang        return reply.readInt32();
10735a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    }
10835a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang
109ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang    // get information about a camera
110ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang    virtual status_t getCameraInfo(int cameraId,
111ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang                                   struct CameraInfo* cameraInfo) {
112ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang        Parcel data, reply;
113ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
114ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang        data.writeInt32(cameraId);
115ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang        remote()->transact(BnCameraService::GET_CAMERA_INFO, data, &reply);
116bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
117bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        if (readExceptionCode(reply)) return -EPROTO;
118bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        status_t result = reply.readInt32();
119bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        if (reply.readInt32() != 0) {
120bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            cameraInfo->facing = reply.readInt32();
121bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            cameraInfo->orientation = reply.readInt32();
122bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        }
123bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        return result;
124ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang    }
125ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang
1262b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He    // get camera characteristics (static metadata)
1272b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He    virtual status_t getCameraCharacteristics(int cameraId,
1282b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He                                              CameraMetadata* cameraInfo) {
1292b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        Parcel data, reply;
1302b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
1312b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        data.writeInt32(cameraId);
1322b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        remote()->transact(BnCameraService::GET_CAMERA_CHARACTERISTICS, data, &reply);
1332b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He
1342b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        if (readExceptionCode(reply)) return -EPROTO;
1352b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        status_t result = reply.readInt32();
1362b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He
1372b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        CameraMetadata out;
1382b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        if (reply.readInt32() != 0) {
1392b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            out.readFromParcel(&reply);
1402b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        }
1412b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He
1422b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        if (cameraInfo != NULL) {
1432b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            cameraInfo->swap(out);
1442b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        }
1452b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He
1462b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        return result;
1472b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He    }
1482b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He
149d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk    // Get enumeration and description of vendor tags for camera
150d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk    virtual status_t getCameraVendorTagDescriptor(/*out*/sp<VendorTagDescriptor>& desc) {
151d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        Parcel data, reply;
152d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
153d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        remote()->transact(BnCameraService::GET_CAMERA_VENDOR_TAG_DESCRIPTOR, data, &reply);
154d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk
155d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        if (readExceptionCode(reply)) return -EPROTO;
156d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        status_t result = reply.readInt32();
157d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk
158d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        if (reply.readInt32() != 0) {
159d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            sp<VendorTagDescriptor> d;
160d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            if (VendorTagDescriptor::createFromParcel(&reply, /*out*/d) == OK) {
161d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk                desc = d;
162d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            }
163d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        }
164d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        return result;
165d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk    }
166d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk
167e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // connect to camera service (android.hardware.Camera)
1680f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    virtual status_t connect(const sp<ICameraClient>& cameraClient, int cameraId,
1690f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                             const String16 &clientPackageName, int clientUid,
1700f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                             /*out*/
1710f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                             sp<ICamera>& device)
1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
1733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Parcel data, reply;
1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        data.writeStrongBinder(cameraClient->asBinder());
17635a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang        data.writeInt32(cameraId);
177ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        data.writeString16(clientPackageName);
178ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        data.writeInt32(clientUid);
1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        remote()->transact(BnCameraService::CONNECT, data, &reply);
180bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
1810f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        if (readExceptionCode(reply)) return -EPROTO;
1820f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        status_t status = reply.readInt32();
1830f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        if (reply.readInt32() != 0) {
1840f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            device = interface_cast<ICamera>(reply.readStrongBinder());
1850f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        }
1860f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        return status;
1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
188634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
189634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // connect to camera service (pro client)
1900f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    virtual status_t connectPro(const sp<IProCameraCallbacks>& cameraCb, int cameraId,
1910f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                const String16 &clientPackageName, int clientUid,
1920f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                /*out*/
1930f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                sp<IProCameraUser>& device)
194634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    {
195634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        Parcel data, reply;
196634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
197634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeStrongBinder(cameraCb->asBinder());
198634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        data.writeInt32(cameraId);
199c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin        data.writeString16(clientPackageName);
200c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin        data.writeInt32(clientUid);
201634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        remote()->transact(BnCameraService::CONNECT_PRO, data, &reply);
202bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
2030f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        if (readExceptionCode(reply)) return -EPROTO;
2040f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        status_t status = reply.readInt32();
2050f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        if (reply.readInt32() != 0) {
2060f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            device = interface_cast<IProCameraUser>(reply.readStrongBinder());
2070f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        }
2080f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        return status;
209634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    }
210bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
2117b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala    // connect to camera service (android.hardware.camera2.CameraDevice)
2120f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    virtual status_t connectDevice(
213e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const sp<ICameraDeviceCallbacks>& cameraCb,
214e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraId,
215e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const String16& clientPackageName,
2160f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            int clientUid,
2170f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            /*out*/
2180f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            sp<ICameraDeviceUser>& device)
219e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
220e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
221e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
222e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeStrongBinder(cameraCb->asBinder());
223e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(cameraId);
224e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeString16(clientPackageName);
225e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInt32(clientUid);
226e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(BnCameraService::CONNECT_DEVICE, data, &reply);
227e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
2280f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        if (readExceptionCode(reply)) return -EPROTO;
2290f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        status_t status = reply.readInt32();
2300f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        if (reply.readInt32() != 0) {
2310f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            device = interface_cast<ICameraDeviceUser>(reply.readStrongBinder());
2320f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        }
2330f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk        return status;
234e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
235e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
236bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    virtual status_t addListener(const sp<ICameraServiceListener>& listener)
237bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    {
238bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        Parcel data, reply;
239bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
240bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        data.writeStrongBinder(listener->asBinder());
241bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        remote()->transact(BnCameraService::ADD_LISTENER, data, &reply);
242bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
243bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        if (readExceptionCode(reply)) return -EPROTO;
244bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        return reply.readInt32();
245bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    }
246bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
247bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    virtual status_t removeListener(const sp<ICameraServiceListener>& listener)
248bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    {
249bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        Parcel data, reply;
250bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
251bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        data.writeStrongBinder(listener->asBinder());
252bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        remote()->transact(BnCameraService::REMOVE_LISTENER, data, &reply);
253bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
254bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin        if (readExceptionCode(reply)) return -EPROTO;
255bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        return reply.readInt32();
256bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    }
25765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
25865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    virtual status_t getLegacyParameters(int cameraId, String16* parameters) {
25965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        if (parameters == NULL) {
26065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            ALOGE("%s: parameters must not be null", __FUNCTION__);
26165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            return BAD_VALUE;
26265d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        }
26365d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
26465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        Parcel data, reply;
26565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
26665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        data.writeInt32(cameraId);
26765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        remote()->transact(BnCameraService::GET_LEGACY_PARAMETERS, data, &reply);
26865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        if (readExceptionCode(reply)) return -EPROTO;
26965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
27065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        status_t res = data.readInt32();
27165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        int32_t length = data.readInt32(); // -1 means null
27265d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        if (length > 0) {
27365d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            *parameters = data.readString16();
27465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        } else {
27565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            *parameters = String16();
27665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        }
27765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
27865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        return res;
27965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    }
28065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
28165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    virtual status_t supportsCameraApi(int cameraId, int apiVersion) {
28265d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        Parcel data, reply;
28365d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
28465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        data.writeInt32(cameraId);
28565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        data.writeInt32(apiVersion);
28665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        remote()->transact(BnCameraService::SUPPORTS_CAMERA_API, data, &reply);
28765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        if (readExceptionCode(reply)) return -EPROTO;
28865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
28965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        status_t res = data.readInt32();
29065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        return res;
29165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    }
2923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
2933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianIMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService");
2953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ----------------------------------------------------------------------
2973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t BnCameraService::onTransact(
2993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    switch(code) {
30235a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang        case GET_NUMBER_OF_CAMERAS: {
30335a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang            CHECK_INTERFACE(ICameraService, data, reply);
304bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeNoException();
30535a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang            reply->writeInt32(getNumberOfCameras());
30635a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang            return NO_ERROR;
30735a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang        } break;
308ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang        case GET_CAMERA_INFO: {
309ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang            CHECK_INTERFACE(ICameraService, data, reply);
310bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            CameraInfo cameraInfo = CameraInfo();
311ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang            memset(&cameraInfo, 0, sizeof(cameraInfo));
312ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang            status_t result = getCameraInfo(data.readInt32(), &cameraInfo);
313bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeNoException();
314bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeInt32(result);
315bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
316bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            // Fake a parcelable object here
317bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeInt32(1); // means the parcelable is included
318ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang            reply->writeInt32(cameraInfo.facing);
319ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang            reply->writeInt32(cameraInfo.orientation);
320ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang            return NO_ERROR;
321ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang        } break;
3222b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        case GET_CAMERA_CHARACTERISTICS: {
3232b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            CHECK_INTERFACE(ICameraService, data, reply);
3242b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            CameraMetadata info;
3252b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            status_t result = getCameraCharacteristics(data.readInt32(), &info);
3262b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            reply->writeNoException();
3272b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            reply->writeInt32(result);
3282b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He
3292b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            // out-variables are after exception and return value
3302b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            reply->writeInt32(1); // means the parcelable is included
3312b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            info.writeToParcel(reply);
3322b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He            return NO_ERROR;
3332b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He        } break;
334d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        case GET_CAMERA_VENDOR_TAG_DESCRIPTOR: {
335d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            CHECK_INTERFACE(ICameraService, data, reply);
336d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            sp<VendorTagDescriptor> d;
337d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            status_t result = getCameraVendorTagDescriptor(d);
338d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            reply->writeNoException();
339d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            reply->writeInt32(result);
340d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk
341d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            // out-variables are after exception and return value
342d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            if (d == NULL) {
343d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk                reply->writeInt32(0);
344d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            } else {
345e1445da74730473a66a3ae8414e940aebfe6585dIgor Murashkin                reply->writeInt32(1); // means the parcelable is included
346d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk                d->writeToParcel(reply);
347d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            }
348d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk            return NO_ERROR;
349d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk        } break;
3503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        case CONNECT: {
3513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            CHECK_INTERFACE(ICameraService, data, reply);
352ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            sp<ICameraClient> cameraClient =
353ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                    interface_cast<ICameraClient>(data.readStrongBinder());
354ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            int32_t cameraId = data.readInt32();
355ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            const String16 clientName = data.readString16();
356ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            int32_t clientUid = data.readInt32();
3570f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            sp<ICamera> camera;
3580f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            status_t status = connect(cameraClient, cameraId,
359e1445da74730473a66a3ae8414e940aebfe6585dIgor Murashkin                    clientName, clientUid, /*out*/camera);
360bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeNoException();
3610f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            reply->writeInt32(status);
3620f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            if (camera != NULL) {
3630f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeInt32(1);
3640f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeStrongBinder(camera->asBinder());
3650f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            } else {
3660f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeInt32(0);
3670f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            }
3683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return NO_ERROR;
3693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } break;
370634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        case CONNECT_PRO: {
371634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            CHECK_INTERFACE(ICameraService, data, reply);
372bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            sp<IProCameraCallbacks> cameraClient =
373bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin                interface_cast<IProCameraCallbacks>(data.readStrongBinder());
374c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin            int32_t cameraId = data.readInt32();
375c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin            const String16 clientName = data.readString16();
376c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin            int32_t clientUid = data.readInt32();
3770f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            sp<IProCameraUser> camera;
3780f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            status_t status = connectPro(cameraClient, cameraId,
379e1445da74730473a66a3ae8414e940aebfe6585dIgor Murashkin                    clientName, clientUid, /*out*/camera);
380bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeNoException();
3810f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            reply->writeInt32(status);
3820f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            if (camera != NULL) {
3830f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeInt32(1);
3840f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeStrongBinder(camera->asBinder());
3850f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            } else {
3860f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeInt32(0);
3870f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            }
388e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
389e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
390e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case CONNECT_DEVICE: {
391e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraService, data, reply);
392e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            sp<ICameraDeviceCallbacks> cameraClient =
393e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                interface_cast<ICameraDeviceCallbacks>(data.readStrongBinder());
394e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int32_t cameraId = data.readInt32();
395e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const String16 clientName = data.readString16();
396e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int32_t clientUid = data.readInt32();
3970f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            sp<ICameraDeviceUser> camera;
3980f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            status_t status = connectDevice(cameraClient, cameraId,
399e1445da74730473a66a3ae8414e940aebfe6585dIgor Murashkin                    clientName, clientUid, /*out*/camera);
400e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            reply->writeNoException();
4010f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            reply->writeInt32(status);
4020f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            if (camera != NULL) {
4030f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeInt32(1);
4040f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeStrongBinder(camera->asBinder());
4050f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            } else {
4060f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                reply->writeInt32(0);
4070f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            }
408634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return NO_ERROR;
409634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        } break;
410bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        case ADD_LISTENER: {
411bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            CHECK_INTERFACE(ICameraService, data, reply);
412bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            sp<ICameraServiceListener> listener =
413bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                interface_cast<ICameraServiceListener>(data.readStrongBinder());
414bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeNoException();
415bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            reply->writeInt32(addListener(listener));
416bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            return NO_ERROR;
417bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        } break;
418bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        case REMOVE_LISTENER: {
419bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            CHECK_INTERFACE(ICameraService, data, reply);
420bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            sp<ICameraServiceListener> listener =
421bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                interface_cast<ICameraServiceListener>(data.readStrongBinder());
422bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin            reply->writeNoException();
423bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            reply->writeInt32(removeListener(listener));
424bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin            return NO_ERROR;
425bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        } break;
42665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        case GET_LEGACY_PARAMETERS: {
42765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            CHECK_INTERFACE(ICameraService, data, reply);
42865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            int cameraId = data.readInt32();
42965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            String16 parameters;
43065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
43165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            reply->writeNoException();
43265d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            // return value
43365d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            reply->writeInt32(getLegacyParameters(cameraId, &parameters));
43465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            // out parameters
43565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            reply->writeInt32(1); // parameters is always available
43665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            reply->writeString16(parameters);
43765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            return NO_ERROR;
43865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        } break;
43965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        case SUPPORTS_CAMERA_API: {
44065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            CHECK_INTERFACE(ICameraService, data, reply);
44165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            int cameraId = data.readInt32();
44265d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            int apiVersion = data.readInt32();
44365d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
44465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            reply->writeNoException();
44565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            // return value
44665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            reply->writeInt32(supportsCameraApi(cameraId, apiVersion));
44765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            return NO_ERROR;
44865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin        } break;
4493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        default:
4503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
4513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
4523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ----------------------------------------------------------------------------
4553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
457