| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2008 The Android Open Source Project | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | #ifndef ANDROID_HARDWARE_CAMERA_H | 
|  | 18 | #define ANDROID_HARDWARE_CAMERA_H | 
|  | 19 |  | 
|  | 20 | #include <utils/Timers.h> | 
| Andy McFadden | 8ba0102 | 2012-12-18 09:46:54 -0800 | [diff] [blame] | 21 | #include <gui/IGraphicBufferProducer.h> | 
| Iliyan Malchev | 9e62652 | 2011-04-14 16:51:21 -0700 | [diff] [blame] | 22 | #include <system/camera.h> | 
| Wu-cheng Li | 4ca2c7c | 2011-06-01 17:22:24 +0800 | [diff] [blame] | 23 | #include <camera/ICameraClient.h> | 
|  | 24 | #include <camera/ICameraRecordingProxy.h> | 
|  | 25 | #include <camera/ICameraRecordingProxyListener.h> | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 26 | #include <camera/ICameraService.h> | 
|  | 27 | #include <camera/ICamera.h> | 
|  | 28 | #include <camera/CameraBase.h> | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 29 |  | 
|  | 30 | namespace android { | 
|  | 31 |  | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 32 | class Surface; | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 33 | class String8; | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 34 | class String16; | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 35 |  | 
|  | 36 | // ref-counted object for callbacks | 
|  | 37 | class CameraListener: virtual public RefBase | 
|  | 38 | { | 
|  | 39 | public: | 
|  | 40 | virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0; | 
| Wu-cheng Li | 57c8618 | 2011-07-30 05:00:37 +0800 | [diff] [blame] | 41 | virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr, | 
|  | 42 | camera_frame_metadata_t *metadata) = 0; | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 43 | virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0; | 
|  | 44 | }; | 
|  | 45 |  | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 46 | class Camera; | 
|  | 47 |  | 
|  | 48 | template <> | 
|  | 49 | struct CameraTraits<Camera> | 
|  | 50 | { | 
|  | 51 | typedef CameraListener        TCamListener; | 
|  | 52 | typedef ICamera               TCamUser; | 
|  | 53 | typedef ICameraClient         TCamCallbacks; | 
| Ruben Brunk | 0f61d8f | 2013-08-08 13:07:18 -0700 | [diff] [blame] | 54 | typedef status_t (ICameraService::*TCamConnectService)(const sp<ICameraClient>&, | 
| Chien-Yu Chen | 98a668f | 2015-12-18 14:10:33 -0800 | [diff] [blame] | 55 | int, const String16&, int, int, | 
| Ruben Brunk | 0f61d8f | 2013-08-08 13:07:18 -0700 | [diff] [blame] | 56 | /*out*/ | 
|  | 57 | sp<ICamera>&); | 
|  | 58 | static TCamConnectService     fnConnectService; | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 59 | }; | 
|  | 60 |  | 
| Ruben Brunk | 0f61d8f | 2013-08-08 13:07:18 -0700 | [diff] [blame] | 61 |  | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 62 | class Camera : | 
|  | 63 | public CameraBase<Camera>, | 
|  | 64 | public BnCameraClient | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 65 | { | 
|  | 66 | public: | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 67 | enum { | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 68 | USE_CALLING_UID = ICameraService::USE_CALLING_UID | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 69 | }; | 
| Chien-Yu Chen | 98a668f | 2015-12-18 14:10:33 -0800 | [diff] [blame] | 70 | enum { | 
|  | 71 | USE_CALLING_PID = ICameraService::USE_CALLING_PID | 
|  | 72 | }; | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 73 |  | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 74 | // construct a camera client from an existing remote | 
|  | 75 | static  sp<Camera>  create(const sp<ICamera>& camera); | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 76 | static  sp<Camera>  connect(int cameraId, | 
| Svetoslav Ganov | 280405a | 2015-05-12 02:19:27 +0000 | [diff] [blame] | 77 | const String16& clientPackageName, | 
| Chien-Yu Chen | 98a668f | 2015-12-18 14:10:33 -0800 | [diff] [blame] | 78 | int clientUid, int clientPid); | 
| Eino-Ville Talvala | ceb388d | 2013-02-19 10:40:14 -0800 | [diff] [blame] | 79 |  | 
| Zhijun He | b10cdad | 2014-06-16 16:38:35 -0700 | [diff] [blame] | 80 | static  status_t  connectLegacy(int cameraId, int halVersion, | 
| Svetoslav Ganov | 280405a | 2015-05-12 02:19:27 +0000 | [diff] [blame] | 81 | const String16& clientPackageName, | 
| Zhijun He | b10cdad | 2014-06-16 16:38:35 -0700 | [diff] [blame] | 82 | int clientUid, sp<Camera>& camera); | 
|  | 83 |  | 
| Wu-cheng Li | 4ca2c7c | 2011-06-01 17:22:24 +0800 | [diff] [blame] | 84 | virtual     ~Camera(); | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 85 |  | 
|  | 86 | status_t    reconnect(); | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 87 | status_t    lock(); | 
|  | 88 | status_t    unlock(); | 
|  | 89 |  | 
| Andy McFadden | 8ba0102 | 2012-12-18 09:46:54 -0800 | [diff] [blame] | 90 | // pass the buffered IGraphicBufferProducer to the camera service | 
| Eino-Ville Talvala | 4b820b0 | 2013-08-21 14:39:05 -0700 | [diff] [blame] | 91 | status_t    setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer); | 
| Jamie Gennis | bfa33aa | 2010-12-20 11:51:31 -0800 | [diff] [blame] | 92 |  | 
| Eino-Ville Talvala | 4b820b0 | 2013-08-21 14:39:05 -0700 | [diff] [blame] | 93 | // start preview mode, must call setPreviewTarget first | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 94 | status_t    startPreview(); | 
|  | 95 |  | 
|  | 96 | // stop preview mode | 
|  | 97 | void        stopPreview(); | 
|  | 98 |  | 
|  | 99 | // get preview state | 
|  | 100 | bool        previewEnabled(); | 
|  | 101 |  | 
| Eino-Ville Talvala | 4b820b0 | 2013-08-21 14:39:05 -0700 | [diff] [blame] | 102 | // start recording mode, must call setPreviewTarget first | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 103 | status_t    startRecording(); | 
|  | 104 |  | 
|  | 105 | // stop recording mode | 
|  | 106 | void        stopRecording(); | 
|  | 107 |  | 
|  | 108 | // get recording state | 
|  | 109 | bool        recordingEnabled(); | 
|  | 110 |  | 
|  | 111 | // release a recording frame | 
|  | 112 | void        releaseRecordingFrame(const sp<IMemory>& mem); | 
|  | 113 |  | 
|  | 114 | // autoFocus - status returned from callback | 
|  | 115 | status_t    autoFocus(); | 
|  | 116 |  | 
|  | 117 | // cancel auto focus | 
|  | 118 | status_t    cancelAutoFocus(); | 
|  | 119 |  | 
|  | 120 | // take a picture - picture returned from callback | 
| James Dong | e468ac5 | 2011-02-17 16:38:06 -0800 | [diff] [blame] | 121 | status_t    takePicture(int msgType); | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 122 |  | 
|  | 123 | // set preview/capture parameters - key/value pairs | 
|  | 124 | status_t    setParameters(const String8& params); | 
|  | 125 |  | 
|  | 126 | // get preview/capture parameters - key/value pairs | 
|  | 127 | String8     getParameters() const; | 
|  | 128 |  | 
|  | 129 | // send command to camera driver | 
|  | 130 | status_t    sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); | 
|  | 131 |  | 
| Chien-Yu Chen | 8cca075 | 2015-11-13 15:28:48 -0800 | [diff] [blame] | 132 | // Tell camera how to pass video buffers. videoBufferMode is one of VIDEO_BUFFER_MODE_*. | 
|  | 133 | // Returns OK if the specified video buffer mode is supported. If videoBufferMode is | 
|  | 134 | // VIDEO_BUFFER_MODE_BUFFER_QUEUE, setVideoTarget() must be called before starting | 
|  | 135 | // video recording. | 
|  | 136 | status_t    setVideoBufferMode(int32_t videoBufferMode); | 
|  | 137 |  | 
|  | 138 | // Set the video buffer producer for camera to use in VIDEO_BUFFER_MODE_BUFFER_QUEUE | 
|  | 139 | // mode. | 
|  | 140 | status_t    setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer); | 
| James Dong | e2ad673 | 2010-10-18 20:42:51 -0700 | [diff] [blame] | 141 |  | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 142 | void        setListener(const sp<CameraListener>& listener); | 
| Wu-cheng Li | 4ca2c7c | 2011-06-01 17:22:24 +0800 | [diff] [blame] | 143 | void        setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener); | 
| Eino-Ville Talvala | 3ee3550 | 2013-04-02 15:45:11 -0700 | [diff] [blame] | 144 |  | 
|  | 145 | // Configure preview callbacks to app. Only one of the older | 
|  | 146 | // callbacks or the callback surface can be active at the same time; | 
|  | 147 | // enabling one will disable the other if active. Flags can be | 
|  | 148 | // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and | 
|  | 149 | // Target by calling it with a NULL interface. | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 150 | void        setPreviewCallbackFlags(int preview_callback_flag); | 
| Eino-Ville Talvala | 3ee3550 | 2013-04-02 15:45:11 -0700 | [diff] [blame] | 151 | status_t    setPreviewCallbackTarget( | 
|  | 152 | const sp<IGraphicBufferProducer>& callbackProducer); | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 153 |  | 
| Wu-cheng Li | 4ca2c7c | 2011-06-01 17:22:24 +0800 | [diff] [blame] | 154 | sp<ICameraRecordingProxy> getRecordingProxy(); | 
|  | 155 |  | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 156 | // ICameraClient interface | 
|  | 157 | virtual void        notifyCallback(int32_t msgType, int32_t ext, int32_t ext2); | 
| Wu-cheng Li | 57c8618 | 2011-07-30 05:00:37 +0800 | [diff] [blame] | 158 | virtual void        dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, | 
|  | 159 | camera_frame_metadata_t *metadata); | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 160 | virtual void        dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); | 
|  | 161 |  | 
| Wu-cheng Li | 4ca2c7c | 2011-06-01 17:22:24 +0800 | [diff] [blame] | 162 | class RecordingProxy : public BnCameraRecordingProxy | 
|  | 163 | { | 
|  | 164 | public: | 
|  | 165 | RecordingProxy(const sp<Camera>& camera); | 
|  | 166 |  | 
|  | 167 | // ICameraRecordingProxy interface | 
|  | 168 | virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener); | 
|  | 169 | virtual void stopRecording(); | 
|  | 170 | virtual void releaseRecordingFrame(const sp<IMemory>& mem); | 
|  | 171 |  | 
|  | 172 | private: | 
|  | 173 | sp<Camera>         mCamera; | 
|  | 174 | }; | 
|  | 175 |  | 
| Igor Murashkin | 1d88023 | 2013-02-20 16:50:13 -0800 | [diff] [blame] | 176 | protected: | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 177 | Camera(int cameraId); | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 178 | Camera(const Camera&); | 
|  | 179 | Camera& operator=(const Camera); | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 180 |  | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 181 | sp<ICameraRecordingProxyListener>  mRecordingProxyListener; | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 182 |  | 
| Igor Murashkin | c073ba5 | 2013-02-26 14:32:34 -0800 | [diff] [blame] | 183 | friend class        CameraBase; | 
| Mathias Agopian | 3cf6135 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 184 | }; | 
|  | 185 |  | 
|  | 186 | }; // namespace android | 
|  | 187 |  | 
|  | 188 | #endif |