| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 1 | /* | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 2 |  * Copyright (C) 2019 The Android Open Source Project | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 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 "CameraOfflineClient" | 
 | 18 | #define ATRACE_TAG ATRACE_TAG_CAMERA | 
 | 19 | //#define LOG_NDEBUG 0 | 
 | 20 |  | 
 | 21 | #include "CameraOfflineSessionClient.h" | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 22 | #include "utils/CameraThreadState.h" | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 23 | #include <utils/Trace.h> | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 24 | #include <camera/StringUtils.h> | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 25 |  | 
 | 26 | namespace android { | 
 | 27 |  | 
 | 28 | using binder::Status; | 
 | 29 |  | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 30 | status_t CameraOfflineSessionClient::initialize(sp<CameraProviderManager>, const std::string&) { | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 31 |     ATRACE_CALL(); | 
 | 32 |  | 
| Emilian Peev | 886ac21 | 2023-02-07 14:10:24 -0800 | [diff] [blame] | 33 |     if (mFrameProcessor.get() != nullptr) { | 
 | 34 |         // Already initialized | 
 | 35 |         return OK; | 
 | 36 |     } | 
 | 37 |  | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 38 |     // Verify ops permissions | 
 | 39 |     auto res = startCameraOps(); | 
 | 40 |     if (res != OK) { | 
 | 41 |         return res; | 
 | 42 |     } | 
 | 43 |  | 
 | 44 |     if (mOfflineSession.get() == nullptr) { | 
 | 45 |         ALOGE("%s: Camera %s: No valid offline session", | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 46 |                 __FUNCTION__, mCameraIdStr.c_str()); | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 47 |         return NO_INIT; | 
 | 48 |     } | 
 | 49 |  | 
| Emilian Peev | faa4bde | 2020-01-23 12:19:37 -0800 | [diff] [blame] | 50 |     mFrameProcessor = new camera2::FrameProcessorBase(mOfflineSession); | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 51 |     std::string threadName = fmt::sprintf("Offline-%s-FrameProc", mCameraIdStr.c_str()); | 
 | 52 |     res = mFrameProcessor->run(threadName.c_str()); | 
| Austin Borger | 7b12954 | 2022-06-09 13:23:06 -0700 | [diff] [blame] | 53 |     if (res != OK) { | 
 | 54 |         ALOGE("%s: Unable to start frame processor thread: %s (%d)", | 
 | 55 |                 __FUNCTION__, strerror(-res), res); | 
 | 56 |         return res; | 
 | 57 |     } | 
| Emilian Peev | faa4bde | 2020-01-23 12:19:37 -0800 | [diff] [blame] | 58 |  | 
 | 59 |     mFrameProcessor->registerListener(camera2::FrameProcessorBase::FRAME_PROCESSOR_LISTENER_MIN_ID, | 
 | 60 |                                       camera2::FrameProcessorBase::FRAME_PROCESSOR_LISTENER_MAX_ID, | 
 | 61 |                                       /*listener*/this, | 
 | 62 |                                       /*sendPartials*/true); | 
 | 63 |  | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 64 |     wp<NotificationListener> weakThis(this); | 
 | 65 |     res = mOfflineSession->initialize(weakThis); | 
 | 66 |     if (res != OK) { | 
 | 67 |         ALOGE("%s: Camera %s: unable to initialize device: %s (%d)", | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 68 |                 __FUNCTION__, mCameraIdStr.c_str(), strerror(-res), res); | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 69 |         return res; | 
 | 70 |     } | 
 | 71 |  | 
| Emilian Peev | c0fe54c | 2020-03-11 14:05:07 -0700 | [diff] [blame] | 72 |     for (size_t i = 0; i < mCompositeStreamMap.size(); i++) { | 
 | 73 |         mCompositeStreamMap.valueAt(i)->switchToOffline(); | 
 | 74 |     } | 
 | 75 |  | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 76 |     return OK; | 
 | 77 | } | 
 | 78 |  | 
| Ravneet | aeb20dc | 2022-03-30 05:33:03 +0000 | [diff] [blame] | 79 | status_t CameraOfflineSessionClient::setCameraServiceWatchdog(bool) { | 
 | 80 |     return OK; | 
 | 81 | } | 
 | 82 |  | 
