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