19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_HARDWARE_CAMERA_H 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_HARDWARE_CAMERA_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks#include <utils/Timers.h> 21ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis#include <gui/ISurfaceTexture.h> 229c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev#include <system/camera.h> 2342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <camera/ICameraClient.h> 2442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <camera/ICameraRecordingProxy.h> 2542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Changstruct CameraInfo { 30b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang /** 319c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev * The direction that the camera faces to. It should be CAMERA_FACING_BACK 329c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev * or CAMERA_FACING_FRONT. 33b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang */ 34b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang int facing; 35b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang 36b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang /** 37b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang * The orientation of the camera image. The value is the angle that the 389c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev * camera image needs to be rotated clockwise so it shows correctly on the 399c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev * display in its natural orientation. It should be 0, 90, 180, or 270. 40b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang * 4199a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li * For example, suppose a device has a naturally tall screen. The 4299a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li * back-facing camera sensor is mounted in landscape. You are looking at 4399a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li * the screen. If the top side of the camera sensor is aligned with the 4499a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li * right edge of the screen in natural orientation, the value should be 459c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev * 90. If the top side of a front-facing camera sensor is aligned with the 469c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev * right of the screen, the value should be 270. 47b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang */ 48b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang int orientation; 49b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang}; 50b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ICameraService; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ICamera; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Surface; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Mutex; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass String8; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 575e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks// ref-counted object for callbacks 585e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparksclass CameraListener: virtual public RefBase 595e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks{ 605e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparkspublic: 615e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0; 62bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr, 63bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li camera_frame_metadata_t *metadata) = 0; 6459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0; 655e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks}; 665e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Camera : public BnCameraClient, public IBinder::DeathRecipient 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // construct a camera client from an existing remote 712adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong static sp<Camera> create(const sp<ICamera>& camera); 72e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang static int32_t getNumberOfCameras(); 73b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang static status_t getCameraInfo(int cameraId, 74b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang struct CameraInfo* cameraInfo); 75e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang static sp<Camera> connect(int cameraId); 7642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li virtual ~Camera(); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void init(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t reconnect(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void disconnect(); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t lock(); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t unlock(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getStatus() { return mStatus; } 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8685cfdd011241a5f2fb7fabc65b5943a39af7e1deJamie Gennis // pass the buffered Surface to the camera service 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setPreviewDisplay(const sp<Surface>& surface); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis // pass the buffered ISurfaceTexture to the camera service 90ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis status_t setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture); 91ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // start preview mode, must call setPreviewDisplay first 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t startPreview(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // stop preview mode 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopPreview(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get preview state 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool previewEnabled(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // start recording mode, must call setPreviewDisplay first 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t startRecording(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // stop recording mode 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopRecording(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get recording state 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool recordingEnabled(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // release a recording frame 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void releaseRecordingFrame(const sp<IMemory>& mem); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // autoFocus - status returned from callback 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t autoFocus(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 116244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang // cancel auto focus 117244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang status_t cancelAutoFocus(); 118244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // take a picture - picture returned from callback 120e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong status_t takePicture(int msgType); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // set preview/capture parameters - key/value pairs 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setParameters(const String8& params); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get preview/capture parameters - key/value pairs 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 getParameters() const; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li // send command to camera driver 12936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); 13036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li 13138311859e809118f2cba3597d056abffe4eb80c0James Dong // tell camera hal to store meta data or real YUV in video buffers. 13238311859e809118f2cba3597d056abffe4eb80c0James Dong status_t storeMetaDataInBuffers(bool enabled); 13338311859e809118f2cba3597d056abffe4eb80c0James Dong 1345e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks void setListener(const sp<CameraListener>& listener); 13542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li void setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener); 1365e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks void setPreviewCallbackFlags(int preview_callback_flag); 1375e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks 13842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li sp<ICameraRecordingProxy> getRecordingProxy(); 13942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ICameraClient interface 1412a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); 142bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li virtual void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 143bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li camera_frame_metadata_t *metadata); 14459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks virtual void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ICamera> remote(); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li class RecordingProxy : public BnCameraRecordingProxy 14942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li { 15042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li public: 15142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li RecordingProxy(const sp<Camera>& camera); 15242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li 15342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li // ICameraRecordingProxy interface 15442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener); 15542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li virtual void stopRecording(); 15642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li virtual void releaseRecordingFrame(const sp<IMemory>& mem); 15742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li 15842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li private: 15942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li sp<Camera> mCamera; 16042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li }; 16142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Camera(); 1646f0602e84a0387fe9239a57f44785de40feb051cDave Sparks Camera(const Camera&); 1656f0602e84a0387fe9239a57f44785de40feb051cDave Sparks Camera& operator=(const Camera); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void binderDied(const wp<IBinder>& who); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class DeathNotifier: public IBinder::DeathRecipient 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DeathNotifier() { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void binderDied(const wp<IBinder>& who); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static sp<DeathNotifier> mDeathNotifier; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // helper function to obtain camera service handle 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const sp<ICameraService>& getCameraService(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ICamera> mCamera; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t mStatus; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1855e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks sp<CameraListener> mListener; 18642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li sp<ICameraRecordingProxyListener> mRecordingProxyListener; 1875e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class DeathNotifier; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static Mutex mLock; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static sp<ICameraService> mCameraService; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 197