blob: b2b65b829dcd133642f754d710541df21bc7e969 [file] [log] [blame]
Mathias Agopian65ab4712010-07-14 17:59:35 -07001/*
Ruben Brunkd1176ef2014-02-21 10:51:38 -08002 * Copyright (C) 2008 The Android Open Source Project
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 */
Mathias Agopian65ab4712010-07-14 17:59:35 -070016
17#ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
18#define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
19
Igor Murashkin634a5152013-02-20 17:15:11 -080020#include <utils/Vector.h>
Ruben Brunkb2119af2014-05-09 19:57:56 -070021#include <utils/KeyedVector.h>
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080022#include <binder/AppOpsManager.h>
Mathias Agopian5462fc92010-07-14 18:41:18 -070023#include <binder/BinderService.h>
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080024#include <binder/IAppOpsCallback.h>
Mathias Agopian65ab4712010-07-14 17:59:35 -070025#include <camera/ICameraService.h>
Iliyan Malchev8951a972011-04-14 16:55:59 -070026#include <hardware/camera.h>
Mathias Agopian65ab4712010-07-14 17:59:35 -070027
Igor Murashkinc073ba52013-02-26 14:32:34 -080028#include <camera/ICamera.h>
29#include <camera/ICameraClient.h>
30#include <camera/IProCameraUser.h>
31#include <camera/IProCameraCallbacks.h>
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070032#include <camera/camera2/ICameraDeviceUser.h>
33#include <camera/camera2/ICameraDeviceCallbacks.h>
Ruben Brunkd1176ef2014-02-21 10:51:38 -080034#include <camera/VendorTagDescriptor.h>
Jianing Weicb0652e2014-03-12 18:29:36 -070035#include <camera/CaptureResult.h>
Ruben Brunkb2119af2014-05-09 19:57:56 -070036#include <camera/CameraParameters.h>
Igor Murashkinc073ba52013-02-26 14:32:34 -080037
Igor Murashkinbfc99152013-02-27 12:55:20 -080038#include <camera/ICameraServiceListener.h>
39
Mathias Agopian65ab4712010-07-14 17:59:35 -070040/* This needs to be increased if we can have more cameras */
41#define MAX_CAMERAS 2
42
43namespace android {
44
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -070045extern volatile int32_t gLogLevel;
46
Mathias Agopian65ab4712010-07-14 17:59:35 -070047class MemoryHeapBase;
48class MediaPlayer;
49
Mathias Agopian5462fc92010-07-14 18:41:18 -070050class CameraService :
51 public BinderService<CameraService>,
Igor Murashkinecf17e82012-10-02 16:05:11 -070052 public BnCameraService,
Igor Murashkincba2c162013-03-20 15:56:31 -070053 public IBinder::DeathRecipient,
54 public camera_module_callbacks_t
Mathias Agopian65ab4712010-07-14 17:59:35 -070055{
Mathias Agopian5462fc92010-07-14 18:41:18 -070056 friend class BinderService<CameraService>;
Mathias Agopian65ab4712010-07-14 17:59:35 -070057public:
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -070058 class Client;
Igor Murashkin634a5152013-02-20 17:15:11 -080059 class BasicClient;
60
61 // Implementation of BinderService<T>
Mathias Agopian5462fc92010-07-14 18:41:18 -070062 static char const* getServiceName() { return "media.camera"; }
Mathias Agopian65ab4712010-07-14 17:59:35 -070063
64 CameraService();
65 virtual ~CameraService();
66
Igor Murashkin634a5152013-02-20 17:15:11 -080067 /////////////////////////////////////////////////////////////////////
Igor Murashkincba2c162013-03-20 15:56:31 -070068 // HAL Callbacks
69 virtual void onDeviceStatusChanged(int cameraId,
70 int newStatus);
71
72 /////////////////////////////////////////////////////////////////////
Igor Murashkin634a5152013-02-20 17:15:11 -080073 // ICameraService
Mathias Agopian65ab4712010-07-14 17:59:35 -070074 virtual int32_t getNumberOfCameras();
75 virtual status_t getCameraInfo(int cameraId,
76 struct CameraInfo* cameraInfo);
Zhijun He2b59be82013-09-25 10:14:30 -070077 virtual status_t getCameraCharacteristics(int cameraId,
78 CameraMetadata* cameraInfo);
Ruben Brunkd1176ef2014-02-21 10:51:38 -080079 virtual status_t getCameraVendorTagDescriptor(/*out*/ sp<VendorTagDescriptor>& desc);
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080080
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070081 virtual status_t connect(const sp<ICameraClient>& cameraClient, int cameraId,
82 const String16& clientPackageName, int clientUid,
83 /*out*/
84 sp<ICamera>& device);
85
86 virtual status_t connectPro(const sp<IProCameraCallbacks>& cameraCb,
87 int cameraId, const String16& clientPackageName, int clientUid,
88 /*out*/
89 sp<IProCameraUser>& device);
90
91 virtual status_t connectDevice(
Igor Murashkine7ee7632013-06-11 18:10:18 -070092 const sp<ICameraDeviceCallbacks>& cameraCb,
93 int cameraId,
94 const String16& clientPackageName,
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070095 int clientUid,
96 /*out*/
97 sp<ICameraDeviceUser>& device);
Mathias Agopian65ab4712010-07-14 17:59:35 -070098
Igor Murashkinbfc99152013-02-27 12:55:20 -080099 virtual status_t addListener(const sp<ICameraServiceListener>& listener);
100 virtual status_t removeListener(
101 const sp<ICameraServiceListener>& listener);
102
Igor Murashkin65d14b92014-06-17 12:03:20 -0700103 virtual status_t getLegacyParameters(
104 int cameraId,
105 /*out*/
106 String16* parameters);
107
108 // OK = supports api of that version, -EOPNOTSUPP = does not support
109 virtual status_t supportsCameraApi(
110 int cameraId, int apiVersion);
111
Igor Murashkin634a5152013-02-20 17:15:11 -0800112 // Extra permissions checks
Mathias Agopian65ab4712010-07-14 17:59:35 -0700113 virtual status_t onTransact(uint32_t code, const Parcel& data,
114 Parcel* reply, uint32_t flags);
Igor Murashkin634a5152013-02-20 17:15:11 -0800115
116 virtual status_t dump(int fd, const Vector<String16>& args);
117
118 /////////////////////////////////////////////////////////////////////
119 // Client functionality
120 virtual void removeClientByRemote(const wp<IBinder>& remoteBinder);
Mathias Agopian65ab4712010-07-14 17:59:35 -0700121
122 enum sound_kind {
123 SOUND_SHUTTER = 0,
124 SOUND_RECORDING = 1,
125 NUM_SOUNDS
126 };
127
128 void loadSound();
129 void playSound(sound_kind kind);
130 void releaseSound();
131
Igor Murashkin98e24722013-06-19 19:51:04 -0700132 /////////////////////////////////////////////////////////////////////
133 // CameraDeviceFactory functionality
134 int getDeviceVersion(int cameraId, int* facing = NULL);
135
Igor Murashkin634a5152013-02-20 17:15:11 -0800136
137 /////////////////////////////////////////////////////////////////////
138 // CameraClient functionality
139
140 // returns plain pointer of client. Note that mClientLock should be acquired to
141 // prevent the client from destruction. The result can be NULL.
Igor Murashkine7ee7632013-06-11 18:10:18 -0700142 virtual BasicClient* getClientByIdUnsafe(int cameraId);
Igor Murashkin634a5152013-02-20 17:15:11 -0800143 virtual Mutex* getClientLockById(int cameraId);
144
145 class BasicClient : public virtual RefBase {
146 public:
147 virtual status_t initialize(camera_module_t *module) = 0;
148
149 virtual void disconnect() = 0;
150
Igor Murashkine7ee7632013-06-11 18:10:18 -0700151 // because we can't virtually inherit IInterface, which breaks
152 // virtual inheritance
153 virtual sp<IBinder> asBinderWrapper() = 0;
154
Igor Murashkine6800ce2013-03-04 17:25:57 -0800155 // Return the remote callback binder object (e.g. IProCameraCallbacks)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700156 sp<IBinder> getRemote() {
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800157 return mRemoteBinder;
Igor Murashkin634a5152013-02-20 17:15:11 -0800158 }
159
Igor Murashkine7ee7632013-06-11 18:10:18 -0700160 virtual status_t dump(int fd, const Vector<String16>& args) = 0;
161
Igor Murashkin634a5152013-02-20 17:15:11 -0800162 protected:
163 BasicClient(const sp<CameraService>& cameraService,
164 const sp<IBinder>& remoteCallback,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800165 const String16& clientPackageName,
Igor Murashkin634a5152013-02-20 17:15:11 -0800166 int cameraId,
167 int cameraFacing,
168 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800169 uid_t clientUid,
Igor Murashkin634a5152013-02-20 17:15:11 -0800170 int servicePid);
171
172 virtual ~BasicClient();
173
174 // the instance is in the middle of destruction. When this is set,
175 // the instance should not be accessed from callback.
176 // CameraService's mClientLock should be acquired to access this.
177 // - subclasses should set this to true in their destructors.
178 bool mDestructionStarted;
179
180 // these are initialized in the constructor.
181 sp<CameraService> mCameraService; // immutable after constructor
182 int mCameraId; // immutable after constructor
183 int mCameraFacing; // immutable after constructor
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800184 const String16 mClientPackageName;
Igor Murashkin634a5152013-02-20 17:15:11 -0800185 pid_t mClientPid;
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800186 uid_t mClientUid; // immutable after constructor
Igor Murashkin634a5152013-02-20 17:15:11 -0800187 pid_t mServicePid; // immutable after constructor
188
189 // - The app-side Binder interface to receive callbacks from us
Igor Murashkine7ee7632013-06-11 18:10:18 -0700190 sp<IBinder> mRemoteBinder; // immutable after constructor
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800191
192 // permissions management
193 status_t startCameraOps();
194 status_t finishCameraOps();
195
196 // Notify client about a fatal error
Jianing Weicb0652e2014-03-12 18:29:36 -0700197 virtual void notifyError(
198 ICameraDeviceCallbacks::CameraErrorCode errorCode,
199 const CaptureResultExtras& resultExtras) = 0;
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800200 private:
201 AppOpsManager mAppOpsManager;
202
203 class OpsCallback : public BnAppOpsCallback {
204 public:
205 OpsCallback(wp<BasicClient> client);
206 virtual void opChanged(int32_t op, const String16& packageName);
207
208 private:
209 wp<BasicClient> mClient;
210
211 }; // class OpsCallback
212
213 sp<OpsCallback> mOpsCallback;
214 // Track whether startCameraOps was called successfully, to avoid
215 // finishing what we didn't start.
216 bool mOpsActive;
217
218 // IAppOpsCallback interface, indirected through opListener
219 virtual void opChanged(int32_t op, const String16& packageName);
220 }; // class BasicClient
Igor Murashkin634a5152013-02-20 17:15:11 -0800221
222 class Client : public BnCamera, public BasicClient
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700223 {
224 public:
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800225 typedef ICameraClient TCamCallbacks;
226
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700227 // ICamera interface (see ICamera for details)
228 virtual void disconnect();
229 virtual status_t connect(const sp<ICameraClient>& client) = 0;
230 virtual status_t lock() = 0;
231 virtual status_t unlock() = 0;
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -0700232 virtual status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)=0;
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700233 virtual void setPreviewCallbackFlag(int flag) = 0;
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700234 virtual status_t setPreviewCallbackTarget(
235 const sp<IGraphicBufferProducer>& callbackProducer) = 0;
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700236 virtual status_t startPreview() = 0;
237 virtual void stopPreview() = 0;
238 virtual bool previewEnabled() = 0;
239 virtual status_t storeMetaDataInBuffers(bool enabled) = 0;
240 virtual status_t startRecording() = 0;
241 virtual void stopRecording() = 0;
242 virtual bool recordingEnabled() = 0;
243 virtual void releaseRecordingFrame(const sp<IMemory>& mem) = 0;
244 virtual status_t autoFocus() = 0;
245 virtual status_t cancelAutoFocus() = 0;
246 virtual status_t takePicture(int msgType) = 0;
247 virtual status_t setParameters(const String8& params) = 0;
248 virtual String8 getParameters() const = 0;
249 virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0;
250
251 // Interface used by CameraService
252 Client(const sp<CameraService>& cameraService,
253 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800254 const String16& clientPackageName,
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700255 int cameraId,
256 int cameraFacing,
Igor Murashkinecf17e82012-10-02 16:05:11 -0700257 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800258 uid_t clientUid,
Igor Murashkinecf17e82012-10-02 16:05:11 -0700259 int servicePid);
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700260 ~Client();
261
262 // return our camera client
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800263 const sp<ICameraClient>& getRemoteCallback() {
264 return mRemoteCallback;
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700265 }
266
Igor Murashkine7ee7632013-06-11 18:10:18 -0700267 virtual sp<IBinder> asBinderWrapper() {
268 return asBinder();
269 }
270
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700271 protected:
272 static Mutex* getClientLockFromCookie(void* user);
273 // convert client from cookie. Client lock should be acquired before getting Client.
274 static Client* getClientFromCookie(void* user);
275
Jianing Weicb0652e2014-03-12 18:29:36 -0700276 virtual void notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
277 const CaptureResultExtras& resultExtras);
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800278
Igor Murashkin634a5152013-02-20 17:15:11 -0800279 // Initialized in constructor
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700280
Igor Murashkin634a5152013-02-20 17:15:11 -0800281 // - The app-side Binder interface to receive callbacks from us
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800282 sp<ICameraClient> mRemoteCallback;
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800283
284 }; // class Client
Igor Murashkin634a5152013-02-20 17:15:11 -0800285
286 class ProClient : public BnProCameraUser, public BasicClient {
287 public:
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800288 typedef IProCameraCallbacks TCamCallbacks;
289
Igor Murashkin634a5152013-02-20 17:15:11 -0800290 ProClient(const sp<CameraService>& cameraService,
291 const sp<IProCameraCallbacks>& remoteCallback,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800292 const String16& clientPackageName,
Igor Murashkin634a5152013-02-20 17:15:11 -0800293 int cameraId,
294 int cameraFacing,
295 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800296 uid_t clientUid,
Igor Murashkin634a5152013-02-20 17:15:11 -0800297 int servicePid);
298
299 virtual ~ProClient();
300
301 const sp<IProCameraCallbacks>& getRemoteCallback() {
302 return mRemoteCallback;
303 }
304
Igor Murashkin634a5152013-02-20 17:15:11 -0800305 /***
306 IProCamera implementation
307 ***/
Igor Murashkine6800ce2013-03-04 17:25:57 -0800308 virtual status_t connect(const sp<IProCameraCallbacks>& callbacks)
309 = 0;
310 virtual status_t exclusiveTryLock() = 0;
311 virtual status_t exclusiveLock() = 0;
312 virtual status_t exclusiveUnlock() = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -0800313
Igor Murashkine6800ce2013-03-04 17:25:57 -0800314 virtual bool hasExclusiveLock() = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -0800315
316 // Note that the callee gets a copy of the metadata.
317 virtual int submitRequest(camera_metadata_t* metadata,
Igor Murashkine6800ce2013-03-04 17:25:57 -0800318 bool streaming = false) = 0;
319 virtual status_t cancelRequest(int requestId) = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -0800320
Igor Murashkinbfc99152013-02-27 12:55:20 -0800321 // Callbacks from camera service
Igor Murashkine6800ce2013-03-04 17:25:57 -0800322 virtual void onExclusiveLockStolen() = 0;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800323
Igor Murashkin634a5152013-02-20 17:15:11 -0800324 protected:
Jianing Weicb0652e2014-03-12 18:29:36 -0700325 virtual void notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
326 const CaptureResultExtras& resultExtras);
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700327
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800328 sp<IProCameraCallbacks> mRemoteCallback;
329 }; // class ProClient
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700330
Mathias Agopian65ab4712010-07-14 17:59:35 -0700331private:
Igor Murashkin634a5152013-02-20 17:15:11 -0800332
333 // Delay-load the Camera HAL module
334 virtual void onFirstRef();
335
Igor Murashkine6800ce2013-03-04 17:25:57 -0800336 // Step 1. Check if we can connect, before we acquire the service lock.
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700337 status_t validateConnect(int cameraId,
Igor Murashkine6800ce2013-03-04 17:25:57 -0800338 /*inout*/
339 int& clientUid) const;
340
341 // Step 2. Check if we can connect, after we acquire the service lock.
342 bool canConnectUnsafe(int cameraId,
343 const String16& clientPackageName,
344 const sp<IBinder>& remoteCallback,
345 /*out*/
Igor Murashkine7ee7632013-06-11 18:10:18 -0700346 sp<BasicClient> &client);
Igor Murashkine6800ce2013-03-04 17:25:57 -0800347
348 // When connection is successful, initialize client and track its death
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700349 status_t connectFinishUnsafe(const sp<BasicClient>& client,
Igor Murashkine7ee7632013-06-11 18:10:18 -0700350 const sp<IBinder>& remoteCallback);
Igor Murashkine6800ce2013-03-04 17:25:57 -0800351
Igor Murashkin634a5152013-02-20 17:15:11 -0800352 virtual sp<BasicClient> getClientByRemote(const wp<IBinder>& cameraClient);
353
Mathias Agopian65ab4712010-07-14 17:59:35 -0700354 Mutex mServiceLock;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700355 // either a Client or CameraDeviceClient
356 wp<BasicClient> mClient[MAX_CAMERAS]; // protected by mServiceLock
Keun young Parkd8973a72012-03-28 14:13:09 -0700357 Mutex mClientLock[MAX_CAMERAS]; // prevent Client destruction inside callbacks
Mathias Agopian65ab4712010-07-14 17:59:35 -0700358 int mNumberOfCameras;
359
Igor Murashkin634a5152013-02-20 17:15:11 -0800360 typedef wp<ProClient> weak_pro_client_ptr;
361 Vector<weak_pro_client_ptr> mProClientList[MAX_CAMERAS];
362
Igor Murashkinecf17e82012-10-02 16:05:11 -0700363 // needs to be called with mServiceLock held
Igor Murashkine7ee7632013-06-11 18:10:18 -0700364 sp<BasicClient> findClientUnsafe(const wp<IBinder>& cameraClient, int& outIndex);
Igor Murashkin634a5152013-02-20 17:15:11 -0800365 sp<ProClient> findProClientUnsafe(
366 const wp<IBinder>& cameraCallbacksRemote);
Igor Murashkinecf17e82012-10-02 16:05:11 -0700367
Mathias Agopian65ab4712010-07-14 17:59:35 -0700368 // atomics to record whether the hardware is allocated to some client.
369 volatile int32_t mBusy[MAX_CAMERAS];
370 void setCameraBusy(int cameraId);
371 void setCameraFree(int cameraId);
372
373 // sounds
Chih-Chung Changff4f55c2011-10-17 19:03:12 +0800374 MediaPlayer* newMediaPlayer(const char *file);
375
Mathias Agopian65ab4712010-07-14 17:59:35 -0700376 Mutex mSoundLock;
377 sp<MediaPlayer> mSoundPlayer[NUM_SOUNDS];
378 int mSoundRef; // reference count (release all MediaPlayer when 0)
379
Iliyan Malchev8951a972011-04-14 16:55:59 -0700380 camera_module_t *mModule;
Igor Murashkinecf17e82012-10-02 16:05:11 -0700381
Igor Murashkinbfc99152013-02-27 12:55:20 -0800382 Vector<sp<ICameraServiceListener> >
383 mListenerList;
384
385 // guard only mStatusList and the broadcasting of ICameraServiceListener
Igor Murashkincba2c162013-03-20 15:56:31 -0700386 mutable Mutex mStatusMutex;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800387 ICameraServiceListener::Status
388 mStatusList[MAX_CAMERAS];
389
Igor Murashkincba2c162013-03-20 15:56:31 -0700390 // Read the current status (locks mStatusMutex)
391 ICameraServiceListener::Status
392 getStatus(int cameraId) const;
393
Igor Murashkin93747b92013-05-01 15:42:20 -0700394 typedef Vector<ICameraServiceListener::Status> StatusVector;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800395 // Broadcast the new status if it changed (locks the service mutex)
396 void updateStatus(
397 ICameraServiceListener::Status status,
Igor Murashkin93747b92013-05-01 15:42:20 -0700398 int32_t cameraId,
399 const StatusVector *rejectSourceStates = NULL);
Igor Murashkinbfc99152013-02-27 12:55:20 -0800400
Igor Murashkinecf17e82012-10-02 16:05:11 -0700401 // IBinder::DeathRecipient implementation
Igor Murashkinbfc99152013-02-27 12:55:20 -0800402 virtual void binderDied(const wp<IBinder> &who);
Igor Murashkin634a5152013-02-20 17:15:11 -0800403
404 // Helpers
Igor Murashkinbfc99152013-02-27 12:55:20 -0800405
406 bool isValidCameraId(int cameraId);
Ruben Brunkd1176ef2014-02-21 10:51:38 -0800407
408 bool setUpVendorTags();
Ruben Brunkb2119af2014-05-09 19:57:56 -0700409
410 /**
411 * A mapping of camera ids to CameraParameters returned by that camera device.
412 *
413 * This cache is used to generate CameraCharacteristic metadata when using
414 * the HAL1 shim.
415 */
416 KeyedVector<int, CameraParameters> mShimParams;
417
418 /**
419 * Initialize and cache the metadata used by the HAL1 shim for a given cameraId.
420 *
421 * Returns OK on success, or a negative error code.
422 */
423 status_t initializeShimMetadata(int cameraId);
424
425 /**
Igor Murashkin65d14b92014-06-17 12:03:20 -0700426 * Get the cached CameraParameters for the camera. If they haven't been
427 * cached yet, then initialize them for the first time.
428 *
429 * Returns OK on success, or a negative error code.
430 */
431 status_t getLegacyParametersLazy(int cameraId, /*out*/CameraParameters* parameters);
432
433 /**
Ruben Brunkb2119af2014-05-09 19:57:56 -0700434 * Generate the CameraCharacteristics metadata required by the Camera2 API
435 * from the available HAL1 CameraParameters and CameraInfo.
436 *
437 * Returns OK on success, or a negative error code.
438 */
439 status_t generateShimMetadata(int cameraId, /*out*/CameraMetadata* cameraInfo);
440
441 /**
442 * Connect a new camera client. This should only be used while holding the
443 * mutex for mServiceLock.
444 *
445 * Returns OK on success, or a negative error code.
446 */
447 status_t connectHelperLocked(const sp<ICameraClient>& cameraClient,
448 int cameraId,
449 const String16& clientPackageName,
450 int clientUid,
451 int callingPid,
452 /*out*/
453 sp<Client>& client);
Mathias Agopian65ab4712010-07-14 17:59:35 -0700454};
455
456} // namespace android
457
458#endif