165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
2d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Copyright (C) 2008 The Android Open Source Project
3d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk *
4d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License");
5d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * you may not use this file except in compliance with the License.
6d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * You may obtain a copy of the License at
7d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk *
8d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk *      http://www.apache.org/licenses/LICENSE-2.0
9d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk *
10d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Unless required by applicable law or agreed to in writing, software
11d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS,
12d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * See the License for the specific language governing permissions and
14d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * limitations under the License.
15d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk */
1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
20634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin#include <utils/Vector.h>
21b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk#include <utils/KeyedVector.h>
22ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala#include <binder/AppOpsManager.h>
235462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian#include <binder/BinderService.h>
24ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala#include <binder/IAppOpsCallback.h>
2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICameraService.h>
268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <hardware/camera.h>
2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
28c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICamera.h>
29c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICameraClient.h>
30c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraUser.h>
31c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/IProCameraCallbacks.h>
327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceUser.h>
337b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceCallbacks.h>
34d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <camera/VendorTagDescriptor.h>
35cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include <camera/CaptureResult.h>
36b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk#include <camera/CameraParameters.h>
37c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
38bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <camera/ICameraServiceListener.h>
39bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* This needs to be increased if we can have more cameras */
4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define MAX_CAMERAS 2
4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android {
4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaextern volatile int32_t gLogLevel;
465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MemoryHeapBase;
4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MediaPlayer;
4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
505462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopianclass CameraService :
515462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian    public BinderService<CameraService>,
52ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    public BnCameraService,
53cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    public IBinder::DeathRecipient,
54cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    public camera_module_callbacks_t
5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
565462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian    friend class BinderService<CameraService>;
5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    class Client;
59634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    class BasicClient;
60634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
61634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // Implementation of BinderService<T>
625462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian    static char const* getServiceName() { return "media.camera"; }
6365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                        CameraService();
6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual             ~CameraService();
6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
67634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /////////////////////////////////////////////////////////////////////
68cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    // HAL Callbacks
69cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    virtual void        onDeviceStatusChanged(int cameraId,
70cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin                                              int newStatus);
71cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin
72cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    /////////////////////////////////////////////////////////////////////
73634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // ICameraService
7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual int32_t     getNumberOfCameras();
7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t    getCameraInfo(int cameraId,
7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                      struct CameraInfo* cameraInfo);
772b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He    virtual status_t    getCameraCharacteristics(int cameraId,
782b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He                                                 CameraMetadata* cameraInfo);
79d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk    virtual status_t    getCameraVendorTagDescriptor(/*out*/ sp<VendorTagDescriptor>& desc);
80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
810f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    virtual status_t connect(const sp<ICameraClient>& cameraClient, int cameraId,
820f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            const String16& clientPackageName, int clientUid,
830f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            /*out*/
840f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            sp<ICamera>& device);
850f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk
86b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He    virtual status_t connectLegacy(const sp<ICameraClient>& cameraClient, int cameraId,
87b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He            int halVersion, const String16& clientPackageName, int clientUid,
88b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He            /*out*/
89b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He            sp<ICamera>& device);
90b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He
910f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    virtual status_t connectPro(const sp<IProCameraCallbacks>& cameraCb,
920f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            int cameraId, const String16& clientPackageName, int clientUid,
930f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            /*out*/
940f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            sp<IProCameraUser>& device);
950f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk
960f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    virtual status_t connectDevice(
97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const sp<ICameraDeviceCallbacks>& cameraCb,
98e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            int cameraId,
99e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            const String16& clientPackageName,
1000f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            int clientUid,
1010f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            /*out*/
1020f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk            sp<ICameraDeviceUser>& device);
103ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin
104bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    virtual status_t    addListener(const sp<ICameraServiceListener>& listener);
105bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    virtual status_t    removeListener(
106bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                                    const sp<ICameraServiceListener>& listener);
107bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
10865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    virtual status_t    getLegacyParameters(
10965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            int cameraId,
11065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            /*out*/
11165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            String16* parameters);
11265d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
11365d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    // OK = supports api of that version, -EOPNOTSUPP = does not support
11465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    virtual status_t    supportsCameraApi(
11565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin            int cameraId, int apiVersion);
11665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
117634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // Extra permissions checks
11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t    onTransact(uint32_t code, const Parcel& data,
11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                   Parcel* reply, uint32_t flags);
120634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
121634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual status_t    dump(int fd, const Vector<String16>& args);
122634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
123634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /////////////////////////////////////////////////////////////////////
124634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // Client functionality
125634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual void        removeClientByRemote(const wp<IBinder>& remoteBinder);
12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
12765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    enum sound_kind {
12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        SOUND_SHUTTER = 0,
12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        SOUND_RECORDING = 1,
13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        NUM_SOUNDS
13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    };
13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void                loadSound();
13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void                playSound(sound_kind kind);
13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void                releaseSound();
13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
13798e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin    /////////////////////////////////////////////////////////////////////
13898e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin    // CameraDeviceFactory functionality
13998e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin    int                 getDeviceVersion(int cameraId, int* facing = NULL);
14098e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin
141f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala    /////////////////////////////////////////////////////////////////////
142f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala    // Shared utilities
143f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala    static status_t     filterOpenErrorCode(status_t err);
144f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala    static status_t     filterGetInfoErrorCode(status_t err);
145634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
146634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    /////////////////////////////////////////////////////////////////////
147634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // CameraClient functionality
148634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
149634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // returns plain pointer of client. Note that mClientLock should be acquired to
150634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // prevent the client from destruction. The result can be NULL.
151e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    virtual BasicClient* getClientByIdUnsafe(int cameraId);
152634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual Mutex*      getClientLockById(int cameraId);
153634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
154634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    class BasicClient : public virtual RefBase {
155634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    public:
156f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala        virtual status_t    initialize(camera_module_t *module) = 0;
157f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala        virtual void        disconnect();
158634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
159e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        // because we can't virtually inherit IInterface, which breaks
160e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        // virtual inheritance
161e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        virtual sp<IBinder> asBinderWrapper() = 0;
162e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
163e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin        // Return the remote callback binder object (e.g. IProCameraCallbacks)
164f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala        sp<IBinder>         getRemote() {
16544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            return mRemoteBinder;
166634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        }
167634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
168f67e23ef637d0b53a0d4bebb68c654234df3da94Eino-Ville Talvala        virtual status_t    dump(int fd, const Vector<String16>& args) = 0;
169e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
170634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    protected:
171634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        BasicClient(const sp<CameraService>& cameraService,
172634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                const sp<IBinder>& remoteCallback,
173ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                const String16& clientPackageName,
174634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                int cameraId,
175634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                int cameraFacing,
176634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                int clientPid,
177ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                uid_t clientUid,
178634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                int servicePid);
179634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
180634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        virtual ~BasicClient();
181634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
182634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // the instance is in the middle of destruction. When this is set,
183634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // the instance should not be accessed from callback.
184634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // CameraService's mClientLock should be acquired to access this.
185634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // - subclasses should set this to true in their destructors.
186634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        bool                            mDestructionStarted;
187634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
188634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // these are initialized in the constructor.
189634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        sp<CameraService>               mCameraService;  // immutable after constructor
190634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        int                             mCameraId;       // immutable after constructor
191634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        int                             mCameraFacing;   // immutable after constructor
192ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        const String16                  mClientPackageName;
193634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        pid_t                           mClientPid;
194ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        uid_t                           mClientUid;      // immutable after constructor
195634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        pid_t                           mServicePid;     // immutable after constructor
196634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
197634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // - The app-side Binder interface to receive callbacks from us
198e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        sp<IBinder>                     mRemoteBinder;   // immutable after constructor
199ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
200ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        // permissions management
201ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        status_t                        startCameraOps();
202ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        status_t                        finishCameraOps();
203ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
204ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        // Notify client about a fatal error
205cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        virtual void                    notifyError(
206cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                ICameraDeviceCallbacks::CameraErrorCode errorCode,
207cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                const CaptureResultExtras& resultExtras) = 0;
208ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    private:
209ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        AppOpsManager                   mAppOpsManager;
210ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
211ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        class OpsCallback : public BnAppOpsCallback {
212ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        public:
213ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            OpsCallback(wp<BasicClient> client);
214ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            virtual void opChanged(int32_t op, const String16& packageName);
215ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
216ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        private:
217ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            wp<BasicClient> mClient;
218ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
219ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        }; // class OpsCallback
220ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
221ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        sp<OpsCallback> mOpsCallback;
222ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        // Track whether startCameraOps was called successfully, to avoid
223ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        // finishing what we didn't start.
224ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        bool            mOpsActive;
225ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
226ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        // IAppOpsCallback interface, indirected through opListener
227ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        virtual void opChanged(int32_t op, const String16& packageName);
228ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }; // class BasicClient
229634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
230634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    class Client : public BnCamera, public BasicClient
23165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    {
23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    public:
23344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        typedef ICameraClient TCamCallbacks;
23444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
23565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // ICamera interface (see ICamera for details)
2365e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          disconnect();
2375e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      connect(const sp<ICameraClient>& client) = 0;
2385e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      lock() = 0;
2395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      unlock() = 0;
2401ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        virtual status_t      setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)=0;
2415e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          setPreviewCallbackFlag(int flag) = 0;
2423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        virtual status_t      setPreviewCallbackTarget(
2433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                const sp<IGraphicBufferProducer>& callbackProducer) = 0;
2445e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      startPreview() = 0;
2455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          stopPreview() = 0;
2465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual bool          previewEnabled() = 0;
2475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      storeMetaDataInBuffers(bool enabled) = 0;
2485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      startRecording() = 0;
2495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          stopRecording() = 0;
2505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual bool          recordingEnabled() = 0;
2515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          releaseRecordingFrame(const sp<IMemory>& mem) = 0;
2525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      autoFocus() = 0;
2535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      cancelAutoFocus() = 0;
2545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      takePicture(int msgType) = 0;
2555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      setParameters(const String8& params) = 0;
2565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual String8       getParameters() const = 0;
2575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0;
2585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        // Interface used by CameraService
2605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        Client(const sp<CameraService>& cameraService,
2615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                const sp<ICameraClient>& cameraClient,
262ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                const String16& clientPackageName,
2635e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                int cameraId,
2645e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                int cameraFacing,
265ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin                int clientPid,
266ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                uid_t clientUid,
267ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin                int servicePid);
2685e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        ~Client();
26965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
27065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // return our camera client
27144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        const sp<ICameraClient>&    getRemoteCallback() {
27244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            return mRemoteCallback;
2735e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        }
2745e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
275e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        virtual sp<IBinder> asBinderWrapper() {
276e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return asBinder();
277e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        }
278e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
2795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    protected:
280d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park        static Mutex*        getClientLockFromCookie(void* user);
281d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park        // convert client from cookie. Client lock should be acquired before getting Client.
282d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park        static Client*       getClientFromCookie(void* user);
2835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
284cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        virtual void         notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
285cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         const CaptureResultExtras& resultExtras);
286ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
287634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // Initialized in constructor
2880ed3ec00d0242c9dc77532fe0cf0082645b6662cJamie Gennis
289634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // - The app-side Binder interface to receive callbacks from us
29044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        sp<ICameraClient>               mRemoteCallback;
291ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
292ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }; // class Client
293634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
294634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    class ProClient : public BnProCameraUser, public BasicClient {
295634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    public:
29644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        typedef IProCameraCallbacks TCamCallbacks;
29744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
298634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        ProClient(const sp<CameraService>& cameraService,
299634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                const sp<IProCameraCallbacks>& remoteCallback,
300ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                const String16& clientPackageName,
301634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                int cameraId,
302634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                int cameraFacing,
303634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                int clientPid,
304ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                uid_t clientUid,
305634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                int servicePid);
306634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
307634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        virtual ~ProClient();
308634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
309634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        const sp<IProCameraCallbacks>& getRemoteCallback() {
310634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            return mRemoteCallback;
311634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        }
312634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
313634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        /***
314634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin            IProCamera implementation
315634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin         ***/
316e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin        virtual status_t      connect(const sp<IProCameraCallbacks>& callbacks)
317e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin                                                                            = 0;
318e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin        virtual status_t      exclusiveTryLock() = 0;
319e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin        virtual status_t      exclusiveLock() = 0;
320e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin        virtual status_t      exclusiveUnlock() = 0;
321634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
322e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin        virtual bool          hasExclusiveLock() = 0;
323634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
324634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        // Note that the callee gets a copy of the metadata.
325634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin        virtual int           submitRequest(camera_metadata_t* metadata,
326e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin                                            bool streaming = false) = 0;
327e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin        virtual status_t      cancelRequest(int requestId) = 0;
328634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
329bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        // Callbacks from camera service
330e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin        virtual void          onExclusiveLockStolen() = 0;
331bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
332634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    protected:
333cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        virtual void          notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
334cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                          const CaptureResultExtras& resultExtras);
33565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
336ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        sp<IProCameraCallbacks> mRemoteCallback;
337ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }; // class ProClient
33865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaprivate:
340634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
341634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // Delay-load the Camera HAL module
342634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual void onFirstRef();
343634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
344e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin    // Step 1. Check if we can connect, before we acquire the service lock.
3450f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    status_t            validateConnect(int cameraId,
346e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin                                        /*inout*/
347e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin                                        int& clientUid) const;
348e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin
349e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin    // Step 2. Check if we can connect, after we acquire the service lock.
350e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin    bool                canConnectUnsafe(int cameraId,
351e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin                                         const String16& clientPackageName,
352e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin                                         const sp<IBinder>& remoteCallback,
353e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin                                         /*out*/
354e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                         sp<BasicClient> &client);
355e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin
356e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin    // When connection is successful, initialize client and track its death
3570f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    status_t            connectFinishUnsafe(const sp<BasicClient>& client,
358e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin                                            const sp<IBinder>& remoteCallback);
359e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin
360634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    virtual sp<BasicClient>  getClientByRemote(const wp<IBinder>& cameraClient);
361634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
3625e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    Mutex               mServiceLock;
363e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    // either a Client or CameraDeviceClient
364e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    wp<BasicClient>     mClient[MAX_CAMERAS];  // protected by mServiceLock
3655e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    Mutex               mClientLock[MAX_CAMERAS]; // prevent Client destruction inside callbacks
3665e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    int                 mNumberOfCameras;
36765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
368634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    typedef wp<ProClient> weak_pro_client_ptr;
369634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    Vector<weak_pro_client_ptr> mProClientList[MAX_CAMERAS];
370634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
371ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    // needs to be called with mServiceLock held
372e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    sp<BasicClient>     findClientUnsafe(const wp<IBinder>& cameraClient, int& outIndex);
373634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp<ProClient>       findProClientUnsafe(
374634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin                                     const wp<IBinder>& cameraCallbacksRemote);
375ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin
3765e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    // atomics to record whether the hardware is allocated to some client.
3775e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    volatile int32_t    mBusy[MAX_CAMERAS];
3785e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    void                setCameraBusy(int cameraId);
3795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    void                setCameraFree(int cameraId);
380d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park
3815e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    // sounds
3825e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    MediaPlayer*        newMediaPlayer(const char *file);
3835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
3845e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    Mutex               mSoundLock;
3855e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    sp<MediaPlayer>     mSoundPlayer[NUM_SOUNDS];
3865e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    int                 mSoundRef;  // reference count (release all MediaPlayer when 0)
3878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev
3888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev    camera_module_t *mModule;
389ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin
390bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    Vector<sp<ICameraServiceListener> >
391bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                        mListenerList;
392bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
393bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    // guard only mStatusList and the broadcasting of ICameraServiceListener
394cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    mutable Mutex       mStatusMutex;
395bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ICameraServiceListener::Status
396bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                        mStatusList[MAX_CAMERAS];
397bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
398cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    // Read the current status (locks mStatusMutex)
399cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin    ICameraServiceListener::Status
400cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin                        getStatus(int cameraId) const;
401cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin
40293747b9c7724f690b3068300514c05629e0b0a3eIgor Murashkin    typedef Vector<ICameraServiceListener::Status> StatusVector;
403bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    // Broadcast the new status if it changed (locks the service mutex)
404bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void                updateStatus(
405bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin                            ICameraServiceListener::Status status,
40693747b9c7724f690b3068300514c05629e0b0a3eIgor Murashkin                            int32_t cameraId,
40793747b9c7724f690b3068300514c05629e0b0a3eIgor Murashkin                            const StatusVector *rejectSourceStates = NULL);
408bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
409ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    // IBinder::DeathRecipient implementation
410bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    virtual void        binderDied(const wp<IBinder> &who);
411634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin
412634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    // Helpers
413bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
414bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    bool                isValidCameraId(int cameraId);
415d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk
416d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk    bool                setUpVendorTags();
417b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
418b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    /**
419b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * A mapping of camera ids to CameraParameters returned by that camera device.
420b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     *
421b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * This cache is used to generate CameraCharacteristic metadata when using
422b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * the HAL1 shim.
423b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     */
424b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    KeyedVector<int, CameraParameters>    mShimParams;
425b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
426b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    /**
427b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * Initialize and cache the metadata used by the HAL1 shim for a given cameraId.
428b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     *
429b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * Returns OK on success, or a negative error code.
430b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     */
431b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    status_t            initializeShimMetadata(int cameraId);
432b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
433b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    /**
43465d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin     * Get the cached CameraParameters for the camera. If they haven't been
43565d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin     * cached yet, then initialize them for the first time.
43665d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin     *
43765d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin     * Returns OK on success, or a negative error code.
43865d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin     */
43965d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    status_t            getLegacyParametersLazy(int cameraId, /*out*/CameraParameters* parameters);
44065d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin
44165d14b9825311f9d1847cf282bd0419e71bac666Igor Murashkin    /**
442b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * Generate the CameraCharacteristics metadata required by the Camera2 API
443b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * from the available HAL1 CameraParameters and CameraInfo.
444b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     *
445b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * Returns OK on success, or a negative error code.
446b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     */
447b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    status_t            generateShimMetadata(int cameraId, /*out*/CameraMetadata* cameraInfo);
448b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk
449b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    /**
450b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * Connect a new camera client.  This should only be used while holding the
451b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * mutex for mServiceLock.
452b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     *
453b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     * Returns OK on success, or a negative error code.
454b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk     */
455a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    status_t            connectHelperLocked(
456a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            /*out*/
457a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            sp<Client>& client,
458a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            /*in*/
459a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            const sp<ICameraClient>& cameraClient,
460a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            int cameraId,
461a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            const String16& clientPackageName,
462a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            int clientUid,
463a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            int callingPid,
464a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            int halVersion = CAMERA_HAL_API_VERSION_UNSPECIFIED,
465a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin            bool legacyMode = false);
46665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
46765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
46865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} // namespace android
46965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
47065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif
471