| Jayant Chowdhary | 44d5f62 | 2023-09-20 03:11:41 +0000 | [diff] [blame] | 83 | status_t CameraOfflineSessionClient::setRotateAndCropOverride(uint8_t /*rotateAndCrop*/, | 
 | 84 |         bool /*fromHal*/) { | 
| Eino-Ville Talvala | f2e3709 | 2020-01-07 15:32:32 -0800 | [diff] [blame] | 85 |     // Since we're not submitting more capture requests, changes to rotateAndCrop override | 
 | 86 |     // make no difference. | 
 | 87 |     return OK; | 
 | 88 | } | 
 | 89 |  | 
| Bharatt Kukreja | 7146ced | 2022-10-25 15:45:29 +0000 | [diff] [blame] | 90 | status_t CameraOfflineSessionClient::setAutoframingOverride(uint8_t) { | 
 | 91 |     return OK; | 
 | 92 | } | 
 | 93 |  | 
| Eino-Ville Talvala | 305cec6 | 2020-11-12 14:18:17 -0800 | [diff] [blame] | 94 | bool CameraOfflineSessionClient::supportsCameraMute() { | 
 | 95 |     // Offline mode doesn't support muting | 
 | 96 |     return false; | 
 | 97 | } | 
 | 98 |  | 
 | 99 | status_t CameraOfflineSessionClient::setCameraMute(bool) { | 
 | 100 |     return INVALID_OPERATION; | 
 | 101 | } | 
 | 102 |  | 
| Shuzhen Wang | 16610a6 | 2022-12-15 22:38:07 -0800 | [diff] [blame] | 103 | void CameraOfflineSessionClient::setStreamUseCaseOverrides( | 
 | 104 |         const std::vector<int64_t>& /*useCaseOverrides*/) { | 
 | 105 | } | 
 | 106 |  | 
 | 107 | void CameraOfflineSessionClient::clearStreamUseCaseOverrides() { | 
 | 108 | } | 
 | 109 |  | 
| Shuzhen Wang | af22e91 | 2023-04-11 16:03:17 -0700 | [diff] [blame] | 110 | bool CameraOfflineSessionClient::supportsZoomOverride() { | 
 | 111 |     return false; | 
 | 112 | } | 
 | 113 |  | 
 | 114 | status_t CameraOfflineSessionClient::setZoomOverride(int32_t /*zoomOverride*/) { | 
 | 115 |     return INVALID_OPERATION; | 
 | 116 | } | 
 | 117 |  | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 118 | status_t CameraOfflineSessionClient::dump(int fd, const Vector<String16>& args) { | 
 | 119 |     return BasicClient::dump(fd, args); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 120 | } | 
 | 121 |  | 
