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; 47b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh virtual void postRecordingFrameHandleTimestampBatch( 48b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<nsecs_t>& timestamps, 49b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*>& handles) = 0; 503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 52c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera; 53c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin 54c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkintemplate <> 55c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinstruct CameraTraits<Camera> 56c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin{ 57d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef CameraListener TCamListener; 58d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef ::android::hardware::ICamera TCamUser; 59d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef ::android::hardware::ICameraClient TCamCallbacks; 60d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala typedef ::android::binder::Status(::android::hardware::ICameraService::*TCamConnectService) 61d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala (const sp<::android::hardware::ICameraClient>&, 62d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int, const String16&, int, int, 63d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 64d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<::android::hardware::ICamera>*); 650f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk static TCamConnectService fnConnectService; 66c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin}; 67c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin 680f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk 69c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera : 70c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin public CameraBase<Camera>, 71d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala public ::android::hardware::BnCameraClient 723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 74ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala enum { 75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala USE_CALLING_UID = ::android::hardware::ICameraService::USE_CALLING_UID 76ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala }; 7798a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen enum { 78d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala USE_CALLING_PID = ::android::hardware::ICameraService::USE_CALLING_PID 7998a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen }; 80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // construct a camera client from an existing remote 82d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala static sp<Camera> create(const sp<::android::hardware::ICamera>& camera); 83ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala static sp<Camera> connect(int cameraId, 84280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov const String16& clientPackageName, 8598a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen int clientUid, int clientPid); 86ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 87b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He static status_t connectLegacy(int cameraId, int halVersion, 88280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov const String16& clientPackageName, 89b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He int clientUid, sp<Camera>& camera); 90b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He 914ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual ~Camera(); 923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t reconnect(); 943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t lock(); 953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t unlock(); 963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 978ba01021b573889802e67e029225a96f0dfa471aAndy McFadden // pass the buffered IGraphicBufferProducer to the camera service 984b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer); 99bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis 1004b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala // start preview mode, must call setPreviewTarget first 1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t startPreview(); 1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // stop preview mode 1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void stopPreview(); 1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get preview state 1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian bool previewEnabled(); 1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1094b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala // start recording mode, must call setPreviewTarget first 1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t startRecording(); 1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // stop recording mode 1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void stopRecording(); 1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get recording state 1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian bool recordingEnabled(); 1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // release a recording frame 1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void releaseRecordingFrame(const sp<IMemory>& mem); 1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1212d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // release a recording frame handle 1222d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen void releaseRecordingFrameHandle(native_handle_t *handle); 1232d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 124b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh // release a batch of recording frame handles 125b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh void releaseRecordingFrameHandleBatch( 126b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*> handles); 127b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // autoFocus - status returned from callback 1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t autoFocus(); 1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // cancel auto focus 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t cancelAutoFocus(); 1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // take a picture - picture returned from callback 135e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong status_t takePicture(int msgType); 1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // set preview/capture parameters - key/value pairs 1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t setParameters(const String8& params); 1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // get preview/capture parameters - key/value pairs 1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian String8 getParameters() const; 1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // send command to camera driver 1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); 1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1468cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Tell camera how to pass video buffers. videoBufferMode is one of VIDEO_BUFFER_MODE_*. 1478cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Returns OK if the specified video buffer mode is supported. If videoBufferMode is 1488cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // VIDEO_BUFFER_MODE_BUFFER_QUEUE, setVideoTarget() must be called before starting 1498cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // video recording. 1508cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen status_t setVideoBufferMode(int32_t videoBufferMode); 1518cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 1528cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // Set the video buffer producer for camera to use in VIDEO_BUFFER_MODE_BUFFER_QUEUE 1538cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // mode. 1548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen status_t setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer); 155e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong 1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void setListener(const sp<CameraListener>& listener); 1574ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li void setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener); 1583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 1593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Configure preview callbacks to app. Only one of the older 1603ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // callbacks or the callback surface can be active at the same time; 1613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // enabling one will disable the other if active. Flags can be 1623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and 1633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // Target by calling it with a NULL interface. 1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void setPreviewCallbackFlags(int preview_callback_flag); 1653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala status_t setPreviewCallbackTarget( 1663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer); 1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1684ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<ICameraRecordingProxy> getRecordingProxy(); 1694ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // ICameraClient interface 1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); 17257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li virtual void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 17357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata); 1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian virtual void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 1752d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen virtual void recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle); 176b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh virtual void recordingFrameHandleCallbackTimestampBatch( 177b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<nsecs_t>& timestamps, 178b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*>& handles); 179b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh 1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li class RecordingProxy : public BnCameraRecordingProxy 1824ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 1834ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li public: 184d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh explicit RecordingProxy(const sp<Camera>& camera); 1854ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1864ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // ICameraRecordingProxy interface 1874ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener); 1884ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void stopRecording(); 1894ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li virtual void releaseRecordingFrame(const sp<IMemory>& mem); 1902d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen virtual void releaseRecordingFrameHandle(native_handle_t* handle); 191b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh virtual void releaseRecordingFrameHandleBatch( 192b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*>& handles); 1934ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1944ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li private: 1954ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<Camera> mCamera; 1964ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li }; 1974ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 1981d88023e1de6b9f370eb4be944dd9c4480d01f11Igor Murashkinprotected: 199d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh explicit Camera(int cameraId); 2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Camera(const Camera&); 2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Camera& operator=(const Camera); 2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 203c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin sp<ICameraRecordingProxyListener> mRecordingProxyListener; 2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 205c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin friend class CameraBase; 2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 2073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#endif 211