blob: 2b608425be45afe91a12265198e29452422c8e44 [file] [log] [blame]
Mathias Agopian3cf61352010-02-09 17:46:37 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
Mathias Agopian3cf61352010-02-09 17:46:37 -08003 *
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 McFadden8ba01022012-12-18 09:46:54 -080021#include <gui/IGraphicBufferProducer.h>
Iliyan Malchev9e626522011-04-14 16:51:21 -070022#include <system/camera.h>
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +080023#include <camera/ICameraClient.h>
24#include <camera/ICameraRecordingProxy.h>
25#include <camera/ICameraRecordingProxyListener.h>
Igor Murashkinc073ba52013-02-26 14:32:34 -080026#include <camera/ICameraService.h>
27#include <camera/ICamera.h>
28#include <camera/CameraBase.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080029
30namespace android {
31
Mathias Agopian3cf61352010-02-09 17:46:37 -080032class Surface;
Mathias Agopian3cf61352010-02-09 17:46:37 -080033class String8;
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080034class String16;
Mathias Agopian3cf61352010-02-09 17:46:37 -080035
36// ref-counted object for callbacks
37class CameraListener: virtual public RefBase
38{
39public:
40 virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
Wu-cheng Li57c86182011-07-30 05:00:37 +080041 virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr,
42 camera_frame_metadata_t *metadata) = 0;
Mathias Agopian3cf61352010-02-09 17:46:37 -080043 virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0;
44};
45
Igor Murashkinc073ba52013-02-26 14:32:34 -080046class Camera;
47
48template <>
49struct CameraTraits<Camera>
50{
51 typedef CameraListener TCamListener;
52 typedef ICamera TCamUser;
53 typedef ICameraClient TCamCallbacks;
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070054 typedef status_t (ICameraService::*TCamConnectService)(const sp<ICameraClient>&,
55 int, const String16&, int,
56 /*out*/
57 sp<ICamera>&);
58 static TCamConnectService fnConnectService;
Igor Murashkinc073ba52013-02-26 14:32:34 -080059};
60
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070061
Igor Murashkinc073ba52013-02-26 14:32:34 -080062class Camera :
63 public CameraBase<Camera>,
64 public BnCameraClient
Mathias Agopian3cf61352010-02-09 17:46:37 -080065{
66public:
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080067 enum {
Igor Murashkinc073ba52013-02-26 14:32:34 -080068 USE_CALLING_UID = ICameraService::USE_CALLING_UID
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080069 };
70
Mathias Agopian3cf61352010-02-09 17:46:37 -080071 // construct a camera client from an existing remote
72 static sp<Camera> create(const sp<ICamera>& camera);
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080073 static sp<Camera> connect(int cameraId,
74 const String16& clientPackageName,
75 int clientUid);
76
Zhijun Heb10cdad2014-06-16 16:38:35 -070077 static status_t connectLegacy(int cameraId, int halVersion,
78 const String16& clientPackageName,
79 int clientUid, sp<Camera>& camera);
80
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +080081 virtual ~Camera();
Mathias Agopian3cf61352010-02-09 17:46:37 -080082
83 status_t reconnect();
Mathias Agopian3cf61352010-02-09 17:46:37 -080084 status_t lock();
85 status_t unlock();
86
Andy McFadden8ba01022012-12-18 09:46:54 -080087 // pass the buffered IGraphicBufferProducer to the camera service
Eino-Ville Talvala4b820b02013-08-21 14:39:05 -070088 status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer);
Jamie Gennisbfa33aa2010-12-20 11:51:31 -080089
Eino-Ville Talvala4b820b02013-08-21 14:39:05 -070090 // start preview mode, must call setPreviewTarget first
Mathias Agopian3cf61352010-02-09 17:46:37 -080091 status_t startPreview();
92
93 // stop preview mode
94 void stopPreview();
95
96 // get preview state
97 bool previewEnabled();
98
Eino-Ville Talvala4b820b02013-08-21 14:39:05 -070099 // start recording mode, must call setPreviewTarget first
Mathias Agopian3cf61352010-02-09 17:46:37 -0800100 status_t startRecording();
101
102 // stop recording mode
103 void stopRecording();
104
105 // get recording state
106 bool recordingEnabled();
107
108 // release a recording frame
109 void releaseRecordingFrame(const sp<IMemory>& mem);
110
111 // autoFocus - status returned from callback
112 status_t autoFocus();
113
114 // cancel auto focus
115 status_t cancelAutoFocus();
116
117 // take a picture - picture returned from callback
James Donge468ac52011-02-17 16:38:06 -0800118 status_t takePicture(int msgType);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800119
120 // set preview/capture parameters - key/value pairs
121 status_t setParameters(const String8& params);
122
123 // get preview/capture parameters - key/value pairs
124 String8 getParameters() const;
125
126 // send command to camera driver
127 status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
128
James Donge2ad6732010-10-18 20:42:51 -0700129 // tell camera hal to store meta data or real YUV in video buffers.
130 status_t storeMetaDataInBuffers(bool enabled);
131
Mathias Agopian3cf61352010-02-09 17:46:37 -0800132 void setListener(const sp<CameraListener>& listener);
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800133 void setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener);
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700134
135 // Configure preview callbacks to app. Only one of the older
136 // callbacks or the callback surface can be active at the same time;
137 // enabling one will disable the other if active. Flags can be
138 // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and
139 // Target by calling it with a NULL interface.
Mathias Agopian3cf61352010-02-09 17:46:37 -0800140 void setPreviewCallbackFlags(int preview_callback_flag);
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700141 status_t setPreviewCallbackTarget(
142 const sp<IGraphicBufferProducer>& callbackProducer);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800143
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800144 sp<ICameraRecordingProxy> getRecordingProxy();
145
Mathias Agopian3cf61352010-02-09 17:46:37 -0800146 // ICameraClient interface
147 virtual void notifyCallback(int32_t msgType, int32_t ext, int32_t ext2);
Wu-cheng Li57c86182011-07-30 05:00:37 +0800148 virtual void dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
149 camera_frame_metadata_t *metadata);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800150 virtual void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
151
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800152 class RecordingProxy : public BnCameraRecordingProxy
153 {
154 public:
155 RecordingProxy(const sp<Camera>& camera);
156
157 // ICameraRecordingProxy interface
158 virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener);
159 virtual void stopRecording();
160 virtual void releaseRecordingFrame(const sp<IMemory>& mem);
161
162 private:
163 sp<Camera> mCamera;
164 };
165
Igor Murashkin1d880232013-02-20 16:50:13 -0800166protected:
Igor Murashkinc073ba52013-02-26 14:32:34 -0800167 Camera(int cameraId);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800168 Camera(const Camera&);
169 Camera& operator=(const Camera);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800170
Igor Murashkinc073ba52013-02-26 14:32:34 -0800171 sp<ICameraRecordingProxyListener> mRecordingProxyListener;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800172
Igor Murashkinc073ba52013-02-26 14:32:34 -0800173 friend class CameraBase;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800174};
175
176}; // namespace android
177
178#endif