blob: 4afae9b578c4dc952b494353d88b415c3477f100 [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>
Austin Borger1c1bee02023-06-01 16:51:35 -070023#include <utils/String16.h>
24#include <camera/StringUtils.h>
Shuzhen Wang316781a2020-08-18 18:11:01 -070025#include <binder/IServiceManager.h>
26
27#include "CameraServiceProxyWrapper.h"
28
29namespace android {
30
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -070031using hardware::CameraExtensionSessionStats;
Shuzhen Wang316781a2020-08-18 18:11:01 -070032using hardware::CameraSessionStats;
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -070033using hardware::ICameraServiceProxy;
34
35namespace {
36// Sentinel value to be returned when extension session with a stale or invalid key is reported.
Austin Borger1c1bee02023-06-01 16:51:35 -070037const std::string POISON_EXT_STATS_KEY("poisoned_stats");
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -070038} // anonymous namespace
Shuzhen Wang316781a2020-08-18 18:11:01 -070039
Shuzhen Wang316781a2020-08-18 18:11:01 -070040/**
41 * CameraSessionStatsWrapper functions
42 */
43
Austin Borger74fca042022-05-23 12:41:21 -070044void CameraServiceProxyWrapper::CameraSessionStatsWrapper::updateProxyDeviceState(
45 sp<hardware::ICameraServiceProxy>& proxyBinder) {
46 if (proxyBinder == nullptr) return;
47 proxyBinder->notifyCameraState(mSessionStats);
Shuzhen Wang316781a2020-08-18 18:11:01 -070048}
49
Austin Borger74fca042022-05-23 12:41:21 -070050void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onOpen(
51 sp<hardware::ICameraServiceProxy>& proxyBinder) {
52 Mutex::Autolock l(mLock);
53 updateProxyDeviceState(proxyBinder);
54}
55
56void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onClose(
Shuzhen Wang03fe6232023-02-05 12:41:15 -080057 sp<hardware::ICameraServiceProxy>& proxyBinder, int32_t latencyMs,
58 bool deviceError) {
Shuzhen Wang316781a2020-08-18 18:11:01 -070059 Mutex::Autolock l(mLock);
60
61 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_CLOSED;
62 mSessionStats.mLatencyMs = latencyMs;
Shuzhen Wang03fe6232023-02-05 12:41:15 -080063 mSessionStats.mDeviceError = deviceError;
Avichal Rakesh89691e12023-05-01 19:41:02 -070064 mSessionStats.mSessionIndex = 0;
Austin Borger74fca042022-05-23 12:41:21 -070065 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070066}
67
68void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onStreamConfigured(
69 int operatingMode, bool internalReconfig, int32_t latencyMs) {
70 Mutex::Autolock l(mLock);
71
72 if (internalReconfig) {
73 mSessionStats.mInternalReconfigure++;
74 } else {
75 mSessionStats.mLatencyMs = latencyMs;
76 mSessionStats.mSessionType = operatingMode;
77 }
78}
79
Austin Borger74fca042022-05-23 12:41:21 -070080void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onActive(
81 sp<hardware::ICameraServiceProxy>& proxyBinder, float maxPreviewFps) {
Shuzhen Wang316781a2020-08-18 18:11:01 -070082 Mutex::Autolock l(mLock);
83
84 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_ACTIVE;
Austin Borger4a870a32022-02-25 01:48:41 +000085 mSessionStats.mMaxPreviewFps = maxPreviewFps;
Avichal Rakesh89691e12023-05-01 19:41:02 -070086 mSessionStats.mSessionIndex++;
Austin Borger74fca042022-05-23 12:41:21 -070087 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070088
89 // Reset mCreationDuration to -1 to distinguish between 1st session
90 // after configuration, and all other sessions after configuration.
91 mSessionStats.mLatencyMs = -1;
92}
93
94void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onIdle(
Austin Borger74fca042022-05-23 12:41:21 -070095 sp<hardware::ICameraServiceProxy>& proxyBinder,
Shuzhen Wang316781a2020-08-18 18:11:01 -070096 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
Eino-Ville Talvala6f1a9c12023-09-14 17:26:28 -070097 const std::string& userTag, int32_t videoStabilizationMode, bool usedUltraWide,
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -070098 bool usedZoomOverride, std::pair<int32_t, int32_t> mostRequestedFpsRange,
99 const std::vector<hardware::CameraStreamStats>& streamStats) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700100 Mutex::Autolock l(mLock);
101
102 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_IDLE;
103 mSessionStats.mRequestCount = requestCount;
104 mSessionStats.mResultErrorCount = resultErrorCount;
105 mSessionStats.mDeviceError = deviceError;
Austin Borger1c1bee02023-06-01 16:51:35 -0700106 mSessionStats.mUserTag = userTag;
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700107 mSessionStats.mVideoStabilizationMode = videoStabilizationMode;
Eino-Ville Talvala6f1a9c12023-09-14 17:26:28 -0700108 mSessionStats.mUsedUltraWide = usedUltraWide;
Shuzhen Wang6e08d202023-10-24 20:27:14 +0000109 mSessionStats.mUsedZoomOverride = usedZoomOverride;
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700110 mSessionStats.mMostRequestedFpsRange = mostRequestedFpsRange;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700111 mSessionStats.mStreamStats = streamStats;
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700112
Austin Borger74fca042022-05-23 12:41:21 -0700113 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700114
115 mSessionStats.mInternalReconfigure = 0;
116 mSessionStats.mStreamStats.clear();
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700117 mSessionStats.mCameraExtensionSessionStats = {};
Shuzhen Wang316781a2020-08-18 18:11:01 -0700118}
119
Avichal Rakesh1fff2d12023-03-03 15:05:48 -0800120int64_t CameraServiceProxyWrapper::CameraSessionStatsWrapper::getLogId() {
121 Mutex::Autolock l(mLock);
122 return mSessionStats.mLogId;
123}
124
Austin Borger1c1bee02023-06-01 16:51:35 -0700125std::string CameraServiceProxyWrapper::CameraSessionStatsWrapper::updateExtensionSessionStats(
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700126 const hardware::CameraExtensionSessionStats& extStats) {
127 Mutex::Autolock l(mLock);
128 CameraExtensionSessionStats& currStats = mSessionStats.mCameraExtensionSessionStats;
129 if (currStats.key != extStats.key) {
130 // Mismatched keys. Extensions stats likely reported for a closed session
131 ALOGW("%s: mismatched extensions stats key: current='%s' reported='%s'. Dropping stats.",
Austin Borger1c1bee02023-06-01 16:51:35 -0700132 __FUNCTION__, toStdString(currStats.key).c_str(), toStdString(extStats.key).c_str());
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700133 return POISON_EXT_STATS_KEY; // return poisoned key to so future calls are
134 // definitely dropped.
135 }
136
137 // Matching keys...
138 if (currStats.key.size()) {
139 // non-empty matching keys. overwrite.
140 ALOGV("%s: Overwriting extension session stats: %s", __FUNCTION__,
141 extStats.toString().c_str());
142 currStats = extStats;
Austin Borger1c1bee02023-06-01 16:51:35 -0700143 return toStdString(currStats.key);
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700144 }
145
146 // Matching empty keys...
Austin Borger1c1bee02023-06-01 16:51:35 -0700147 if (mSessionStats.mClientName != toStdString(extStats.clientName)) {
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700148 ALOGW("%s: extension stats reported for unexpected package: current='%s' reported='%s'. "
149 "Dropping stats.", __FUNCTION__,
Austin Borger1c1bee02023-06-01 16:51:35 -0700150 mSessionStats.mClientName.c_str(),
151 toStdString(extStats.clientName).c_str());
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700152 return POISON_EXT_STATS_KEY;
153 }
154
155 // Matching empty keys for the current client...
156 if (mSessionStats.mNewCameraState == CameraSessionStats::CAMERA_STATE_OPEN ||
157 mSessionStats.mNewCameraState == CameraSessionStats::CAMERA_STATE_IDLE) {
158 // Camera is open, but not active. It is possible that the active callback hasn't
159 // occurred yet. Keep the stats, but don't associate it with any session.
160 ALOGV("%s: extension stat reported for an open, but not active camera. "
161 "Saving stats, but not generating key.", __FUNCTION__);
162 currStats = extStats;
163 return {}; // Subsequent calls will handle setting the correct key.
164 }
165
166 if (mSessionStats.mNewCameraState == CameraSessionStats::CAMERA_STATE_ACTIVE) {
167 // camera is active. First call for the session!
168 currStats = extStats;
169
170 // Generate a new key from logId and sessionIndex.
171 std::ostringstream key;
172 key << mSessionStats.mSessionIndex << '/' << mSessionStats.mLogId;
173 currStats.key = String16(key.str().c_str());
174 ALOGV("%s: New extension session stats: %s", __FUNCTION__, currStats.toString().c_str());
Austin Borger1c1bee02023-06-01 16:51:35 -0700175 return toStdString(currStats.key);
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700176 }
177
178 // Camera is closed. Probably a stale call.
179 ALOGW("%s: extension stats reported for closed camera id '%s'. Dropping stats.",
Austin Borger1c1bee02023-06-01 16:51:35 -0700180 __FUNCTION__, mSessionStats.mCameraId.c_str());
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700181 return {};
182}
183
Shuzhen Wang316781a2020-08-18 18:11:01 -0700184/**
185 * CameraServiceProxyWrapper functions
186 */
187
188sp<ICameraServiceProxy> CameraServiceProxyWrapper::getCameraServiceProxy() {
189#ifndef __BRILLO__
Austin Borger74fca042022-05-23 12:41:21 -0700190 Mutex::Autolock al(mProxyMutex);
191 if (mCameraServiceProxy == nullptr) {
192 mCameraServiceProxy = getDefaultCameraServiceProxy();
Shuzhen Wang316781a2020-08-18 18:11:01 -0700193 }
194#endif
Austin Borger74fca042022-05-23 12:41:21 -0700195 return mCameraServiceProxy;
196}
197
198sp<hardware::ICameraServiceProxy> CameraServiceProxyWrapper::getDefaultCameraServiceProxy() {
199#ifndef __BRILLO__
200 sp<IServiceManager> sm = defaultServiceManager();
201 // Use checkService because cameraserver normally starts before the
202 // system server and the proxy service. So the long timeout that getService
203 // has before giving up is inappropriate.
204 sp<IBinder> binder = sm->checkService(String16("media.camera.proxy"));
205 if (binder != nullptr) {
206 return interface_cast<ICameraServiceProxy>(binder);
207 }
208#endif
209 return nullptr;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700210}
211
212void CameraServiceProxyWrapper::pingCameraServiceProxy() {
213 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
214 if (proxyBinder == nullptr) return;
215 proxyBinder->pingForUserUpdate();
216}
217
Austin Borger1c1bee02023-06-01 16:51:35 -0700218int CameraServiceProxyWrapper::getRotateAndCropOverride(const std::string &packageName,
219 int lensFacing, int userId) {
Emilian Peevb91f1802021-03-23 14:50:28 -0700220 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
221 if (proxyBinder == nullptr) return true;
Emilian Peev5368ebf2021-10-08 17:52:18 -0700222 int ret = 0;
Austin Borger1c1bee02023-06-01 16:51:35 -0700223 auto status = proxyBinder->getRotateAndCropOverride(packageName, lensFacing,
224 userId, &ret);
Emilian Peevb91f1802021-03-23 14:50:28 -0700225 if (!status.isOk()) {
226 ALOGE("%s: Failed during top activity orientation query: %s", __FUNCTION__,
227 status.exceptionMessage().c_str());
228 }
229
230 return ret;
231}
232
Austin Borger1c1bee02023-06-01 16:51:35 -0700233int CameraServiceProxyWrapper::getAutoframingOverride(const std::string& packageName) {
Bharatt Kukreja7146ced2022-10-25 15:45:29 +0000234 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
235 if (proxyBinder == nullptr) {
236 return ANDROID_CONTROL_AUTOFRAMING_OFF;
237 }
238 int ret = 0;
239 auto status = proxyBinder->getAutoframingOverride(packageName, &ret);
240 if (!status.isOk()) {
241 ALOGE("%s: Failed during autoframing override query: %s", __FUNCTION__,
242 status.exceptionMessage().c_str());
243 }
244
245 return ret;
246}
247
Austin Borger1c1bee02023-06-01 16:51:35 -0700248void CameraServiceProxyWrapper::logStreamConfigured(const std::string& id,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700249 int operatingMode, bool internalConfig, int32_t latencyMs) {
250 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
251 {
252 Mutex::Autolock l(mLock);
Shuzhen Wang25152e42023-06-13 22:18:58 +0000253 if (mSessionStatsMap.count(id) == 0) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700254 ALOGE("%s: SessionStatsMap should contain camera %s",
255 __FUNCTION__, id.c_str());
256 return;
257 }
Shuzhen Wang25152e42023-06-13 22:18:58 +0000258 sessionStats = mSessionStatsMap[id];
Shuzhen Wang316781a2020-08-18 18:11:01 -0700259 }
260
261 ALOGV("%s: id %s, operatingMode %d, internalConfig %d, latencyMs %d",
262 __FUNCTION__, id.c_str(), operatingMode, internalConfig, latencyMs);
263 sessionStats->onStreamConfigured(operatingMode, internalConfig, latencyMs);
264}
265
Austin Borger1c1bee02023-06-01 16:51:35 -0700266void CameraServiceProxyWrapper::logActive(const std::string& id, float maxPreviewFps) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700267 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
268 {
269 Mutex::Autolock l(mLock);
Shuzhen Wang25152e42023-06-13 22:18:58 +0000270 if (mSessionStatsMap.count(id) == 0) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700271 ALOGE("%s: SessionStatsMap should contain camera %s when logActive is called",
272 __FUNCTION__, id.c_str());
273 return;
274 }
Shuzhen Wang25152e42023-06-13 22:18:58 +0000275 sessionStats = mSessionStatsMap[id];
Shuzhen Wang316781a2020-08-18 18:11:01 -0700276 }
277
278 ALOGV("%s: id %s", __FUNCTION__, id.c_str());
Austin Borger74fca042022-05-23 12:41:21 -0700279 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
280 sessionStats->onActive(proxyBinder, maxPreviewFps);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700281}
282
Austin Borger1c1bee02023-06-01 16:51:35 -0700283void CameraServiceProxyWrapper::logIdle(const std::string& id,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700284 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
Eino-Ville Talvala6f1a9c12023-09-14 17:26:28 -0700285 const std::string& userTag, int32_t videoStabilizationMode, bool usedUltraWide,
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700286 bool usedZoomOverride, std::pair<int32_t, int32_t> mostRequestedFpsRange,
287 const std::vector<hardware::CameraStreamStats>& streamStats) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700288 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
289 {
290 Mutex::Autolock l(mLock);
Shuzhen Wang25152e42023-06-13 22:18:58 +0000291 if (mSessionStatsMap.count(id) == 0) {
292 ALOGE("%s: SessionStatsMap should contain camera %s when logIdle is called",
Shuzhen Wang316781a2020-08-18 18:11:01 -0700293 __FUNCTION__, id.c_str());
Shuzhen Wang25152e42023-06-13 22:18:58 +0000294 return;
295 }
296 sessionStats = mSessionStatsMap[id];
Shuzhen Wang316781a2020-08-18 18:11:01 -0700297 }
298
Shuzhen Wangd26b1862022-03-07 12:05:05 -0800299 ALOGV("%s: id %s, requestCount %" PRId64 ", resultErrorCount %" PRId64 ", deviceError %d"
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700300 ", userTag %s, videoStabilizationMode %d, most common FPS [%d,%d]",
301 __FUNCTION__, id.c_str(), requestCount, resultErrorCount, deviceError, userTag.c_str(),
302 videoStabilizationMode, mostRequestedFpsRange.first, mostRequestedFpsRange.second);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700303 for (size_t i = 0; i < streamStats.size(); i++) {
304 ALOGV("%s: streamStats[%zu]: w %d h %d, requestedCount %" PRId64 ", dropCount %"
305 PRId64 ", startTimeMs %d" ,
306 __FUNCTION__, i, streamStats[i].mWidth, streamStats[i].mHeight,
307 streamStats[i].mRequestCount, streamStats[i].mErrorCount,
308 streamStats[i].mStartLatencyMs);
309 }
310
Austin Borger74fca042022-05-23 12:41:21 -0700311 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
312 sessionStats->onIdle(proxyBinder, requestCount, resultErrorCount, deviceError, userTag,
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700313 videoStabilizationMode, usedUltraWide, usedZoomOverride,
314 mostRequestedFpsRange, streamStats);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700315}
316
Austin Borger1c1bee02023-06-01 16:51:35 -0700317void CameraServiceProxyWrapper::logOpen(const std::string& id, int facing,
318 const std::string& clientPackageName, int effectiveApiLevel, bool isNdk,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700319 int32_t latencyMs) {
320 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
321 {
322 Mutex::Autolock l(mLock);
323 if (mSessionStatsMap.count(id) > 0) {
324 ALOGE("%s: SessionStatsMap shouldn't contain camera %s",
325 __FUNCTION__, id.c_str());
326 return;
327 }
328
329 int apiLevel = CameraSessionStats::CAMERA_API_LEVEL_1;
330 if (effectiveApiLevel == 2) {
331 apiLevel = CameraSessionStats::CAMERA_API_LEVEL_2;
332 }
333
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800334 // Generate a new log ID for open events
335 int64_t logId = generateLogId(mRandomDevice);
336
337 sessionStats = std::make_shared<CameraSessionStatsWrapper>(
Austin Borger1c1bee02023-06-01 16:51:35 -0700338 id, facing, CameraSessionStats::CAMERA_STATE_OPEN, clientPackageName,
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800339 apiLevel, isNdk, latencyMs, logId);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700340 mSessionStatsMap.emplace(id, sessionStats);
341 ALOGV("%s: Adding id %s", __FUNCTION__, id.c_str());
342 }
343
344 ALOGV("%s: id %s, facing %d, effectiveApiLevel %d, isNdk %d, latencyMs %d",
345 __FUNCTION__, id.c_str(), facing, effectiveApiLevel, isNdk, latencyMs);
Austin Borger74fca042022-05-23 12:41:21 -0700346 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
347 sessionStats->onOpen(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700348}
349
Austin Borger1c1bee02023-06-01 16:51:35 -0700350void CameraServiceProxyWrapper::logClose(const std::string& id, int32_t latencyMs,
351 bool deviceError) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700352 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
353 {
354 Mutex::Autolock l(mLock);
355 if (mSessionStatsMap.count(id) == 0) {
356 ALOGE("%s: SessionStatsMap should contain camera %s before it's closed",
357 __FUNCTION__, id.c_str());
358 return;
359 }
360
361 sessionStats = mSessionStatsMap[id];
362 if (sessionStats == nullptr) {
363 ALOGE("%s: SessionStatsMap should contain camera %s",
364 __FUNCTION__, id.c_str());
365 return;
366 }
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800367
Shuzhen Wang316781a2020-08-18 18:11:01 -0700368 mSessionStatsMap.erase(id);
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800369 ALOGV("%s: Erasing id %s, deviceError %d", __FUNCTION__, id.c_str(), deviceError);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700370 }
371
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800372 ALOGV("%s: id %s, latencyMs %d, deviceError %d", __FUNCTION__,
373 id.c_str(), latencyMs, deviceError);
Austin Borger74fca042022-05-23 12:41:21 -0700374 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800375 sessionStats->onClose(proxyBinder, latencyMs, deviceError);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700376}
377
Austin Borger9bfa0a72022-08-03 17:50:40 -0700378bool CameraServiceProxyWrapper::isCameraDisabled(int userId) {
Austin Borger5f7abe22022-04-26 15:55:10 -0700379 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
380 if (proxyBinder == nullptr) return true;
381 bool ret = false;
Austin Borger9bfa0a72022-08-03 17:50:40 -0700382 auto status = proxyBinder->isCameraDisabled(userId, &ret);
Austin Borger5f7abe22022-04-26 15:55:10 -0700383 if (!status.isOk()) {
384 ALOGE("%s: Failed during camera disabled query: %s", __FUNCTION__,
385 status.exceptionMessage().c_str());
386 }
387 return ret;
388}
389
Austin Borger1c1bee02023-06-01 16:51:35 -0700390int64_t CameraServiceProxyWrapper::getCurrentLogIdForCamera(const std::string& cameraId) {
Avichal Rakesh1fff2d12023-03-03 15:05:48 -0800391 std::shared_ptr<CameraSessionStatsWrapper> stats;
392 {
393 Mutex::Autolock _l(mLock);
394 if (mSessionStatsMap.count(cameraId) == 0) {
395 ALOGE("%s: SessionStatsMap should contain camera %s before asking for its logging ID.",
396 __FUNCTION__, cameraId.c_str());
397 return 0;
398 }
399
400 stats = mSessionStatsMap[cameraId];
401 }
402 return stats->getLogId();
403}
404
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800405int64_t CameraServiceProxyWrapper::generateLogId(std::random_device& randomDevice) {
406 int64_t ret = 0;
407 do {
408 // std::random_device generates 32 bits per call, so we call it twice
409 ret = randomDevice();
410 ret = ret << 32;
411 ret = ret | randomDevice();
412 } while (ret == 0); // 0 is not a valid identifier
413
414 return ret;
415}
416
Austin Borger1c1bee02023-06-01 16:51:35 -0700417std::string CameraServiceProxyWrapper::updateExtensionStats(
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700418 const hardware::CameraExtensionSessionStats& extStats) {
419 std::shared_ptr<CameraSessionStatsWrapper> stats;
Austin Borger1c1bee02023-06-01 16:51:35 -0700420 std::string cameraId = toStdString(extStats.cameraId);
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700421 {
422 Mutex::Autolock _l(mLock);
423 if (mSessionStatsMap.count(cameraId) == 0) {
424 ALOGE("%s CameraExtensionSessionStats reported for camera id that isn't open: %s",
425 __FUNCTION__, cameraId.c_str());
426 return {};
427 }
428
429 stats = mSessionStatsMap[cameraId];
430 return stats->updateExtensionSessionStats(extStats);
431 }
432}
433
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800434} // namespace android