blob: af5f3ee5247c4659c026381044a7a9c6293bc05b [file] [log] [blame]
Shuzhen Wang316781a2020-08-18 18:11:01 -07001/*
2 * Copyright (C) 2020 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 "CameraServiceProxyWrapper"
18#define ATRACE_TAG ATRACE_TAG_CAMERA
19//#define LOG_NDEBUG 0
20
21#include <inttypes.h>
22#include <utils/Log.h>
23#include <binder/IServiceManager.h>
24
25#include "CameraServiceProxyWrapper.h"
26
27namespace android {
28
29using hardware::ICameraServiceProxy;
30using hardware::CameraSessionStats;
31
Shuzhen Wang316781a2020-08-18 18:11:01 -070032/**
33 * CameraSessionStatsWrapper functions
34 */
35
Austin Borger74fca042022-05-23 12:41:21 -070036void CameraServiceProxyWrapper::CameraSessionStatsWrapper::updateProxyDeviceState(
37 sp<hardware::ICameraServiceProxy>& proxyBinder) {
38 if (proxyBinder == nullptr) return;
39 proxyBinder->notifyCameraState(mSessionStats);
Shuzhen Wang316781a2020-08-18 18:11:01 -070040}
41
Austin Borger74fca042022-05-23 12:41:21 -070042void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onOpen(
43 sp<hardware::ICameraServiceProxy>& proxyBinder) {
44 Mutex::Autolock l(mLock);
45 updateProxyDeviceState(proxyBinder);
46}
47
48void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onClose(
Shuzhen Wang03fe6232023-02-05 12:41:15 -080049 sp<hardware::ICameraServiceProxy>& proxyBinder, int32_t latencyMs,
50 bool deviceError) {
Shuzhen Wang316781a2020-08-18 18:11:01 -070051 Mutex::Autolock l(mLock);
52
53 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_CLOSED;
54 mSessionStats.mLatencyMs = latencyMs;
Shuzhen Wang03fe6232023-02-05 12:41:15 -080055 mSessionStats.mDeviceError = deviceError;
Avichal Rakesh89691e12023-05-01 19:41:02 -070056 mSessionStats.mSessionIndex = 0;
Austin Borger74fca042022-05-23 12:41:21 -070057 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070058}
59
60void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onStreamConfigured(
61 int operatingMode, bool internalReconfig, int32_t latencyMs) {
62 Mutex::Autolock l(mLock);
63
64 if (internalReconfig) {
65 mSessionStats.mInternalReconfigure++;
66 } else {
67 mSessionStats.mLatencyMs = latencyMs;
68 mSessionStats.mSessionType = operatingMode;
69 }
70}
71
Austin Borger74fca042022-05-23 12:41:21 -070072void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onActive(
73 sp<hardware::ICameraServiceProxy>& proxyBinder, float maxPreviewFps) {
Shuzhen Wang316781a2020-08-18 18:11:01 -070074 Mutex::Autolock l(mLock);
75
76 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_ACTIVE;
Austin Borger4a870a32022-02-25 01:48:41 +000077 mSessionStats.mMaxPreviewFps = maxPreviewFps;
Avichal Rakesh89691e12023-05-01 19:41:02 -070078 mSessionStats.mSessionIndex++;
Austin Borger74fca042022-05-23 12:41:21 -070079 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070080
81 // Reset mCreationDuration to -1 to distinguish between 1st session
82 // after configuration, and all other sessions after configuration.
83 mSessionStats.mLatencyMs = -1;
84}
85
86void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onIdle(
Austin Borger74fca042022-05-23 12:41:21 -070087 sp<hardware::ICameraServiceProxy>& proxyBinder,
Shuzhen Wang316781a2020-08-18 18:11:01 -070088 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
Shuzhen Wang9372b0b2022-05-11 18:55:19 -070089 const std::string& userTag, int32_t videoStabilizationMode,
Shuzhen Wang316781a2020-08-18 18:11:01 -070090 const std::vector<hardware::CameraStreamStats>& streamStats) {
91 Mutex::Autolock l(mLock);
92
93 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_IDLE;
94 mSessionStats.mRequestCount = requestCount;
95 mSessionStats.mResultErrorCount = resultErrorCount;
96 mSessionStats.mDeviceError = deviceError;
Shuzhen Wangd26b1862022-03-07 12:05:05 -080097 mSessionStats.mUserTag = String16(userTag.c_str());
Shuzhen Wang9372b0b2022-05-11 18:55:19 -070098 mSessionStats.mVideoStabilizationMode = videoStabilizationMode;
Shuzhen Wang316781a2020-08-18 18:11:01 -070099 mSessionStats.mStreamStats = streamStats;
Austin Borger74fca042022-05-23 12:41:21 -0700100 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700101
102 mSessionStats.mInternalReconfigure = 0;
103 mSessionStats.mStreamStats.clear();
104}
105
Avichal Rakesh1fff2d12023-03-03 15:05:48 -0800106int64_t CameraServiceProxyWrapper::CameraSessionStatsWrapper::getLogId() {
107 Mutex::Autolock l(mLock);
108 return mSessionStats.mLogId;
109}
110
Shuzhen Wang316781a2020-08-18 18:11:01 -0700111/**
112 * CameraServiceProxyWrapper functions
113 */
114
115sp<ICameraServiceProxy> CameraServiceProxyWrapper::getCameraServiceProxy() {
116#ifndef __BRILLO__
Austin Borger74fca042022-05-23 12:41:21 -0700117 Mutex::Autolock al(mProxyMutex);
118 if (mCameraServiceProxy == nullptr) {
119 mCameraServiceProxy = getDefaultCameraServiceProxy();
Shuzhen Wang316781a2020-08-18 18:11:01 -0700120 }
121#endif
Austin Borger74fca042022-05-23 12:41:21 -0700122 return mCameraServiceProxy;
123}
124
125sp<hardware::ICameraServiceProxy> CameraServiceProxyWrapper::getDefaultCameraServiceProxy() {
126#ifndef __BRILLO__
127 sp<IServiceManager> sm = defaultServiceManager();
128 // Use checkService because cameraserver normally starts before the
129 // system server and the proxy service. So the long timeout that getService
130 // has before giving up is inappropriate.
131 sp<IBinder> binder = sm->checkService(String16("media.camera.proxy"));
132 if (binder != nullptr) {
133 return interface_cast<ICameraServiceProxy>(binder);
134 }
135#endif
136 return nullptr;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700137}
138
139void CameraServiceProxyWrapper::pingCameraServiceProxy() {
140 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
141 if (proxyBinder == nullptr) return;
142 proxyBinder->pingForUserUpdate();
143}
144
Emilian Peev065b2c12021-11-23 13:12:57 -0800145int CameraServiceProxyWrapper::getRotateAndCropOverride(String16 packageName, int lensFacing,
146 int userId) {
Emilian Peevb91f1802021-03-23 14:50:28 -0700147 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
148 if (proxyBinder == nullptr) return true;
Emilian Peev5368ebf2021-10-08 17:52:18 -0700149 int ret = 0;
Emilian Peev065b2c12021-11-23 13:12:57 -0800150 auto status = proxyBinder->getRotateAndCropOverride(packageName, lensFacing, userId, &ret);
Emilian Peevb91f1802021-03-23 14:50:28 -0700151 if (!status.isOk()) {
152 ALOGE("%s: Failed during top activity orientation query: %s", __FUNCTION__,
153 status.exceptionMessage().c_str());
154 }
155
156 return ret;
157}
158
Bharatt Kukreja7146ced2022-10-25 15:45:29 +0000159int CameraServiceProxyWrapper::getAutoframingOverride(const String16& packageName) {
160 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
161 if (proxyBinder == nullptr) {
162 return ANDROID_CONTROL_AUTOFRAMING_OFF;
163 }
164 int ret = 0;
165 auto status = proxyBinder->getAutoframingOverride(packageName, &ret);
166 if (!status.isOk()) {
167 ALOGE("%s: Failed during autoframing override query: %s", __FUNCTION__,
168 status.exceptionMessage().c_str());
169 }
170
171 return ret;
172}
173
Shuzhen Wang316781a2020-08-18 18:11:01 -0700174void CameraServiceProxyWrapper::logStreamConfigured(const String8& id,
175 int operatingMode, bool internalConfig, int32_t latencyMs) {
176 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
177 {
178 Mutex::Autolock l(mLock);
179 sessionStats = mSessionStatsMap[id];
180 if (sessionStats == nullptr) {
181 ALOGE("%s: SessionStatsMap should contain camera %s",
182 __FUNCTION__, id.c_str());
183 return;
184 }
185 }
186
187 ALOGV("%s: id %s, operatingMode %d, internalConfig %d, latencyMs %d",
188 __FUNCTION__, id.c_str(), operatingMode, internalConfig, latencyMs);
189 sessionStats->onStreamConfigured(operatingMode, internalConfig, latencyMs);
190}
191
Austin Borger4a870a32022-02-25 01:48:41 +0000192void CameraServiceProxyWrapper::logActive(const String8& id, float maxPreviewFps) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700193 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
194 {
195 Mutex::Autolock l(mLock);
196 sessionStats = mSessionStatsMap[id];
197 if (sessionStats == nullptr) {
198 ALOGE("%s: SessionStatsMap should contain camera %s when logActive is called",
199 __FUNCTION__, id.c_str());
200 return;
201 }
202 }
203
204 ALOGV("%s: id %s", __FUNCTION__, id.c_str());
Austin Borger74fca042022-05-23 12:41:21 -0700205 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
206 sessionStats->onActive(proxyBinder, maxPreviewFps);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700207}
208
209void CameraServiceProxyWrapper::logIdle(const String8& id,
210 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700211 const std::string& userTag, int32_t videoStabilizationMode,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700212 const std::vector<hardware::CameraStreamStats>& streamStats) {
213 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
214 {
215 Mutex::Autolock l(mLock);
216 sessionStats = mSessionStatsMap[id];
217 }
218
219 if (sessionStats == nullptr) {
220 ALOGE("%s: SessionStatsMap should contain camera %s when logIdle is called",
221 __FUNCTION__, id.c_str());
222 return;
223 }
224
Shuzhen Wangd26b1862022-03-07 12:05:05 -0800225 ALOGV("%s: id %s, requestCount %" PRId64 ", resultErrorCount %" PRId64 ", deviceError %d"
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700226 ", userTag %s, videoStabilizationMode %d", __FUNCTION__, id.c_str(), requestCount,
227 resultErrorCount, deviceError, userTag.c_str(), videoStabilizationMode);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700228 for (size_t i = 0; i < streamStats.size(); i++) {
229 ALOGV("%s: streamStats[%zu]: w %d h %d, requestedCount %" PRId64 ", dropCount %"
230 PRId64 ", startTimeMs %d" ,
231 __FUNCTION__, i, streamStats[i].mWidth, streamStats[i].mHeight,
232 streamStats[i].mRequestCount, streamStats[i].mErrorCount,
233 streamStats[i].mStartLatencyMs);
234 }
235
Austin Borger74fca042022-05-23 12:41:21 -0700236 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
237 sessionStats->onIdle(proxyBinder, requestCount, resultErrorCount, deviceError, userTag,
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700238 videoStabilizationMode, streamStats);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700239}
240
241void CameraServiceProxyWrapper::logOpen(const String8& id, int facing,
242 const String16& clientPackageName, int effectiveApiLevel, bool isNdk,
243 int32_t latencyMs) {
244 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
245 {
246 Mutex::Autolock l(mLock);
247 if (mSessionStatsMap.count(id) > 0) {
248 ALOGE("%s: SessionStatsMap shouldn't contain camera %s",
249 __FUNCTION__, id.c_str());
250 return;
251 }
252
253 int apiLevel = CameraSessionStats::CAMERA_API_LEVEL_1;
254 if (effectiveApiLevel == 2) {
255 apiLevel = CameraSessionStats::CAMERA_API_LEVEL_2;
256 }
257
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800258 // Generate a new log ID for open events
259 int64_t logId = generateLogId(mRandomDevice);
260
261 sessionStats = std::make_shared<CameraSessionStatsWrapper>(
262 String16(id), facing, CameraSessionStats::CAMERA_STATE_OPEN, clientPackageName,
263 apiLevel, isNdk, latencyMs, logId);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700264 mSessionStatsMap.emplace(id, sessionStats);
265 ALOGV("%s: Adding id %s", __FUNCTION__, id.c_str());
266 }
267
268 ALOGV("%s: id %s, facing %d, effectiveApiLevel %d, isNdk %d, latencyMs %d",
269 __FUNCTION__, id.c_str(), facing, effectiveApiLevel, isNdk, latencyMs);
Austin Borger74fca042022-05-23 12:41:21 -0700270 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
271 sessionStats->onOpen(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700272}
273
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800274void CameraServiceProxyWrapper::logClose(const String8& id, int32_t latencyMs, bool deviceError) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700275 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
276 {
277 Mutex::Autolock l(mLock);
278 if (mSessionStatsMap.count(id) == 0) {
279 ALOGE("%s: SessionStatsMap should contain camera %s before it's closed",
280 __FUNCTION__, id.c_str());
281 return;
282 }
283
284 sessionStats = mSessionStatsMap[id];
285 if (sessionStats == nullptr) {
286 ALOGE("%s: SessionStatsMap should contain camera %s",
287 __FUNCTION__, id.c_str());
288 return;
289 }
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800290
Shuzhen Wang316781a2020-08-18 18:11:01 -0700291 mSessionStatsMap.erase(id);
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800292 ALOGV("%s: Erasing id %s, deviceError %d", __FUNCTION__, id.c_str(), deviceError);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700293 }
294
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800295 ALOGV("%s: id %s, latencyMs %d, deviceError %d", __FUNCTION__,
296 id.c_str(), latencyMs, deviceError);
Austin Borger74fca042022-05-23 12:41:21 -0700297 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800298 sessionStats->onClose(proxyBinder, latencyMs, deviceError);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700299}
300
Austin Borger9bfa0a72022-08-03 17:50:40 -0700301bool CameraServiceProxyWrapper::isCameraDisabled(int userId) {
Austin Borger5f7abe22022-04-26 15:55:10 -0700302 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
303 if (proxyBinder == nullptr) return true;
304 bool ret = false;
Austin Borger9bfa0a72022-08-03 17:50:40 -0700305 auto status = proxyBinder->isCameraDisabled(userId, &ret);
Austin Borger5f7abe22022-04-26 15:55:10 -0700306 if (!status.isOk()) {
307 ALOGE("%s: Failed during camera disabled query: %s", __FUNCTION__,
308 status.exceptionMessage().c_str());
309 }
310 return ret;
311}
312
Avichal Rakesh1fff2d12023-03-03 15:05:48 -0800313int64_t CameraServiceProxyWrapper::getCurrentLogIdForCamera(const String8& cameraId) {
314 std::shared_ptr<CameraSessionStatsWrapper> stats;
315 {
316 Mutex::Autolock _l(mLock);
317 if (mSessionStatsMap.count(cameraId) == 0) {
318 ALOGE("%s: SessionStatsMap should contain camera %s before asking for its logging ID.",
319 __FUNCTION__, cameraId.c_str());
320 return 0;
321 }
322
323 stats = mSessionStatsMap[cameraId];
324 }
325 return stats->getLogId();
326}
327
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800328int64_t CameraServiceProxyWrapper::generateLogId(std::random_device& randomDevice) {
329 int64_t ret = 0;
330 do {
331 // std::random_device generates 32 bits per call, so we call it twice
332 ret = randomDevice();
333 ret = ret << 32;
334 ret = ret | randomDevice();
335 } while (ret == 0); // 0 is not a valid identifier
336
337 return ret;
338}
339
340} // namespace android