13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/* 23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Copyright (C) 2008 The Android Open Source Project 33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * 43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * you may not use this file except in compliance with the License. 63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * You may obtain a copy of the License at 73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * 83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * 103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Unless required by applicable law or agreed to in writing, software 113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * See the License for the specific language governing permissions and 143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * limitations under the License. 153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian */ 163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#ifndef ANDROID_HARDWARE_CAMERA_H 183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define ANDROID_HARDWARE_CAMERA_H 193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/Timers.h> 21d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 22d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraService.h> 23d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 248ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h> 259e626526453f91999bdf3de4c2ec8e55c5d90511Iliyan Malchev#include <system/camera.h> 264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxy.h> 274ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h> 28d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/android/hardware/ICamera.h> 29d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/android/hardware/ICameraClient.h> 30c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/CameraBase.h> 313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass Surface; 353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass String8; 36ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalaclass String16; 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ref-counted object for callbacks 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass CameraListener: virtual public RefBase 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0; 4357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr, 4457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata) = 0; 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0; 462d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen virtual void postRecordingFrameHandleTimestamp(nsecs_t timestamp, native_handle_t* handle) = 0; 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 49c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera; 50c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin 51c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkintemplate <> 52c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinstruct CameraTraits<Camera> 53c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin{ 54d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef CameraListener TCamListener; 55d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef ::android::hardware::ICamera TCamUser; 56d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef ::android::hardware::ICameraClient TCamCallbacks; 57d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef ::android::binder::Status(::android::hardware::ICameraService::*TCamConnectService) 58d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala (const sp<::android::hardware::ICameraClient>&, 59d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int, const String16&, int, int, 60d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 61d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<::android::hardware::ICamera>*); 620f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk static TCamConnectService fnConnectService; 63c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin}; 64c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin 650f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk 66c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera : 67c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin public CameraBase<Camera>, 68d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala public ::android::hardware::BnCameraClient 693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 71ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala enum { 72d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala USE_CALLING_UID = ::android::hardware::ICameraService::USE_CALLING_UID 73ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala }; 7498a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen enum { 75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala USE_CALLING_PID = ::android::hardware::ICameraService::USE_CALLING_PID 7698a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen }; 77ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // construct a camera client from an existing remote 79d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala static sp<Camera> create(const sp<::android::hardware::ICamera>& camera); 80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala static sp<Camera> connect(int cameraId, 81280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov const String16& clientPackageName, 8298a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen int clientUid, int clientPid); 83ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 84b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He static status_t connectLegacy(int cameraId, int halVersion, 85280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov const String16& clientPackageName, 86b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He int clientUid, sp<Camera>& camera); 87b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He 884ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual ~Camera(); 893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t reconnect(); 913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t lock(); 923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t unlock(); 933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 948ba01021b573889802e67e029225a96f0dfa471aAndy McFadden // pass the buffered IGraphicBufferProducer to the camera service 954b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer); 96bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis 974b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala // start preview mode, must call setPreviewTarget first 983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t startPreview(); 993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // stop preview mode 1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void stopPreview(); 1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get preview state 1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian bool previewEnabled(); 1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1064b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala // start recording mode, must call setPreviewTarget first 1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t startRecording(); 1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // stop recording mode 1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void stopRecording(); 1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get recording state 1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian bool recordingEnabled(); 1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // release a recording frame 1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void releaseRecordingFrame(const sp<IMemory>& mem); 1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1182d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // release a recording frame handle 1192d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen void releaseRecordingFrameHandle(native_handle_t *handle); 1202d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // autoFocus - status returned from callback 1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t autoFocus(); 1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // cancel auto focus 1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t cancelAutoFocus(); 1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // take a picture - picture returned from callback 128e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong status_t takePicture(int msgType); 1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // set preview/capture parameters - key/value pairs 1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t setParameters(const String8& params); 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get preview/capture parameters - key/value pairs 1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian String8 getParameters() const; 1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // send command to camera driver 1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); 1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1398cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Tell camera how to pass video buffers. videoBufferMode is one of VIDEO_BUFFER_MODE_*. 1408cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Returns OK if the specified video buffer mode is supported. If videoBufferMode is 1418cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // VIDEO_BUFFER_MODE_BUFFER_QUEUE, setVideoTarget() must be called before starting 1428cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // video recording. 1438cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen status_t setVideoBufferMode(int32_t videoBufferMode); 1448cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 1458cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Set the video buffer producer for camera to use in VIDEO_BUFFER_MODE_BUFFER_QUEUE 1468cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // mode. 1478cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen status_t setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer); 148e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong 1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void setListener(const sp<CameraListener>& listener); 1504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li void setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener); 1513ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 1523ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Configure preview callbacks to app. Only one of the older 1533ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // callbacks or the callback surface can be active at the same time; 1543ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // enabling one will disable the other if active. Flags can be 1553ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and 1563ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Target by calling it with a NULL interface. 1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void setPreviewCallbackFlags(int preview_callback_flag); 1583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala status_t setPreviewCallbackTarget( 1593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer); 1603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1614ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<ICameraRecordingProxy> getRecordingProxy(); 1624ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // ICameraClient interface 1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); 16557c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li virtual void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 16657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata); 1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 1682d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen virtual void recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle); 1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1704ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li class RecordingProxy : public BnCameraRecordingProxy 1714ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 1724ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li public: 1734ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li RecordingProxy(const sp<Camera>& camera); 1744ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1754ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // ICameraRecordingProxy interface 1764ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener); 1774ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void stopRecording(); 1784ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void releaseRecordingFrame(const sp<IMemory>& mem); 1792d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen virtual void releaseRecordingFrameHandle(native_handle_t* handle); 1804ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li private: 1824ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<Camera> mCamera; 1834ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li }; 1844ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1851d88023e1de6b9f370eb4be944dd9c4480d01f11Igor Murashkinprotected: 186c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin Camera(int cameraId); 1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Camera(const Camera&); 1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Camera& operator=(const Camera); 1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 190c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin sp<ICameraRecordingProxyListener> mRecordingProxyListener; 1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 192c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin friend class CameraBase; 1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#endif 198