blob: 7aaf6b277195e782351175fc8109727a657e20d7 [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;
Austin Borger74fca042022-05-23 12:41:21 -070056 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070057}
58
59void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onStreamConfigured(
60 int operatingMode, bool internalReconfig, int32_t latencyMs) {
61 Mutex::Autolock l(mLock);
62
63 if (internalReconfig) {
64 mSessionStats.mInternalReconfigure++;
65 } else {
66 mSessionStats.mLatencyMs = latencyMs;
67 mSessionStats.mSessionType = operatingMode;
68 }
69}
70
Austin Borger74fca042022-05-23 12:41:21 -070071void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onActive(
72 sp<hardware::ICameraServiceProxy>& proxyBinder, float maxPreviewFps) {
Shuzhen Wang316781a2020-08-18 18:11:01 -070073 Mutex::Autolock l(mLock);
74
75 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_ACTIVE;
Austin Borger4a870a32022-02-25 01:48:41 +000076 mSessionStats.mMaxPreviewFps = maxPreviewFps;
Austin Borger74fca042022-05-23 12:41:21 -070077 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070078
79 // Reset mCreationDuration to -1 to distinguish between 1st session
80 // after configuration, and all other sessions after configuration.
81 mSessionStats.mLatencyMs = -1;
82}
83
84void CameraServiceProxyWrapper::CameraSessionStatsWrapper::onIdle(
Austin Borger74fca042022-05-23 12:41:21 -070085 sp<hardware::ICameraServiceProxy>& proxyBinder,
Shuzhen Wang316781a2020-08-18 18:11:01 -070086 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
Shuzhen Wang9372b0b2022-05-11 18:55:19 -070087 const std::string& userTag, int32_t videoStabilizationMode,
Shuzhen Wang316781a2020-08-18 18:11:01 -070088 const std::vector<hardware::CameraStreamStats>& streamStats) {
89 Mutex::Autolock l(mLock);
90
91 mSessionStats.mNewCameraState = CameraSessionStats::CAMERA_STATE_IDLE;
92 mSessionStats.mRequestCount = requestCount;
93 mSessionStats.mResultErrorCount = resultErrorCount;
94 mSessionStats.mDeviceError = deviceError;
Shuzhen Wangd26b1862022-03-07 12:05:05 -080095 mSessionStats.mUserTag = String16(userTag.c_str());
Shuzhen Wang9372b0b2022-05-11 18:55:19 -070096 mSessionStats.mVideoStabilizationMode = videoStabilizationMode;
Shuzhen Wang316781a2020-08-18 18:11:01 -070097 mSessionStats.mStreamStats = streamStats;
Austin Borger74fca042022-05-23 12:41:21 -070098 updateProxyDeviceState(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -070099
100 mSessionStats.mInternalReconfigure = 0;
101 mSessionStats.mStreamStats.clear();
102}
103
104/**
105 * CameraServiceProxyWrapper functions
106 */
107
108sp<ICameraServiceProxy> CameraServiceProxyWrapper::getCameraServiceProxy() {
109#ifndef __BRILLO__
Austin Borger74fca042022-05-23 12:41:21 -0700110 Mutex::Autolock al(mProxyMutex);
111 if (mCameraServiceProxy == nullptr) {
112 mCameraServiceProxy = getDefaultCameraServiceProxy();
Shuzhen Wang316781a2020-08-18 18:11:01 -0700113 }
114#endif
Austin Borger74fca042022-05-23 12:41:21 -0700115 return mCameraServiceProxy;
116}
117
118sp<hardware::ICameraServiceProxy> CameraServiceProxyWrapper::getDefaultCameraServiceProxy() {
119#ifndef __BRILLO__
120 sp<IServiceManager> sm = defaultServiceManager();
121 // Use checkService because cameraserver normally starts before the
122 // system server and the proxy service. So the long timeout that getService
123 // has before giving up is inappropriate.
124 sp<IBinder> binder = sm->checkService(String16("media.camera.proxy"));
125 if (binder != nullptr) {
126 return interface_cast<ICameraServiceProxy>(binder);
127 }
128#endif
129 return nullptr;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700130}
131
132void CameraServiceProxyWrapper::pingCameraServiceProxy() {
133 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
134 if (proxyBinder == nullptr) return;
135 proxyBinder->pingForUserUpdate();
136}
137
Emilian Peev065b2c12021-11-23 13:12:57 -0800138int CameraServiceProxyWrapper::getRotateAndCropOverride(String16 packageName, int lensFacing,
139 int userId) {
Emilian Peevb91f1802021-03-23 14:50:28 -0700140 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
141 if (proxyBinder == nullptr) return true;
Emilian Peev5368ebf2021-10-08 17:52:18 -0700142 int ret = 0;
Emilian Peev065b2c12021-11-23 13:12:57 -0800143 auto status = proxyBinder->getRotateAndCropOverride(packageName, lensFacing, userId, &ret);
Emilian Peevb91f1802021-03-23 14:50:28 -0700144 if (!status.isOk()) {
145 ALOGE("%s: Failed during top activity orientation query: %s", __FUNCTION__,
146 status.exceptionMessage().c_str());
147 }
148
149 return ret;
150}
151
Bharatt Kukreja7146ced2022-10-25 15:45:29 +0000152int CameraServiceProxyWrapper::getAutoframingOverride(const String16& packageName) {
153 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
154 if (proxyBinder == nullptr) {
155 return ANDROID_CONTROL_AUTOFRAMING_OFF;
156 }
157 int ret = 0;
158 auto status = proxyBinder->getAutoframingOverride(packageName, &ret);
159 if (!status.isOk()) {
160 ALOGE("%s: Failed during autoframing override query: %s", __FUNCTION__,
161 status.exceptionMessage().c_str());
162 }
163
164 return ret;
165}
166
Shuzhen Wang316781a2020-08-18 18:11:01 -0700167void CameraServiceProxyWrapper::logStreamConfigured(const String8& id,
168 int operatingMode, bool internalConfig, int32_t latencyMs) {
169 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
170 {
171 Mutex::Autolock l(mLock);
172 sessionStats = mSessionStatsMap[id];
173 if (sessionStats == nullptr) {
174 ALOGE("%s: SessionStatsMap should contain camera %s",
175 __FUNCTION__, id.c_str());
176 return;
177 }
178 }
179
180 ALOGV("%s: id %s, operatingMode %d, internalConfig %d, latencyMs %d",
181 __FUNCTION__, id.c_str(), operatingMode, internalConfig, latencyMs);
182 sessionStats->onStreamConfigured(operatingMode, internalConfig, latencyMs);
183}
184
Austin Borger4a870a32022-02-25 01:48:41 +0000185void CameraServiceProxyWrapper::logActive(const String8& id, float maxPreviewFps) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700186 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
187 {
188 Mutex::Autolock l(mLock);
189 sessionStats = mSessionStatsMap[id];
190 if (sessionStats == nullptr) {
191 ALOGE("%s: SessionStatsMap should contain camera %s when logActive is called",
192 __FUNCTION__, id.c_str());
193 return;
194 }
195 }
196
197 ALOGV("%s: id %s", __FUNCTION__, id.c_str());
Austin Borger74fca042022-05-23 12:41:21 -0700198 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
199 sessionStats->onActive(proxyBinder, maxPreviewFps);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700200}
201
202void CameraServiceProxyWrapper::logIdle(const String8& id,
203 int64_t requestCount, int64_t resultErrorCount, bool deviceError,
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700204 const std::string& userTag, int32_t videoStabilizationMode,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700205 const std::vector<hardware::CameraStreamStats>& streamStats) {
206 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
207 {
208 Mutex::Autolock l(mLock);
209 sessionStats = mSessionStatsMap[id];
210 }
211
212 if (sessionStats == nullptr) {
213 ALOGE("%s: SessionStatsMap should contain camera %s when logIdle is called",
214 __FUNCTION__, id.c_str());
215 return;
216 }
217
Shuzhen Wangd26b1862022-03-07 12:05:05 -0800218 ALOGV("%s: id %s, requestCount %" PRId64 ", resultErrorCount %" PRId64 ", deviceError %d"
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700219 ", userTag %s, videoStabilizationMode %d", __FUNCTION__, id.c_str(), requestCount,
220 resultErrorCount, deviceError, userTag.c_str(), videoStabilizationMode);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700221 for (size_t i = 0; i < streamStats.size(); i++) {
222 ALOGV("%s: streamStats[%zu]: w %d h %d, requestedCount %" PRId64 ", dropCount %"
223 PRId64 ", startTimeMs %d" ,
224 __FUNCTION__, i, streamStats[i].mWidth, streamStats[i].mHeight,
225 streamStats[i].mRequestCount, streamStats[i].mErrorCount,
226 streamStats[i].mStartLatencyMs);
227 }
228
Austin Borger74fca042022-05-23 12:41:21 -0700229 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
230 sessionStats->onIdle(proxyBinder, requestCount, resultErrorCount, deviceError, userTag,
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700231 videoStabilizationMode, streamStats);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700232}
233
234void CameraServiceProxyWrapper::logOpen(const String8& id, int facing,
235 const String16& clientPackageName, int effectiveApiLevel, bool isNdk,
236 int32_t latencyMs) {
237 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
238 {
239 Mutex::Autolock l(mLock);
240 if (mSessionStatsMap.count(id) > 0) {
241 ALOGE("%s: SessionStatsMap shouldn't contain camera %s",
242 __FUNCTION__, id.c_str());
243 return;
244 }
245
246 int apiLevel = CameraSessionStats::CAMERA_API_LEVEL_1;
247 if (effectiveApiLevel == 2) {
248 apiLevel = CameraSessionStats::CAMERA_API_LEVEL_2;
249 }
250
251 sessionStats = std::make_shared<CameraSessionStatsWrapper>(String16(id), facing,
252 CameraSessionStats::CAMERA_STATE_OPEN, clientPackageName,
253 apiLevel, isNdk, latencyMs);
254 mSessionStatsMap.emplace(id, sessionStats);
255 ALOGV("%s: Adding id %s", __FUNCTION__, id.c_str());
256 }
257
258 ALOGV("%s: id %s, facing %d, effectiveApiLevel %d, isNdk %d, latencyMs %d",
259 __FUNCTION__, id.c_str(), facing, effectiveApiLevel, isNdk, latencyMs);
Austin Borger74fca042022-05-23 12:41:21 -0700260 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
261 sessionStats->onOpen(proxyBinder);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700262}
263
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800264void CameraServiceProxyWrapper::logClose(const String8& id, int32_t latencyMs, bool deviceError) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700265 std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
266 {
267 Mutex::Autolock l(mLock);
268 if (mSessionStatsMap.count(id) == 0) {
269 ALOGE("%s: SessionStatsMap should contain camera %s before it's closed",
270 __FUNCTION__, id.c_str());
271 return;
272 }
273
274 sessionStats = mSessionStatsMap[id];
275 if (sessionStats == nullptr) {
276 ALOGE("%s: SessionStatsMap should contain camera %s",
277 __FUNCTION__, id.c_str());
278 return;
279 }
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800280
Shuzhen Wang316781a2020-08-18 18:11:01 -0700281 mSessionStatsMap.erase(id);
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800282 ALOGV("%s: Erasing id %s, deviceError %d", __FUNCTION__, id.c_str(), deviceError);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700283 }
284
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800285 ALOGV("%s: id %s, latencyMs %d, deviceError %d", __FUNCTION__,
286 id.c_str(), latencyMs, deviceError);
Austin Borger74fca042022-05-23 12:41:21 -0700287 sp<hardware::ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
Shuzhen Wang03fe6232023-02-05 12:41:15 -0800288 sessionStats->onClose(proxyBinder, latencyMs, deviceError);
Shuzhen Wang316781a2020-08-18 18:11:01 -0700289}
290
Austin Borger9bfa0a72022-08-03 17:50:40 -0700291bool CameraServiceProxyWrapper::isCameraDisabled(int userId) {
Austin Borger5f7abe22022-04-26 15:55:10 -0700292 sp<ICameraServiceProxy> proxyBinder = getCameraServiceProxy();
293 if (proxyBinder == nullptr) return true;
294 bool ret = false;
Austin Borger9bfa0a72022-08-03 17:50:40 -0700295 auto status = proxyBinder->isCameraDisabled(userId, &ret);
Austin Borger5f7abe22022-04-26 15:55:10 -0700296 if (!status.isOk()) {
297 ALOGE("%s: Failed during camera disabled query: %s", __FUNCTION__,
298 status.exceptionMessage().c_str());
299 }
300 return ret;
301}
302
Shuzhen Wang316781a2020-08-18 18:11:01 -0700303}; // namespace android