| Emilian Peev | faa4bde | 2020-01-23 12:19:37 -0800 | [diff] [blame] | 122 | status_t CameraOfflineSessionClient::dumpClient(int fd, const Vector<String16>& args) { | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 123 |     std::string result; | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 124 |  | 
 | 125 |     result = "  Offline session dump:\n"; | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 126 |     write(fd, result.c_str(), result.size()); | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 127 |  | 
 | 128 |     if (mOfflineSession.get() == nullptr) { | 
 | 129 |         result = "  *** Offline session is detached\n"; | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 130 |         write(fd, result.c_str(), result.size()); | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 131 |         return NO_ERROR; | 
 | 132 |     } | 
 | 133 |  | 
| Emilian Peev | faa4bde | 2020-01-23 12:19:37 -0800 | [diff] [blame] | 134 |     mFrameProcessor->dump(fd, args); | 
 | 135 |  | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 136 |     auto res = mOfflineSession->dump(fd); | 
 | 137 |     if (res != OK) { | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 138 |         result = fmt::sprintf("   Error dumping offline session: %s (%d)", | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 139 |                 strerror(-res), res); | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 140 |         write(fd, result.c_str(), result.size()); | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 141 |     } | 
 | 142 |  | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 143 |     return OK; | 
 | 144 | } | 
 | 145 |  | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 146 | status_t CameraOfflineSessionClient::startWatchingTags(const std::string &tags, int outFd) { | 
| Avichal Rakesh | 7e53cad | 2021-10-05 13:46:30 -0700 | [diff] [blame] | 147 |     return BasicClient::startWatchingTags(tags, outFd); | 
 | 148 | } | 
 | 149 |  | 
 | 150 | status_t CameraOfflineSessionClient::stopWatchingTags(int outFd) { | 
 | 151 |     return BasicClient::stopWatchingTags(outFd); | 
 | 152 | } | 
 | 153 |  | 
 | 154 | status_t CameraOfflineSessionClient::dumpWatchedEventsToVector(std::vector<std::string> &out) { | 
 | 155 |     return BasicClient::dumpWatchedEventsToVector(out); | 
 | 156 | } | 
 | 157 |  | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 158 | binder::Status CameraOfflineSessionClient::disconnect() { | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 159 |     Mutex::Autolock icl(mBinderSerializationLock); | 
 | 160 |  | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 161 |     binder::Status res = Status::ok(); | 
 | 162 |     if (mDisconnected) { | 
 | 163 |         return res; | 
 | 164 |     } | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 165 |     // Allow both client and the media server to disconnect at all times | 
 | 166 |     int callingPid = CameraThreadState::getCallingPid(); | 
 | 167 |     if (callingPid != mClientPid && | 
 | 168 |             callingPid != mServicePid) { | 
 | 169 |         return res; | 
 | 170 |     } | 
 | 171 |  | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 172 |     mDisconnected = true; | 
 | 173 |  | 
 | 174 |     sCameraService->removeByClient(this); | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 175 |     sCameraService->logDisconnectedOffline(mCameraIdStr, mClientPid, mClientPackageName); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 176 |  | 
 | 177 |     sp<IBinder> remote = getRemote(); | 
 | 178 |     if (remote != nullptr) { | 
 | 179 |         remote->unlinkToDeath(sCameraService); | 
 | 180 |     } | 
 | 181 |  | 
| Emilian Peev | faa4bde | 2020-01-23 12:19:37 -0800 | [diff] [blame] | 182 |     mFrameProcessor->removeListener(camera2::FrameProcessorBase::FRAME_PROCESSOR_LISTENER_MIN_ID, | 
 | 183 |                                     camera2::FrameProcessorBase::FRAME_PROCESSOR_LISTENER_MAX_ID, | 
 | 184 |                                     /*listener*/this); | 
 | 185 |     mFrameProcessor->requestExit(); | 
 | 186 |     mFrameProcessor->join(); | 
 | 187 |  | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 188 |     finishCameraOps(); | 
 | 189 |     ALOGI("%s: Disconnected client for offline camera %s for PID %d", __FUNCTION__, | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 190 |             mCameraIdStr.c_str(), mClientPid); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 191 |  | 
 | 192 |     // client shouldn't be able to call into us anymore | 
 | 193 |     mClientPid = 0; | 
 | 194 |  | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 195 |     if (mOfflineSession.get() != nullptr) { | 
 | 196 |         auto ret = mOfflineSession->disconnect(); | 
 | 197 |         if (ret != OK) { | 
 | 198 |             ALOGE("%s: Failed disconnecting from offline session %s (%d)", __FUNCTION__, | 
 | 199 |                     strerror(-ret), ret); | 
 | 200 |         } | 
 | 201 |         mOfflineSession = nullptr; | 
 | 202 |     } | 
 | 203 |  | 
| Emilian Peev | 4697b64 | 2019-11-19 17:11:14 -0800 | [diff] [blame] | 204 |     for (size_t i = 0; i < mCompositeStreamMap.size(); i++) { | 
 | 205 |         auto ret = mCompositeStreamMap.valueAt(i)->deleteInternalStreams(); | 
 | 206 |         if (ret != OK) { | 
 | 207 |             ALOGE("%s: Failed removing composite stream  %s (%d)", __FUNCTION__, | 
 | 208 |                     strerror(-ret), ret); | 
 | 209 |         } | 
 | 210 |     } | 
 | 211 |     mCompositeStreamMap.clear(); | 
 | 212 |  | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 213 |     return res; | 
 | 214 | } | 
 | 215 |  | 
 | 216 | void CameraOfflineSessionClient::notifyError(int32_t errorCode, | 
 | 217 |         const CaptureResultExtras& resultExtras) { | 
 | 218 |     // Thread safe. Don't bother locking. | 
| Emilian Peev | 4697b64 | 2019-11-19 17:11:14 -0800 | [diff] [blame] | 219 |     // Composites can have multiple internal streams. Error notifications coming from such internal | 
 | 220 |     // streams may need to remain within camera service. | 
 | 221 |     bool skipClientNotification = false; | 
 | 222 |     for (size_t i = 0; i < mCompositeStreamMap.size(); i++) { | 
 | 223 |         skipClientNotification |= mCompositeStreamMap.valueAt(i)->onError(errorCode, resultExtras); | 
 | 224 |     } | 
 | 225 |  | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 226 |     if ((mRemoteCallback.get() != nullptr) && (!skipClientNotification)) { | 
 | 227 |         mRemoteCallback->onDeviceError(errorCode, resultExtras); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 228 |     } | 
 | 229 | } | 
 | 230 |  | 
 | 231 | status_t CameraOfflineSessionClient::startCameraOps() { | 
 | 232 |     ATRACE_CALL(); | 
 | 233 |     { | 
 | 234 |         ALOGV("%s: Start camera ops, package name = %s, client UID = %d", | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 235 |               __FUNCTION__, mClientPackageName.c_str(), mClientUid); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 236 |     } | 
 | 237 |  | 
 | 238 |     if (mAppOpsManager != nullptr) { | 
 | 239 |         // Notify app ops that the camera is not available | 
 | 240 |         mOpsCallback = new OpsCallback(this); | 
 | 241 |         int32_t res; | 
 | 242 |         // TODO : possibly change this to OP_OFFLINE_CAMERA_SESSION | 
 | 243 |         mAppOpsManager->startWatchingMode(AppOpsManager::OP_CAMERA, | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 244 |                 toString16(mClientPackageName), mOpsCallback); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 245 |         // TODO : possibly change this to OP_OFFLINE_CAMERA_SESSION | 
 | 246 |         res = mAppOpsManager->startOpNoThrow(AppOpsManager::OP_CAMERA, | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 247 |                 mClientUid, toString16(mClientPackageName), /*startIfModeDefault*/ false); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 248 |  | 
 | 249 |         if (res == AppOpsManager::MODE_ERRORED) { | 
 | 250 |             ALOGI("Offline Camera %s: Access for \"%s\" has been revoked", | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 251 |                     mCameraIdStr.c_str(), mClientPackageName.c_str()); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 252 |             return PERMISSION_DENIED; | 
 | 253 |         } | 
 | 254 |  | 
| Shuzhen Wang | 2c65679 | 2020-04-13 17:36:49 -0700 | [diff] [blame] | 255 |         // If the calling Uid is trusted (a native service), the AppOpsManager could | 
 | 256 |         // return MODE_IGNORED. Do not treat such case as error. | 
 | 257 |         if (!mUidIsTrusted && res == AppOpsManager::MODE_IGNORED) { | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 258 |             ALOGI("Offline Camera %s: Access for \"%s\" has been restricted", | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 259 |                     mCameraIdStr.c_str(), mClientPackageName.c_str()); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 260 |             // Return the same error as for device policy manager rejection | 
 | 261 |             return -EACCES; | 
 | 262 |         } | 
 | 263 |     } | 
 | 264 |  | 
 | 265 |     mOpsActive = true; | 
 | 266 |  | 
 | 267 |     // Transition device state to OPEN | 
| Austin Borger | dddb755 | 2023-03-30 17:53:01 -0700 | [diff] [blame] | 268 |     sCameraService->mUidPolicy->registerMonitorUid(mClientUid, /*openCamera*/true); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 269 |  | 
 | 270 |     return OK; | 
 | 271 | } | 
 | 272 |  | 
 | 273 | status_t CameraOfflineSessionClient::finishCameraOps() { | 
 | 274 |     ATRACE_CALL(); | 
 | 275 |  | 
 | 276 |     // Check if startCameraOps succeeded, and if so, finish the camera op | 
 | 277 |     if (mOpsActive) { | 
 | 278 |         // Notify app ops that the camera is available again | 
 | 279 |         if (mAppOpsManager != nullptr) { | 
 | 280 |         // TODO : possibly change this to OP_OFFLINE_CAMERA_SESSION | 
 | 281 |             mAppOpsManager->finishOp(AppOpsManager::OP_CAMERA, mClientUid, | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 282 |                     toString16(mClientPackageName)); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 283 |             mOpsActive = false; | 
 | 284 |         } | 
 | 285 |     } | 
 | 286 |     // Always stop watching, even if no camera op is active | 
 | 287 |     if (mOpsCallback != nullptr && mAppOpsManager != nullptr) { | 
 | 288 |         mAppOpsManager->stopWatchingMode(mOpsCallback); | 
 | 289 |     } | 
 | 290 |     mOpsCallback.clear(); | 
 | 291 |  | 
| Austin Borger | dddb755 | 2023-03-30 17:53:01 -0700 | [diff] [blame] | 292 |     sCameraService->mUidPolicy->unregisterMonitorUid(mClientUid, /*closeCamera*/true); | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 293 |  | 
 | 294 |     return OK; | 
 | 295 | } | 
 | 296 |  | 
