165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Copyright (C) 2008, The Android Open Source Project
465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** you may not use this file except in compliance with the License.
765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** You may obtain a copy of the License at
865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Unless required by applicable law or agreed to in writing, software
1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** See the License for the specific language governing permissions and
1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** limitations under the License.
1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian*/
1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
215462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian#include <binder/BinderService.h>
2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICameraService.h>
238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <hardware/camera.h>
2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* This needs to be increased if we can have more cameras */
2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define MAX_CAMERAS 2
2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android {
2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
305e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaextern volatile int32_t gLogLevel;
315e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MemoryHeapBase;
3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MediaPlayer;
3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
355462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopianclass CameraService :
365462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian    public BinderService<CameraService>,
37ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    public BnCameraService,
38ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    public IBinder::DeathRecipient
3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
405462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian    friend class BinderService<CameraService>;
4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
425e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    class Client;
435462fc9a38fa8c9dff434cd53fa5fb1782ae3042Mathias Agopian    static char const* getServiceName() { return "media.camera"; }
4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                        CameraService();
4665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual             ~CameraService();
4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual int32_t     getNumberOfCameras();
4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t    getCameraInfo(int cameraId,
5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                      struct CameraInfo* cameraInfo);
5108ad5efcef90e24db2863c0f85972ed05fe848a2Wu-cheng Li    virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId);
5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void        removeClient(const sp<ICameraClient>& cameraClient);
53d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park    // returns plain pointer of client. Note that mClientLock should be acquired to
54d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park    // prevent the client from destruction. The result can be NULL.
55d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park    virtual Client*     getClientByIdUnsafe(int cameraId);
56d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park    virtual Mutex*      getClientLockById(int cameraId);
5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
58294d0eca9eabfaa3ef0ee8bee7ccf3eaaa925e41Igor Murashkin    virtual sp<Client>  getClientByRemote(const wp<IBinder>& cameraClient);
59ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin
6065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t    dump(int fd, const Vector<String16>& args);
6165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t    onTransact(uint32_t code, const Parcel& data,
6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                   Parcel* reply, uint32_t flags);
638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev    virtual void onFirstRef();
6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    enum sound_kind {
6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        SOUND_SHUTTER = 0,
6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        SOUND_RECORDING = 1,
6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        NUM_SOUNDS
6965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    };
7065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void                loadSound();
7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void                playSound(sound_kind kind);
7365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void                releaseSound();
7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    class Client : public BnCamera
7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    {
7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    public:
7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // ICamera interface (see ICamera for details)
795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          disconnect();
805e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      connect(const sp<ICameraClient>& client) = 0;
815e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      lock() = 0;
825e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      unlock() = 0;
835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      setPreviewDisplay(const sp<Surface>& surface) = 0;
845e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture) = 0;
855e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          setPreviewCallbackFlag(int flag) = 0;
865e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      startPreview() = 0;
875e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          stopPreview() = 0;
885e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual bool          previewEnabled() = 0;
895e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      storeMetaDataInBuffers(bool enabled) = 0;
905e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      startRecording() = 0;
915e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          stopRecording() = 0;
925e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual bool          recordingEnabled() = 0;
935e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual void          releaseRecordingFrame(const sp<IMemory>& mem) = 0;
945e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      autoFocus() = 0;
955e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      cancelAutoFocus() = 0;
965e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      takePicture(int msgType) = 0;
975e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      setParameters(const String8& params) = 0;
985e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual String8       getParameters() const = 0;
995e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t      sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0;
1005e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1015e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        // Interface used by CameraService
1025e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        Client(const sp<CameraService>& cameraService,
1035e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                const sp<ICameraClient>& cameraClient,
1045e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                int cameraId,
1055e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                int cameraFacing,
106ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin                int clientPid,
107ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin                int servicePid);
1085e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        ~Client();
10965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
11065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // return our camera client
1115e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        const sp<ICameraClient>&    getCameraClient() {
1125e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala            return mCameraClient;
1135e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        }
1145e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        virtual status_t initialize(camera_module_t *module) = 0;
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1175e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        virtual status_t dump(int fd, const Vector<String16>& args) = 0;
1185e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1195e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    protected:
120d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park        static Mutex*        getClientLockFromCookie(void* user);
121d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park        // convert client from cookie. Client lock should be acquired before getting Client.
122d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park        static Client*       getClientFromCookie(void* user);
1235e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1245e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        // the instance is in the middle of destruction. When this is set,
1255e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        // the instance should not be accessed from callback.
1265e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        // CameraService's mClientLock should be acquired to access this.
1275e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        bool                            mDestructionStarted;
1280ed3ec00d0242c9dc77532fe0cf0082645b6662cJamie Gennis
12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // these are initialized in the constructor.
13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sp<CameraService>               mCameraService;  // immutable after constructor
13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sp<ICameraClient>               mCameraClient;
13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int                             mCameraId;       // immutable after constructor
133012716a857641a977afd16ff6be4bf66fc403884Wu-cheng Li        int                             mCameraFacing;   // immutable after constructor
13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        pid_t                           mClientPid;
135ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        pid_t                           mServicePid;     // immutable after constructor
13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1375e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    };
13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaprivate:
1405e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    Mutex               mServiceLock;
1415e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    wp<Client>          mClient[MAX_CAMERAS];  // protected by mServiceLock
1425e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    Mutex               mClientLock[MAX_CAMERAS]; // prevent Client destruction inside callbacks
1435e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    int                 mNumberOfCameras;
14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
145ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    // needs to be called with mServiceLock held
146294d0eca9eabfaa3ef0ee8bee7ccf3eaaa925e41Igor Murashkin    sp<Client>          findClientUnsafe(const wp<IBinder>& cameraClient, int& outIndex);
147ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin
1485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    // atomics to record whether the hardware is allocated to some client.
1495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    volatile int32_t    mBusy[MAX_CAMERAS];
1505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    void                setCameraBusy(int cameraId);
1515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    void                setCameraFree(int cameraId);
152d8973a71a3d1dd670e5dcdf6e94ec0cd45444eecKeun young Park
1535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    // sounds
1545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    MediaPlayer*        newMediaPlayer(const char *file);
1555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    Mutex               mSoundLock;
1575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    sp<MediaPlayer>     mSoundPlayer[NUM_SOUNDS];
1585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    int                 mSoundRef;  // reference count (release all MediaPlayer when 0)
1598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev
1608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev    camera_module_t *mModule;
161ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin
162ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    // IBinder::DeathRecipient implementation
163ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin    virtual void binderDied(const wp<IBinder> &who);
16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} // namespace android
16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif
169