blob: 28590eb289a2b74a3e818033bad83782a11b02d9 [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
Zhijun Heb10cdad2014-06-16 16:38:35 -070086 virtual status_t connectLegacy(const sp<ICameraClient>& cameraClient, int cameraId,
87 int halVersion, const String16& clientPackageName, int clientUid,
88 /*out*/
89 sp<ICamera>& device);
90
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070091 virtual status_t connectPro(const sp<IProCameraCallbacks>& cameraCb,
92 int cameraId, const String16& clientPackageName, int clientUid,
93 /*out*/
94 sp<IProCameraUser>& device);
95
96 virtual status_t connectDevice(
Igor Murashkine7ee7632013-06-11 18:10:18 -070097 const sp<ICameraDeviceCallbacks>& cameraCb,
98 int cameraId,
99 const String16& clientPackageName,
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700100 int clientUid,
101 /*out*/
102 sp<ICameraDeviceUser>& device);
Mathias Agopian65ab4712010-07-14 17:59:35 -0700103
Igor Murashkinbfc99152013-02-27 12:55:20 -0800104 virtual status_t addListener(const sp<ICameraServiceListener>& listener);
105 virtual status_t removeListener(
106 const sp<ICameraServiceListener>& listener);
107
Igor Murashkin65d14b92014-06-17 12:03:20 -0700108 virtual status_t getLegacyParameters(
109 int cameraId,
110 /*out*/
111 String16* parameters);
112
113 // OK = supports api of that version, -EOPNOTSUPP = does not support
114 virtual status_t supportsCameraApi(
115 int cameraId, int apiVersion);
116
Igor Murashkin634a5152013-02-20 17:15:11 -0800117 // Extra permissions checks
Mathias Agopian65ab4712010-07-14 17:59:35 -0700118 virtual status_t onTransact(uint32_t code, const Parcel& data,
119 Parcel* reply, uint32_t flags);
Igor Murashkin634a5152013-02-20 17:15:11 -0800120
121 virtual status_t dump(int fd, const Vector<String16>& args);
122
123 /////////////////////////////////////////////////////////////////////
124 // Client functionality
125 virtual void removeClientByRemote(const wp<IBinder>& remoteBinder);
Mathias Agopian65ab4712010-07-14 17:59:35 -0700126
127 enum sound_kind {
128 SOUND_SHUTTER = 0,
129 SOUND_RECORDING = 1,
130 NUM_SOUNDS
131 };
132
133 void loadSound();
134 void playSound(sound_kind kind);
135 void releaseSound();
136
Igor Murashkin98e24722013-06-19 19:51:04 -0700137 /////////////////////////////////////////////////////////////////////
138 // CameraDeviceFactory functionality
139 int getDeviceVersion(int cameraId, int* facing = NULL);
140
Igor Murashkin634a5152013-02-20 17:15:11 -0800141
142 /////////////////////////////////////////////////////////////////////
143 // CameraClient functionality
144
145 // returns plain pointer of client. Note that mClientLock should be acquired to
146 // prevent the client from destruction. The result can be NULL.
Igor Murashkine7ee7632013-06-11 18:10:18 -0700147 virtual BasicClient* getClientByIdUnsafe(int cameraId);
Igor Murashkin634a5152013-02-20 17:15:11 -0800148 virtual Mutex* getClientLockById(int cameraId);
149
150 class BasicClient : public virtual RefBase {
151 public:
152 virtual status_t initialize(camera_module_t *module) = 0;
153
154 virtual void disconnect() = 0;
155
Igor Murashkine7ee7632013-06-11 18:10:18 -0700156 // because we can't virtually inherit IInterface, which breaks
157 // virtual inheritance
158 virtual sp<IBinder> asBinderWrapper() = 0;
159
Igor Murashkine6800ce2013-03-04 17:25:57 -0800160 // Return the remote callback binder object (e.g. IProCameraCallbacks)
Igor Murashkine7ee7632013-06-11 18:10:18 -0700161 sp<IBinder> getRemote() {
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800162 return mRemoteBinder;
Igor Murashkin634a5152013-02-20 17:15:11 -0800163 }
164
Igor Murashkine7ee7632013-06-11 18:10:18 -0700165 virtual status_t dump(int fd, const Vector<String16>& args) = 0;
166
Igor Murashkin634a5152013-02-20 17:15:11 -0800167 protected:
168 BasicClient(const sp<CameraService>& cameraService,
169 const sp<IBinder>& remoteCallback,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800170 const String16& clientPackageName,
Igor Murashkin634a5152013-02-20 17:15:11 -0800171 int cameraId,
172 int cameraFacing,
173 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800174 uid_t clientUid,
Igor Murashkin634a5152013-02-20 17:15:11 -0800175 int servicePid);
176
177 virtual ~BasicClient();
178
179 // the instance is in the middle of destruction. When this is set,
180 // the instance should not be accessed from callback.
181 // CameraService's mClientLock should be acquired to access this.
182 // - subclasses should set this to true in their destructors.
183 bool mDestructionStarted;
184
185 // these are initialized in the constructor.
186 sp<CameraService> mCameraService; // immutable after constructor
187 int mCameraId; // immutable after constructor
188 int mCameraFacing; // immutable after constructor
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800189 const String16 mClientPackageName;
Igor Murashkin634a5152013-02-20 17:15:11 -0800190 pid_t mClientPid;
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800191 uid_t mClientUid; // immutable after constructor
Igor Murashkin634a5152013-02-20 17:15:11 -0800192 pid_t mServicePid; // immutable after constructor
193
194 // - The app-side Binder interface to receive callbacks from us
Igor Murashkine7ee7632013-06-11 18:10:18 -0700195 sp<IBinder> mRemoteBinder; // immutable after constructor
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800196
197 // permissions management
198 status_t startCameraOps();
199 status_t finishCameraOps();
200
201 // Notify client about a fatal error
Jianing Weicb0652e2014-03-12 18:29:36 -0700202 virtual void notifyError(
203 ICameraDeviceCallbacks::CameraErrorCode errorCode,
204 const CaptureResultExtras& resultExtras) = 0;
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800205 private:
206 AppOpsManager mAppOpsManager;
207
208 class OpsCallback : public BnAppOpsCallback {
209 public:
210 OpsCallback(wp<BasicClient> client);
211 virtual void opChanged(int32_t op, const String16& packageName);
212
213 private:
214 wp<BasicClient> mClient;
215
216 }; // class OpsCallback
217
218 sp<OpsCallback> mOpsCallback;
219 // Track whether startCameraOps was called successfully, to avoid
220 // finishing what we didn't start.
221 bool mOpsActive;
222
223 // IAppOpsCallback interface, indirected through opListener
224 virtual void opChanged(int32_t op, const String16& packageName);
225 }; // class BasicClient
Igor Murashkin634a5152013-02-20 17:15:11 -0800226
227 class Client : public BnCamera, public BasicClient
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700228 {
229 public:
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800230 typedef ICameraClient TCamCallbacks;
231
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700232 // ICamera interface (see ICamera for details)
233 virtual void disconnect();
234 virtual status_t connect(const sp<ICameraClient>& client) = 0;
235 virtual status_t lock() = 0;
236 virtual status_t unlock() = 0;
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -0700237 virtual status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)=0;
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700238 virtual void setPreviewCallbackFlag(int flag) = 0;
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700239 virtual status_t setPreviewCallbackTarget(
240 const sp<IGraphicBufferProducer>& callbackProducer) = 0;
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700241 virtual status_t startPreview() = 0;
242 virtual void stopPreview() = 0;
243 virtual bool previewEnabled() = 0;
244 virtual status_t storeMetaDataInBuffers(bool enabled) = 0;
245 virtual status_t startRecording() = 0;
246 virtual void stopRecording() = 0;
247 virtual bool recordingEnabled() = 0;
248 virtual void releaseRecordingFrame(const sp<IMemory>& mem) = 0;
249 virtual status_t autoFocus() = 0;
250 virtual status_t cancelAutoFocus() = 0;
251 virtual status_t takePicture(int msgType) = 0;
252 virtual status_t setParameters(const String8& params) = 0;
253 virtual String8 getParameters() const = 0;
254 virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0;
255
256 // Interface used by CameraService
257 Client(const sp<CameraService>& cameraService,
258 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800259 const String16& clientPackageName,
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700260 int cameraId,
261 int cameraFacing,
Igor Murashkinecf17e82012-10-02 16:05:11 -0700262 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800263 uid_t clientUid,
Igor Murashkinecf17e82012-10-02 16:05:11 -0700264 int servicePid);
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700265 ~Client();
266
267 // return our camera client
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800268 const sp<ICameraClient>& getRemoteCallback() {
269 return mRemoteCallback;
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700270 }
271
Igor Murashkine7ee7632013-06-11 18:10:18 -0700272 virtual sp<IBinder> asBinderWrapper() {
273 return asBinder();
274 }
275
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700276 protected:
277 static Mutex* getClientLockFromCookie(void* user);
278 // convert client from cookie. Client lock should be acquired before getting Client.
279 static Client* getClientFromCookie(void* user);
280
Jianing Weicb0652e2014-03-12 18:29:36 -0700281 virtual void notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
282 const CaptureResultExtras& resultExtras);
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800283
Igor Murashkin634a5152013-02-20 17:15:11 -0800284 // Initialized in constructor
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700285
Igor Murashkin634a5152013-02-20 17:15:11 -0800286 // - The app-side Binder interface to receive callbacks from us
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800287 sp<ICameraClient> mRemoteCallback;
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800288
289 }; // class Client
Igor Murashkin634a5152013-02-20 17:15:11 -0800290
291 class ProClient : public BnProCameraUser, public BasicClient {
292 public:
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800293 typedef IProCameraCallbacks TCamCallbacks;
294
Igor Murashkin634a5152013-02-20 17:15:11 -0800295 ProClient(const sp<CameraService>& cameraService,
296 const sp<IProCameraCallbacks>& remoteCallback,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800297 const String16& clientPackageName,
Igor Murashkin634a5152013-02-20 17:15:11 -0800298 int cameraId,
299 int cameraFacing,
300 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800301 uid_t clientUid,
Igor Murashkin634a5152013-02-20 17:15:11 -0800302 int servicePid);
303
304 virtual ~ProClient();
305
306 const sp<IProCameraCallbacks>& getRemoteCallback() {
307 return mRemoteCallback;
308 }
309
Igor Murashkin634a5152013-02-20 17:15:11 -0800310 /***
311 IProCamera implementation
312 ***/
Igor Murashkine6800ce2013-03-04 17:25:57 -0800313 virtual status_t connect(const sp<IProCameraCallbacks>& callbacks)
314 = 0;
315 virtual status_t exclusiveTryLock() = 0;
316 virtual status_t exclusiveLock() = 0;
317 virtual status_t exclusiveUnlock() = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -0800318
Igor Murashkine6800ce2013-03-04 17:25:57 -0800319 virtual bool hasExclusiveLock() = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -0800320
321 // Note that the callee gets a copy of the metadata.
322 virtual int submitRequest(camera_metadata_t* metadata,
Igor Murashkine6800ce2013-03-04 17:25:57 -0800323 bool streaming = false) = 0;
324 virtual status_t cancelRequest(int requestId) = 0;
Igor Murashkin634a5152013-02-20 17:15:11 -0800325
Igor Murashkinbfc99152013-02-27 12:55:20 -0800326 // Callbacks from camera service
Igor Murashkine6800ce2013-03-04 17:25:57 -0800327 virtual void onExclusiveLockStolen() = 0;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800328
Igor Murashkin634a5152013-02-20 17:15:11 -0800329 protected:
Jianing Weicb0652e2014-03-12 18:29:36 -0700330 virtual void notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCode,
331 const CaptureResultExtras& resultExtras);
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700332
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800333 sp<IProCameraCallbacks> mRemoteCallback;
334 }; // class ProClient
Eino-Ville Talvala5e08d602012-05-16 14:59:25 -0700335
Mathias Agopian65ab4712010-07-14 17:59:35 -0700336private:
Igor Murashkin634a5152013-02-20 17:15:11 -0800337
338 // Delay-load the Camera HAL module
339 virtual void onFirstRef();
340
Igor Murashkine6800ce2013-03-04 17:25:57 -0800341 // Step 1. Check if we can connect, before we acquire the service lock.
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700342 status_t validateConnect(int cameraId,
Igor Murashkine6800ce2013-03-04 17:25:57 -0800343 /*inout*/
344 int& clientUid) const;
345
346 // Step 2. Check if we can connect, after we acquire the service lock.
347 bool canConnectUnsafe(int cameraId,
348 const String16& clientPackageName,
349 const sp<IBinder>& remoteCallback,
350 /*out*/
Igor Murashkine7ee7632013-06-11 18:10:18 -0700351 sp<BasicClient> &client);
Igor Murashkine6800ce2013-03-04 17:25:57 -0800352
353 // When connection is successful, initialize client and track its death
Ruben Brunk0f61d8f2013-08-08 13:07:18 -0700354 status_t connectFinishUnsafe(const sp<BasicClient>& client,
Igor Murashkine7ee7632013-06-11 18:10:18 -0700355 const sp<IBinder>& remoteCallback);
Igor Murashkine6800ce2013-03-04 17:25:57 -0800356
Igor Murashkin634a5152013-02-20 17:15:11 -0800357 virtual sp<BasicClient> getClientByRemote(const wp<IBinder>& cameraClient);
358
Mathias Agopian65ab4712010-07-14 17:59:35 -0700359 Mutex mServiceLock;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700360 // either a Client or CameraDeviceClient
361 wp<BasicClient> mClient[MAX_CAMERAS]; // protected by mServiceLock
Keun young Parkd8973a72012-03-28 14:13:09 -0700362 Mutex mClientLock[MAX_CAMERAS]; // prevent Client destruction inside callbacks
Mathias Agopian65ab4712010-07-14 17:59:35 -0700363 int mNumberOfCameras;
364
Igor Murashkin634a5152013-02-20 17:15:11 -0800365 typedef wp<ProClient> weak_pro_client_ptr;
366 Vector<weak_pro_client_ptr> mProClientList[MAX_CAMERAS];
367
Igor Murashkinecf17e82012-10-02 16:05:11 -0700368 // needs to be called with mServiceLock held
Igor Murashkine7ee7632013-06-11 18:10:18 -0700369 sp<BasicClient> findClientUnsafe(const wp<IBinder>& cameraClient, int& outIndex);
Igor Murashkin634a5152013-02-20 17:15:11 -0800370 sp<ProClient> findProClientUnsafe(
371 const wp<IBinder>& cameraCallbacksRemote);
Igor Murashkinecf17e82012-10-02 16:05:11 -0700372
Mathias Agopian65ab4712010-07-14 17:59:35 -0700373 // atomics to record whether the hardware is allocated to some client.
374 volatile int32_t mBusy[MAX_CAMERAS];
375 void setCameraBusy(int cameraId);
376 void setCameraFree(int cameraId);
377
378 // sounds
Chih-Chung Changff4f55c2011-10-17 19:03:12 +0800379 MediaPlayer* newMediaPlayer(const char *file);
380
Mathias Agopian65ab4712010-07-14 17:59:35 -0700381 Mutex mSoundLock;
382 sp<MediaPlayer> mSoundPlayer[NUM_SOUNDS];
383 int mSoundRef; // reference count (release all MediaPlayer when 0)
384
Iliyan Malchev8951a972011-04-14 16:55:59 -0700385 camera_module_t *mModule;
Igor Murashkinecf17e82012-10-02 16:05:11 -0700386
Igor Murashkinbfc99152013-02-27 12:55:20 -0800387 Vector<sp<ICameraServiceListener> >
388 mListenerList;
389
390 // guard only mStatusList and the broadcasting of ICameraServiceListener
Igor Murashkincba2c162013-03-20 15:56:31 -0700391 mutable Mutex mStatusMutex;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800392 ICameraServiceListener::Status
393 mStatusList[MAX_CAMERAS];
394
Igor Murashkincba2c162013-03-20 15:56:31 -0700395 // Read the current status (locks mStatusMutex)
396 ICameraServiceListener::Status
397 getStatus(int cameraId) const;
398
Igor Murashkin93747b92013-05-01 15:42:20 -0700399 typedef Vector<ICameraServiceListener::Status> StatusVector;
Igor Murashkinbfc99152013-02-27 12:55:20 -0800400 // Broadcast the new status if it changed (locks the service mutex)
401 void updateStatus(
402 ICameraServiceListener::Status status,
Igor Murashkin93747b92013-05-01 15:42:20 -0700403 int32_t cameraId,
404 const StatusVector *rejectSourceStates = NULL);
Igor Murashkinbfc99152013-02-27 12:55:20 -0800405
Igor Murashkinecf17e82012-10-02 16:05:11 -0700406 // IBinder::DeathRecipient implementation
Igor Murashkinbfc99152013-02-27 12:55:20 -0800407 virtual void binderDied(const wp<IBinder> &who);
Igor Murashkin634a5152013-02-20 17:15:11 -0800408
409 // Helpers
Igor Murashkinbfc99152013-02-27 12:55:20 -0800410
411 bool isValidCameraId(int cameraId);
Ruben Brunkd1176ef2014-02-21 10:51:38 -0800412
413 bool setUpVendorTags();
Ruben Brunkb2119af2014-05-09 19:57:56 -0700414
415 /**
416 * A mapping of camera ids to CameraParameters returned by that camera device.
417 *
418 * This cache is used to generate CameraCharacteristic metadata when using
419 * the HAL1 shim.
420 */
421 KeyedVector<int, CameraParameters> mShimParams;
422
423 /**
424 * Initialize and cache the metadata used by the HAL1 shim for a given cameraId.
425 *
426 * Returns OK on success, or a negative error code.
427 */
428 status_t initializeShimMetadata(int cameraId);
429
430 /**
Igor Murashkin65d14b92014-06-17 12:03:20 -0700431 * Get the cached CameraParameters for the camera. If they haven't been
432 * cached yet, then initialize them for the first time.
433 *
434 * Returns OK on success, or a negative error code.
435 */
436 status_t getLegacyParametersLazy(int cameraId, /*out*/CameraParameters* parameters);
437
438 /**
Ruben Brunkb2119af2014-05-09 19:57:56 -0700439 * Generate the CameraCharacteristics metadata required by the Camera2 API
440 * from the available HAL1 CameraParameters and CameraInfo.
441 *
442 * Returns OK on success, or a negative error code.
443 */
444 status_t generateShimMetadata(int cameraId, /*out*/CameraMetadata* cameraInfo);
445
446 /**
447 * Connect a new camera client. This should only be used while holding the
448 * mutex for mServiceLock.
449 *
450 * Returns OK on success, or a negative error code.
451 */
452 status_t connectHelperLocked(const sp<ICameraClient>& cameraClient,
453 int cameraId,
454 const String16& clientPackageName,
455 int clientUid,
456 int callingPid,
457 /*out*/
Zhijun Heb10cdad2014-06-16 16:38:35 -0700458 sp<Client>& client,
459 int halVersion = CAMERA_HAL_API_VERSION_UNSPECIFIED);
Mathias Agopian65ab4712010-07-14 17:59:35 -0700460};
461
462} // namespace android
463
464#endif