| Emilian Peev | 4697b64 | 2019-11-19 17:11:14 -0800 | [diff] [blame] | 297 | void CameraOfflineSessionClient::onResultAvailable(const CaptureResult& result) { | 
 | 298 |     ATRACE_CALL(); | 
 | 299 |     ALOGV("%s", __FUNCTION__); | 
 | 300 |  | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 301 |     if (mRemoteCallback.get() != NULL) { | 
 | 302 |         mRemoteCallback->onResultReceived(result.mMetadata, result.mResultExtras, | 
| Emilian Peev | 4697b64 | 2019-11-19 17:11:14 -0800 | [diff] [blame] | 303 |                 result.mPhysicalMetadatas); | 
 | 304 |     } | 
 | 305 |  | 
 | 306 |     for (size_t i = 0; i < mCompositeStreamMap.size(); i++) { | 
 | 307 |         mCompositeStreamMap.valueAt(i)->onResultAvailable(result); | 
 | 308 |     } | 
 | 309 | } | 
 | 310 |  | 
 | 311 | void CameraOfflineSessionClient::notifyShutter(const CaptureResultExtras& resultExtras, | 
 | 312 |         nsecs_t timestamp) { | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 313 |  | 
 | 314 |     if (mRemoteCallback.get() != nullptr) { | 
 | 315 |         mRemoteCallback->onCaptureStarted(resultExtras, timestamp); | 
| Emilian Peev | 4697b64 | 2019-11-19 17:11:14 -0800 | [diff] [blame] | 316 |     } | 
 | 317 |  | 
 | 318 |     for (size_t i = 0; i < mCompositeStreamMap.size(); i++) { | 
 | 319 |         mCompositeStreamMap.valueAt(i)->onShutter(resultExtras, timestamp); | 
 | 320 |     } | 
 | 321 | } | 
 | 322 |  | 
