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> 218ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h> 229e626526453f91999bdf3de4c2ec8e55c5d90511Iliyan Malchev#include <system/camera.h> 234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraClient.h> 244ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxy.h> 254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h> 26c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICameraService.h> 27c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICamera.h> 28c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/CameraBase.h> 293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass Surface; 333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass String8; 34ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalaclass String16; 353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ref-counted object for callbacks 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass CameraListener: virtual public RefBase 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0; 4157c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr, 4257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata) = 0; 433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0; 443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 46c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera; 47c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin 48c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkintemplate <> 49c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinstruct CameraTraits<Camera> 50c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin{ 51c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin typedef CameraListener TCamListener; 52c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin typedef ICamera TCamUser; 53c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin typedef ICameraClient TCamCallbacks; 540f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk typedef status_t (ICameraService::*TCamConnectService)(const sp<ICameraClient>&, 550f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk int, const String16&, int, 560f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk /*out*/ 570f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk sp<ICamera>&); 580f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk static TCamConnectService fnConnectService; 59c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin}; 60c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin 610f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk 62c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera : 63c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin public CameraBase<Camera>, 64c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin public BnCameraClient 653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 67ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala enum { 68c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin USE_CALLING_UID = ICameraService::USE_CALLING_UID 69ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala }; 70ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // construct a camera client from an existing remote 723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian static sp<Camera> create(const sp<ICamera>& camera); 73ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala static sp<Camera> connect(int cameraId, 74ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala const String16& clientPackageName, 75ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int clientUid); 76ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 77b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He static status_t connectLegacy(int cameraId, int halVersion, 78b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He const String16& clientPackageName, 79b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He int clientUid, sp<Camera>& camera); 80b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He 814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual ~Camera(); 823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t reconnect(); 843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t lock(); 853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t unlock(); 863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 878ba01021b573889802e67e029225a96f0dfa471aAndy McFadden // pass the buffered IGraphicBufferProducer to the camera service 884b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer); 89bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis 904b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala // start preview mode, must call setPreviewTarget first 913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t startPreview(); 923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // stop preview mode 943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void stopPreview(); 953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get preview state 973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian bool previewEnabled(); 983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 994b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala // start recording mode, must call setPreviewTarget first 1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t startRecording(); 1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // stop recording mode 1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void stopRecording(); 1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get recording state 1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian bool recordingEnabled(); 1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // release a recording frame 1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void releaseRecordingFrame(const sp<IMemory>& mem); 1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // autoFocus - status returned from callback 1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t autoFocus(); 1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // cancel auto focus 1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t cancelAutoFocus(); 1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // take a picture - picture returned from callback 118e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong status_t takePicture(int msgType); 1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // set preview/capture parameters - key/value pairs 1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t setParameters(const String8& params); 1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get preview/capture parameters - key/value pairs 1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian String8 getParameters() const; 1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // send command to camera driver 1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); 1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 129e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong // tell camera hal to store meta data or real YUV in video buffers. 130e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong status_t storeMetaDataInBuffers(bool enabled); 131e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void setListener(const sp<CameraListener>& listener); 1334ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li void setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener); 1343ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 1353ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Configure preview callbacks to app. Only one of the older 1363ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // callbacks or the callback surface can be active at the same time; 1373ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // enabling one will disable the other if active. Flags can be 1383ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and 1393ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Target by calling it with a NULL interface. 1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void setPreviewCallbackFlags(int preview_callback_flag); 1413ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala status_t setPreviewCallbackTarget( 1423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer); 1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<ICameraRecordingProxy> getRecordingProxy(); 1454ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // ICameraClient interface 1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); 14857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li virtual void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 14957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata); 1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li class RecordingProxy : public BnCameraRecordingProxy 1534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 1544ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li public: 1554ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li RecordingProxy(const sp<Camera>& camera); 1564ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1574ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // ICameraRecordingProxy interface 1584ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener); 1594ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void stopRecording(); 1604ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void releaseRecordingFrame(const sp<IMemory>& mem); 1614ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1624ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li private: 1634ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<Camera> mCamera; 1644ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li }; 1654ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1661d88023e1de6b9f370eb4be944dd9c4480d01f11Igor Murashkinprotected: 167c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin Camera(int cameraId); 1683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Camera(const Camera&); 1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Camera& operator=(const Camera); 1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 171c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin sp<ICameraRecordingProxyListener> mRecordingProxyListener; 1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 173c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin friend class CameraBase; 1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 1773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#endif 179