blob: 887bf1ee5045950375144c668b1db5acc655bf12 [file] [log] [blame]
Igor Murashkin44cfcf02013-03-01 16:22:28 -08001/*
2 * Copyright (C) 2013 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 */
16
17#define LOG_TAG "Camera2ClientBase"
18#define ATRACE_TAG ATRACE_TAG_CAMERA
19//#define LOG_NDEBUG 0
20
Colin Crosse5729fa2014-03-21 15:04:25 -070021#include <inttypes.h>
22
Igor Murashkin44cfcf02013-03-01 16:22:28 -080023#include <utils/Log.h>
24#include <utils/Trace.h>
25
26#include <cutils/properties.h>
27#include <gui/Surface.h>
28#include <gui/Surface.h>
Igor Murashkin44cfcf02013-03-01 16:22:28 -080029
Shuzhen Wang316781a2020-08-18 18:11:01 -070030#include <camera/CameraSessionStats.h>
31
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070032#include "common/Camera2ClientBase.h"
Igor Murashkine7ee7632013-06-11 18:10:18 -070033
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070034#include "api2/CameraDeviceClient.h"
35
Eino-Ville Talvalad309fb92015-11-25 12:12:45 -080036#include "device3/Camera3Device.h"
Jayant Chowdhary12361932018-08-27 14:46:13 -070037#include "utils/CameraThreadState.h"
Shuzhen Wang316781a2020-08-18 18:11:01 -070038#include "utils/CameraServiceProxyWrapper.h"
Igor Murashkin44cfcf02013-03-01 16:22:28 -080039
40namespace android {
41using namespace camera2;
42
Igor Murashkin44cfcf02013-03-01 16:22:28 -080043// Interface used by CameraService
44
45template <typename TClientBase>
46Camera2ClientBase<TClientBase>::Camera2ClientBase(
47 const sp<CameraService>& cameraService,
48 const sp<TCamCallbacks>& remoteCallback,
49 const String16& clientPackageName,
Jooyung Han3f9a3b42020-01-23 12:27:18 +090050 const std::optional<String16>& clientFeatureId,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080051 const String8& cameraId,
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -080052 int api1CameraId,
Igor Murashkin44cfcf02013-03-01 16:22:28 -080053 int cameraFacing,
Emilian Peev8b64f282021-03-25 16:49:57 -070054 int sensorOrientation,
Igor Murashkin44cfcf02013-03-01 16:22:28 -080055 int clientPid,
56 uid_t clientUid,
Shuzhen Wangd4abdf72021-05-28 11:22:50 -070057 int servicePid,
58 bool overrideForPerfClass):
Philip P. Moltmann9e648f62019-11-04 12:52:45 -080059 TClientBase(cameraService, remoteCallback, clientPackageName, clientFeatureId,
Emilian Peev8b64f282021-03-25 16:49:57 -070060 cameraId, api1CameraId, cameraFacing, sensorOrientation, clientPid, clientUid,
61 servicePid),
Yin-Chia Yehcd8fce82014-06-18 10:51:34 -070062 mSharedCameraCallbacks(remoteCallback),
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080063 mDeviceVersion(cameraService->getDeviceVersion(TClientBase::mCameraIdStr)),
Shuzhen Wangd4abdf72021-05-28 11:22:50 -070064 mDevice(new Camera3Device(cameraId, overrideForPerfClass)),
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -080065 mDeviceActive(false), mApi1CameraId(api1CameraId)
Igor Murashkin44cfcf02013-03-01 16:22:28 -080066{
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080067 ALOGI("Camera %s: Opened. Client: %s (PID %d, UID %d)", cameraId.string(),
Eino-Ville Talvalab9d2f332014-09-18 17:24:22 -070068 String8(clientPackageName).string(), clientPid, clientUid);
Igor Murashkin98e24722013-06-19 19:51:04 -070069
Eino-Ville Talvalab9d2f332014-09-18 17:24:22 -070070 mInitialClientPid = clientPid;
Igor Murashkin98e24722013-06-19 19:51:04 -070071 LOG_ALWAYS_FATAL_IF(mDevice == 0, "Device should never be NULL here.");
Igor Murashkin44cfcf02013-03-01 16:22:28 -080072}
73
74template <typename TClientBase>
75status_t Camera2ClientBase<TClientBase>::checkPid(const char* checkLocation)
76 const {
77
Jayant Chowdhary12361932018-08-27 14:46:13 -070078 int callingPid = CameraThreadState::getCallingPid();
Igor Murashkin44cfcf02013-03-01 16:22:28 -080079 if (callingPid == TClientBase::mClientPid) return NO_ERROR;
80
81 ALOGE("%s: attempt to use a locked camera from a different process"
82 " (old pid %d, new pid %d)", checkLocation, TClientBase::mClientPid, callingPid);
83 return PERMISSION_DENIED;
84}
85
86template <typename TClientBase>
Emilian Peevbd8c5032018-02-14 23:05:40 +000087status_t Camera2ClientBase<TClientBase>::initialize(sp<CameraProviderManager> manager,
88 const String8& monitorTags) {
89 return initializeImpl(manager, monitorTags);
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080090}
91
92template <typename TClientBase>
93template <typename TProviderPtr>
Emilian Peevbd8c5032018-02-14 23:05:40 +000094status_t Camera2ClientBase<TClientBase>::initializeImpl(TProviderPtr providerPtr,
95 const String8& monitorTags) {
Igor Murashkin44cfcf02013-03-01 16:22:28 -080096 ATRACE_CALL();
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -080097 ALOGV("%s: Initializing client for camera %s", __FUNCTION__,
98 TClientBase::mCameraIdStr.string());
Igor Murashkin44cfcf02013-03-01 16:22:28 -080099 status_t res;
100
Igor Murashkine6800ce2013-03-04 17:25:57 -0800101 // Verify ops permissions
102 res = TClientBase::startCameraOps();
103 if (res != OK) {
104 return res;
105 }
106
107 if (mDevice == NULL) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800108 ALOGE("%s: Camera %s: No device connected",
109 __FUNCTION__, TClientBase::mCameraIdStr.string());
Igor Murashkine6800ce2013-03-04 17:25:57 -0800110 return NO_INIT;
111 }
112
Emilian Peevbd8c5032018-02-14 23:05:40 +0000113 res = mDevice->initialize(providerPtr, monitorTags);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800114 if (res != OK) {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800115 ALOGE("%s: Camera %s: unable to initialize device: %s (%d)",
116 __FUNCTION__, TClientBase::mCameraIdStr.string(), strerror(-res), res);
Zhijun He66281c32013-09-13 17:59:59 -0700117 return res;
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800118 }
119
Yin-Chia Yeh5fd603e2019-11-20 11:22:27 -0800120 wp<NotificationListener> weakThis(this);
Yin-Chia Yehe1c80632016-08-08 14:48:05 -0700121 res = mDevice->setNotifyCallback(weakThis);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800122
123 return OK;
124}
125
126template <typename TClientBase>
127Camera2ClientBase<TClientBase>::~Camera2ClientBase() {
128 ATRACE_CALL();
129
130 TClientBase::mDestructionStarted = true;
131
132 disconnect();
133
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800134 ALOGI("Closed Camera %s. Client was: %s (PID %d, UID %u)",
135 TClientBase::mCameraIdStr.string(),
Svetoslav Ganov280405a2015-05-12 02:19:27 +0000136 String8(TClientBase::mClientPackageName).string(),
Eino-Ville Talvalab9d2f332014-09-18 17:24:22 -0700137 mInitialClientPid, TClientBase::mClientUid);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800138}
139
140template <typename TClientBase>
Eino-Ville Talvalac4003962016-01-13 10:07:04 -0800141status_t Camera2ClientBase<TClientBase>::dumpClient(int fd,
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800142 const Vector<String16>& args) {
143 String8 result;
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800144 result.appendFormat("Camera2ClientBase[%s] (%p) PID: %d, dump:\n",
145 TClientBase::mCameraIdStr.string(),
Eino-Ville Talvalae992e752014-11-07 16:17:48 -0800146 (TClientBase::getRemoteCallback() != NULL ?
Marco Nelissen06b46062014-11-14 07:58:25 -0800147 IInterface::asBinder(TClientBase::getRemoteCallback()).get() : NULL),
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800148 TClientBase::mClientPid);
149 result.append(" State: ");
150
151 write(fd, result.string(), result.size());
152 // TODO: print dynamic/request section from most recent requests
153
154 return dumpDevice(fd, args);
155}
156
157template <typename TClientBase>
158status_t Camera2ClientBase<TClientBase>::dumpDevice(
159 int fd,
160 const Vector<String16>& args) {
161 String8 result;
162
163 result = " Device dump:\n";
164 write(fd, result.string(), result.size());
165
Yin-Chia Yehe5138f12017-11-10 14:10:05 -0800166 sp<CameraDeviceBase> device = mDevice;
167 if (!device.get()) {
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800168 result = " *** Device is detached\n";
169 write(fd, result.string(), result.size());
170 return NO_ERROR;
171 }
172
Yin-Chia Yehe5138f12017-11-10 14:10:05 -0800173 status_t res = device->dump(fd, args);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800174 if (res != OK) {
175 result = String8::format(" Error dumping device: %s (%d)",
176 strerror(-res), res);
177 write(fd, result.string(), result.size());
178 }
179
180 return NO_ERROR;
181}
182
183// ICameraClient2BaseUser interface
184
185
186template <typename TClientBase>
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800187binder::Status Camera2ClientBase<TClientBase>::disconnect() {
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800188 ATRACE_CALL();
189 Mutex::Autolock icl(mBinderSerializationLock);
190
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800191 binder::Status res = binder::Status::ok();
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800192 // Allow both client and the media server to disconnect at all times
Jayant Chowdhary12361932018-08-27 14:46:13 -0700193 int callingPid = CameraThreadState::getCallingPid();
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800194 if (callingPid != TClientBase::mClientPid &&
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800195 callingPid != TClientBase::mServicePid) return res;
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800196
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800197 ALOGV("Camera %s: Shutting down", TClientBase::mCameraIdStr.string());
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800198
Rucha Katakwar30dd3ee2021-05-19 16:03:39 -0700199 // Before detaching the device, cache the info from current open session
200 Camera2ClientBase::getCameraService()->cacheDump();
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800201 detachDevice();
202
Igor Murashkine6800ce2013-03-04 17:25:57 -0800203 CameraService::BasicClient::disconnect();
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800204
Shuzhen Wang316781a2020-08-18 18:11:01 -0700205 ALOGV("Camera %s: Shut down complete", TClientBase::mCameraIdStr.string());
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800206
207 return res;
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800208}
209
210template <typename TClientBase>
211void Camera2ClientBase<TClientBase>::detachDevice() {
212 if (mDevice == 0) return;
213 mDevice->disconnect();
214
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800215 ALOGV("Camera %s: Detach complete", TClientBase::mCameraIdStr.string());
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800216}
217
218template <typename TClientBase>
219status_t Camera2ClientBase<TClientBase>::connect(
220 const sp<TCamCallbacks>& client) {
221 ATRACE_CALL();
222 ALOGV("%s: E", __FUNCTION__);
223 Mutex::Autolock icl(mBinderSerializationLock);
224
225 if (TClientBase::mClientPid != 0 &&
Jayant Chowdhary12361932018-08-27 14:46:13 -0700226 CameraThreadState::getCallingPid() != TClientBase::mClientPid) {
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800227
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800228 ALOGE("%s: Camera %s: Connection attempt from pid %d; "
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800229 "current locked to pid %d",
230 __FUNCTION__,
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800231 TClientBase::mCameraIdStr.string(),
Jayant Chowdhary12361932018-08-27 14:46:13 -0700232 CameraThreadState::getCallingPid(),
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800233 TClientBase::mClientPid);
234 return BAD_VALUE;
235 }
236
Jayant Chowdhary12361932018-08-27 14:46:13 -0700237 TClientBase::mClientPid = CameraThreadState::getCallingPid();
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800238
239 TClientBase::mRemoteCallback = client;
240 mSharedCameraCallbacks = client;
241
242 return OK;
243}
244
245/** Device-related methods */
246
247template <typename TClientBase>
Jianing Weicb0652e2014-03-12 18:29:36 -0700248void Camera2ClientBase<TClientBase>::notifyError(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800249 int32_t errorCode,
Jianing Weicb0652e2014-03-12 18:29:36 -0700250 const CaptureResultExtras& resultExtras) {
251 ALOGE("Error condition %d reported by HAL, requestId %" PRId32, errorCode,
252 resultExtras.requestId);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800253}
254
255template <typename TClientBase>
Eino-Ville Talvala178e8232021-04-16 18:41:39 -0700256status_t Camera2ClientBase<TClientBase>::notifyActive() {
257 if (!mDeviceActive) {
258 status_t res = TClientBase::startCameraStreamingOps();
259 if (res != OK) {
260 ALOGE("%s: Camera %s: Error starting camera streaming ops: %d", __FUNCTION__,
261 TClientBase::mCameraIdStr.string(), res);
262 return res;
263 }
264 CameraServiceProxyWrapper::logActive(TClientBase::mCameraIdStr);
265 }
266 mDeviceActive = true;
267
268 ALOGV("Camera device is now active");
269 return OK;
270}
271
272template <typename TClientBase>
Shuzhen Wang316781a2020-08-18 18:11:01 -0700273void Camera2ClientBase<TClientBase>::notifyIdle(
274 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
275 const std::vector<hardware::CameraStreamStats>& streamStats) {
Eino-Ville Talvala412fe562015-08-20 17:08:32 -0700276 if (mDeviceActive) {
Eino-Ville Talvala178e8232021-04-16 18:41:39 -0700277 status_t res = TClientBase::finishCameraStreamingOps();
278 if (res != OK) {
279 ALOGE("%s: Camera %s: Error finishing streaming ops: %d", __FUNCTION__,
280 TClientBase::mCameraIdStr.string(), res);
281 }
Shuzhen Wang316781a2020-08-18 18:11:01 -0700282 CameraServiceProxyWrapper::logIdle(TClientBase::mCameraIdStr,
283 requestCount, resultErrorCount, deviceError, streamStats);
Eino-Ville Talvala412fe562015-08-20 17:08:32 -0700284 }
285 mDeviceActive = false;
286
Eino-Ville Talvalaf1e98d82013-09-06 09:32:43 -0700287 ALOGV("Camera device is now idle");
288}
289
290template <typename TClientBase>
Jianing Weicb0652e2014-03-12 18:29:36 -0700291void Camera2ClientBase<TClientBase>::notifyShutter(const CaptureResultExtras& resultExtras,
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800292 nsecs_t timestamp) {
Jianing Weicb0652e2014-03-12 18:29:36 -0700293 (void)resultExtras;
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800294 (void)timestamp;
295
Jianing Weicb0652e2014-03-12 18:29:36 -0700296 ALOGV("%s: Shutter notification for request id %" PRId32 " at time %" PRId64,
297 __FUNCTION__, resultExtras.requestId, timestamp);
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800298}
299
300template <typename TClientBase>
301void Camera2ClientBase<TClientBase>::notifyAutoFocus(uint8_t newState,
302 int triggerId) {
303 (void)newState;
304 (void)triggerId;
305
306 ALOGV("%s: Autofocus state now %d, last trigger %d",
307 __FUNCTION__, newState, triggerId);
308
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800309}
310
311template <typename TClientBase>
312void Camera2ClientBase<TClientBase>::notifyAutoExposure(uint8_t newState,
313 int triggerId) {
314 (void)newState;
315 (void)triggerId;
316
317 ALOGV("%s: Autoexposure state now %d, last trigger %d",
318 __FUNCTION__, newState, triggerId);
319}
320
321template <typename TClientBase>
322void Camera2ClientBase<TClientBase>::notifyAutoWhitebalance(uint8_t newState,
323 int triggerId) {
324 (void)newState;
325 (void)triggerId;
326
327 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
328 __FUNCTION__, newState, triggerId);
329}
330
331template <typename TClientBase>
Eino-Ville Talvala4d44cad2015-04-11 13:15:45 -0700332void Camera2ClientBase<TClientBase>::notifyPrepared(int streamId) {
333 (void)streamId;
334
335 ALOGV("%s: Stream %d now prepared",
336 __FUNCTION__, streamId);
337}
338
339template <typename TClientBase>
Shuzhen Wang9d066012016-09-30 11:30:20 -0700340void Camera2ClientBase<TClientBase>::notifyRequestQueueEmpty() {
341
342 ALOGV("%s: Request queue now empty", __FUNCTION__);
343}
344
345template <typename TClientBase>
Chien-Yu Chene8c535e2016-04-14 12:18:26 -0700346void Camera2ClientBase<TClientBase>::notifyRepeatingRequestError(long lastFrameNumber) {
347 (void)lastFrameNumber;
348
349 ALOGV("%s: Repeating request was stopped. Last frame number is %ld",
350 __FUNCTION__, lastFrameNumber);
351}
352
353template <typename TClientBase>
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800354int Camera2ClientBase<TClientBase>::getCameraId() const {
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800355 return mApi1CameraId;
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800356}
357
358template <typename TClientBase>
Yin-Chia Yehcd8fce82014-06-18 10:51:34 -0700359int Camera2ClientBase<TClientBase>::getCameraDeviceVersion() const {
360 return mDeviceVersion;
361}
362
363template <typename TClientBase>
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800364const sp<CameraDeviceBase>& Camera2ClientBase<TClientBase>::getCameraDevice() {
365 return mDevice;
366}
367
368template <typename TClientBase>
369const sp<CameraService>& Camera2ClientBase<TClientBase>::getCameraService() {
Eino-Ville Talvala2f09bac2016-12-13 11:29:54 -0800370 return TClientBase::sCameraService;
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800371}
372
373template <typename TClientBase>
374Camera2ClientBase<TClientBase>::SharedCameraCallbacks::Lock::Lock(
375 SharedCameraCallbacks &client) :
376
377 mRemoteCallback(client.mRemoteCallback),
378 mSharedClient(client) {
379
380 mSharedClient.mRemoteCallbackLock.lock();
381}
382
383template <typename TClientBase>
384Camera2ClientBase<TClientBase>::SharedCameraCallbacks::Lock::~Lock() {
385 mSharedClient.mRemoteCallbackLock.unlock();
386}
387
388template <typename TClientBase>
389Camera2ClientBase<TClientBase>::SharedCameraCallbacks::SharedCameraCallbacks(
390 const sp<TCamCallbacks>&client) :
391
392 mRemoteCallback(client) {
393}
394
395template <typename TClientBase>
396typename Camera2ClientBase<TClientBase>::SharedCameraCallbacks&
397Camera2ClientBase<TClientBase>::SharedCameraCallbacks::operator=(
398 const sp<TCamCallbacks>&client) {
399
400 Mutex::Autolock l(mRemoteCallbackLock);
401 mRemoteCallback = client;
402 return *this;
403}
404
405template <typename TClientBase>
406void Camera2ClientBase<TClientBase>::SharedCameraCallbacks::clear() {
407 Mutex::Autolock l(mRemoteCallbackLock);
408 mRemoteCallback.clear();
409}
410
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800411template class Camera2ClientBase<CameraService::Client>;
Igor Murashkine7ee7632013-06-11 18:10:18 -0700412template class Camera2ClientBase<CameraDeviceClientBase>;
Igor Murashkin44cfcf02013-03-01 16:22:28 -0800413
414} // namespace android