| Austin Borger | 4a870a3 | 2022-02-25 01:48:41 +0000 | [diff] [blame] | 323 | status_t CameraOfflineSessionClient::notifyActive(float maxPreviewFps __unused) { | 
| Eino-Ville Talvala | 178e823 | 2021-04-16 18:41:39 -0700 | [diff] [blame] | 324 |     return startCameraStreamingOps(); | 
 | 325 | } | 
 | 326 |  | 
| Shuzhen Wang | 316781a | 2020-08-18 18:11:01 -0700 | [diff] [blame] | 327 | void CameraOfflineSessionClient::notifyIdle( | 
 | 328 |         int64_t /*requestCount*/, int64_t /*resultErrorCount*/, bool /*deviceError*/, | 
 | 329 |         const std::vector<hardware::CameraStreamStats>& /*streamStats*/) { | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 330 |     if (mRemoteCallback.get() != nullptr) { | 
 | 331 |         mRemoteCallback->onDeviceIdle(); | 
 | 332 |     } | 
| Eino-Ville Talvala | 178e823 | 2021-04-16 18:41:39 -0700 | [diff] [blame] | 333 |     finishCameraStreamingOps(); | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 334 | } | 
 | 335 |  | 
| Jing Mike | c7f9b13 | 2023-03-12 11:12:04 +0800 | [diff] [blame] | 336 | void CameraOfflineSessionClient::notifyAutoFocus([[maybe_unused]] uint8_t newState, | 
 | 337 |                 [[maybe_unused]] int triggerId) { | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 338 |     ALOGV("%s: Autofocus state now %d, last trigger %d", | 
 | 339 |           __FUNCTION__, newState, triggerId); | 
 | 340 | } | 
 | 341 |  | 
