blob: d5e37909f28f3f91f2b5580fe639c6a29c30da56 [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
Shuzhen Wange3e8e732024-05-22 17:48:01 -070021#include <gui/Surface.h>
Shuzhen Wang316781a2020-08-18 18:11:01 -070022#include <inttypes.h>
23#include <utils/Log.h>
Austin Borger1c1bee02023-06-01 16:51:35 -070024#include <utils/String16.h>
25#include <camera/StringUtils.h>
Shuzhen Wang316781a2020-08-18 18:11:01 -070026#include <binder/IServiceManager.h>
Shuzhen Wange3e8e732024-05-22 17:48:01 -070027#include <system/window.h>
28
29#include "aidl/android/hardware/graphics/common/Dataspace.h"
Shuzhen Wang316781a2020-08-18 18:11:01 -070030
31#include "CameraServiceProxyWrapper.h"
32
33namespace android {
34
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -070035using hardware::CameraExtensionSessionStats;
Shuzhen Wange3e8e732024-05-22 17:48:01 -070036using hardware::CameraFeatureCombinationStats;
Shuzhen Wang316781a2020-08-18 18:11:01 -070037using hardware::CameraSessionStats;
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -070038using hardware::ICameraServiceProxy;
Shuzhen Wange3e8e732024-05-22 17:48:01 -070039using hardware::camera2::params::SessionConfiguration;
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -070040
41namespace {
42// Sentinel value to be returned when extension session with a stale or invalid key is reported.
Austin Borger1c1bee02023-06-01 16:51:35 -070043const std::string POISON_EXT_STATS_KEY("poisoned_stats");
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -070044} // anonymous namespace
Shuzhen Wang316781a2020-08-18 18:11:01 -070045
Shuzhen Wang316781a2020-08-18 18:11:01 -070046/**
47 * CameraSessionStatsWrapper functions
48 */
49
Austin Borger74fca042022-05-23 12:41:21 -070050void CameraServiceProxyWrapper::CameraSessionStatsWrapper::updateProxyDeviceState(
51 sp<hardware::ICameraServiceProxy>& proxyBinder) {
52 if (proxyBinder == nullptr) return;
53 proxyBinder->notifyCameraState(mSessionStats);
Shuzhen Wang316781a2020-08-18 18:11:01 -070054}
55
Austin Borger74fca042022-05-23 12:41:21 -070056void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onOpen(
57 sp<hardware::ICameraServiceProxy>& proxyBinder) {
58 Mutex::Autolock l(mLock);
59 updateProxyDeviceState(proxyBinder);
60}
61
62void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onClose(
Shuzhen Wang03fe6232023-02-05 12:41:15 -080063 sp<hardware::ICameraServiceProxy>& proxyBinder, int32_t latencyMs,
64 bool deviceError) {
Shuzhen Wang316781a2020-08-18 18:11:01 -070065 Mutex::Autolock l(mLock);
66
67 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_CLOSED;
68 mSessionStats.mLatencyMs = latencyMs;
Shuzhen Wang03fe6232023-02-05 12:41:15 -080069 mSessionStats.mDeviceError = deviceError;
Avichal Rakesh89691e12023-05-01 19:41:02 -070070 mSessionStats.mSessionIndex = 0;
Austin Borger74fca042022-05-23 12:41:21 -070071 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070072}
73
74void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onStreamConfigured(
75 int operatingMode, bool internalReconfig, int32_t latencyMs) {
76 Mutex::Autolock l(mLock);
77
78 if (internalReconfig) {
79 mSessionStats.mInternalReconfigure++;
80 } else {
81 mSessionStats.mLatencyMs = latencyMs;
82 mSessionStats.mSessionType = operatingMode;
83 }
84}
85
Austin Borger74fca042022-05-23 12:41:21 -070086void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onActive(
87 sp<hardware::ICameraServiceProxy>& proxyBinder, float maxPreviewFps) {
Shuzhen Wang316781a2020-08-18 18:11:01 -070088 Mutex::Autolock l(mLock);
89
90 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_ACTIVE;
Austin Borger4a870a32022-02-25 01:48:41 +000091 mSessionStats.mMaxPreviewFps = maxPreviewFps;
Avichal Rakesh89691e12023-05-01 19:41:02 -070092 mSessionStats.mSessionIndex++;
Austin Borger74fca042022-05-23 12:41:21 -070093 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070094
95 // Reset mCreationDuration to -1 to distinguish between 1st session
96 // after configuration, and all other sessions after configuration.
97 mSessionStats.mLatencyMs = -1;
98}
99
100void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onIdle(
Austin Borger74fca042022-05-23 12:41:21 -0700101 sp<hardware::ICameraServiceProxy>& proxyBinder,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700102 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
Eino-Ville Talvala6f1a9c12023-09-14 17:26:28 -0700103 const std::string& userTag, int32_t videoStabilizationMode, bool usedUltraWide,
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700104 bool usedZoomOverride, std::pair<int32_t, int32_t> mostRequestedFpsRange,
105 const std::vector<hardware::CameraStreamStats>& streamStats) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700106 Mutex::Autolock l(mLock);
107
108 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_IDLE;
109 mSessionStats.mRequestCount = requestCount;
110 mSessionStats.mResultErrorCount = resultErrorCount;
111 mSessionStats.mDeviceError = deviceError;
Austin Borger1c1bee02023-06-01 16:51:35 -0700112 mSessionStats.mUserTag = userTag;
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700113 mSessionStats.mVideoStabilizationMode = videoStabilizationMode;
Eino-Ville Talvala6f1a9c12023-09-14 17:26:28 -0700114 mSessionStats.mUsedUltraWide = usedUltraWide;
Shuzhen Wang6e08d202023-10-24 20:27:14 +0000115 mSessionStats.mUsedZoomOverride = usedZoomOverride;
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700116 mSessionStats.mMostRequestedFpsRange = mostRequestedFpsRange;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700117 mSessionStats.mStreamStats = streamStats;
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700118
Austin Borger74fca042022-05-23 12:41:21 -0700119 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700120
121 mSessionStats.mInternalReconfigure = 0;
122 mSessionStats.mStreamStats.clear();
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700123 mSessionStats.mCameraExtensionSessionStats = {};
Shuzhen Wang316781a2020-08-18 18:11:01 -0700124}
125
Avichal Rakesh1fff2d12023-03-03 15:05:48 -0800126int64_t CameraServiceProxyWrapper::CameraSessionStatsWrapper::getLogId() {
127 Mutex::Autolock l(mLock);
128 return mSessionStats.mLogId;
129}
130
Austin Borger1c1bee02023-06-01 16:51:35 -0700131std::string CameraServiceProxyWrapper::CameraSessionStatsWrapper::updateExtensionSessionStats(
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700132 const hardware::CameraExtensionSessionStats& extStats) {
133 Mutex::Autolock l(mLock);
134 CameraExtensionSessionStats& currStats = mSessionStats.mCameraExtensionSessionStats;
135 if (currStats.key != extStats.key) {
136 // Mismatched keys. Extensions stats likely reported for a closed session
137 ALOGW("%s: mismatched extensions stats key: current='%s' reported='%s'. Dropping stats.",
Austin Borger1c1bee02023-06-01 16:51:35 -0700138 __FUNCTION__, toStdString(currStats.key).c_str(), toStdString(extStats.key).c_str());
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700139 return POISON_EXT_STATS_KEY; // return poisoned key to so future calls are
140 // definitely dropped.
141 }
142
143 // Matching keys...
144 if (currStats.key.size()) {
145 // non-empty matching keys. overwrite.
146 ALOGV("%s: Overwriting extension session stats: %s", __FUNCTION__,
147 extStats.toString().c_str());
148 currStats = extStats;
Austin Borger1c1bee02023-06-01 16:51:35 -0700149 return toStdString(currStats.key);
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700150 }
151
152 // Matching empty keys...
Austin Borger1c1bee02023-06-01 16:51:35 -0700153 if (mSessionStats.mClientName != toStdString(extStats.clientName)) {
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700154 ALOGW("%s: extension stats reported for unexpected package: current='%s' reported='%s'. "
155 "Dropping stats.", __FUNCTION__,
Austin Borger1c1bee02023-06-01 16:51:35 -0700156 mSessionStats.mClientName.c_str(),
157 toStdString(extStats.clientName).c_str());
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700158 return POISON_EXT_STATS_KEY;
159 }
160
161 // Matching empty keys for the current client...
162 if (mSessionStats.mNewCameraState == CameraSessionStats::CAMERA_STATE_OPEN ||
163 mSessionStats.mNewCameraState == CameraSessionStats::CAMERA_STATE_IDLE) {
164 // Camera is open, but not active. It is possible that the active callback hasn't
165 // occurred yet. Keep the stats, but don't associate it with any session.
166 ALOGV("%s: extension stat reported for an open, but not active camera. "
167 "Saving stats, but not generating key.", __FUNCTION__);
168 currStats = extStats;
169 return {}; // Subsequent calls will handle setting the correct key.
170 }
171
172 if (mSessionStats.mNewCameraState == CameraSessionStats::CAMERA_STATE_ACTIVE) {
173 // camera is active. First call for the session!
174 currStats = extStats;
175
176 // Generate a new key from logId and sessionIndex.
177 std::ostringstream key;
178 key << mSessionStats.mSessionIndex << '/' << mSessionStats.mLogId;
179 currStats.key = String16(key.str().c_str());
180 ALOGV("%s: New extension session stats: %s", __FUNCTION__, currStats.toString().c_str());
Austin Borger1c1bee02023-06-01 16:51:35 -0700181 return toStdString(currStats.key);
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700182 }
183
184 // Camera is closed. Probably a stale call.
185 ALOGW("%s: extension stats reported for closed camera id '%s'. Dropping stats.",
Austin Borger1c1bee02023-06-01 16:51:35 -0700186 __FUNCTION__, mSessionStats.mCameraId.c_str());
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700187 return {};
188}
189
Shuzhen Wang316781a2020-08-18 18:11:01 -0700190/**
191 * CameraServiceProxyWrapper functions
192 */
193
194sp<ICameraServiceProxy> CameraServiceProxyWrapper::getCameraServiceProxy() {
195#ifndef __BRILLO__
Austin Borger74fca042022-05-23 12:41:21 -0700196 Mutex::Autolock al(mProxyMutex);
197 if (mCameraServiceProxy == nullptr) {
198 mCameraServiceProxy = getDefaultCameraServiceProxy();
Shuzhen Wang316781a2020-08-18 18:11:01 -0700199 }
200#endif
Austin Borger74fca042022-05-23 12:41:21 -0700201 return mCameraServiceProxy;
202}
203
204sp<hardware::ICameraServiceProxy> CameraServiceProxyWrapper::getDefaultCameraServiceProxy() {
205#ifndef __BRILLO__
206 sp<IServiceManager> sm = defaultServiceManager();
207 // Use checkService because cameraserver normally starts before the
208 // system server and the proxy service. So the long timeout that getService
209 // has before giving up is inappropriate.
210 sp<IBinder> binder = sm->checkService(String16("media.camera.proxy"));
211 if (binder != nullptr) {
212 return interface_cast<ICameraServiceProxy>(binder);
213 }
214#endif
215 return nullptr;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700216}
217
218void CameraServiceProxyWrapper::pingCameraServiceProxy() {
219 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
220 if (proxyBinder == nullptr) return;
221 proxyBinder->pingForUserUpdate();
222}
223
Shuzhen Wange3e8e732024-05-22 17:48:01 -0700224int64_t CameraServiceProxyWrapper::encodeSessionConfiguration(
225 const SessionConfiguration& sessionConfig) {
226 int64_t features = CameraFeatureCombinationStats::CAMERA_FEATURE_UNKNOWN;
227 const static int32_t WIDTH_4K = 3840;
228 const static int32_t HEIGHT_4K = 2160;
229
230 // Check session parameters
231 if (sessionConfig.hasSessionParameters()) {
232 const auto& parameters = sessionConfig.getSessionParameters();
233
234 camera_metadata_ro_entry fpsEntry = parameters.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE);
235 if (fpsEntry.count == 2 && fpsEntry.data.i32[1] == 60) {
236 features |= CameraFeatureCombinationStats::CAMERA_FEATURE_60_FPS;
237 }
238
239 camera_metadata_ro_entry stabEntry =
240 parameters.find(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE);
241 if (stabEntry.count == 1 && stabEntry.data.u8[0] ==
242 ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION) {
243 features |= CameraFeatureCombinationStats::CAMERA_FEATURE_STABILIZATION;
244 }
245 }
246
247 // Check output configurations
248 const auto& outputConfigs = sessionConfig.getOutputConfigurations();
249 for (const auto& config : outputConfigs) {
250 int format = config.getFormat();
251 int dataSpace = config.getDataspace();
252 int64_t dynamicRangeProfile = config.getDynamicRangeProfile();
253
254 // Check JPEG and JPEG_R features
255 if (format == HAL_PIXEL_FORMAT_BLOB) {
256 if (dataSpace == HAL_DATASPACE_V0_JFIF) {
257 features |= CameraFeatureCombinationStats::CAMERA_FEATURE_JPEG;
258 } else if (dataSpace == static_cast<android_dataspace_t>(
259 aidl::android::hardware::graphics::common::Dataspace::JPEG_R)) {
260 features |= CameraFeatureCombinationStats::CAMERA_FEATURE_JPEG_R;
261 }
262 } else {
263 if (dynamicRangeProfile == HAL_DATASPACE_BT2020_HLG) {
264 features |= CameraFeatureCombinationStats::CAMERA_FEATURE_HLG10;
265 }
266
267 // Check 4K
268 const auto& gbps = config.getGraphicBufferProducers();
269 int32_t width = 0, height = 0;
270 if (gbps.size() > 0) {
271 sp<Surface> surface = new Surface(gbps[0], /*useAsync*/false);
272 ANativeWindow *anw = surface.get();
273
274 width = ANativeWindow_getWidth(anw);
275 if (width < 0) {
276 ALOGE("%s: Failed to query Surface width: %s (%d)",
277 __FUNCTION__, strerror(-width), width);
278 return CameraFeatureCombinationStats::CAMERA_FEATURE_UNKNOWN;
279 }
280 height = ANativeWindow_getHeight(anw);
281 if (height < 0) {
282 ALOGE("%s: Failed to query Surface height: %s (%d)",
283 __FUNCTION__, strerror(-height), height);
284 return CameraFeatureCombinationStats::CAMERA_FEATURE_UNKNOWN;
285 }
286 } else {
287 width = config.getWidth();
288 height = config.getHeight();
289 }
290 if (width == WIDTH_4K && height == HEIGHT_4K) {
291 features |= CameraFeatureCombinationStats::CAMERA_FEATURE_4K;
292 }
293 }
294 }
295 return features;
296}
297
298// Note: The `ret` parameter is the return value of the
299// `isSessionConfigurationWithParametersSupporteed` binder call from the app.
300void CameraServiceProxyWrapper::logFeatureCombinationInternal(
301 const std::string &cameraId, int clientUid,
302 const SessionConfiguration& sessionConfiguration, binder::Status ret,
303 int type) {
304 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
305 if (proxyBinder == nullptr) return;
306
307 int64_t featureCombination = encodeSessionConfiguration(sessionConfiguration);
308 int queryStatus = ret.isOk() ? OK : ret.serviceSpecificErrorCode();
309 CameraFeatureCombinationStats stats;
310 stats.mCameraId = cameraId;
311 stats.mUid = clientUid;
312 stats.mFeatureCombination = featureCombination;
313 stats.mQueryType = type;
314 stats.mStatus = queryStatus;
315
316 auto status = proxyBinder->notifyFeatureCombinationStats(stats);
317 if (!status.isOk()) {
318 ALOGE("%s: Failed to notify feature combination stats: %s", __FUNCTION__,
319 status.exceptionMessage().c_str());
320 }
321}
322
Austin Borger1c1bee02023-06-01 16:51:35 -0700323int CameraServiceProxyWrapper::getRotateAndCropOverride(const std::string &packageName,
324 int lensFacing, int userId) {
Emilian Peevb91f1802021-03-23 14:50:28 -0700325 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
326 if (proxyBinder == nullptr) return true;
Emilian Peev5368ebf2021-10-08 17:52:18 -0700327 int ret = 0;
Austin Borger1c1bee02023-06-01 16:51:35 -0700328 auto status = proxyBinder->getRotateAndCropOverride(packageName, lensFacing,
329 userId, &ret);
Emilian Peevb91f1802021-03-23 14:50:28 -0700330 if (!status.isOk()) {
331 ALOGE("%s: Failed during top activity orientation query: %s", __FUNCTION__,
332 status.exceptionMessage().c_str());
333 }
334
335 return ret;
336}
337
Austin Borger1c1bee02023-06-01 16:51:35 -0700338int CameraServiceProxyWrapper::getAutoframingOverride(const std::string& packageName) {
Bharatt Kukreja7146ced2022-10-25 15:45:29 +0000339 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
340 if (proxyBinder == nullptr) {
341 return ANDROID_CONTROL_AUTOFRAMING_OFF;
342 }
343 int ret = 0;
344 auto status = proxyBinder->getAutoframingOverride(packageName, &ret);
345 if (!status.isOk()) {
346 ALOGE("%s: Failed during autoframing override query: %s", __FUNCTION__,
347 status.exceptionMessage().c_str());
348 }
349
350 return ret;
351}
352
Austin Borger1c1bee02023-06-01 16:51:35 -0700353void CameraServiceProxyWrapper::logStreamConfigured(const std::string& id,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700354 int operatingMode, bool internalConfig, int32_t latencyMs) {
355 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
356 {
357 Mutex::Autolock l(mLock);
Shuzhen Wang25152e42023-06-13 22:18:58 +0000358 if (mSessionStatsMap.count(id) == 0) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700359 ALOGE("%s: SessionStatsMap should contain camera %s",
360 __FUNCTION__, id.c_str());
361 return;
362 }
Shuzhen Wang25152e42023-06-13 22:18:58 +0000363 sessionStats = mSessionStatsMap[id];
Shuzhen Wang316781a2020-08-18 18:11:01 -0700364 }
365
366 ALOGV("%s: id %s, operatingMode %d, internalConfig %d, latencyMs %d",
367 __FUNCTION__, id.c_str(), operatingMode, internalConfig, latencyMs);
368 sessionStats->onStreamConfigured(operatingMode, internalConfig, latencyMs);
369}
370
Austin Borger1c1bee02023-06-01 16:51:35 -0700371void CameraServiceProxyWrapper::logActive(const std::string& id, float maxPreviewFps) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700372 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
373 {
374 Mutex::Autolock l(mLock);
Shuzhen Wang25152e42023-06-13 22:18:58 +0000375 if (mSessionStatsMap.count(id) == 0) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700376 ALOGE("%s: SessionStatsMap should contain camera %s when logActive is called",
377 __FUNCTION__, id.c_str());
378 return;
379 }
Shuzhen Wang25152e42023-06-13 22:18:58 +0000380 sessionStats = mSessionStatsMap[id];
Shuzhen Wang316781a2020-08-18 18:11:01 -0700381 }
382
383 ALOGV("%s: id %s", __FUNCTION__, id.c_str());
Austin Borger74fca042022-05-23 12:41:21 -0700384 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
385 sessionStats->onActive(proxyBinder, maxPreviewFps);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700386}
387
Austin Borger1c1bee02023-06-01 16:51:35 -0700388void CameraServiceProxyWrapper::logIdle(const std::string& id,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700389 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
Eino-Ville Talvala6f1a9c12023-09-14 17:26:28 -0700390 const std::string& userTag, int32_t videoStabilizationMode, bool usedUltraWide,
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700391 bool usedZoomOverride, std::pair<int32_t, int32_t> mostRequestedFpsRange,
392 const std::vector<hardware::CameraStreamStats>& streamStats) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700393 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
394 {
395 Mutex::Autolock l(mLock);
Shuzhen Wang25152e42023-06-13 22:18:58 +0000396 if (mSessionStatsMap.count(id) == 0) {
397 ALOGE("%s: SessionStatsMap should contain camera %s when logIdle is called",
Shuzhen Wang316781a2020-08-18 18:11:01 -0700398 __FUNCTION__, id.c_str());
Shuzhen Wang25152e42023-06-13 22:18:58 +0000399 return;
400 }
401 sessionStats = mSessionStatsMap[id];
Shuzhen Wang316781a2020-08-18 18:11:01 -0700402 }
403
Shuzhen Wangd26b1862022-03-07 12:05:05 -0800404 ALOGV("%s: id %s, requestCount %" PRId64 ", resultErrorCount %" PRId64 ", deviceError %d"
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700405 ", userTag %s, videoStabilizationMode %d, most common FPS [%d,%d]",
406 __FUNCTION__, id.c_str(), requestCount, resultErrorCount, deviceError, userTag.c_str(),
407 videoStabilizationMode, mostRequestedFpsRange.first, mostRequestedFpsRange.second);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700408 for (size_t i = 0; i < streamStats.size(); i++) {
409 ALOGV("%s: streamStats[%zu]: w %d h %d, requestedCount %" PRId64 ", dropCount %"
410 PRId64 ", startTimeMs %d" ,
411 __FUNCTION__, i, streamStats[i].mWidth, streamStats[i].mHeight,
412 streamStats[i].mRequestCount, streamStats[i].mErrorCount,
413 streamStats[i].mStartLatencyMs);
414 }
415
Austin Borger74fca042022-05-23 12:41:21 -0700416 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
417 sessionStats->onIdle(proxyBinder, requestCount, resultErrorCount, deviceError, userTag,
Eino-Ville Talvalaffc186b2024-04-09 18:10:47 -0700418 videoStabilizationMode, usedUltraWide, usedZoomOverride,
419 mostRequestedFpsRange, streamStats);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700420}
421
Austin Borger1c1bee02023-06-01 16:51:35 -0700422void CameraServiceProxyWrapper::logOpen(const std::string& id, int facing,
423 const std::string& clientPackageName, int effectiveApiLevel, bool isNdk,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700424 int32_t latencyMs) {
425 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
426 {
427 Mutex::Autolock l(mLock);
428 if (mSessionStatsMap.count(id) > 0) {
429 ALOGE("%s: SessionStatsMap shouldn't contain camera %s",
430 __FUNCTION__, id.c_str());
431 return;
432 }
433
434 int apiLevel = CameraSessionStats::CAMERA_API_LEVEL_1;
435 if (effectiveApiLevel == 2) {
436 apiLevel = CameraSessionStats::CAMERA_API_LEVEL_2;
437 }
438
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800439 // Generate a new log ID for open events
440 int64_t logId = generateLogId(mRandomDevice);
441
442 sessionStats = std::make_shared<CameraSessionStatsWrapper>(
Austin Borger1c1bee02023-06-01 16:51:35 -0700443 id, facing, CameraSessionStats::CAMERA_STATE_OPEN, clientPackageName,
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800444 apiLevel, isNdk, latencyMs, logId);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700445 mSessionStatsMap.emplace(id, sessionStats);
446 ALOGV("%s: Adding id %s", __FUNCTION__, id.c_str());
447 }
448
449 ALOGV("%s: id %s, facing %d, effectiveApiLevel %d, isNdk %d, latencyMs %d",
450 __FUNCTION__, id.c_str(), facing, effectiveApiLevel, isNdk, latencyMs);
Austin Borger74fca042022-05-23 12:41:21 -0700451 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
452 sessionStats->onOpen(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700453}
454
Austin Borger1c1bee02023-06-01 16:51:35 -0700455void CameraServiceProxyWrapper::logClose(const std::string& id, int32_t latencyMs,
456 bool deviceError) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700457 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
458 {
459 Mutex::Autolock l(mLock);
460 if (mSessionStatsMap.count(id) == 0) {
461 ALOGE("%s: SessionStatsMap should contain camera %s before it's closed",
462 __FUNCTION__, id.c_str());
463 return;
464 }
465
466 sessionStats = mSessionStatsMap[id];
467 if (sessionStats == nullptr) {
468 ALOGE("%s: SessionStatsMap should contain camera %s",
469 __FUNCTION__, id.c_str());
470 return;
471 }
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800472
Shuzhen Wang316781a2020-08-18 18:11:01 -0700473 mSessionStatsMap.erase(id);
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800474 ALOGV("%s: Erasing id %s, deviceError %d", __FUNCTION__, id.c_str(), deviceError);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700475 }
476
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800477 ALOGV("%s: id %s, latencyMs %d, deviceError %d", __FUNCTION__,
478 id.c_str(), latencyMs, deviceError);
Austin Borger74fca042022-05-23 12:41:21 -0700479 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800480 sessionStats->onClose(proxyBinder, latencyMs, deviceError);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700481}
482
Austin Borger9bfa0a72022-08-03 17:50:40 -0700483bool CameraServiceProxyWrapper::isCameraDisabled(int userId) {
Austin Borger5f7abe22022-04-26 15:55:10 -0700484 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
485 if (proxyBinder == nullptr) return true;
486 bool ret = false;
Austin Borger9bfa0a72022-08-03 17:50:40 -0700487 auto status = proxyBinder->isCameraDisabled(userId, &ret);
Austin Borger5f7abe22022-04-26 15:55:10 -0700488 if (!status.isOk()) {
489 ALOGE("%s: Failed during camera disabled query: %s", __FUNCTION__,
490 status.exceptionMessage().c_str());
491 }
492 return ret;
493}
494
Austin Borger1c1bee02023-06-01 16:51:35 -0700495int64_t CameraServiceProxyWrapper::getCurrentLogIdForCamera(const std::string& cameraId) {
Avichal Rakesh1fff2d12023-03-03 15:05:48 -0800496 std::shared_ptr<CameraSessionStatsWrapper> stats;
497 {
498 Mutex::Autolock _l(mLock);
499 if (mSessionStatsMap.count(cameraId) == 0) {
500 ALOGE("%s: SessionStatsMap should contain camera %s before asking for its logging ID.",
501 __FUNCTION__, cameraId.c_str());
502 return 0;
503 }
504
505 stats = mSessionStatsMap[cameraId];
506 }
507 return stats->getLogId();
508}
509
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800510int64_t CameraServiceProxyWrapper::generateLogId(std::random_device& randomDevice) {
511 int64_t ret = 0;
512 do {
513 // std::random_device generates 32 bits per call, so we call it twice
514 ret = randomDevice();
515 ret = ret << 32;
516 ret = ret | randomDevice();
517 } while (ret == 0); // 0 is not a valid identifier
518
519 return ret;
520}
521
Austin Borger1c1bee02023-06-01 16:51:35 -0700522std::string CameraServiceProxyWrapper::updateExtensionStats(
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700523 const hardware::CameraExtensionSessionStats& extStats) {
524 std::shared_ptr<CameraSessionStatsWrapper> stats;
Austin Borger1c1bee02023-06-01 16:51:35 -0700525 std::string cameraId = toStdString(extStats.cameraId);
Avichal Rakesh6e57a2b2023-05-01 17:53:37 -0700526 {
527 Mutex::Autolock _l(mLock);
528 if (mSessionStatsMap.count(cameraId) == 0) {
529 ALOGE("%s CameraExtensionSessionStats reported for camera id that isn't open: %s",
530 __FUNCTION__, cameraId.c_str());
531 return {};
532 }
533
534 stats = mSessionStatsMap[cameraId];
535 return stats->updateExtensionSessionStats(extStats);
536 }
537}
538
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800539} // namespace android