| Jing Mike | c7f9b13 | 2023-03-12 11:12:04 +0800 | [diff] [blame] | 342 | void CameraOfflineSessionClient::notifyAutoExposure([[maybe_unused]] uint8_t newState, | 
 | 343 |                 [[maybe_unused]] int triggerId) { | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 344 |     ALOGV("%s: Autoexposure state now %d, last trigger %d", | 
 | 345 |             __FUNCTION__, newState, triggerId); | 
 | 346 | } | 
 | 347 |  | 
| Jing Mike | c7f9b13 | 2023-03-12 11:12:04 +0800 | [diff] [blame] | 348 | void CameraOfflineSessionClient::notifyAutoWhitebalance([[maybe_unused]] uint8_t newState, | 
 | 349 |                 [[maybe_unused]] int triggerId) { | 
| Emilian Peev | d99c8ae | 2019-11-26 13:19:13 -0800 | [diff] [blame] | 350 |     ALOGV("%s: Auto-whitebalance state now %d, last trigger %d", __FUNCTION__, newState, | 
 | 351 |             triggerId); | 
 | 352 | } | 
 | 353 |  | 
 | 354 | void CameraOfflineSessionClient::notifyPrepared(int /*streamId*/) { | 
 | 355 |     ALOGE("%s: Unexpected stream prepare notification in offline mode!", __FUNCTION__); | 
 | 356 |     notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE, | 
 | 357 |                 CaptureResultExtras()); | 
 | 358 | } | 
 | 359 |  | 
 | 360 | void CameraOfflineSessionClient::notifyRequestQueueEmpty() { | 
 | 361 |     if (mRemoteCallback.get() != nullptr) { | 
 | 362 |         mRemoteCallback->onRequestQueueEmpty(); | 
 | 363 |     } | 
 | 364 | } | 
 | 365 |  | 
 | 366 | void CameraOfflineSessionClient::notifyRepeatingRequestError(long /*lastFrameNumber*/) { | 
 | 367 |     ALOGE("%s: Unexpected repeating request error in offline mode!", __FUNCTION__); | 
 | 368 |     notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE, | 
 | 369 |                 CaptureResultExtras()); | 
 | 370 | } | 
 | 371 |  | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 372 | status_t CameraOfflineSessionClient::injectCamera(const std::string& injectedCamId, | 
| Cliff Wu | d3a0531 | 2021-04-26 23:07:31 +0800 | [diff] [blame] | 373 |             sp<CameraProviderManager> manager) { | 
 | 374 |     ALOGV("%s: This client doesn't support the injection camera. injectedCamId: %s providerPtr: %p", | 
| Austin Borger | ed99f64 | 2023-06-01 16:51:35 -0700 | [diff] [blame] | 375 |             __FUNCTION__, injectedCamId.c_str(), manager.get()); | 
| Cliff Wu | d3a0531 | 2021-04-26 23:07:31 +0800 | [diff] [blame] | 376 |  | 
 | 377 |     return OK; | 
 | 378 | } | 
 | 379 |  | 
 | 380 | status_t CameraOfflineSessionClient::stopInjection() { | 
 | 381 |     ALOGV("%s: This client doesn't support the injection camera.", __FUNCTION__); | 
 | 382 |  | 
 | 383 |     return OK; | 
 | 384 | } | 
 | 385 |  | 
| Emilian Peev | b2bc5a4 | 2019-11-20 16:02:14 -0800 | [diff] [blame] | 386 | // ---------------------------------------------------------------------------- | 
 | 387 | }; // namespace android |